blob: a583b1c4308e791d107cff746fe58dbbc1e27735 [file] [log] [blame]
Govinda Wassermanc7495cd2019-05-20 14:43:28 -04001/*
2 * Copyright (C) 2019 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package com.android.systemui.assist;
18
19import static org.mockito.AdditionalAnswers.answerVoid;
20import static org.mockito.ArgumentMatchers.any;
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040021import static org.mockito.ArgumentMatchers.anyInt;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040022import static org.mockito.ArgumentMatchers.anyLong;
Govinda Wasserman48cdd682019-06-04 12:15:23 -040023import static org.mockito.ArgumentMatchers.eq;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040024import static org.mockito.Mockito.doAnswer;
25import static org.mockito.Mockito.inOrder;
26import static org.mockito.Mockito.reset;
27import static org.mockito.Mockito.verify;
28import static org.mockito.Mockito.verifyNoMoreInteractions;
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040029import static org.mockito.Mockito.when;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040030
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040031import android.content.ComponentName;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040032import android.os.Handler;
33import android.testing.AndroidTestingRunner;
34import android.testing.TestableLooper.RunWithLooper;
35
36import androidx.test.filters.SmallTest;
37
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040038import com.android.internal.app.AssistUtils;
Govinda Wasserman48cdd682019-06-04 12:15:23 -040039import com.android.internal.config.sysui.SystemUiDeviceConfigFlags;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040040import com.android.systemui.ScreenDecorations;
41import com.android.systemui.SysuiTestCase;
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040042import com.android.systemui.plugins.statusbar.StatusBarStateController;
43import com.android.systemui.recents.OverviewProxyService;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040044
Govinda Wasserman48cdd682019-06-04 12:15:23 -040045import org.junit.After;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040046import org.junit.Before;
47import org.junit.Test;
48import org.junit.runner.RunWith;
49import org.mockito.InOrder;
50import org.mockito.Mock;
51import org.mockito.MockitoAnnotations;
52
53@SmallTest
54@RunWith(AndroidTestingRunner.class)
55@RunWithLooper
56public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
57
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040058 private static final ComponentName COMPONENT_NAME = new ComponentName("", "");
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040059
60 private AssistHandleBehaviorController mAssistHandleBehaviorController;
61
62 @Mock private ScreenDecorations mMockScreenDecorations;
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040063 @Mock private AssistUtils mMockAssistUtils;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040064 @Mock private Handler mMockHandler;
Govinda Wasserman48cdd682019-06-04 12:15:23 -040065 @Mock private PhenotypeHelper mMockPhenotypeHelper;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040066 @Mock private AssistHandleBehaviorController.BehaviorController mMockBehaviorController;
67
68 @Before
69 public void setup() {
70 MockitoAnnotations.initMocks(this);
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040071 mDependency.injectMockDependency(StatusBarStateController.class);
72 mDependency.injectMockDependency(OverviewProxyService.class);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040073 doAnswer(answerVoid(Runnable::run)).when(mMockHandler).post(any(Runnable.class));
74 doAnswer(answerVoid(Runnable::run)).when(mMockHandler)
75 .postDelayed(any(Runnable.class), anyLong());
Govinda Wasserman48cdd682019-06-04 12:15:23 -040076
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040077 mAssistHandleBehaviorController =
78 new AssistHandleBehaviorController(
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040079 mContext,
80 mMockAssistUtils,
81 mMockHandler, () -> mMockScreenDecorations,
Govinda Wasserman48cdd682019-06-04 12:15:23 -040082 mMockPhenotypeHelper,
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040083 mMockBehaviorController);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040084 }
85
Govinda Wasserman48cdd682019-06-04 12:15:23 -040086 @After
87 public void teardown() {
88 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF);
89 }
90
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040091 @Test
92 public void hide_hidesHandlesWhenShowing() {
93 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040094 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040095 mAssistHandleBehaviorController.showAndStay();
96 reset(mMockScreenDecorations);
97
98 // Act
99 mAssistHandleBehaviorController.hide();
100
101 // Assert
102 verify(mMockScreenDecorations).setAssistHintVisible(false);
103 verifyNoMoreInteractions(mMockScreenDecorations);
104 }
105
106 @Test
107 public void hide_doesNothingWhenHiding() {
108 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400109 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400110 mAssistHandleBehaviorController.hide();
111 reset(mMockScreenDecorations);
112
113 // Act
114 mAssistHandleBehaviorController.hide();
115
116 // Assert
117 verifyNoMoreInteractions(mMockScreenDecorations);
118 }
119
120 @Test
121 public void showAndStay_showsHandlesWhenHiding() {
122 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400123 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400124 mAssistHandleBehaviorController.hide();
125 reset(mMockScreenDecorations);
126
127 // Act
128 mAssistHandleBehaviorController.showAndStay();
129
130 // Assert
131 verify(mMockScreenDecorations).setAssistHintVisible(true);
132 verifyNoMoreInteractions(mMockScreenDecorations);
133 }
134
135 @Test
136 public void showAndStay_doesNothingWhenShowing() {
137 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400138 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400139 mAssistHandleBehaviorController.showAndStay();
140 reset(mMockScreenDecorations);
141
142 // Act
143 mAssistHandleBehaviorController.showAndStay();
144
145 // Assert
146 verifyNoMoreInteractions(mMockScreenDecorations);
147 }
148
149 @Test
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400150 public void showAndStay_doesNothingWhenThereIsNoAssistant() {
151 // Arrange
152 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null);
153 mAssistHandleBehaviorController.hide();
154 reset(mMockScreenDecorations);
155
156 // Act
157 mAssistHandleBehaviorController.showAndStay();
158
159 // Assert
160 verifyNoMoreInteractions(mMockScreenDecorations);
161 }
162
163 @Test
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400164 public void showAndGo_showsThenHidesHandlesWhenHiding() {
165 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400166 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400167 mAssistHandleBehaviorController.hide();
168 reset(mMockScreenDecorations);
169
170 // Act
171 mAssistHandleBehaviorController.showAndGo();
172
173 // Assert
174 InOrder inOrder = inOrder(mMockScreenDecorations);
175 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true);
176 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
177 inOrder.verifyNoMoreInteractions();
178 }
179
180 @Test
181 public void showAndGo_hidesHandlesAfterTimeoutWhenShowing() {
182 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400183 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400184 mAssistHandleBehaviorController.showAndStay();
185 reset(mMockScreenDecorations);
186
187 // Act
188 mAssistHandleBehaviorController.showAndGo();
189
190 // Assert
191 verify(mMockScreenDecorations).setAssistHintVisible(false);
192 verifyNoMoreInteractions(mMockScreenDecorations);
193 }
194
195 @Test
196 public void showAndGo_doesNothingIfRecentlyHidden() {
197 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400198 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400199 when(mMockPhenotypeHelper.getLong(
200 eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS),
201 anyLong())).thenReturn(10000L);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400202 mAssistHandleBehaviorController.showAndGo();
203 reset(mMockScreenDecorations);
204
205 // Act
206 mAssistHandleBehaviorController.showAndGo();
207
208 // Assert
209 verifyNoMoreInteractions(mMockScreenDecorations);
210 }
211
212 @Test
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400213 public void showAndGo_doesNothingWhenThereIsNoAssistant() {
214 // Arrange
215 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null);
216 mAssistHandleBehaviorController.hide();
217 reset(mMockScreenDecorations);
218
219 // Act
220 mAssistHandleBehaviorController.showAndGo();
221
222 // Assert
223 verifyNoMoreInteractions(mMockScreenDecorations);
224 }
225
226 @Test
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400227 public void showAndGoDelayed_showsThenHidesHandlesWhenHiding() {
228 // Arrange
229 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
230 mAssistHandleBehaviorController.hide();
231 reset(mMockScreenDecorations);
232
233 // Act
234 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
235
236 // Assert
237 InOrder inOrder = inOrder(mMockScreenDecorations);
238 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true);
239 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
240 inOrder.verifyNoMoreInteractions();
241 }
242
243 @Test
244 public void showAndGoDelayed_hidesHandlesAfterTimeoutWhenShowing() {
245 // Arrange
246 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
247 mAssistHandleBehaviorController.showAndStay();
248 reset(mMockScreenDecorations);
249
250 // Act
251 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
252
253 // Assert
254 verify(mMockScreenDecorations).setAssistHintVisible(false);
255 verifyNoMoreInteractions(mMockScreenDecorations);
256 }
257
258 @Test
259 public void showAndGoDelayed_hidesInitiallyThenShowsThenHidesAfterTimeoutWhenHideRequested() {
260 // Arrange
261 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
262 mAssistHandleBehaviorController.showAndStay();
263 reset(mMockScreenDecorations);
264
265 // Act
266 mAssistHandleBehaviorController.showAndGoDelayed(1000, true);
267
268 // Assert
269 InOrder inOrder = inOrder(mMockScreenDecorations);
270 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
271 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true);
272 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
273 inOrder.verifyNoMoreInteractions();
274 }
275
276 @Test
277 public void showAndGoDelayed_doesNothingIfRecentlyHidden() {
278 // Arrange
279 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
280 when(mMockPhenotypeHelper.getLong(
281 eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS),
282 anyLong())).thenReturn(10000L);
283 mAssistHandleBehaviorController.showAndGo();
284 reset(mMockScreenDecorations);
285
286 // Act
287 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
288
289 // Assert
290 verifyNoMoreInteractions(mMockScreenDecorations);
291 }
292
293 @Test
294 public void showAndGoDelayed_doesNothingWhenThereIsNoAssistant() {
295 // Arrange
296 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null);
297 mAssistHandleBehaviorController.hide();
298 reset(mMockScreenDecorations);
299
300 // Act
301 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
302
303 // Assert
304 verifyNoMoreInteractions(mMockScreenDecorations);
305 }
306
307 @Test
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400308 public void setBehavior_activatesTheBehaviorWhenInGesturalMode() {
309 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400310 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400311 mAssistHandleBehaviorController.setInGesturalModeForTest(true);
312
313 // Act
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400314 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400315
316 // Assert
317 verify(mMockBehaviorController).onModeActivated(mContext, mAssistHandleBehaviorController);
318 verifyNoMoreInteractions(mMockBehaviorController);
319 }
320
321 @Test
322 public void setBehavior_deactivatesThePreviousBehaviorWhenInGesturalMode() {
323 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400324 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
325 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400326 mAssistHandleBehaviorController.setInGesturalModeForTest(true);
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400327 reset(mMockBehaviorController);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400328
329 // Act
330 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF);
331
332 // Assert
333 verify(mMockBehaviorController).onModeDeactivated();
334 verifyNoMoreInteractions(mMockBehaviorController);
335 }
336
337 @Test
338 public void setBehavior_doesNothingWhenNotInGesturalMode() {
339 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400340 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400341 mAssistHandleBehaviorController.setInGesturalModeForTest(false);
342
343 // Act
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400344 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400345
346 // Assert
347 verifyNoMoreInteractions(mMockBehaviorController);
348 }
349}