1 /* 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 17 package com.android.systemui.navigationbar; 18 19 import static android.app.StatusBarManager.NAVIGATION_HINT_BACK_ALT; 20 import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SHOWN; 21 import static android.app.StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN; 22 import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEFAULT; 23 import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; 24 import static android.inputmethodservice.InputMethodService.IME_VISIBLE; 25 import static android.view.Display.DEFAULT_DISPLAY; 26 import static android.view.DisplayAdjustments.DEFAULT_DISPLAY_ADJUSTMENTS; 27 import static android.view.WindowInsets.Type.ime; 28 29 import static com.android.internal.config.sysui.SystemUiDeviceConfigFlags.HOME_BUTTON_LONG_PRESS_DURATION_MS; 30 import static com.android.systemui.navigationbar.NavigationBar.NavBarActionEvent.NAVBAR_ASSIST_LONGPRESS; 31 import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_SCREEN_PINNING; 32 33 import static org.junit.Assert.assertEquals; 34 import static org.junit.Assert.assertFalse; 35 import static org.junit.Assert.assertTrue; 36 import static org.mockito.ArgumentMatchers.any; 37 import static org.mockito.ArgumentMatchers.anyBoolean; 38 import static org.mockito.ArgumentMatchers.anyInt; 39 import static org.mockito.Matchers.eq; 40 import static org.mockito.Mockito.doNothing; 41 import static org.mockito.Mockito.doReturn; 42 import static org.mockito.Mockito.mock; 43 import static org.mockito.Mockito.spy; 44 import static org.mockito.Mockito.times; 45 import static org.mockito.Mockito.verify; 46 import static org.mockito.Mockito.when; 47 48 import android.app.ActivityManager; 49 import android.content.Context; 50 import android.content.res.Resources; 51 import android.hardware.display.DisplayManagerGlobal; 52 import android.os.Handler; 53 import android.os.SystemClock; 54 import android.provider.DeviceConfig; 55 import android.telecom.TelecomManager; 56 import android.testing.AndroidTestingRunner; 57 import android.testing.TestableLooper; 58 import android.testing.TestableLooper.RunWithLooper; 59 import android.view.Display; 60 import android.view.DisplayInfo; 61 import android.view.IWindowManager; 62 import android.view.MotionEvent; 63 import android.view.View; 64 import android.view.ViewRootImpl; 65 import android.view.ViewTreeObserver; 66 import android.view.WindowInsets; 67 import android.view.WindowManager; 68 import android.view.WindowMetrics; 69 import android.view.accessibility.AccessibilityManager; 70 import android.view.inputmethod.InputMethodManager; 71 72 import androidx.test.filters.SmallTest; 73 74 import com.android.internal.logging.MetricsLogger; 75 import com.android.internal.logging.UiEventLogger; 76 import com.android.systemui.SysuiTestCase; 77 import com.android.systemui.SysuiTestableContext; 78 import com.android.systemui.accessibility.AccessibilityButtonModeObserver; 79 import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; 80 import com.android.systemui.accessibility.SystemActions; 81 import com.android.systemui.assist.AssistManager; 82 import com.android.systemui.dump.DumpManager; 83 import com.android.systemui.keyguard.WakefulnessLifecycle; 84 import com.android.systemui.model.SysUiState; 85 import com.android.systemui.navigationbar.buttons.ButtonDispatcher; 86 import com.android.systemui.navigationbar.buttons.DeadZone; 87 import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; 88 import com.android.systemui.plugins.statusbar.StatusBarStateController; 89 import com.android.systemui.recents.OverviewProxyService; 90 import com.android.systemui.recents.Recents; 91 import com.android.systemui.settings.DisplayTracker; 92 import com.android.systemui.settings.FakeDisplayTracker; 93 import com.android.systemui.settings.UserContextProvider; 94 import com.android.systemui.settings.UserTracker; 95 import com.android.systemui.shade.NotificationShadeWindowView; 96 import com.android.systemui.shade.ShadeController; 97 import com.android.systemui.shared.rotation.RotationButtonController; 98 import com.android.systemui.shared.system.TaskStackChangeListeners; 99 import com.android.systemui.statusbar.CommandQueue; 100 import com.android.systemui.statusbar.NotificationRemoteInputManager; 101 import com.android.systemui.statusbar.NotificationShadeDepthController; 102 import com.android.systemui.statusbar.phone.AutoHideController; 103 import com.android.systemui.statusbar.phone.CentralSurfaces; 104 import com.android.systemui.statusbar.phone.LightBarController; 105 import com.android.systemui.statusbar.phone.LightBarTransitionsController; 106 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; 107 import com.android.systemui.statusbar.policy.DeviceProvisionedController; 108 import com.android.systemui.statusbar.policy.KeyguardStateController; 109 import com.android.systemui.util.DeviceConfigProxyFake; 110 import com.android.systemui.util.concurrency.FakeExecutor; 111 import com.android.systemui.util.time.FakeSystemClock; 112 import com.android.systemui.utils.leaks.LeakCheckedTest; 113 import com.android.wm.shell.back.BackAnimation; 114 import com.android.wm.shell.pip.Pip; 115 116 import org.junit.Before; 117 import org.junit.Rule; 118 import org.junit.Test; 119 import org.junit.runner.RunWith; 120 import org.mockito.Mock; 121 import org.mockito.MockitoAnnotations; 122 123 import java.util.Optional; 124 import java.util.concurrent.Executor; 125 126 @RunWith(AndroidTestingRunner.class) 127 @RunWithLooper(setAsMainLooper = true) 128 @SmallTest 129 public class NavigationBarTest extends SysuiTestCase { 130 private static final int EXTERNAL_DISPLAY_ID = 2; 131 132 private NavigationBar mNavigationBar; 133 private NavigationBar mExternalDisplayNavigationBar; 134 135 private SysuiTestableContext mSysuiTestableContextExternal; 136 @Mock 137 NavigationBarView mNavigationBarView; 138 @Mock 139 NavigationBarFrame mNavigationBarFrame; 140 @Mock 141 ButtonDispatcher mHomeButton; 142 @Mock 143 ButtonDispatcher mRecentsButton; 144 @Mock 145 ButtonDispatcher mAccessibilityButton; 146 @Mock 147 ButtonDispatcher mImeSwitchButton; 148 @Mock 149 ButtonDispatcher mBackButton; 150 @Mock 151 NavigationBarTransitions mNavigationBarTransitions; 152 @Mock 153 RotationButtonController mRotationButtonController; 154 @Mock 155 LightBarTransitionsController mLightBarTransitionsController; 156 @Mock 157 private SystemActions mSystemActions; 158 @Mock 159 private OverviewProxyService mOverviewProxyService; 160 @Mock 161 private StatusBarStateController mStatusBarStateController; 162 @Mock 163 private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; 164 @Mock 165 private NavigationModeController mNavigationModeController; 166 @Mock 167 private CommandQueue mCommandQueue; 168 private SysUiState mMockSysUiState; 169 @Mock 170 private Handler mHandler; 171 @Mock 172 private UserTracker mUserTracker; 173 @Mock 174 private UiEventLogger mUiEventLogger; 175 @Mock 176 private ViewTreeObserver mViewTreeObserver; 177 NavBarHelper mNavBarHelper; 178 @Mock 179 private LightBarController mLightBarController; 180 @Mock 181 private LightBarController.Factory mLightBarcontrollerFactory; 182 @Mock 183 private AutoHideController mAutoHideController; 184 @Mock 185 private AutoHideController.Factory mAutoHideControllerFactory; 186 @Mock 187 private WindowManager mWindowManager; 188 @Mock 189 private TelecomManager mTelecomManager; 190 @Mock 191 private InputMethodManager mInputMethodManager; 192 @Mock 193 private AssistManager mAssistManager; 194 @Mock 195 private DeadZone mDeadZone; 196 @Mock 197 private CentralSurfaces mCentralSurfaces; 198 @Mock 199 private KeyguardStateController mKeyguardStateController; 200 @Mock 201 private UserContextProvider mUserContextProvider; 202 @Mock 203 private WakefulnessLifecycle mWakefulnessLifecycle; 204 @Mock 205 private Resources mResources; 206 @Mock 207 private ViewRootImpl mViewRootImpl; 208 @Mock 209 private EdgeBackGestureHandler.Factory mEdgeBackGestureHandlerFactory; 210 @Mock 211 private EdgeBackGestureHandler mEdgeBackGestureHandler; 212 private FakeExecutor mFakeExecutor = new FakeExecutor(new FakeSystemClock()); 213 private DeviceConfigProxyFake mDeviceConfigProxyFake = new DeviceConfigProxyFake(); 214 private TaskStackChangeListeners mTaskStackChangeListeners = 215 TaskStackChangeListeners.getTestInstance(); 216 217 @Rule 218 public final LeakCheckedTest.SysuiLeakCheck mLeakCheck = new LeakCheckedTest.SysuiLeakCheck(); 219 220 @Before setup()221 public void setup() throws Exception { 222 MockitoAnnotations.initMocks(this); 223 224 when(mLightBarcontrollerFactory.create(any(Context.class))).thenReturn(mLightBarController); 225 when(mAutoHideControllerFactory.create(any(Context.class))).thenReturn(mAutoHideController); 226 when(mNavigationBarView.getHomeButton()).thenReturn(mHomeButton); 227 when(mNavigationBarView.getRecentsButton()).thenReturn(mRecentsButton); 228 when(mNavigationBarView.getAccessibilityButton()).thenReturn(mAccessibilityButton); 229 when(mNavigationBarView.getImeSwitchButton()).thenReturn(mImeSwitchButton); 230 when(mNavigationBarView.getBackButton()).thenReturn(mBackButton); 231 when(mNavigationBarView.getRotationButtonController()) 232 .thenReturn(mRotationButtonController); 233 when(mNavigationBarTransitions.getLightTransitionsController()) 234 .thenReturn(mLightBarTransitionsController); 235 when(mStatusBarKeyguardViewManager.isNavBarVisible()).thenReturn(true); 236 when(mNavigationBarView.getViewTreeObserver()).thenReturn(mViewTreeObserver); 237 when(mUserContextProvider.createCurrentUserContext(any(Context.class))) 238 .thenReturn(mContext); 239 when(mNavigationBarView.getResources()).thenReturn(mResources); 240 when(mNavigationBarView.getViewRootImpl()).thenReturn(mViewRootImpl); 241 when(mEdgeBackGestureHandlerFactory.create(any())).thenReturn(mEdgeBackGestureHandler); 242 setupSysuiDependency(); 243 // This class inflates views that call Dependency.get, thus these injections are still 244 // necessary. 245 mDependency.injectTestDependency(AssistManager.class, mAssistManager); 246 mDependency.injectMockDependency(KeyguardStateController.class); 247 mDependency.injectTestDependency(StatusBarStateController.class, mStatusBarStateController); 248 mDependency.injectMockDependency(NavigationBarController.class); 249 mDependency.injectTestDependency(OverviewProxyService.class, mOverviewProxyService); 250 mDependency.injectTestDependency(NavigationModeController.class, mNavigationModeController); 251 TestableLooper.get(this).runWithLooper(() -> { 252 mNavBarHelper = spy(new NavBarHelper(mContext, mock(AccessibilityManager.class), 253 mock(AccessibilityButtonModeObserver.class), 254 mock(AccessibilityButtonTargetsObserver.class), 255 mSystemActions, mOverviewProxyService, 256 () -> mock(AssistManager.class), () -> Optional.of(mCentralSurfaces), 257 mKeyguardStateController, mock(NavigationModeController.class), 258 mEdgeBackGestureHandlerFactory, mock(IWindowManager.class), 259 mock(UserTracker.class), mock(DisplayTracker.class), mock(DumpManager.class), 260 mock(CommandQueue.class))); 261 mNavigationBar = createNavBar(mContext); 262 mExternalDisplayNavigationBar = createNavBar(mSysuiTestableContextExternal); 263 }); 264 } 265 setupSysuiDependency()266 private void setupSysuiDependency() { 267 Display display = new Display(DisplayManagerGlobal.getInstance(), EXTERNAL_DISPLAY_ID, 268 new DisplayInfo(), DEFAULT_DISPLAY_ADJUSTMENTS); 269 mSysuiTestableContextExternal = (SysuiTestableContext) getContext().createDisplayContext( 270 display); 271 272 Display defaultDisplay = mContext.getDisplay(); 273 when(mWindowManager.getDefaultDisplay()).thenReturn(defaultDisplay); 274 WindowMetrics metrics = mContext.getSystemService(WindowManager.class) 275 .getMaximumWindowMetrics(); 276 when(mWindowManager.getMaximumWindowMetrics()).thenReturn(metrics); 277 WindowMetrics currentWindowMetrics = mContext.getSystemService(WindowManager.class) 278 .getCurrentWindowMetrics(); 279 when(mWindowManager.getCurrentWindowMetrics()).thenReturn(currentWindowMetrics); 280 doNothing().when(mWindowManager).addView(any(), any()); 281 doNothing().when(mWindowManager).removeViewImmediate(any()); 282 mMockSysUiState = mock(SysUiState.class); 283 when(mMockSysUiState.setFlag(anyInt(), anyBoolean())).thenReturn(mMockSysUiState); 284 285 mContext.addMockSystemService(WindowManager.class, mWindowManager); 286 mSysuiTestableContextExternal.addMockSystemService(WindowManager.class, mWindowManager); 287 } 288 289 @Test testHomeLongPress()290 public void testHomeLongPress() { 291 mNavigationBar.init(); 292 mNavigationBar.onViewAttached(); 293 mNavigationBar.onHomeLongClick(mNavigationBar.getView()); 294 295 verify(mUiEventLogger, times(1)).log(NAVBAR_ASSIST_LONGPRESS); 296 } 297 298 @Test testHomeLongPressWithCustomDuration()299 public void testHomeLongPressWithCustomDuration() throws Exception { 300 mDeviceConfigProxyFake.setProperty( 301 DeviceConfig.NAMESPACE_SYSTEMUI, 302 HOME_BUTTON_LONG_PRESS_DURATION_MS, 303 "100", 304 false); 305 when(mNavBarHelper.getLongPressHomeEnabled()).thenReturn(true); 306 mNavigationBar.init(); 307 mNavigationBar.onViewAttached(); 308 309 mNavigationBar.onHomeTouch(mNavigationBar.getView(), MotionEvent.obtain( 310 /*downTime=*/SystemClock.uptimeMillis(), 311 /*eventTime=*/SystemClock.uptimeMillis(), 312 /*action=*/MotionEvent.ACTION_DOWN, 313 0, 0, 0 314 )); 315 verify(mHandler, times(1)).postDelayed(any(), eq(100L)); 316 317 mNavigationBar.onHomeTouch(mNavigationBar.getView(), MotionEvent.obtain( 318 /*downTime=*/SystemClock.uptimeMillis(), 319 /*eventTime=*/SystemClock.uptimeMillis(), 320 /*action=*/MotionEvent.ACTION_UP, 321 0, 0, 0 322 )); 323 324 verify(mHandler, times(1)).removeCallbacks(any()); 325 } 326 327 @Test testRegisteredWithUserTracker()328 public void testRegisteredWithUserTracker() { 329 mNavigationBar.init(); 330 mNavigationBar.onViewAttached(); 331 verify(mUserTracker).addCallback(any(UserTracker.Callback.class), any(Executor.class)); 332 } 333 334 @Test testSetImeWindowStatusWhenImeSwitchOnDisplay()335 public void testSetImeWindowStatusWhenImeSwitchOnDisplay() { 336 // Create default & external NavBar fragment. 337 NavigationBar defaultNavBar = mNavigationBar; 338 NavigationBar externalNavBar = mExternalDisplayNavigationBar; 339 NotificationShadeWindowView mockShadeWindowView = mock(NotificationShadeWindowView.class); 340 WindowInsets windowInsets = new WindowInsets.Builder().setVisible(ime(), false).build(); 341 doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets(); 342 doReturn(mockShadeWindowView).when(mCentralSurfaces).getNotificationShadeWindowView(); 343 doReturn(true).when(mockShadeWindowView).isAttachedToWindow(); 344 doNothing().when(defaultNavBar).checkNavBarModes(); 345 doNothing().when(externalNavBar).checkNavBarModes(); 346 defaultNavBar.init(); 347 externalNavBar.init(); 348 349 defaultNavBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, 350 BACK_DISPOSITION_DEFAULT, true); 351 352 // Verify IME window state will be updated in default NavBar & external NavBar state reset. 353 assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN 354 | NAVIGATION_HINT_IME_SWITCHER_SHOWN, 355 defaultNavBar.getNavigationIconHints()); 356 assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); 357 assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); 358 assertFalse((externalNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SWITCHER_SHOWN) 359 != 0); 360 361 externalNavBar.setImeWindowStatus(EXTERNAL_DISPLAY_ID, null, IME_VISIBLE, 362 BACK_DISPOSITION_DEFAULT, true); 363 defaultNavBar.setImeWindowStatus( 364 DEFAULT_DISPLAY, null, IME_INVISIBLE, BACK_DISPOSITION_DEFAULT, false); 365 // Verify IME window state will be updated in external NavBar & default NavBar state reset. 366 assertEquals(NAVIGATION_HINT_BACK_ALT | NAVIGATION_HINT_IME_SHOWN 367 | NAVIGATION_HINT_IME_SWITCHER_SHOWN, 368 externalNavBar.getNavigationIconHints()); 369 assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); 370 assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); 371 assertFalse((defaultNavBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SWITCHER_SHOWN) 372 != 0); 373 } 374 375 @Test testSetImeWindowStatusWhenKeyguardLockingAndImeInsetsChange()376 public void testSetImeWindowStatusWhenKeyguardLockingAndImeInsetsChange() { 377 NotificationShadeWindowView mockShadeWindowView = mock(NotificationShadeWindowView.class); 378 doReturn(mockShadeWindowView).when(mCentralSurfaces).getNotificationShadeWindowView(); 379 doReturn(true).when(mockShadeWindowView).isAttachedToWindow(); 380 doNothing().when(mNavigationBar).checkNavBarModes(); 381 mNavigationBar.init(); 382 WindowInsets windowInsets = new WindowInsets.Builder().setVisible(ime(), false).build(); 383 doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets(); 384 385 // Verify navbar altered back icon when an app is showing IME 386 mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, 387 BACK_DISPOSITION_DEFAULT, true); 388 assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); 389 assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); 390 assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SWITCHER_SHOWN) 391 != 0); 392 393 // Verify navbar didn't alter and showing back icon when the keyguard is showing without 394 // requesting IME insets visible. 395 doReturn(true).when(mKeyguardStateController).isShowing(); 396 mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, 397 BACK_DISPOSITION_DEFAULT, true); 398 assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); 399 assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); 400 assertFalse((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SWITCHER_SHOWN) 401 != 0); 402 403 // Verify navbar altered and showing back icon when the keyguard is showing and 404 // requesting IME insets visible. 405 windowInsets = new WindowInsets.Builder().setVisible(ime(), true).build(); 406 doReturn(windowInsets).when(mockShadeWindowView).getRootWindowInsets(); 407 mNavigationBar.setImeWindowStatus(DEFAULT_DISPLAY, null, IME_VISIBLE, 408 BACK_DISPOSITION_DEFAULT, true); 409 assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_BACK_ALT) != 0); 410 assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SHOWN) != 0); 411 assertTrue((mNavigationBar.getNavigationIconHints() & NAVIGATION_HINT_IME_SWITCHER_SHOWN) 412 != 0); 413 } 414 415 @Test testA11yEventAfterDetach()416 public void testA11yEventAfterDetach() { 417 mNavigationBar.init(); 418 mNavigationBar.onViewAttached(); 419 verify(mNavBarHelper).registerNavTaskStateUpdater(any( 420 NavBarHelper.NavbarTaskbarStateUpdater.class)); 421 mNavigationBar.onViewDetached(); 422 verify(mNavBarHelper).removeNavTaskStateUpdater(any( 423 NavBarHelper.NavbarTaskbarStateUpdater.class)); 424 425 // Should be safe even though the internal view is now null. 426 mNavigationBar.updateAccessibilityStateFlags(); 427 } 428 429 @Test testCreateView_initiallyVisible_viewIsVisible()430 public void testCreateView_initiallyVisible_viewIsVisible() { 431 when(mStatusBarKeyguardViewManager.isNavBarVisible()).thenReturn(true); 432 mNavigationBar.init(); 433 mNavigationBar.onViewAttached(); 434 435 verify(mNavigationBarView).setVisibility(View.VISIBLE); 436 } 437 438 @Test testCreateView_initiallyNotVisible_viewIsNotVisible()439 public void testCreateView_initiallyNotVisible_viewIsNotVisible() { 440 when(mStatusBarKeyguardViewManager.isNavBarVisible()).thenReturn(false); 441 mNavigationBar.init(); 442 mNavigationBar.onViewAttached(); 443 444 verify(mNavigationBarView).setVisibility(View.INVISIBLE); 445 } 446 447 @Test testOnInit_readCurrentSysuiState()448 public void testOnInit_readCurrentSysuiState() { 449 mNavigationBar.init(); 450 verify(mNavBarHelper, times(1)).getCurrentSysuiState(); 451 } 452 453 @Test testScreenPinningEnabled_updatesSysuiState()454 public void testScreenPinningEnabled_updatesSysuiState() { 455 mNavigationBar.init(); 456 mTaskStackChangeListeners.getListenerImpl().onLockTaskModeChanged( 457 ActivityManager.LOCK_TASK_MODE_PINNED); 458 verify(mMockSysUiState).setFlag(eq(SYSUI_STATE_SCREEN_PINNING), eq(true)); 459 } 460 createNavBar(Context context)461 private NavigationBar createNavBar(Context context) { 462 DeviceProvisionedController deviceProvisionedController = 463 mock(DeviceProvisionedController.class); 464 when(deviceProvisionedController.isDeviceProvisioned()).thenReturn(true); 465 return spy(new NavigationBar( 466 mNavigationBarView, 467 mNavigationBarFrame, 468 null, 469 context, 470 mWindowManager, 471 () -> mAssistManager, 472 mock(AccessibilityManager.class), 473 deviceProvisionedController, 474 new MetricsLogger(), 475 mOverviewProxyService, 476 mNavigationModeController, 477 mStatusBarStateController, 478 mStatusBarKeyguardViewManager, 479 mMockSysUiState, 480 mUserTracker, 481 mCommandQueue, 482 Optional.of(mock(Pip.class)), 483 Optional.of(mock(Recents.class)), 484 () -> Optional.of(mCentralSurfaces), 485 mock(ShadeController.class), 486 mock(NotificationRemoteInputManager.class), 487 mock(NotificationShadeDepthController.class), 488 mHandler, 489 mFakeExecutor, 490 mFakeExecutor, 491 mUiEventLogger, 492 mNavBarHelper, 493 mLightBarController, 494 mLightBarcontrollerFactory, 495 mAutoHideController, 496 mAutoHideControllerFactory, 497 Optional.of(mTelecomManager), 498 mInputMethodManager, 499 mDeadZone, 500 mDeviceConfigProxyFake, 501 mNavigationBarTransitions, 502 Optional.of(mock(BackAnimation.class)), 503 mUserContextProvider, 504 mWakefulnessLifecycle, 505 mTaskStackChangeListeners, 506 new FakeDisplayTracker(mContext))); 507 } 508 processAllMessages()509 private void processAllMessages() { 510 TestableLooper.get(this).processAllMessages(); 511 } 512 } 513