diff --git a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml index 3e35df9d9b0cf..f617ec06ae528 100644 --- a/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml +++ b/packages/CarSystemUI/res-keyguard/layout/keyguard_container.xml @@ -14,10 +14,7 @@ ~ limitations under the License. --> - - diff --git a/packages/CarSystemUI/res-keyguard/values/dimens.xml b/packages/CarSystemUI/res-keyguard/values/dimens.xml index 8dfe1716ef54d..3c139586c2cc7 100644 --- a/packages/CarSystemUI/res-keyguard/values/dimens.xml +++ b/packages/CarSystemUI/res-keyguard/values/dimens.xml @@ -17,10 +17,8 @@ 112dp 144dp - 80dp + 120dp 80dp - @*android:dimen/car_padding_5 - @*android:dimen/car_padding_5 @dimen/num_pad_key_height 1dp 128dp diff --git a/packages/CarSystemUI/res-keyguard/values/styles.xml b/packages/CarSystemUI/res-keyguard/values/styles.xml index ecea30a13ced1..ca37428a9fd92 100644 --- a/packages/CarSystemUI/res-keyguard/values/styles.xml +++ b/packages/CarSystemUI/res-keyguard/values/styles.xml @@ -23,12 +23,11 @@ @dimen/num_pad_key_width @dimen/num_pad_key_height @dimen/num_pad_key_margin_bottom + ?android:attr/selectableItemBackground @id/pinEntry diff --git a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml index 99df6d52de073..f987b5a650bc7 100644 --- a/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml +++ b/packages/CarSystemUI/res/layout/car_fullscreen_user_switcher.xml @@ -14,29 +14,36 @@ See the License for the specific language governing permissions and limitations under the License. --> - - - - - - + - - + android:layout_height="match_parent" + android:background="@color/car_user_switcher_background_color" + android:orientation="vertical"> - + + + + + + + + + diff --git a/packages/CarSystemUI/res/layout/notification_center_activity.xml b/packages/CarSystemUI/res/layout/notification_center_activity.xml index 0e45e43132de2..51d23db79e8dd 100644 --- a/packages/CarSystemUI/res/layout/notification_center_activity.xml +++ b/packages/CarSystemUI/res/layout/notification_center_activity.xml @@ -22,10 +22,6 @@ android:layout_height="match_parent" android:background="@color/notification_shade_background_color"> - - - - - + app:layout_constraintTop_toTopOf="parent"/> diff --git a/packages/CarSystemUI/res/layout/notification_panel_container.xml b/packages/CarSystemUI/res/layout/notification_panel_container.xml index 3b53c6aaeac31..de69769b2bb0e 100644 --- a/packages/CarSystemUI/res/layout/notification_panel_container.xml +++ b/packages/CarSystemUI/res/layout/notification_panel_container.xml @@ -14,7 +14,7 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - + + + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/notification_panel_container" + android:layout_marginBottom="@dimen/car_bottom_navigation_bar_height"/> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/keyguard_container" /> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/car_fullscreen_user_switcher"/> + android:layout_width="match_parent" + android:layout_height="match_parent" + android:layout="@layout/car_user_switching_dialog"/> \ No newline at end of file diff --git a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java index ec018f9bb62e5..53d2320b3f9fb 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/keyguard/CarKeyguardViewController.java @@ -147,6 +147,11 @@ public class CarKeyguardViewController extends OverlayViewController implements registerUserSwitchedListener(); } + @Override + protected int getFocusAreaViewId() { + return R.id.keyguard_container; + } + @Override protected boolean shouldShowNavigationBarInsets() { return true; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java index b83fcf4bf8b5c..6597144a088a5 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/notification/NotificationPanelViewController.java @@ -218,6 +218,11 @@ public class NotificationPanelViewController extends OverlayPanelViewController mNotificationVisibilityLogger.stop(); } + @Override + protected int getFocusAreaViewId() { + return R.id.notification_container; + } + @Override protected boolean shouldShowNavigationBarInsets() { return true; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java index 5fc7299f68c5a..dd59efa7b0b26 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/userswitcher/FullScreenUserSwitcherViewController.java @@ -76,7 +76,7 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController } if (event.getAction() == KeyEvent.ACTION_UP && getLayout().isVisibleToUser()) { - getLayout().setVisibility(View.GONE); + stop(); } return true; }); @@ -91,6 +91,11 @@ public class FullScreenUserSwitcherViewController extends OverlayViewController registerCarUserManagerIfPossible(); } + @Override + protected int getFocusAreaViewId() { + return R.id.user_switcher_container; + } + @Override protected boolean shouldFocusWindow() { return true; diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java index 8adc1adcc41c4..7bc17765d9fc4 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewController.java @@ -17,12 +17,17 @@ package com.android.systemui.car.window; import static android.view.WindowInsets.Type.statusBars; +import static android.view.accessibility.AccessibilityNodeInfo.ACTION_FOCUS; import android.view.View; import android.view.ViewGroup; import android.view.ViewStub; import android.view.WindowInsets; +import androidx.annotation.IdRes; + +import com.android.car.ui.FocusArea; + /** * Owns a {@link View} that is present in SystemUIOverlayWindow. */ @@ -128,6 +133,66 @@ public class OverlayViewController { return mOverlayViewGlobalStateController; } + /** Returns whether the view controlled by this controller is visible. */ + public final boolean isVisible() { + return mLayout.getVisibility() == View.VISIBLE; + } + + /** + * Returns the ID of the focus area that should receive focus when this view is the + * topmost view or {@link View#NO_ID} if there is no focus area. + */ + @IdRes + protected int getFocusAreaViewId() { + return View.NO_ID; + } + + /** Returns whether the view controlled by this controller has rotary focus. */ + protected final boolean hasRotaryFocus() { + return !mLayout.isInTouchMode() && mLayout.hasFocus(); + } + + /** + * Sets whether this view allows rotary focus. This should be set to {@code true} for the + * topmost layer in the overlay window and {@code false} for the others. + */ + public void setAllowRotaryFocus(boolean allowRotaryFocus) { + if (!isInflated()) { + return; + } + + if (!(mLayout instanceof ViewGroup)) { + return; + } + + ViewGroup viewGroup = (ViewGroup) mLayout; + viewGroup.setDescendantFocusability(allowRotaryFocus + ? ViewGroup.FOCUS_BEFORE_DESCENDANTS + : ViewGroup.FOCUS_BLOCK_DESCENDANTS); + } + + /** + * Refreshes the rotary focus in this view if we are in rotary mode. If the view already has + * rotary focus, it leaves the focus alone. Returns {@code true} if a new view was focused. + */ + public boolean refreshRotaryFocusIfNeeded() { + if (mLayout.isInTouchMode()) { + return false; + } + + if (hasRotaryFocus()) { + return false; + } + + View view = mLayout.findViewById(getFocusAreaViewId()); + if (view == null || !(view instanceof FocusArea)) { + return mLayout.requestFocus(); + } + + FocusArea focusArea = (FocusArea) view; + return focusArea.performAccessibilityAction(ACTION_FOCUS, /* arguments= */ null); + } + /** * Returns {@code true} if heads up notifications should be displayed over this view. */ diff --git a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java index 55f0975aeccfa..204dde7e87b7a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/window/OverlayViewGlobalStateController.java @@ -29,6 +29,7 @@ import androidx.annotation.VisibleForTesting; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; @@ -120,6 +121,7 @@ public class OverlayViewGlobalStateController { refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); + refreshRotaryFocusIfNeeded(); Log.d(TAG, "Content shown: " + viewController.getClass().getName()); debugLog(); @@ -193,6 +195,7 @@ public class OverlayViewGlobalStateController { refreshWindowFocus(); refreshNavigationBarVisibility(); refreshStatusBarVisibility(); + refreshRotaryFocusIfNeeded(); if (mZOrderVisibleSortedMap.isEmpty()) { setWindowVisible(false); @@ -254,6 +257,17 @@ public class OverlayViewGlobalStateController { } } + private void refreshRotaryFocusIfNeeded() { + for (OverlayViewController controller : mZOrderVisibleSortedMap.values()) { + boolean isTop = Objects.equals(controller, mHighestZOrder); + controller.setAllowRotaryFocus(isTop); + } + + if (!mZOrderVisibleSortedMap.isEmpty()) { + mHighestZOrder.refreshRotaryFocusIfNeeded(); + } + } + /** Returns {@code true} is the window is visible. */ public boolean isWindowVisible() { return mSystemUIOverlayWindowController.isWindowVisible(); diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java index 294aa0d3cf9bc..d97b2329350f4 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/window/OverlayViewGlobalStateControllerTest.java @@ -214,6 +214,16 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { verify(mSystemUIOverlayWindowController).setWindowVisible(true); } + @Test + public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() { + setupOverlayViewController1(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey( + OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue(); + } + @Test public void showView_nothingAlreadyShown_newHighestZOrder() { setupOverlayViewController1(); @@ -225,13 +235,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { } @Test - public void showView_nothingAlreadyShown_newHighestZOrder_isVisible() { + public void showView_nothingAlreadyShown_descendantsFocusable() { setupOverlayViewController1(); mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); - assertThat(mOverlayViewGlobalStateController.mZOrderVisibleSortedMap.containsKey( - OVERLAY_VIEW_CONTROLLER_1_Z_ORDER)).isTrue(); + verify(mOverlayViewController1).setAllowRotaryFocus(true); } @Test @@ -331,6 +340,30 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray()); } + @Test + public void showView_newHighestZOrder_topDescendantsFocusable() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); + + verify(mOverlayViewController1).setAllowRotaryFocus(false); + verify(mOverlayViewController2).setAllowRotaryFocus(true); + } + + @Test + public void showView_newHighestZOrder_refreshTopFocus() { + setupOverlayViewController1(); + setOverlayViewControllerAsShowing(mOverlayViewController1); + setupOverlayViewController2(); + + mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable); + + verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded(); + verify(mOverlayViewController2).refreshRotaryFocusIfNeeded(); + } + @Test public void showView_oldHighestZOrder() { setupOverlayViewController2(); @@ -345,9 +378,9 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarsHidden() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -360,11 +393,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarsShown() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); @@ -374,9 +408,9 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -389,11 +423,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { @Test public void showView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() { setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); - setOverlayViewControllerAsShowing(mOverlayViewController2); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); @@ -425,6 +460,30 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { OVERLAY_VIEW_CONTROLLER_2_Z_ORDER).toArray()); } + @Test + public void showView_oldHighestZOrder_topDescendantsFocusable() { + setupOverlayViewController1(); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mOverlayViewController1).setAllowRotaryFocus(false); + verify(mOverlayViewController2).setAllowRotaryFocus(true); + } + + @Test + public void showView_oldHighestZOrder_refreshTopFocus() { + setupOverlayViewController1(); + setupOverlayViewController2(); + setOverlayViewControllerAsShowing(mOverlayViewController2); + + mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable); + + verify(mOverlayViewController1, never()).refreshRotaryFocusIfNeeded(); + verify(mOverlayViewController2).refreshRotaryFocusIfNeeded(); + } + @Test public void showView_somethingAlreadyShown_windowVisibleNotCalled() { setupOverlayViewController1(); @@ -577,10 +636,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -593,10 +652,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowNavBarTrue_navigationBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowNavigationBarInsets()).thenReturn(true); reset(mWindowInsetsController); @@ -609,10 +668,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -625,10 +684,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_newHighestZOrder_shouldShowStatusBarTrue_statusBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController1.shouldShowStatusBarInsets()).thenReturn(true); reset(mWindowInsetsController); @@ -668,10 +727,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowNavBarFalse_navigationBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -684,11 +743,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowNavBarTrue_navigationBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowNavigationBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); @@ -699,10 +759,10 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(false); reset(mWindowInsetsController); @@ -715,11 +775,12 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { public void hideView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarShown() { setupOverlayViewController1(); setupOverlayViewController2(); - when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); - when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); setOverlayViewControllerAsShowing(mOverlayViewController1); setOverlayViewControllerAsShowing(mOverlayViewController2); + when(mOverlayViewController1.shouldFocusWindow()).thenReturn(true); + when(mOverlayViewController2.shouldFocusWindow()).thenReturn(true); when(mOverlayViewController2.shouldShowStatusBarInsets()).thenReturn(true); + reset(mWindowInsetsController); mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable); @@ -917,7 +978,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase { private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) { mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null); + View layout = overlayViewController.getLayout(); reset(mSystemUIOverlayWindowController); + reset(overlayViewController); when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout); + when(overlayViewController.getLayout()).thenReturn(layout); + when(overlayViewController.isInflated()).thenReturn(true); } }