Improve SystemUIOverlayWindow control

1. Make sysui overlay window views more stable
2. hide/show system bars using insets in SystemUIOverlayWindow

Bug: 161926721
Bug: 151617493
Test: Manual & Unit Tests
Change-Id: I78fd2b5e8488d2f5006edd9773308e2bb9856d2b
This commit is contained in:
Abhijoy Saha
2020-06-12 23:08:44 +00:00
committed by Heemin Seog
parent 9a85dc9c0a
commit f0988b92e2
9 changed files with 324 additions and 34 deletions

View File

@@ -15,7 +15,6 @@
~ limitations under the License.
-->
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:fitsSystemWindows="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"

View File

@@ -22,12 +22,10 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- TODO(b/151617493): replace marginBottom with insets. -->
<ViewStub android:id="@+id/notification_panel_stub"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout="@layout/notification_panel_container"
android:layout_marginBottom="@dimen/navigation_bar_height"/>
android:layout="@layout/notification_panel_container"/>
<ViewStub android:id="@+id/keyguard_stub"
android:layout_width="match_parent"

View File

@@ -140,6 +140,11 @@ public class CarKeyguardViewController extends OverlayViewController implements
registerUserSwitchedListener();
}
@Override
protected boolean shouldShowNavigationBar() {
return true;
}
@Override
public void onFinishInflate() {
mBouncer = SystemUIFactory.getInstance().createKeyguardBouncer(mContext,

View File

@@ -16,6 +16,8 @@
package com.android.systemui.car.notification;
import static android.view.WindowInsets.Type.navigationBars;
import android.app.ActivityManager;
import android.car.Car;
import android.car.drivingstate.CarUxRestrictionsManager;
@@ -196,6 +198,16 @@ public class NotificationPanelViewController extends OverlayPanelViewController
return true;
}
@Override
protected boolean shouldShowStatusBar() {
return true;
}
@Override
protected int getInsetTypesToFit() {
return navigationBars();
}
@Override
protected boolean shouldShowHUN() {
return mEnableHeadsUpNotificationWhenNotificationShadeOpen;

View File

@@ -91,6 +91,11 @@ public class UserSwitchTransitionViewController extends OverlayViewController {
R.integer.config_userSwitchTransitionViewShownTimeoutMs);
}
@Override
protected int getInsetTypesToFit() {
return 0;
}
/**
* Makes the user switch transition view appear and draws the content inside of it if a user
* that is different from the previous user is provided and if the dialog is not already

View File

@@ -16,9 +16,12 @@
package com.android.systemui.car.window;
import static android.view.WindowInsets.Type.statusBars;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.WindowInsets;
/**
* Owns a {@link View} that is present in SystemUIOverlayWindow.
@@ -139,10 +142,26 @@ public class OverlayViewController {
return false;
}
/**
* Returns {@code true} if status bar should be displayed over this view.
*/
protected boolean shouldShowStatusBar() {
return false;
}
/**
* Returns {@code true} if this view should be hidden during the occluded state.
*/
protected boolean shouldShowWhenOccluded() {
return false;
}
/**
* Returns the insets types to fit to the sysui overlay window when this
* {@link OverlayViewController} is in the foreground.
*/
@WindowInsets.Type.InsetsType
protected int getInsetTypesToFit() {
return statusBars();
}
}

View File

@@ -16,13 +16,17 @@
package com.android.systemui.car.window;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
import static android.view.WindowInsetsController.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE;
import android.annotation.Nullable;
import android.util.Log;
import android.view.WindowInsets.Type.InsetsType;
import android.view.WindowInsetsController;
import androidx.annotation.VisibleForTesting;
import com.android.systemui.car.navigationbar.CarNavigationBarController;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -48,10 +52,7 @@ public class OverlayViewGlobalStateController {
private static final String TAG = OverlayViewGlobalStateController.class.getSimpleName();
private static final int UNKNOWN_Z_ORDER = -1;
private final SystemUIOverlayWindowController mSystemUIOverlayWindowController;
private final CarNavigationBarController mCarNavigationBarController;
private boolean mIsOccluded;
private final WindowInsetsController mWindowInsetsController;
@VisibleForTesting
Map<OverlayViewController, Integer> mZOrderMap;
@VisibleForTesting
@@ -60,14 +61,15 @@ public class OverlayViewGlobalStateController {
Set<OverlayViewController> mViewsHiddenForOcclusion;
@VisibleForTesting
OverlayViewController mHighestZOrder;
private boolean mIsOccluded;
@Inject
public OverlayViewGlobalStateController(
CarNavigationBarController carNavigationBarController,
SystemUIOverlayWindowController systemUIOverlayWindowController) {
mSystemUIOverlayWindowController = systemUIOverlayWindowController;
mSystemUIOverlayWindowController.attach();
mCarNavigationBarController = carNavigationBarController;
mWindowInsetsController =
mSystemUIOverlayWindowController.getBaseLayout().getWindowInsetsController();
mZOrderMap = new HashMap<>();
mZOrderVisibleSortedMap = new TreeMap<>();
mViewsHiddenForOcclusion = new HashSet<>();
@@ -115,7 +117,9 @@ public class OverlayViewGlobalStateController {
}
updateInternalsWhenShowingView(viewController);
refreshInsetTypesToFit();
refreshNavigationBarVisibility();
refreshStatusBarVisibility();
Log.d(TAG, "Content shown: " + viewController.getClass().getName());
debugLog();
@@ -185,7 +189,9 @@ public class OverlayViewGlobalStateController {
mZOrderVisibleSortedMap.remove(mZOrderMap.get(viewController));
refreshHighestZOrderWhenHidingView(viewController);
refreshInsetTypesToFit();
refreshNavigationBarVisibility();
refreshStatusBarVisibility();
if (mZOrderVisibleSortedMap.isEmpty()) {
setWindowVisible(false);
@@ -208,10 +214,28 @@ public class OverlayViewGlobalStateController {
}
private void refreshNavigationBarVisibility() {
mWindowInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
if (mZOrderVisibleSortedMap.isEmpty() || mHighestZOrder.shouldShowNavigationBar()) {
mCarNavigationBarController.showBars();
mWindowInsetsController.show(navigationBars());
} else {
mCarNavigationBarController.hideBars();
mWindowInsetsController.hide(navigationBars());
}
}
private void refreshStatusBarVisibility() {
mWindowInsetsController.setSystemBarsBehavior(BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
if (mZOrderVisibleSortedMap.isEmpty() || mHighestZOrder.shouldShowStatusBar()) {
mWindowInsetsController.show(statusBars());
} else {
mWindowInsetsController.hide(statusBars());
}
}
private void refreshInsetTypesToFit() {
if (mZOrderVisibleSortedMap.isEmpty()) {
setFitInsetsTypes(statusBars());
} else {
setFitInsetsTypes(mHighestZOrder.getInsetTypesToFit());
}
}
@@ -224,6 +248,10 @@ public class OverlayViewGlobalStateController {
mSystemUIOverlayWindowController.setWindowVisible(visible);
}
private void setFitInsetsTypes(@InsetsType int types) {
mSystemUIOverlayWindowController.setFitInsetsTypes(types);
}
/**
* Sets the {@link android.view.WindowManager.LayoutParams#FLAG_ALT_FOCUSABLE_IM} flag of the
* sysui overlay window.

View File

@@ -25,6 +25,7 @@ import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowInsets;
import android.view.WindowManager;
import com.android.systemui.R;
@@ -99,7 +100,6 @@ public class SystemUIOverlayWindowController implements
PixelFormat.TRANSLUCENT);
mLp.token = new Binder();
mLp.gravity = Gravity.TOP;
mLp.setFitInsetsTypes(/* types= */ 0);
mLp.softInputMode = WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE;
mLp.setTitle("SystemUIOverlayWindow");
mLp.packageName = mContext.getPackageName();
@@ -110,6 +110,12 @@ public class SystemUIOverlayWindowController implements
setWindowVisible(false);
}
/** Sets the types of insets to fit. Note: This should be rarely used. */
public void setFitInsetsTypes(@WindowInsets.Type.InsetsType int types) {
mLpChanged.setFitInsetsTypes(types);
updateWindow();
}
/** Sets the window to the visible state. */
public void setWindowVisible(boolean visible) {
mVisible = visible;

View File

@@ -16,9 +16,14 @@
package com.android.systemui.car.window;
import static android.view.WindowInsets.Type.navigationBars;
import static android.view.WindowInsets.Type.statusBars;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.reset;
import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -28,19 +33,18 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewStub;
import android.view.WindowInsetsController;
import androidx.test.filters.SmallTest;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.car.CarSystemUiTest;
import com.android.systemui.car.navigationbar.CarNavigationBarController;
import com.android.systemui.tests.R;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
import java.util.Arrays;
@@ -57,8 +61,6 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
private OverlayViewGlobalStateController mOverlayViewGlobalStateController;
private ViewGroup mBaseLayout;
@Mock
private CarNavigationBarController mCarNavigationBarController;
@Mock
private SystemUIOverlayWindowController mSystemUIOverlayWindowController;
@Mock
@@ -71,18 +73,22 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
private OverlayPanelViewController mOverlayPanelViewController;
@Mock
private Runnable mRunnable;
@Mock
private WindowInsetsController mWindowInsetsController;
@Before
public void setUp() {
MockitoAnnotations.initMocks(/* testClass= */ this);
mBaseLayout = (ViewGroup) LayoutInflater.from(mContext).inflate(
R.layout.overlay_view_global_state_controller_test, /* root= */ null);
mBaseLayout = spy((ViewGroup) LayoutInflater.from(mContext).inflate(
R.layout.overlay_view_global_state_controller_test, /* root= */ null));
when(mBaseLayout.getWindowInsetsController()).thenReturn(mWindowInsetsController);
when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
mOverlayViewGlobalStateController = new OverlayViewGlobalStateController(
mCarNavigationBarController, mSystemUIOverlayWindowController);
mSystemUIOverlayWindowController);
verify(mSystemUIOverlayWindowController).attach();
}
@@ -108,7 +114,7 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).hideBars();
verify(mWindowInsetsController).hide(navigationBars());
}
@Test
@@ -118,7 +124,37 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).showBars();
verify(mWindowInsetsController).show(navigationBars());
}
@Test
public void showView_nothingAlreadyShown_shouldShowStatusBarFalse_statusBarsHidden() {
setupOverlayViewController1();
when(mOverlayViewController1.shouldShowStatusBar()).thenReturn(false);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).hide(statusBars());
}
@Test
public void showView_nothingAlreadyShown_shouldShowStatusBarTrue_statusBarsShown() {
setupOverlayViewController1();
when(mOverlayViewController1.shouldShowStatusBar()).thenReturn(true);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).show(statusBars());
}
@Test
public void showView_nothingAlreadyShown_fitsNavBarInsets_insetsAdjusted() {
setupOverlayViewController1();
when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(navigationBars());
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
}
@Test
@@ -168,10 +204,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
verify(mCarNavigationBarController).hideBars();
verify(mWindowInsetsController).hide(navigationBars());
}
@Test
@@ -183,7 +220,46 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
verify(mCarNavigationBarController).showBars();
verify(mWindowInsetsController).show(navigationBars());
}
@Test
public void showView_newHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
when(mOverlayViewController2.shouldShowStatusBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
verify(mWindowInsetsController).hide(statusBars());
}
@Test
public void showView_newHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
when(mOverlayViewController2.shouldShowStatusBar()).thenReturn(true);
mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
verify(mWindowInsetsController).show(statusBars());
}
@Test
public void showView_newHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
setupOverlayViewController1();
when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(statusBars());
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(navigationBars());
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController2, mRunnable);
verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
}
@Test
@@ -216,10 +292,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(true);
when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).hideBars();
verify(mWindowInsetsController).hide(navigationBars());
}
@Test
@@ -231,7 +308,44 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).showBars();
verify(mWindowInsetsController).show(navigationBars());
}
@Test
public void showView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarsHidden() {
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBar()).thenReturn(true);
when(mOverlayViewController2.shouldShowStatusBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).hide(statusBars());
}
@Test
public void showView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarsShown() {
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBar()).thenReturn(false);
when(mOverlayViewController2.shouldShowStatusBar()).thenReturn(true);
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).show(statusBars());
}
@Test
public void showView_oldHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(statusBars());
when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(navigationBars());
mOverlayViewGlobalStateController.showView(mOverlayViewController1, mRunnable);
verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
}
@Test
@@ -402,10 +516,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowNavigationBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
verify(mCarNavigationBarController).hideBars();
verify(mWindowInsetsController).hide(navigationBars());
}
@Test
@@ -418,7 +533,48 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
verify(mCarNavigationBarController).showBars();
verify(mWindowInsetsController).show(navigationBars());
}
@Test
public void hideView_newHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
verify(mWindowInsetsController).hide(statusBars());
}
@Test
public void hideView_newHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.shouldShowStatusBar()).thenReturn(true);
mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
verify(mWindowInsetsController).show(statusBars());
}
@Test
public void hideView_newHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(navigationBars());
when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(statusBars());
mOverlayViewGlobalStateController.hideView(mOverlayViewController2, mRunnable);
verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
}
@Test
@@ -441,10 +597,11 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController2.shouldShowNavigationBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).hideBars();
verify(mWindowInsetsController).hide(navigationBars());
}
@Test
@@ -457,7 +614,48 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).showBars();
verify(mWindowInsetsController).show(navigationBars());
}
@Test
public void hideView_oldHighestZOrder_shouldShowStatusBarFalse_statusBarHidden() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController2.shouldShowStatusBar()).thenReturn(false);
reset(mWindowInsetsController);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).hide(statusBars());
}
@Test
public void hideView_oldHighestZOrder_shouldShowStatusBarTrue_statusBarShown() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController2.shouldShowStatusBar()).thenReturn(true);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).show(statusBars());
}
@Test
public void hideView_oldHighestZOrder_fitsNavBarInsets_insetsAdjusted() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
setupOverlayViewController2();
setOverlayViewControllerAsShowing(mOverlayViewController2);
when(mOverlayViewController1.getInsetTypesToFit()).thenReturn(statusBars());
when(mOverlayViewController2.getInsetTypesToFit()).thenReturn(navigationBars());
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mSystemUIOverlayWindowController).setFitInsetsTypes(navigationBars());
}
@Test
@@ -479,7 +677,27 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mCarNavigationBarController).showBars();
verify(mWindowInsetsController).show(navigationBars());
}
@Test
public void hideView_viewControllerOnlyShown_statusBarShown() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mWindowInsetsController).show(statusBars());
}
@Test
public void hideView_viewControllerOnlyShown_insetsAdjustedToDefault() {
setupOverlayViewController1();
setOverlayViewControllerAsShowing(mOverlayViewController1);
mOverlayViewGlobalStateController.hideView(mOverlayViewController1, mRunnable);
verify(mSystemUIOverlayWindowController).setFitInsetsTypes(statusBars());
}
@Test
@@ -615,7 +833,7 @@ public class OverlayViewGlobalStateControllerTest extends SysuiTestCase {
private void setOverlayViewControllerAsShowing(OverlayViewController overlayViewController) {
mOverlayViewGlobalStateController.showView(overlayViewController, /* show= */ null);
Mockito.reset(mCarNavigationBarController, mSystemUIOverlayWindowController);
reset(mSystemUIOverlayWindowController);
when(mSystemUIOverlayWindowController.getBaseLayout()).thenReturn(mBaseLayout);
}
}