blob: 20983fc16080843db4a4c2542bf11b16a956ae7b [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 Wasserman3fcd7172019-09-05 16:32:23 -040040import com.android.systemui.DumpController;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040041import com.android.systemui.ScreenDecorations;
42import com.android.systemui.SysuiTestCase;
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040043import com.android.systemui.plugins.statusbar.StatusBarStateController;
44import com.android.systemui.recents.OverviewProxyService;
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040045import com.android.systemui.statusbar.phone.NavigationModeController;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040046
Govinda Wasserman48cdd682019-06-04 12:15:23 -040047import org.junit.After;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040048import org.junit.Before;
49import org.junit.Test;
50import org.junit.runner.RunWith;
51import org.mockito.InOrder;
52import org.mockito.Mock;
53import org.mockito.MockitoAnnotations;
54
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040055import java.util.EnumMap;
56import java.util.Map;
57
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040058@SmallTest
59@RunWith(AndroidTestingRunner.class)
60@RunWithLooper
61public class AssistHandleBehaviorControllerTest extends SysuiTestCase {
62
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040063 private static final ComponentName COMPONENT_NAME = new ComponentName("", "");
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040064
65 private AssistHandleBehaviorController mAssistHandleBehaviorController;
66
67 @Mock private ScreenDecorations mMockScreenDecorations;
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040068 @Mock private AssistUtils mMockAssistUtils;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040069 @Mock private Handler mMockHandler;
Govinda Wasserman48cdd682019-06-04 12:15:23 -040070 @Mock private PhenotypeHelper mMockPhenotypeHelper;
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040071 @Mock private AssistHandleOffBehavior mMockOffBehavior;
72 @Mock private AssistHandleLikeHomeBehavior mMockLikeHomeBehavior;
73 @Mock private AssistHandleReminderExpBehavior mMockReminderExpBehavior;
74 @Mock private AssistHandleBehaviorController.BehaviorController mMockTestBehavior;
75 @Mock private NavigationModeController mMockNavigationModeController;
76 @Mock private DumpController mMockDumpController;
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040077
78 @Before
79 public void setup() {
80 MockitoAnnotations.initMocks(this);
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040081 mDependency.injectMockDependency(StatusBarStateController.class);
82 mDependency.injectMockDependency(OverviewProxyService.class);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040083 doAnswer(answerVoid(Runnable::run)).when(mMockHandler).post(any(Runnable.class));
84 doAnswer(answerVoid(Runnable::run)).when(mMockHandler)
85 .postDelayed(any(Runnable.class), anyLong());
Govinda Wasserman48cdd682019-06-04 12:15:23 -040086
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040087 Map<AssistHandleBehavior, AssistHandleBehaviorController.BehaviorController> behaviorMap =
88 new EnumMap<>(AssistHandleBehavior.class);
89 behaviorMap.put(AssistHandleBehavior.OFF, mMockOffBehavior);
90 behaviorMap.put(AssistHandleBehavior.LIKE_HOME, mMockLikeHomeBehavior);
91 behaviorMap.put(AssistHandleBehavior.REMINDER_EXP, mMockReminderExpBehavior);
92 behaviorMap.put(AssistHandleBehavior.TEST, mMockTestBehavior);
93
Govinda Wassermanc7495cd2019-05-20 14:43:28 -040094 mAssistHandleBehaviorController =
95 new AssistHandleBehaviorController(
Govinda Wasserman5dfe9652019-05-30 13:24:24 -040096 mContext,
97 mMockAssistUtils,
Govinda Wasserman3fcd7172019-09-05 16:32:23 -040098 mMockHandler,
99 () -> mMockScreenDecorations,
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400100 mMockPhenotypeHelper,
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400101 behaviorMap,
102 mMockNavigationModeController,
103 mMockDumpController);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400104 }
105
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400106 @After
107 public void teardown() {
108 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF);
109 }
110
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400111 @Test
112 public void hide_hidesHandlesWhenShowing() {
113 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400114 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400115 mAssistHandleBehaviorController.showAndStay();
116 reset(mMockScreenDecorations);
117
118 // Act
119 mAssistHandleBehaviorController.hide();
120
121 // Assert
122 verify(mMockScreenDecorations).setAssistHintVisible(false);
123 verifyNoMoreInteractions(mMockScreenDecorations);
124 }
125
126 @Test
127 public void hide_doesNothingWhenHiding() {
128 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400129 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400130 mAssistHandleBehaviorController.hide();
131 reset(mMockScreenDecorations);
132
133 // Act
134 mAssistHandleBehaviorController.hide();
135
136 // Assert
137 verifyNoMoreInteractions(mMockScreenDecorations);
138 }
139
140 @Test
141 public void showAndStay_showsHandlesWhenHiding() {
142 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400143 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400144 mAssistHandleBehaviorController.hide();
145 reset(mMockScreenDecorations);
146
147 // Act
148 mAssistHandleBehaviorController.showAndStay();
149
150 // Assert
151 verify(mMockScreenDecorations).setAssistHintVisible(true);
152 verifyNoMoreInteractions(mMockScreenDecorations);
153 }
154
155 @Test
156 public void showAndStay_doesNothingWhenShowing() {
157 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400158 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400159 mAssistHandleBehaviorController.showAndStay();
160 reset(mMockScreenDecorations);
161
162 // Act
163 mAssistHandleBehaviorController.showAndStay();
164
165 // Assert
166 verifyNoMoreInteractions(mMockScreenDecorations);
167 }
168
169 @Test
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400170 public void showAndStay_doesNothingWhenThereIsNoAssistant() {
171 // Arrange
172 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null);
173 mAssistHandleBehaviorController.hide();
174 reset(mMockScreenDecorations);
175
176 // Act
177 mAssistHandleBehaviorController.showAndStay();
178
179 // Assert
180 verifyNoMoreInteractions(mMockScreenDecorations);
181 }
182
183 @Test
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400184 public void showAndGo_showsThenHidesHandlesWhenHiding() {
185 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400186 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400187 mAssistHandleBehaviorController.hide();
188 reset(mMockScreenDecorations);
189
190 // Act
191 mAssistHandleBehaviorController.showAndGo();
192
193 // Assert
194 InOrder inOrder = inOrder(mMockScreenDecorations);
195 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true);
196 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
197 inOrder.verifyNoMoreInteractions();
198 }
199
200 @Test
201 public void showAndGo_hidesHandlesAfterTimeoutWhenShowing() {
202 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400203 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400204 mAssistHandleBehaviorController.showAndStay();
205 reset(mMockScreenDecorations);
206
207 // Act
208 mAssistHandleBehaviorController.showAndGo();
209
210 // Assert
211 verify(mMockScreenDecorations).setAssistHintVisible(false);
212 verifyNoMoreInteractions(mMockScreenDecorations);
213 }
214
215 @Test
216 public void showAndGo_doesNothingIfRecentlyHidden() {
217 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400218 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400219 when(mMockPhenotypeHelper.getLong(
220 eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS),
221 anyLong())).thenReturn(10000L);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400222 mAssistHandleBehaviorController.showAndGo();
223 reset(mMockScreenDecorations);
224
225 // Act
226 mAssistHandleBehaviorController.showAndGo();
227
228 // Assert
229 verifyNoMoreInteractions(mMockScreenDecorations);
230 }
231
232 @Test
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400233 public void showAndGo_doesNothingWhenThereIsNoAssistant() {
234 // Arrange
235 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null);
236 mAssistHandleBehaviorController.hide();
237 reset(mMockScreenDecorations);
238
239 // Act
240 mAssistHandleBehaviorController.showAndGo();
241
242 // Assert
243 verifyNoMoreInteractions(mMockScreenDecorations);
244 }
245
246 @Test
Govinda Wasserman48cdd682019-06-04 12:15:23 -0400247 public void showAndGoDelayed_showsThenHidesHandlesWhenHiding() {
248 // Arrange
249 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
250 mAssistHandleBehaviorController.hide();
251 reset(mMockScreenDecorations);
252
253 // Act
254 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
255
256 // Assert
257 InOrder inOrder = inOrder(mMockScreenDecorations);
258 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true);
259 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
260 inOrder.verifyNoMoreInteractions();
261 }
262
263 @Test
264 public void showAndGoDelayed_hidesHandlesAfterTimeoutWhenShowing() {
265 // Arrange
266 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
267 mAssistHandleBehaviorController.showAndStay();
268 reset(mMockScreenDecorations);
269
270 // Act
271 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
272
273 // Assert
274 verify(mMockScreenDecorations).setAssistHintVisible(false);
275 verifyNoMoreInteractions(mMockScreenDecorations);
276 }
277
278 @Test
279 public void showAndGoDelayed_hidesInitiallyThenShowsThenHidesAfterTimeoutWhenHideRequested() {
280 // Arrange
281 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
282 mAssistHandleBehaviorController.showAndStay();
283 reset(mMockScreenDecorations);
284
285 // Act
286 mAssistHandleBehaviorController.showAndGoDelayed(1000, true);
287
288 // Assert
289 InOrder inOrder = inOrder(mMockScreenDecorations);
290 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
291 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(true);
292 inOrder.verify(mMockScreenDecorations).setAssistHintVisible(false);
293 inOrder.verifyNoMoreInteractions();
294 }
295
296 @Test
297 public void showAndGoDelayed_doesNothingIfRecentlyHidden() {
298 // Arrange
299 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
300 when(mMockPhenotypeHelper.getLong(
301 eq(SystemUiDeviceConfigFlags.ASSIST_HANDLES_SHOWN_FREQUENCY_THRESHOLD_MS),
302 anyLong())).thenReturn(10000L);
303 mAssistHandleBehaviorController.showAndGo();
304 reset(mMockScreenDecorations);
305
306 // Act
307 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
308
309 // Assert
310 verifyNoMoreInteractions(mMockScreenDecorations);
311 }
312
313 @Test
314 public void showAndGoDelayed_doesNothingWhenThereIsNoAssistant() {
315 // Arrange
316 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(null);
317 mAssistHandleBehaviorController.hide();
318 reset(mMockScreenDecorations);
319
320 // Act
321 mAssistHandleBehaviorController.showAndGoDelayed(1000, false);
322
323 // Assert
324 verifyNoMoreInteractions(mMockScreenDecorations);
325 }
326
327 @Test
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400328 public void setBehavior_activatesTheBehaviorWhenInGesturalMode() {
329 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400330 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400331 mAssistHandleBehaviorController.setInGesturalModeForTest(true);
332
333 // Act
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400334 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400335
336 // Assert
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400337 verify(mMockTestBehavior).onModeActivated(mContext, mAssistHandleBehaviorController);
338 verifyNoMoreInteractions(mMockTestBehavior);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400339 }
340
341 @Test
342 public void setBehavior_deactivatesThePreviousBehaviorWhenInGesturalMode() {
343 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400344 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
345 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400346 mAssistHandleBehaviorController.setInGesturalModeForTest(true);
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400347 reset(mMockTestBehavior);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400348
349 // Act
350 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.OFF);
351
352 // Assert
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400353 verify(mMockTestBehavior).onModeDeactivated();
354 verifyNoMoreInteractions(mMockTestBehavior);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400355 }
356
357 @Test
358 public void setBehavior_doesNothingWhenNotInGesturalMode() {
359 // Arrange
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400360 when(mMockAssistUtils.getAssistComponentForUser(anyInt())).thenReturn(COMPONENT_NAME);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400361 mAssistHandleBehaviorController.setInGesturalModeForTest(false);
362
363 // Act
Govinda Wasserman5dfe9652019-05-30 13:24:24 -0400364 mAssistHandleBehaviorController.setBehavior(AssistHandleBehavior.TEST);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400365
366 // Assert
Govinda Wasserman3fcd7172019-09-05 16:32:23 -0400367 verifyNoMoreInteractions(mMockTestBehavior);
Govinda Wassermanc7495cd2019-05-20 14:43:28 -0400368 }
369}