Merge "Move status bar to CarNavigationBar" into rvc-dev am: 463b1fa2be am: 300de195a8

Change-Id: If1791c8a384e0280a6d27dd958b0fb64522c8069
This commit is contained in:
Heemin Seog
2020-04-17 22:57:07 +00:00
committed by Automerger Merge Worker
6 changed files with 339 additions and 42 deletions

View File

@@ -25,6 +25,7 @@
<bool name="config_enableFullscreenUserSwitcher">true</bool> <bool name="config_enableFullscreenUserSwitcher">true</bool>
<!-- configure which system ui bars should be displayed --> <!-- configure which system ui bars should be displayed -->
<bool name="config_enableTopNavigationBar">true</bool>
<bool name="config_enableLeftNavigationBar">false</bool> <bool name="config_enableLeftNavigationBar">false</bool>
<bool name="config_enableRightNavigationBar">false</bool> <bool name="config_enableRightNavigationBar">false</bool>
<bool name="config_enableBottomNavigationBar">true</bool> <bool name="config_enableBottomNavigationBar">true</bool>
@@ -83,7 +84,7 @@
<item>com.android.systemui.recents.Recents</item> <item>com.android.systemui.recents.Recents</item>
<item>com.android.systemui.volume.VolumeUI</item> <item>com.android.systemui.volume.VolumeUI</item>
<item>com.android.systemui.stackdivider.Divider</item> <item>com.android.systemui.stackdivider.Divider</item>
<item>com.android.systemui.statusbar.phone.StatusBar</item> <!-- <item>com.android.systemui.statusbar.phone.StatusBar</item>-->
<item>com.android.systemui.usb.StorageNotification</item> <item>com.android.systemui.usb.StorageNotification</item>
<item>com.android.systemui.power.PowerUI</item> <item>com.android.systemui.power.PowerUI</item>
<item>com.android.systemui.media.RingtonePlayer</item> <item>com.android.systemui.media.RingtonePlayer</item>

View File

@@ -17,14 +17,18 @@
package com.android.systemui.navigationbar.car; package com.android.systemui.navigationbar.car;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static android.view.InsetsState.containsType; import static android.view.InsetsState.containsType;
import static android.view.WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_SEMI_TRANSPARENT;
import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT; import static com.android.systemui.statusbar.phone.BarTransitions.MODE_TRANSPARENT;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import android.graphics.PixelFormat; import android.graphics.PixelFormat;
import android.inputmethodservice.InputMethodService; import android.inputmethodservice.InputMethodService;
import android.os.Binder;
import android.os.Handler; import android.os.Handler;
import android.os.IBinder; import android.os.IBinder;
import android.os.RemoteException; import android.os.RemoteException;
@@ -35,6 +39,8 @@ import android.view.View;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.WindowManager; import android.view.WindowManager;
import androidx.annotation.VisibleForTesting;
import com.android.internal.statusbar.IStatusBarService; import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.statusbar.RegisterStatusBarResult; import com.android.internal.statusbar.RegisterStatusBarResult;
import com.android.systemui.R; import com.android.systemui.R;
@@ -49,6 +55,9 @@ import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.SuperStatusBarViewFactory; import com.android.systemui.statusbar.SuperStatusBarViewFactory;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.BarTransitions; import com.android.systemui.statusbar.phone.BarTransitions;
import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarSignalPolicy;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import java.io.FileDescriptor; import java.io.FileDescriptor;
@@ -61,6 +70,7 @@ import dagger.Lazy;
/** Navigation bars customized for the automotive use case. */ /** Navigation bars customized for the automotive use case. */
public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks { public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks {
private final Resources mResources;
private final CarNavigationBarController mCarNavigationBarController; private final CarNavigationBarController mCarNavigationBarController;
private final WindowManager mWindowManager; private final WindowManager mWindowManager;
private final CarDeviceProvisionedController mCarDeviceProvisionedController; private final CarDeviceProvisionedController mCarDeviceProvisionedController;
@@ -72,9 +82,12 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
private final Lazy<NavigationBarController> mNavigationBarControllerLazy; private final Lazy<NavigationBarController> mNavigationBarControllerLazy;
private final SuperStatusBarViewFactory mSuperStatusBarViewFactory; private final SuperStatusBarViewFactory mSuperStatusBarViewFactory;
private final ButtonSelectionStateController mButtonSelectionStateController; private final ButtonSelectionStateController mButtonSelectionStateController;
private final PhoneStatusBarPolicy mIconPolicy;
private final StatusBarIconController mIconController;
private final int mDisplayId; private final int mDisplayId;
private StatusBarSignalPolicy mSignalPolicy;
private IStatusBarService mBarService; private IStatusBarService mBarService;
private ActivityManagerWrapper mActivityManagerWrapper; private ActivityManagerWrapper mActivityManagerWrapper;
@@ -97,11 +110,14 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
private boolean mDeviceIsSetUpForUser = true; private boolean mDeviceIsSetUpForUser = true;
private boolean mIsUserSetupInProgress = false; private boolean mIsUserSetupInProgress = false;
private @BarTransitions.TransitionMode int mStatusBarMode;
private @BarTransitions.TransitionMode int mNavigationBarMode; private @BarTransitions.TransitionMode int mNavigationBarMode;
private boolean mTransientShown; private boolean mStatusBarTransientShown;
private boolean mNavBarTransientShown;
@Inject @Inject
public CarNavigationBar(Context context, public CarNavigationBar(Context context,
@Main Resources resources,
CarNavigationBarController carNavigationBarController, CarNavigationBarController carNavigationBarController,
WindowManager windowManager, WindowManager windowManager,
CarDeviceProvisionedController deviceProvisionedController, CarDeviceProvisionedController deviceProvisionedController,
@@ -112,8 +128,12 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
Lazy<KeyguardStateController> keyguardStateControllerLazy, Lazy<KeyguardStateController> keyguardStateControllerLazy,
Lazy<NavigationBarController> navigationBarControllerLazy, Lazy<NavigationBarController> navigationBarControllerLazy,
SuperStatusBarViewFactory superStatusBarViewFactory, SuperStatusBarViewFactory superStatusBarViewFactory,
ButtonSelectionStateController buttonSelectionStateController) { ButtonSelectionStateController buttonSelectionStateController,
PhoneStatusBarPolicy iconPolicy,
StatusBarIconController iconController
) {
super(context); super(context);
mResources = resources;
mCarNavigationBarController = carNavigationBarController; mCarNavigationBarController = carNavigationBarController;
mWindowManager = windowManager; mWindowManager = windowManager;
mCarDeviceProvisionedController = deviceProvisionedController; mCarDeviceProvisionedController = deviceProvisionedController;
@@ -125,14 +145,16 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
mNavigationBarControllerLazy = navigationBarControllerLazy; mNavigationBarControllerLazy = navigationBarControllerLazy;
mSuperStatusBarViewFactory = superStatusBarViewFactory; mSuperStatusBarViewFactory = superStatusBarViewFactory;
mButtonSelectionStateController = buttonSelectionStateController; mButtonSelectionStateController = buttonSelectionStateController;
mIconPolicy = iconPolicy;
mIconController = iconController;
mDisplayId = mWindowManager.getDefaultDisplay().getDisplayId(); mDisplayId = context.getDisplayId();
} }
@Override @Override
public void start() { public void start() {
// Set initial state. // Set initial state.
mHideNavBarForKeyboard = mContext.getResources().getBoolean( mHideNavBarForKeyboard = mResources.getBoolean(
com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard); com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard);
mBottomNavBarVisible = false; mBottomNavBarVisible = false;
@@ -150,6 +172,33 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
ex.rethrowFromSystemServer(); ex.rethrowFromSystemServer();
} }
// StatusBarManagerService has a back up of IME token and it's restored here.
setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis,
result.mImeBackDisposition, result.mShowImeSwitcher);
// Set up the initial icon state
int numIcons = result.mIcons.size();
for (int i = 0; i < numIcons; i++) {
mCommandQueue.setIcon(result.mIcons.keyAt(i), result.mIcons.valueAt(i));
}
mAutoHideController.setStatusBar(new AutoHideUiElement() {
@Override
public void synchronizeState() {
// No op.
}
@Override
public boolean isVisible() {
return mStatusBarTransientShown;
}
@Override
public void hide() {
clearTransient();
}
});
mAutoHideController.setNavigationBar(new AutoHideUiElement() { mAutoHideController.setNavigationBar(new AutoHideUiElement() {
@Override @Override
public void synchronizeState() { public void synchronizeState() {
@@ -158,7 +207,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
@Override @Override
public boolean isVisible() { public boolean isVisible() {
return mTransientShown; return mNavBarTransientShown;
} }
@Override @Override
@@ -193,6 +242,10 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
mActivityManagerWrapper.registerTaskStackListener(mButtonSelectionStateListener); mActivityManagerWrapper.registerTaskStackListener(mButtonSelectionStateListener);
mCarNavigationBarController.connectToHvac(); mCarNavigationBarController.connectToHvac();
// Lastly, call to the icon policy to install/update all the icons.
mIconPolicy.init();
mSignalPolicy = new StatusBarSignalPolicy(mContext, mIconController);
} }
private void restartNavBarsIfNecessary() { private void restartNavBarsIfNecessary() {
@@ -274,9 +327,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
} }
private void buildNavBarWindows() { private void buildNavBarWindows() {
mTopNavigationBarWindow = mSuperStatusBarViewFactory mTopNavigationBarWindow = mCarNavigationBarController.getTopWindow();
.getStatusBarWindowView()
.findViewById(R.id.car_top_navigation_bar_container);
mBottomNavigationBarWindow = mCarNavigationBarController.getBottomWindow(); mBottomNavigationBarWindow = mCarNavigationBarController.getBottomWindow();
mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow(); mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow();
mRightNavigationBarWindow = mCarNavigationBarController.getRightWindow(); mRightNavigationBarWindow = mCarNavigationBarController.getRightWindow();
@@ -305,6 +356,26 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
} }
private void attachNavBarWindows() { private void attachNavBarWindows() {
if (mTopNavigationBarWindow != null) {
int height = mResources.getDimensionPixelSize(
com.android.internal.R.dimen.status_bar_height);
WindowManager.LayoutParams lp = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT,
height,
WindowManager.LayoutParams.TYPE_STATUS_BAR,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH
| WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS,
PixelFormat.TRANSLUCENT);
lp.token = new Binder();
lp.gravity = Gravity.TOP;
lp.setFitInsetsTypes(0 /* types */);
lp.setTitle("TopCarNavigationBar");
lp.packageName = mContext.getPackageName();
lp.layoutInDisplayCutoutMode = LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
mWindowManager.addView(mTopNavigationBarWindow, lp);
}
if (mBottomNavigationBarWindow != null && !mBottomNavBarVisible) { if (mBottomNavigationBarWindow != null && !mBottomNavBarVisible) {
mBottomNavBarVisible = true; mBottomNavBarVisible = true;
@@ -316,13 +387,13 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
| WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH | WindowManager.LayoutParams.FLAG_WATCH_OUTSIDE_TOUCH
| WindowManager.LayoutParams.FLAG_SPLIT_TOUCH, | WindowManager.LayoutParams.FLAG_SPLIT_TOUCH,
PixelFormat.TRANSLUCENT); PixelFormat.TRANSLUCENT);
lp.setTitle("CarNavigationBar"); lp.setTitle("BottomCarNavigationBar");
lp.windowAnimations = 0; lp.windowAnimations = 0;
mWindowManager.addView(mBottomNavigationBarWindow, lp); mWindowManager.addView(mBottomNavigationBarWindow, lp);
} }
if (mLeftNavigationBarWindow != null) { if (mLeftNavigationBarWindow != null) {
int width = mContext.getResources().getDimensionPixelSize( int width = mResources.getDimensionPixelSize(
R.dimen.car_left_navigation_bar_width); R.dimen.car_left_navigation_bar_width);
WindowManager.LayoutParams leftlp = new WindowManager.LayoutParams( WindowManager.LayoutParams leftlp = new WindowManager.LayoutParams(
width, ViewGroup.LayoutParams.MATCH_PARENT, width, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -340,7 +411,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
mWindowManager.addView(mLeftNavigationBarWindow, leftlp); mWindowManager.addView(mLeftNavigationBarWindow, leftlp);
} }
if (mRightNavigationBarWindow != null) { if (mRightNavigationBarWindow != null) {
int width = mContext.getResources().getDimensionPixelSize( int width = mResources.getDimensionPixelSize(
R.dimen.car_right_navigation_bar_width); R.dimen.car_right_navigation_bar_width);
WindowManager.LayoutParams rightlp = new WindowManager.LayoutParams( WindowManager.LayoutParams rightlp = new WindowManager.LayoutParams(
width, ViewGroup.LayoutParams.MATCH_PARENT, width, ViewGroup.LayoutParams.MATCH_PARENT,
@@ -371,7 +442,7 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
return; return;
} }
if (mContext.getDisplay().getDisplayId() != displayId) { if (mContext.getDisplayId() != displayId) {
return; return;
} }
@@ -385,32 +456,50 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
if (displayId != mDisplayId) { if (displayId != mDisplayId) {
return; return;
} }
if (!containsType(types, ITYPE_NAVIGATION_BAR)) { if (containsType(types, ITYPE_STATUS_BAR)) {
return; if (!mStatusBarTransientShown) {
} mStatusBarTransientShown = true;
if (!mTransientShown) {
mTransientShown = true;
handleTransientChanged(); handleTransientChanged();
} }
} }
if (containsType(types, ITYPE_NAVIGATION_BAR)) {
if (!mNavBarTransientShown) {
mNavBarTransientShown = true;
handleTransientChanged();
}
}
}
@Override @Override
public void abortTransient(int displayId, int[] types) { public void abortTransient(int displayId, int[] types) {
if (displayId != mDisplayId) { if (displayId != mDisplayId) {
return; return;
} }
if (!containsType(types, ITYPE_NAVIGATION_BAR)) { if (!containsType(types, ITYPE_STATUS_BAR) && !containsType(types, ITYPE_NAVIGATION_BAR)) {
return; return;
} }
clearTransient(); clearTransient();
} }
private void clearTransient() { private void clearTransient() {
if (mTransientShown) { if (mStatusBarTransientShown) {
mTransientShown = false; mStatusBarTransientShown = false;
handleTransientChanged(); handleTransientChanged();
} }
if (mNavBarTransientShown) {
mNavBarTransientShown = false;
handleTransientChanged();
}
}
@VisibleForTesting
boolean isStatusBarTransientShown() {
return mStatusBarTransientShown;
}
@VisibleForTesting
boolean isNavBarTransientShown() {
return mNavBarTransientShown;
} }
@Override @Override
@@ -422,11 +511,22 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
} }
private void handleTransientChanged() { private void handleTransientChanged() {
updateBarMode(mTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT); updateStatusBarMode(mStatusBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
updateNavBarMode(mNavBarTransientShown ? MODE_SEMI_TRANSPARENT : MODE_TRANSPARENT);
} }
// Returns true if the bar mode is changed. // Returns true if the status bar mode has changed.
private boolean updateBarMode(int barMode) { private boolean updateStatusBarMode(int barMode) {
if (mStatusBarMode != barMode) {
mStatusBarMode = barMode;
mAutoHideController.touchAutoHide();
return true;
}
return false;
}
// Returns true if the nav bar mode has changed.
private boolean updateNavBarMode(int barMode) {
if (mNavigationBarMode != barMode) { if (mNavigationBarMode != barMode) {
mNavigationBarMode = barMode; mNavigationBarMode = barMode;
mAutoHideController.touchAutoHide(); mAutoHideController.touchAutoHide();

View File

@@ -40,6 +40,7 @@ public class CarNavigationBarController {
private final ButtonSelectionStateController mButtonSelectionStateController; private final ButtonSelectionStateController mButtonSelectionStateController;
private final Lazy<HvacController> mHvacControllerLazy; private final Lazy<HvacController> mHvacControllerLazy;
private boolean mShowTop;
private boolean mShowBottom; private boolean mShowBottom;
private boolean mShowLeft; private boolean mShowLeft;
private boolean mShowRight; private boolean mShowRight;
@@ -66,6 +67,7 @@ public class CarNavigationBarController {
mHvacControllerLazy = hvacControllerLazy; mHvacControllerLazy = hvacControllerLazy;
// Read configuration. // Read configuration.
mShowTop = mContext.getResources().getBoolean(R.bool.config_enableTopNavigationBar);
mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar); mShowBottom = mContext.getResources().getBoolean(R.bool.config_enableBottomNavigationBar);
mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar); mShowLeft = mContext.getResources().getBoolean(R.bool.config_enableLeftNavigationBar);
mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar); mShowRight = mContext.getResources().getBoolean(R.bool.config_enableRightNavigationBar);
@@ -105,6 +107,12 @@ public class CarNavigationBarController {
mHvacControllerLazy.get().removeAllComponents(); mHvacControllerLazy.get().removeAllComponents();
} }
/** Gets the top window if configured to do so. */
@Nullable
public ViewGroup getTopWindow() {
return mShowTop ? mNavigationBarViewFactory.getTopWindow() : null;
}
/** Gets the bottom window if configured to do so. */ /** Gets the bottom window if configured to do so. */
@Nullable @Nullable
public ViewGroup getBottomWindow() { public ViewGroup getBottomWindow() {

View File

@@ -71,6 +71,11 @@ public class NavigationBarViewFactory {
mContext = context; mContext = context;
} }
/** Gets the top window. */
public ViewGroup getTopWindow() {
return getWindowCached(Type.TOP);
}
/** Gets the bottom window. */ /** Gets the bottom window. */
public ViewGroup getBottomWindow() { public ViewGroup getBottomWindow() {
return getWindowCached(Type.BOTTOM); return getWindowCached(Type.BOTTOM);

View File

@@ -86,6 +86,40 @@ public class CarNavigationBarControllerTest extends SysuiTestCase {
verify(mHvacController).removeAllComponents(); verify(mHvacController).removeAllComponents();
} }
@Test
public void testGetTopWindow_topDisabled_returnsNull() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, false);
mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
mButtonSelectionStateController, () -> mHvacController);
ViewGroup window = mCarNavigationBar.getTopWindow();
assertThat(window).isNull();
}
@Test
public void testGetTopWindow_topEnabled_returnsWindow() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
mButtonSelectionStateController, () -> mHvacController);
ViewGroup window = mCarNavigationBar.getTopWindow();
assertThat(window).isNotNull();
}
@Test
public void testGetTopWindow_topEnabled_calledTwice_returnsSameWindow() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory,
mButtonSelectionStateController, () -> mHvacController);
ViewGroup window1 = mCarNavigationBar.getTopWindow();
ViewGroup window2 = mCarNavigationBar.getTopWindow();
assertThat(window1).isEqualTo(window2);
}
@Test @Test
public void testGetBottomWindow_bottomDisabled_returnsNull() { public void testGetBottomWindow_bottomDisabled_returnsNull() {
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, false); mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, false);

View File

@@ -16,6 +16,11 @@
package com.android.systemui.navigationbar.car; package com.android.systemui.navigationbar.car;
import static android.view.InsetsState.ITYPE_NAVIGATION_BAR;
import static android.view.InsetsState.ITYPE_STATUS_BAR;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -23,7 +28,7 @@ import android.os.Handler;
import android.testing.AndroidTestingRunner; import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper; import android.testing.TestableLooper;
import android.testing.TestableResources; import android.testing.TestableResources;
import android.view.LayoutInflater; import android.view.Display;
import android.view.WindowManager; import android.view.WindowManager;
import androidx.test.filters.SmallTest; import androidx.test.filters.SmallTest;
@@ -31,13 +36,12 @@ import androidx.test.filters.SmallTest;
import com.android.systemui.R; import com.android.systemui.R;
import com.android.systemui.SysuiTestCase; import com.android.systemui.SysuiTestCase;
import com.android.systemui.car.CarDeviceProvisionedController; import com.android.systemui.car.CarDeviceProvisionedController;
import com.android.systemui.plugins.DarkIconDispatcher;
import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue;
import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.NavigationBarController;
import com.android.systemui.statusbar.SuperStatusBarViewFactory; import com.android.systemui.statusbar.SuperStatusBarViewFactory;
import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.AutoHideController;
import com.android.systemui.statusbar.phone.PhoneStatusBarPolicy;
import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.phone.StatusBarIconController;
import com.android.systemui.statusbar.phone.StatusBarWindowView;
import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.KeyguardStateController;
import org.junit.Before; import org.junit.Before;
@@ -74,30 +78,28 @@ public class CarNavigationBarTest extends SysuiTestCase {
private SuperStatusBarViewFactory mSuperStatusBarViewFactory; private SuperStatusBarViewFactory mSuperStatusBarViewFactory;
@Mock @Mock
private ButtonSelectionStateController mButtonSelectionStateController; private ButtonSelectionStateController mButtonSelectionStateController;
@Mock
private PhoneStatusBarPolicy mIconPolicy;
@Mock
private StatusBarIconController mIconController;
@Before @Before
public void setUp() { public void setUp() {
MockitoAnnotations.initMocks(this); MockitoAnnotations.initMocks(this);
mTestableResources = mContext.getOrCreateTestableResources(); mTestableResources = mContext.getOrCreateTestableResources();
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
mHandler = Handler.getMain(); mHandler = Handler.getMain();
mCarNavigationBar = new CarNavigationBar(mContext, mCarNavigationBarController, mCarNavigationBar = new CarNavigationBar(mContext, mTestableResources.getResources(),
mWindowManager, mDeviceProvisionedController, new CommandQueue(mContext), mCarNavigationBarController, mWindowManager, mDeviceProvisionedController,
mAutoHideController, mButtonSelectionStateListener, mHandler, new CommandQueue(mContext), mAutoHideController, mButtonSelectionStateListener,
() -> mKeyguardStateController, () -> mNavigationBarController, mHandler, () -> mKeyguardStateController, () -> mNavigationBarController,
mSuperStatusBarViewFactory, mButtonSelectionStateController); mSuperStatusBarViewFactory, mButtonSelectionStateController, mIconPolicy,
StatusBarWindowView statusBarWindowView = (StatusBarWindowView) LayoutInflater.from( mIconController);
mContext).inflate(R.layout.super_status_bar, /* root= */ null);
when(mSuperStatusBarViewFactory.getStatusBarWindowView()).thenReturn(statusBarWindowView);
when(mKeyguardStateController.isShowing()).thenReturn(false);
mDependency.injectMockDependency(WindowManager.class);
// Needed to inflate top navigation bar.
mDependency.injectMockDependency(DarkIconDispatcher.class);
mDependency.injectMockDependency(StatusBarIconController.class);
} }
@Test @Test
public void restartNavbars_refreshesTaskChanged() { public void restartNavbars_refreshesTaskChanged() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener> ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass( deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
CarDeviceProvisionedController.DeviceProvisionedListener.class); CarDeviceProvisionedController.DeviceProvisionedListener.class);
@@ -115,6 +117,8 @@ public class CarNavigationBarTest extends SysuiTestCase {
@Test @Test
public void restartNavBars_newUserNotSetupWithKeyguardShowing_showsKeyguardButtons() { public void restartNavBars_newUserNotSetupWithKeyguardShowing_showsKeyguardButtons() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener> ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass( deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
CarDeviceProvisionedController.DeviceProvisionedListener.class); CarDeviceProvisionedController.DeviceProvisionedListener.class);
@@ -133,6 +137,8 @@ public class CarNavigationBarTest extends SysuiTestCase {
@Test @Test
public void restartNavbars_newUserIsSetupWithKeyguardHidden_hidesKeyguardButtons() { public void restartNavbars_newUserIsSetupWithKeyguardHidden_hidesKeyguardButtons() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener> ArgumentCaptor<CarDeviceProvisionedController.DeviceProvisionedListener>
deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass( deviceProvisionedCallbackCaptor = ArgumentCaptor.forClass(
CarDeviceProvisionedController.DeviceProvisionedListener.class); CarDeviceProvisionedController.DeviceProvisionedListener.class);
@@ -152,4 +158,147 @@ public class CarNavigationBarTest extends SysuiTestCase {
verify(mCarNavigationBarController).hideAllKeyguardButtons(true); verify(mCarNavigationBarController).hideAllKeyguardButtons(true);
} }
@Test
public void showTransient_wrongDisplayId_transientModeNotUpdated() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
int randomDisplay = Display.DEFAULT_DISPLAY + 10;
int[] insetTypes = new int[]{};
mCarNavigationBar.showTransient(randomDisplay, insetTypes);
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
}
@Test
public void showTransient_correctDisplayId_noStatusBarInset_transientModeNotUpdated() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
int[] insetTypes = new int[]{};
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
}
@Test
public void showTransient_correctDisplayId_statusBarInset_transientModeUpdated() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
}
@Test
public void showTransient_correctDisplayId_noNavBarInset_transientModeNotUpdated() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
int[] insetTypes = new int[]{};
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
}
@Test
public void showTransient_correctDisplayId_navBarInset_transientModeUpdated() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY, insetTypes);
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
}
@Test
public void abortTransient_wrongDisplayId_transientModeNotCleared() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
int[] insetTypes = new int[]{};
int randomDisplay = Display.DEFAULT_DISPLAY + 10;
mCarNavigationBar.abortTransient(randomDisplay, insetTypes);
// The transient booleans were not cleared.
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
}
@Test
public void abortTransient_correctDisplayId_noInsets_transientModeNotCleared() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
int[] insetTypes = new int[]{};
mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
// The transient booleans were not cleared.
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
}
@Test
public void abortTransient_correctDisplayId_statusBarInset_transientModeCleared() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
int[] insetTypes = new int[]{ITYPE_STATUS_BAR};
mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
// The transient booleans were cleared.
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
}
@Test
public void abortTransient_correctDisplayId_navBarInset_transientModeCleared() {
mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
when(mDeviceProvisionedController.isCurrentUserSetup()).thenReturn(true);
mCarNavigationBar.start();
mCarNavigationBar.showTransient(Display.DEFAULT_DISPLAY,
new int[]{ITYPE_STATUS_BAR, ITYPE_NAVIGATION_BAR});
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isTrue();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isTrue();
int[] insetTypes = new int[]{ITYPE_NAVIGATION_BAR};
mCarNavigationBar.abortTransient(Display.DEFAULT_DISPLAY, insetTypes);
// The transient booleans were cleared.
assertThat(mCarNavigationBar.isStatusBarTransientShown()).isFalse();
assertThat(mCarNavigationBar.isNavBarTransientShown()).isFalse();
}
} }