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