• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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