1 package com.android.launcher3.taskbar; 2 3 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y; 4 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK; 5 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME; 6 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IME_SWITCH; 7 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS; 8 import static com.android.launcher3.taskbar.TaskbarNavButtonController.SCREEN_PIN_LONG_PRESS_THRESHOLD; 9 import static com.android.quickstep.OverviewCommandHelper.TYPE_HOME; 10 import static com.android.quickstep.OverviewCommandHelper.TYPE_TOGGLE; 11 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; 12 13 import static org.mockito.ArgumentMatchers.any; 14 import static org.mockito.Mockito.times; 15 import static org.mockito.Mockito.verify; 16 import static org.mockito.Mockito.when; 17 18 import android.os.Handler; 19 20 import androidx.test.runner.AndroidJUnit4; 21 22 import com.android.quickstep.OverviewCommandHelper; 23 import com.android.quickstep.SystemUiProxy; 24 import com.android.quickstep.TouchInteractionService; 25 26 import org.junit.Before; 27 import org.junit.Test; 28 import org.junit.runner.RunWith; 29 import org.mockito.Mock; 30 import org.mockito.MockitoAnnotations; 31 32 @RunWith(AndroidJUnit4.class) 33 public class TaskbarNavButtonControllerTest { 34 35 private final static int DISPLAY_ID = 2; 36 37 @Mock 38 SystemUiProxy mockSystemUiProxy; 39 @Mock 40 TouchInteractionService mockService; 41 @Mock 42 OverviewCommandHelper mockCommandHelper; 43 @Mock 44 Handler mockHandler; 45 46 private TaskbarNavButtonController mNavButtonController; 47 48 @Before setup()49 public void setup() { 50 MockitoAnnotations.initMocks(this); 51 when(mockService.getDisplayId()).thenReturn(DISPLAY_ID); 52 when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper); 53 mNavButtonController = new TaskbarNavButtonController(mockService, 54 mockSystemUiProxy, mockHandler); 55 } 56 57 @Test testPressBack()58 public void testPressBack() { 59 mNavButtonController.onButtonClick(BUTTON_BACK); 60 verify(mockSystemUiProxy, times(1)).onBackPressed(); 61 } 62 63 @Test testPressImeSwitcher()64 public void testPressImeSwitcher() { 65 mNavButtonController.onButtonClick(BUTTON_IME_SWITCH); 66 verify(mockSystemUiProxy, times(1)).onImeSwitcherPressed(); 67 } 68 69 @Test testPressA11yShortClick()70 public void testPressA11yShortClick() { 71 mNavButtonController.onButtonClick(BUTTON_A11Y); 72 verify(mockSystemUiProxy, times(1)) 73 .notifyAccessibilityButtonClicked(DISPLAY_ID); 74 } 75 76 @Test testPressA11yLongClick()77 public void testPressA11yLongClick() { 78 mNavButtonController.onButtonLongClick(BUTTON_A11Y); 79 verify(mockSystemUiProxy, times(1)).notifyAccessibilityButtonLongClicked(); 80 } 81 82 @Test testLongPressHome()83 public void testLongPressHome() { 84 mNavButtonController.onButtonLongClick(BUTTON_HOME); 85 verify(mockSystemUiProxy, times(1)).startAssistant(any()); 86 } 87 88 @Test testPressHome()89 public void testPressHome() { 90 mNavButtonController.onButtonClick(BUTTON_HOME); 91 verify(mockCommandHelper, times(1)).addCommand(TYPE_HOME); 92 } 93 94 @Test testPressRecents()95 public void testPressRecents() { 96 mNavButtonController.onButtonClick(BUTTON_RECENTS); 97 verify(mockCommandHelper, times(1)).addCommand(TYPE_TOGGLE); 98 } 99 100 @Test testPressRecentsWithScreenPinned()101 public void testPressRecentsWithScreenPinned() { 102 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 103 mNavButtonController.onButtonClick(BUTTON_RECENTS); 104 verify(mockCommandHelper, times(0)).addCommand(TYPE_TOGGLE); 105 } 106 107 @Test testLongPressBackRecentsNotPinned()108 public void testLongPressBackRecentsNotPinned() { 109 mNavButtonController.onButtonLongClick(BUTTON_RECENTS); 110 mNavButtonController.onButtonLongClick(BUTTON_BACK); 111 verify(mockSystemUiProxy, times(0)).stopScreenPinning(); 112 } 113 114 @Test testLongPressBackRecentsPinned()115 public void testLongPressBackRecentsPinned() { 116 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 117 mNavButtonController.onButtonLongClick(BUTTON_RECENTS); 118 mNavButtonController.onButtonLongClick(BUTTON_BACK); 119 verify(mockSystemUiProxy, times(1)).stopScreenPinning(); 120 } 121 122 @Test testLongPressBackRecentsTooLongPinned()123 public void testLongPressBackRecentsTooLongPinned() { 124 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 125 mNavButtonController.onButtonLongClick(BUTTON_RECENTS); 126 try { 127 Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5); 128 } catch (InterruptedException e) { 129 e.printStackTrace(); 130 } 131 mNavButtonController.onButtonLongClick(BUTTON_BACK); 132 verify(mockSystemUiProxy, times(0)).stopScreenPinning(); 133 } 134 135 @Test testLongPressBackRecentsMultipleAttemptPinned()136 public void testLongPressBackRecentsMultipleAttemptPinned() { 137 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 138 mNavButtonController.onButtonLongClick(BUTTON_RECENTS); 139 try { 140 Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5); 141 } catch (InterruptedException e) { 142 e.printStackTrace(); 143 } 144 mNavButtonController.onButtonLongClick(BUTTON_BACK); 145 verify(mockSystemUiProxy, times(0)).stopScreenPinning(); 146 147 // Try again w/in threshold 148 mNavButtonController.onButtonLongClick(BUTTON_RECENTS); 149 mNavButtonController.onButtonLongClick(BUTTON_BACK); 150 verify(mockSystemUiProxy, times(1)).stopScreenPinning(); 151 } 152 153 @Test testLongPressHomeScreenPinned()154 public void testLongPressHomeScreenPinned() { 155 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 156 mNavButtonController.onButtonLongClick(BUTTON_HOME); 157 verify(mockSystemUiProxy, times(0)).startAssistant(any()); 158 } 159 } 160