package com.android.launcher3.taskbar; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IME_SWITCH; import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS; import static com.android.launcher3.taskbar.TaskbarNavButtonController.SCREEN_PIN_LONG_PRESS_THRESHOLD; import static com.android.quickstep.OverviewCommandHelper.TYPE_HOME; import static com.android.quickstep.OverviewCommandHelper.TYPE_TOGGLE; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.os.Handler; import androidx.test.runner.AndroidJUnit4; import com.android.quickstep.OverviewCommandHelper; import com.android.quickstep.SystemUiProxy; import com.android.quickstep.TouchInteractionService; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @RunWith(AndroidJUnit4.class) public class TaskbarNavButtonControllerTest { private final static int DISPLAY_ID = 2; @Mock SystemUiProxy mockSystemUiProxy; @Mock TouchInteractionService mockService; @Mock OverviewCommandHelper mockCommandHelper; @Mock Handler mockHandler; private TaskbarNavButtonController mNavButtonController; @Before public void setup() { MockitoAnnotations.initMocks(this); when(mockService.getDisplayId()).thenReturn(DISPLAY_ID); when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper); mNavButtonController = new TaskbarNavButtonController(mockService, mockSystemUiProxy, mockHandler); } @Test public void testPressBack() { mNavButtonController.onButtonClick(BUTTON_BACK); verify(mockSystemUiProxy, times(1)).onBackPressed(); } @Test public void testPressImeSwitcher() { mNavButtonController.onButtonClick(BUTTON_IME_SWITCH); verify(mockSystemUiProxy, times(1)).onImeSwitcherPressed(); } @Test public void testPressA11yShortClick() { mNavButtonController.onButtonClick(BUTTON_A11Y); verify(mockSystemUiProxy, times(1)) .notifyAccessibilityButtonClicked(DISPLAY_ID); } @Test public void testPressA11yLongClick() { mNavButtonController.onButtonLongClick(BUTTON_A11Y); verify(mockSystemUiProxy, times(1)).notifyAccessibilityButtonLongClicked(); } @Test public void testLongPressHome() { mNavButtonController.onButtonLongClick(BUTTON_HOME); verify(mockSystemUiProxy, times(1)).startAssistant(any()); } @Test public void testPressHome() { mNavButtonController.onButtonClick(BUTTON_HOME); verify(mockCommandHelper, times(1)).addCommand(TYPE_HOME); } @Test public void testPressRecents() { mNavButtonController.onButtonClick(BUTTON_RECENTS); verify(mockCommandHelper, times(1)).addCommand(TYPE_TOGGLE); } @Test public void testPressRecentsWithScreenPinned() { mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); mNavButtonController.onButtonClick(BUTTON_RECENTS); verify(mockCommandHelper, times(0)).addCommand(TYPE_TOGGLE); } @Test public void testLongPressBackRecentsNotPinned() { mNavButtonController.onButtonLongClick(BUTTON_RECENTS); mNavButtonController.onButtonLongClick(BUTTON_BACK); verify(mockSystemUiProxy, times(0)).stopScreenPinning(); } @Test public void testLongPressBackRecentsPinned() { mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); mNavButtonController.onButtonLongClick(BUTTON_RECENTS); mNavButtonController.onButtonLongClick(BUTTON_BACK); verify(mockSystemUiProxy, times(1)).stopScreenPinning(); } @Test public void testLongPressBackRecentsTooLongPinned() { mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); mNavButtonController.onButtonLongClick(BUTTON_RECENTS); try { Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5); } catch (InterruptedException e) { e.printStackTrace(); } mNavButtonController.onButtonLongClick(BUTTON_BACK); verify(mockSystemUiProxy, times(0)).stopScreenPinning(); } @Test public void testLongPressBackRecentsMultipleAttemptPinned() { mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); mNavButtonController.onButtonLongClick(BUTTON_RECENTS); try { Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5); } catch (InterruptedException e) { e.printStackTrace(); } mNavButtonController.onButtonLongClick(BUTTON_BACK); verify(mockSystemUiProxy, times(0)).stopScreenPinning(); // Try again w/in threshold mNavButtonController.onButtonLongClick(BUTTON_RECENTS); mNavButtonController.onButtonLongClick(BUTTON_BACK); verify(mockSystemUiProxy, times(1)).stopScreenPinning(); } @Test public void testLongPressHomeScreenPinned() { mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); mNavButtonController.onButtonLongClick(BUTTON_HOME); verify(mockSystemUiProxy, times(0)).startAssistant(any()); } }