1 package com.android.launcher3.taskbar; 2 3 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS; 4 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_BACK_BUTTON_TAP; 5 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS; 6 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_HOME_BUTTON_TAP; 7 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS; 8 import static com.android.launcher3.logging.StatsLogManager.LauncherEvent.LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP; 9 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_A11Y; 10 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_BACK; 11 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_HOME; 12 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_IME_SWITCH; 13 import static com.android.launcher3.taskbar.TaskbarNavButtonController.BUTTON_RECENTS; 14 import static com.android.launcher3.taskbar.TaskbarNavButtonController.SCREEN_PIN_LONG_PRESS_THRESHOLD; 15 import static com.android.quickstep.OverviewCommandHelper.TYPE_HOME; 16 import static com.android.quickstep.OverviewCommandHelper.TYPE_TOGGLE; 17 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; 18 19 import static org.mockito.ArgumentMatchers.any; 20 import static org.mockito.Mockito.doReturn; 21 import static org.mockito.Mockito.never; 22 import static org.mockito.Mockito.times; 23 import static org.mockito.Mockito.verify; 24 import static org.mockito.Mockito.when; 25 26 import android.os.Handler; 27 import android.view.View; 28 29 import androidx.test.runner.AndroidJUnit4; 30 31 import com.android.launcher3.logging.StatsLogManager; 32 import com.android.quickstep.OverviewCommandHelper; 33 import com.android.quickstep.SystemUiProxy; 34 import com.android.quickstep.TouchInteractionService; 35 36 import org.junit.Before; 37 import org.junit.Test; 38 import org.junit.runner.RunWith; 39 import org.mockito.Mock; 40 import org.mockito.MockitoAnnotations; 41 42 @RunWith(AndroidJUnit4.class) 43 public class TaskbarNavButtonControllerTest { 44 45 private final static int DISPLAY_ID = 2; 46 47 @Mock 48 SystemUiProxy mockSystemUiProxy; 49 @Mock 50 TouchInteractionService mockService; 51 @Mock 52 OverviewCommandHelper mockCommandHelper; 53 @Mock 54 Handler mockHandler; 55 @Mock 56 StatsLogManager mockStatsLogManager; 57 @Mock 58 StatsLogManager.StatsLogger mockStatsLogger; 59 @Mock 60 TaskbarControllers mockTaskbarControllers; 61 @Mock 62 TaskbarActivityContext mockTaskbarActivityContext; 63 @Mock 64 View mockView; 65 66 private TaskbarNavButtonController mNavButtonController; 67 68 @Before setup()69 public void setup() { 70 MockitoAnnotations.initMocks(this); 71 when(mockService.getDisplayId()).thenReturn(DISPLAY_ID); 72 when(mockService.getOverviewCommandHelper()).thenReturn(mockCommandHelper); 73 when(mockStatsLogManager.logger()).thenReturn(mockStatsLogger); 74 when(mockTaskbarControllers.getTaskbarActivityContext()) 75 .thenReturn(mockTaskbarActivityContext); 76 doReturn(mockStatsLogManager).when(mockTaskbarActivityContext).getStatsLogManager(); 77 mNavButtonController = new TaskbarNavButtonController(mockService, 78 mockSystemUiProxy, mockHandler); 79 } 80 81 @Test testPressBack()82 public void testPressBack() { 83 mNavButtonController.onButtonClick(BUTTON_BACK, mockView); 84 verify(mockSystemUiProxy, times(1)).onBackPressed(); 85 } 86 87 @Test testPressImeSwitcher()88 public void testPressImeSwitcher() { 89 mNavButtonController.onButtonClick(BUTTON_IME_SWITCH, mockView); 90 verify(mockSystemUiProxy, times(1)).onImeSwitcherPressed(); 91 } 92 93 @Test testPressA11yShortClick()94 public void testPressA11yShortClick() { 95 mNavButtonController.onButtonClick(BUTTON_A11Y, mockView); 96 verify(mockSystemUiProxy, times(1)) 97 .notifyAccessibilityButtonClicked(DISPLAY_ID); 98 } 99 100 @Test testPressA11yLongClick()101 public void testPressA11yLongClick() { 102 mNavButtonController.onButtonLongClick(BUTTON_A11Y, mockView); 103 verify(mockSystemUiProxy, times(1)).notifyAccessibilityButtonLongClicked(); 104 } 105 106 @Test testLongPressHome_enabled()107 public void testLongPressHome_enabled() { 108 mNavButtonController.setAssistantLongPressEnabled(true /*assistantLongPressEnabled*/); 109 mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView); 110 verify(mockSystemUiProxy, times(1)).startAssistant(any()); 111 } 112 113 @Test testLongPressHome_disabled()114 public void testLongPressHome_disabled() { 115 mNavButtonController.setAssistantLongPressEnabled(false /*assistantLongPressEnabled*/); 116 mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView); 117 verify(mockSystemUiProxy, never()).startAssistant(any()); 118 } 119 120 @Test testPressHome()121 public void testPressHome() { 122 mNavButtonController.onButtonClick(BUTTON_HOME, mockView); 123 verify(mockCommandHelper, times(1)).addCommand(TYPE_HOME); 124 } 125 126 @Test testPressRecents()127 public void testPressRecents() { 128 mNavButtonController.onButtonClick(BUTTON_RECENTS, mockView); 129 verify(mockCommandHelper, times(1)).addCommand(TYPE_TOGGLE); 130 } 131 132 @Test testPressRecentsWithScreenPinned()133 public void testPressRecentsWithScreenPinned() { 134 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 135 mNavButtonController.onButtonClick(BUTTON_RECENTS, mockView); 136 verify(mockCommandHelper, times(0)).addCommand(TYPE_TOGGLE); 137 } 138 139 @Test testLongPressBackRecentsNotPinned()140 public void testLongPressBackRecentsNotPinned() { 141 mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView); 142 mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView); 143 verify(mockSystemUiProxy, times(0)).stopScreenPinning(); 144 } 145 146 @Test testLongPressBackRecentsPinned()147 public void testLongPressBackRecentsPinned() { 148 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 149 mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView); 150 mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView); 151 verify(mockSystemUiProxy, times(1)).stopScreenPinning(); 152 } 153 154 @Test testLongPressBackRecentsTooLongPinned()155 public void testLongPressBackRecentsTooLongPinned() { 156 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 157 mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView); 158 try { 159 Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5); 160 } catch (InterruptedException e) { 161 e.printStackTrace(); 162 } 163 mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView); 164 verify(mockSystemUiProxy, times(0)).stopScreenPinning(); 165 } 166 167 @Test testLongPressBackRecentsMultipleAttemptPinned()168 public void testLongPressBackRecentsMultipleAttemptPinned() { 169 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 170 mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView); 171 try { 172 Thread.sleep(SCREEN_PIN_LONG_PRESS_THRESHOLD + 5); 173 } catch (InterruptedException e) { 174 e.printStackTrace(); 175 } 176 mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView); 177 verify(mockSystemUiProxy, times(0)).stopScreenPinning(); 178 179 // Try again w/in threshold 180 mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView); 181 mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView); 182 verify(mockSystemUiProxy, times(1)).stopScreenPinning(); 183 } 184 185 @Test testLongPressHomeScreenPinned()186 public void testLongPressHomeScreenPinned() { 187 mNavButtonController.updateSysuiFlags(SYSUI_STATE_SCREEN_PINNING); 188 mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView); 189 verify(mockSystemUiProxy, times(0)).startAssistant(any()); 190 } 191 192 @Test testNoCallsToNullLogger()193 public void testNoCallsToNullLogger() { 194 mNavButtonController.onButtonClick(BUTTON_HOME, mockView); 195 verify(mockStatsLogManager, times(0)).logger(); 196 verify(mockStatsLogger, times(0)).log(any()); 197 } 198 199 @Test testNoCallsAfterNullingOut()200 public void testNoCallsAfterNullingOut() { 201 mNavButtonController.init(mockTaskbarControllers); 202 mNavButtonController.onButtonClick(BUTTON_HOME, mockView); 203 mNavButtonController.onDestroy(); 204 mNavButtonController.onButtonClick(BUTTON_HOME, mockView); 205 verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); 206 verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); 207 } 208 209 @Test testLogOnTap()210 public void testLogOnTap() { 211 mNavButtonController.init(mockTaskbarControllers); 212 mNavButtonController.onButtonClick(BUTTON_HOME, mockView); 213 verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); 214 verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); 215 } 216 217 @Test testLogOnLongpress()218 public void testLogOnLongpress() { 219 mNavButtonController.init(mockTaskbarControllers); 220 mNavButtonController.onButtonLongClick(BUTTON_HOME, mockView); 221 verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_HOME_BUTTON_LONGPRESS); 222 verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_HOME_BUTTON_TAP); 223 } 224 225 @Test testBackOverviewLogOnLongpress()226 public void testBackOverviewLogOnLongpress() { 227 mNavButtonController.init(mockTaskbarControllers); 228 mNavButtonController.onButtonLongClick(BUTTON_RECENTS, mockView); 229 verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_LONGPRESS); 230 verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_OVERVIEW_BUTTON_TAP); 231 232 mNavButtonController.onButtonLongClick(BUTTON_BACK, mockView); 233 verify(mockStatsLogger, times(1)).log(LAUNCHER_TASKBAR_BACK_BUTTON_LONGPRESS); 234 verify(mockStatsLogger, times(0)).log(LAUNCHER_TASKBAR_BACK_BUTTON_TAP); 235 } 236 } 237