blob: 04e0a7324adfd591075d9b08d741ee7bafad1311 [file] [log] [blame]
kwaky371e6212020-02-19 13:45:22 -08001/*
2 * Copyright (C) 2020 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
Heemin Seog9b078d32020-04-21 15:07:32 -070017package com.android.systemui.car.navigationbar;
kwaky371e6212020-02-19 13:45:22 -080018
Heemin Seog29ecf612020-04-14 22:47:01 -070019import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
20import static android.view.InsetsState.ITYPE_STATUS_BAR;
JianYang Liu0e3c4782020-05-07 19:15:37 -070021import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
22import static android.view.WindowInsetsController.APPEARANCE_OPAQUE_STATUS_BARS;
Heemin Seog29ecf612020-04-14 22:47:01 -070023
24import static com.google.common.truth.Truth.assertThat;
25
Heemin Seog4860f802020-05-05 00:22:42 -070026import static org.mockito.ArgumentMatchers.any;
kwaky371e6212020-02-19 13:45:22 -080027import static org.mockito.Mockito.verify;
28import static org.mockito.Mockito.when;
29
JianYang Liu0e3c4782020-05-07 19:15:37 -070030import android.graphics.Rect;
kwaky371e6212020-02-19 13:45:22 -080031import android.os.Handler;
Heemin Seog4860f802020-05-05 00:22:42 -070032import android.os.RemoteException;
kwaky371e6212020-02-19 13:45:22 -080033import android.testing.AndroidTestingRunner;
34import android.testing.TestableLooper;
35import android.testing.TestableResources;
Heemin Seog4860f802020-05-05 00:22:42 -070036import android.util.ArrayMap;
Heemin Seog29ecf612020-04-14 22:47:01 -070037import android.view.Display;
kwaky371e6212020-02-19 13:45:22 -080038import android.view.WindowManager;
39
Heemin Seogdf741ac2020-03-27 09:38:26 -070040import androidx.test.filters.SmallTest;
41
Heemin Seog23f18d02020-04-24 17:53:22 -070042import com.android.internal.statusbar.IStatusBarService;
Heemin Seog4860f802020-05-05 00:22:42 -070043import com.android.internal.statusbar.RegisterStatusBarResult;
44import com.android.internal.view.AppearanceRegion;
kwaky371e6212020-02-19 13:45:22 -080045import com.android.systemui.R;
46import com.android.systemui.SysuiTestCase;
47import com.android.systemui.car.CarDeviceProvisionedController;
kwaky371e6212020-02-19 13:45:22 -080048import com.android.systemui.statusbar.CommandQueue;
kwaky371e6212020-02-19 13:45:22 -080049import com.android.systemui.statusbar.phone.AutoHideController;
JianYang Liu0e3c4782020-05-07 19:15:37 -070050import com.android.systemui.statusbar.phone.LightBarController;
51import com.android.systemui.statusbar.phone.LightBarTransitionsController;
Heemin Seog29ecf612020-04-14 22:47:01 -070052import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
kwaky371e6212020-02-19 13:45:22 -080053import com.android.systemui.statusbar.phone.StatusBarIconController;
JianYang Liu0e3c4782020-05-07 19:15:37 -070054import com.android.systemui.statusbar.phone.SysuiDarkIconDispatcher;
kwaky371e6212020-02-19 13:45:22 -080055import com.android.systemui.statusbar.policy.KeyguardStateController;
Heemin Seog4860f802020-05-05 00:22:42 -070056import com.android.systemui.util.concurrency.FakeExecutor;
57import com.android.systemui.util.time.FakeSystemClock;
kwaky371e6212020-02-19 13:45:22 -080058
59import org.junit.Before;
60import org.junit.Test;
61import org.junit.runner.RunWith;
62import org.mockito.ArgumentCaptor;
63import org.mockito.Mock;
64import org.mockito.MockitoAnnotations;
65
kwaky371e6212020-02-19 13:45:22 -080066@RunWith(AndroidTestingRunner.class)
67@TestableLooper.RunWithLooper
68@SmallTest
69public class CarNavigationBarTest extends SysuiTestCase {
70
71 private CarNavigationBar mCarNavigationBar;
72 private TestableResources mTestableResources;
73 private Handler mHandler;
74
75 @Mock
76 private CarNavigationBarController mCarNavigationBarController;
77 @Mock
JianYang Liu0e3c4782020-05-07 19:15:37 -070078 private LightBarController mLightBarController;
79 @Mock
80 private SysuiDarkIconDispatcher mStatusBarIconController;
81 @Mock
82 private LightBarTransitionsController mLightBarTransitionsController;
83 @Mock
kwaky371e6212020-02-19 13:45:22 -080084 private WindowManager mWindowManager;
85 @Mock
86 private CarDeviceProvisionedController mDeviceProvisionedController;
87 @Mock
88 private AutoHideController mAutoHideController;
89 @Mock
90 private ButtonSelectionStateListener mButtonSelectionStateListener;
91 @Mock
Heemin Seog23f18d02020-04-24 17:53:22 -070092 private IStatusBarService mBarService;
93 @Mock
kwaky371e6212020-02-19 13:45:22 -080094 private KeyguardStateController mKeyguardStateController;
95 @Mock
kwaky371e6212020-02-19 13:45:22 -080096 private ButtonSelectionStateController mButtonSelectionStateController;
Heemin Seog29ecf612020-04-14 22:47:01 -070097 @Mock
98 private PhoneStatusBarPolicy mIconPolicy;
99 @Mock
100 private StatusBarIconController mIconController;
kwaky371e6212020-02-19 13:45:22 -0800101
Heemin Seog4860f802020-05-05 00:22:42 -0700102 private RegisterStatusBarResult mBarResult;
JianYang Liu0e3c4782020-05-07 19:15:37 -0700103 private AppearanceRegion[] mAppearanceRegions;
Heemin Seog4860f802020-05-05 00:22:42 -0700104 private FakeExecutor mUiBgExecutor;
105
kwaky371e6212020-02-19 13:45:22 -0800106 @Before
107 public void setUp() {
108 MockitoAnnotations.initMocks(this);
109 mTestableResources = mContext.getOrCreateTestableResources();
kwaky371e6212020-02-19 13:45:22 -0800110 mHandler = Handler.getMain();
Heemin Seog4860f802020-05-05 00:22:42 -0700111 mUiBgExecutor = new FakeExecutor(new FakeSystemClock());
JianYang Liu0e3c4782020-05-07 19:15:37 -0700112 when(mStatusBarIconController.getTransitionsController()).thenReturn(
113 mLightBarTransitionsController);
114 mAppearanceRegions = new AppearanceRegion[] {
115 new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect())
116 };
Heemin Seog4860f802020-05-05 00:22:42 -0700117 mBarResult = new RegisterStatusBarResult(
118 /* icons= */ new ArrayMap<>(),
119 /* disabledFlags1= */ 0,
120 /* appearance= */ 0,
JianYang Liu0e3c4782020-05-07 19:15:37 -0700121 mAppearanceRegions,
Heemin Seog4860f802020-05-05 00:22:42 -0700122 /* imeWindowVis= */ 0,
123 /* imeBackDisposition= */ 0,
124 /* showImeSwitcher= */ false,
125 /* disabledFlags2= */ 0,
126 /* imeToken= */ null,
127 /* navbarColorMangedByIme= */ false,
128 /* appFullscreen= */ false,
129 /* appImmersive= */ false,
130 /* transientBarTypes= */ new int[]{});
131 try {
132 when(mBarService.registerStatusBar(any())).thenReturn(mBarResult);
133 } catch (RemoteException e) {
134 e.printStackTrace();
135 }
Heemin Seog29ecf612020-04-14 22:47:01 -0700136 mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
JianYang Liu0e3c4782020-05-07 19:15:37 -0700137 mCarNavigationBarController, mLightBarController, mStatusBarIconController,
138 mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext),
139 mAutoHideController, mButtonSelectionStateListener, mHandler, mUiBgExecutor,
140 mBarService, () -> mKeyguardStateController, mButtonSelectionStateController,
141 () -> mIconPolicy, () -> mIconController);
kwaky371e6212020-02-19 13:45:22 -0800142 }
143
144 @Test
145 public void restartNavbars_refreshesTaskChanged() {
Heemin Seog29ecf612020-04-14 22:47:01 -0700146 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
147 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
kwaky371e6212020-02-19 13:45:22 -0800148 ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
149 deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
150 CarDeviceProvisionedController.DeviceProvisionedListener.class);
151 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
152 mCarNavigationBar.start();
153 // switching the currentUserSetup value to force restart the navbars.
154 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
155 verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
156
157 deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
Heemin Seog4860f802020-05-05 00:22:42 -0700158 waitForIdleSync(mHandler);
kwaky371e6212020-02-19 13:45:22 -0800159
160 verify(mButtonSelectionStateListener).onTaskStackChanged();
161 }
JianYang Liu4fbd9812020-03-09 13:39:58 -0700162
163 @Test
164 public void restartNavBars_newUserNotSetupWithKeyguardShowing_showsKeyguardButtons() {
Heemin Seog29ecf612020-04-14 22:47:01 -0700165 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
166 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
JianYang Liu4fbd9812020-03-09 13:39:58 -0700167 ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
168 deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
169 CarDeviceProvisionedController.DeviceProvisionedListener.class);
170 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
171 mCarNavigationBar.start();
172 when(mKeyguardStateController.isShowing()).thenReturn(true);
173 // switching the currentUserSetup value to force restart the navbars.
174 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
175 verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
176
177 deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
Heemin Seog4860f802020-05-05 00:22:42 -0700178 waitForIdleSync(mHandler);
JianYang Liu4fbd9812020-03-09 13:39:58 -0700179
180 verify(mCarNavigationBarController).showAllKeyguardButtons(false);
181 }
182
183 @Test
184 public void restartNavbars_newUserIsSetupWithKeyguardHidden_hidesKeyguardButtons() {
Heemin Seog29ecf612020-04-14 22:47:01 -0700185 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
186 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
JianYang Liu4fbd9812020-03-09 13:39:58 -0700187 ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
188 deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
189 CarDeviceProvisionedController.DeviceProvisionedListener.class);
190 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
191 mCarNavigationBar.start();
192 when(mKeyguardStateController.isShowing()).thenReturn(true);
193 // switching the currentUserSetup value to force restart the navbars.
194 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(false);
195 verify(mDeviceProvisionedController).addCallback(deviceProvisionedCallbackCaptor.capture());
196 deviceProvisionedCallbackCaptor.getValue().onUserSwitched();
Heemin Seog4860f802020-05-05 00:22:42 -0700197 waitForIdleSync(mHandler);
JianYang Liu4fbd9812020-03-09 13:39:58 -0700198 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
199 when(mKeyguardStateController.isShowing()).thenReturn(false);
200
201 deviceProvisionedCallbackCaptor.getValue().onUserSetupChanged();
Heemin Seog4860f802020-05-05 00:22:42 -0700202 waitForIdleSync(mHandler);
JianYang Liu4fbd9812020-03-09 13:39:58 -0700203
204 verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
205 }
Heemin Seog29ecf612020-04-14 22:47:01 -0700206
207 @Test
JianYang Liu0e3c4782020-05-07 19:15:37 -0700208 public void restartNavBars_lightAppearance_darkensAllIcons() {
209 mAppearanceRegions[0] = new AppearanceRegion(APPEARANCE_LIGHT_STATUS_BARS, new Rect());
210
211 mCarNavigationBar.start();
212
213 verify(mLightBarTransitionsController).setIconsDark(
214 /* dark= */ true, /* animate= */ false);
215 }
216
217 @Test
218 public void restartNavBars_opaqueAppearance_lightensAllIcons() {
219 mAppearanceRegions[0] = new AppearanceRegion(APPEARANCE_OPAQUE_STATUS_BARS, new Rect());
220
221 mCarNavigationBar.start();
222
223 verify(mLightBarTransitionsController).setIconsDark(
224 /* dark= */ false, /* animate= */ false);
225 }
226
227 @Test
Heemin Seog29ecf612020-04-14 22:47:01 -0700228 public void showTransient_wrongDisplayId_transientModeNotUpdated() {
229 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
230 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
231 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
232 mCarNavigationBar.start();
233
234 int randomDisplay = Display.DEFAULT_DISPLAY + 10;
235 int[] insetTypes = new int[]{};
236 mCarNavigationBar.showTransient(randomDisplay, insetTypes);
237
238 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
239 }
240
241 @Test
242 public void showTransient_correctDisplayId_noStatusBarInset_transientModeNotUpdated() {
243 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
244 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
245 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
246 mCarNavigationBar.start();
247
248 int[] insetTypes = new int[]{};
249 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
250
251 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
252 }
253
254 @Test
255 public void showTransient_correctDisplayId_statusBarInset_transientModeUpdated() {
256 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
257 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
258 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
259 mCarNavigationBar.start();
260
261 int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
262 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
263
264 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
265 }
266
267 @Test
268 public void showTransient_correctDisplayId_noNavBarInset_transientModeNotUpdated() {
269 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
270 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
271 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
272 mCarNavigationBar.start();
273
274 int[] insetTypes = new int[]{};
275 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
276
277 assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
278 }
279
280 @Test
281 public void showTransient_correctDisplayId_navBarInset_transientModeUpdated() {
282 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
283 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
284 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
285 mCarNavigationBar.start();
286
287 int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
288 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
289
290 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
291 }
292
293 @Test
294 public void abortTransient_wrongDisplayId_transientModeNotCleared() {
295 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
296 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
297 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
298 mCarNavigationBar.start();
299 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
300 new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
301 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
302 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
303
304 int[] insetTypes = new int[]{};
305 int randomDisplay = Display.DEFAULT_DISPLAY + 10;
306 mCarNavigationBar.abortTransient(randomDisplay, insetTypes);
307
308 // The transient booleans were not cleared.
309 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
310 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
311 }
312
313 @Test
314 public void abortTransient_correctDisplayId_noInsets_transientModeNotCleared() {
315 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
316 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
317 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
318 mCarNavigationBar.start();
319 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
320 new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
321 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
322 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
323
324 int[] insetTypes = new int[]{};
325 mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
326
327 // The transient booleans were not cleared.
328 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
329 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
330 }
331
332 @Test
333 public void abortTransient_correctDisplayId_statusBarInset_transientModeCleared() {
334 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
335 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
336 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
337 mCarNavigationBar.start();
338 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
339 new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
340 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
341 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
342
343 int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
344 mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
345
346 // The transient booleans were cleared.
347 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
348 assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
349 }
350
351 @Test
352 public void abortTransient_correctDisplayId_navBarInset_transientModeCleared() {
353 mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
354 mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
355 when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
356 mCarNavigationBar.start();
357 mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
358 new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
359 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
360 assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
361
362 int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
363 mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
364
365 // The transient booleans were cleared.
366 assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
367 assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
368 }
kwaky371e6212020-02-19 13:45:22 -0800369}