diff options
5 files changed, 197 insertions, 99 deletions
diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java index 63bc66afddf8..98b91ebd8038 100644 --- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBar.java @@ -25,6 +25,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.view.Display; import android.view.Gravity; +import android.view.View; import android.view.ViewGroup; import android.view.WindowManager; @@ -291,7 +292,8 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks } boolean isKeyboardVisible = (vis & InputMethodService.IME_VISIBLE) != 0; - mCarNavigationBarController.setBottomWindowVisibility(!isKeyboardVisible); + mCarNavigationBarController.setBottomWindowVisibility( + isKeyboardVisible ? View.GONE : View.VISIBLE); } private void updateNavBarForKeyguardContent() { diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java index f59f886d487b..6bed69bdee88 100644 --- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java +++ b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationBarController.java @@ -98,31 +98,30 @@ public class CarNavigationBarController { } /** Toggles the bottom nav bar visibility. */ - public boolean setBottomWindowVisibility(boolean isVisible) { - return setWindowVisibility(getBottomWindow(), isVisible); + public boolean setBottomWindowVisibility(@View.Visibility int visibility) { + return setWindowVisibility(getBottomWindow(), visibility); } /** Toggles the left nav bar visibility. */ - public boolean setLeftWindowVisibility(boolean isVisible) { - return setWindowVisibility(getLeftWindow(), isVisible); + public boolean setLeftWindowVisibility(@View.Visibility int visibility) { + return setWindowVisibility(getLeftWindow(), visibility); } /** Toggles the right nav bar visibility. */ - public boolean setRightWindowVisibility(boolean isVisible) { - return setWindowVisibility(getRightWindow(), isVisible); + public boolean setRightWindowVisibility(@View.Visibility int visibility) { + return setWindowVisibility(getRightWindow(), visibility); } - private boolean setWindowVisibility(ViewGroup window, boolean isVisible) { + private boolean setWindowVisibility(ViewGroup window, @View.Visibility int visibility) { if (window == null) { return false; } - int newVisibility = isVisible ? View.VISIBLE : View.GONE; - if (window.getVisibility() == newVisibility) { + if (window.getVisibility() == visibility) { return false; } - window.setVisibility(newVisibility); + window.setVisibility(visibility); return true; } @@ -228,6 +227,63 @@ public class CarNavigationBarController { } } + /** + * Shows all of the keyguard specific buttons on the valid instances of + * {@link CarNavigationBarView}. + */ + public void showAllKeyguardButtons(boolean isSetUp) { + checkAllBars(isSetUp); + if (mTopView != null) { + mTopView.showKeyguardButtons(); + } + if (mBottomView != null) { + mBottomView.showKeyguardButtons(); + } + if (mLeftView != null) { + mLeftView.showKeyguardButtons(); + } + if (mRightView != null) { + mRightView.showKeyguardButtons(); + } + } + + /** + * Hides all of the keyguard specific buttons on the valid instances of + * {@link CarNavigationBarView}. + */ + public void hideAllKeyguardButtons(boolean isSetUp) { + checkAllBars(isSetUp); + if (mTopView != null) { + mTopView.hideKeyguardButtons(); + } + if (mBottomView != null) { + mBottomView.hideKeyguardButtons(); + } + if (mLeftView != null) { + mLeftView.hideKeyguardButtons(); + } + if (mRightView != null) { + mRightView.hideKeyguardButtons(); + } + } + + /** Toggles whether the notifications icon has an unseen indicator or not. */ + public void toggleAllNotificationsUnseenIndicator(boolean isSetUp, boolean hasUnseen) { + checkAllBars(isSetUp); + if (mTopView != null) { + mTopView.toggleNotificationUnseenIndicator(hasUnseen); + } + if (mBottomView != null) { + mBottomView.toggleNotificationUnseenIndicator(hasUnseen); + } + if (mLeftView != null) { + mLeftView.toggleNotificationUnseenIndicator(hasUnseen); + } + if (mRightView != null) { + mRightView.toggleNotificationUnseenIndicator(hasUnseen); + } + } + /** Interface for controlling the notifications shade. */ public interface NotificationsShadeController { /** Toggles the visibility of the notifications shade. */ @@ -244,4 +300,11 @@ public class CarNavigationBarController { } } } + + private void checkAllBars(boolean isSetUp) { + mTopView = getTopBar(isSetUp); + mBottomView = getBottomBar(isSetUp); + mLeftView = getLeftBar(isSetUp); + mRightView = getRightBar(isSetUp); + } } diff --git a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java index 40823abaaead..922bfffcfa22 100644 --- a/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java +++ b/packages/CarSystemUI/src/com/android/systemui/navigationbar/car/CarNavigationButton.java @@ -150,6 +150,11 @@ public class CarNavigationButton extends com.android.keyguard.AlphaOptimizedImag updateImage(); } + /** Gets whether the icon is in an unseen state. */ + public boolean getUnseen() { + return mHasUnseen; + } + private void updateImage() { if (mHasUnseen) { setImageResource(mSelected ? UNSEEN_SELECTED_ICON_RESOURCE_ID diff --git a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java index 601bc4030226..ce763b900b9a 100644 --- a/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/statusbar/car/CarStatusBar.java @@ -168,13 +168,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt private Drawable mNotificationPanelBackground; private ViewGroup mTopNavigationBarContainer; - private ViewGroup mNavigationBarWindow; - private ViewGroup mLeftNavigationBarWindow; - private ViewGroup mRightNavigationBarWindow; private CarNavigationBarView mTopNavigationBarView; - private CarNavigationBarView mNavigationBarView; - private CarNavigationBarView mLeftNavigationBarView; - private CarNavigationBarView mRightNavigationBarView; private final Object mQueueLock = new Object(); private final CarNavigationBarController mCarNavigationBarController; @@ -425,12 +419,12 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt new DeviceProvisionedController.DeviceProvisionedListener() { @Override public void onUserSetupChanged() { - mHandler.post(() -> restartNavBarsIfNecessary()); + mHandler.post(() -> resetSystemBarsIfNecessary()); } @Override public void onUserSwitched() { - mHandler.post(() -> restartNavBarsIfNecessary()); + mHandler.post(() -> resetSystemBarsIfNecessary()); } }); @@ -444,11 +438,11 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt mSwitchToGuestTimer = new SwitchToGuestTimer(mContext); } - private void restartNavBarsIfNecessary() { + private void resetSystemBarsIfNecessary() { boolean currentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); if (mDeviceIsSetUpForUser != currentUserSetup) { mDeviceIsSetUpForUser = currentUserSetup; - restartNavBars(); + resetSystemBars(); } } @@ -456,19 +450,9 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt * Remove all content from navbars and rebuild them. Used to allow for different nav bars * before and after the device is provisioned. . Also for change of density and font size. */ - private void restartNavBars() { + private void resetSystemBars() { mCarFacetButtonController.removeAll(); - if (mNavigationBarWindow != null) { - mNavigationBarView = null; - } - if (mLeftNavigationBarWindow != null) { - mLeftNavigationBarView = null; - } - if (mRightNavigationBarWindow != null) { - mRightNavigationBarView = null; - } - buildNavBarContent(); // CarFacetButtonController was reset therefore we need to re-add the status bar elements // to the controller. @@ -480,51 +464,22 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt * the full screen user selector is shown. */ void setNavBarVisibility(@View.Visibility int visibility) { - if (mNavigationBarWindow != null) { - mNavigationBarWindow.setVisibility(visibility); - } - if (mLeftNavigationBarWindow != null) { - mLeftNavigationBarWindow.setVisibility(visibility); - } - if (mRightNavigationBarWindow != null) { - mRightNavigationBarWindow.setVisibility(visibility); - } + mCarNavigationBarController.setBottomWindowVisibility(visibility); + mCarNavigationBarController.setLeftWindowVisibility(visibility); + mCarNavigationBarController.setRightWindowVisibility(visibility); } @Override public boolean hideKeyguard() { boolean result = super.hideKeyguard(); - if (mNavigationBarView != null) { - mNavigationBarView.hideKeyguardButtons(); - } - if (mLeftNavigationBarView != null) { - mLeftNavigationBarView.hideKeyguardButtons(); - } - if (mRightNavigationBarView != null) { - mRightNavigationBarView.hideKeyguardButtons(); - } + mCarNavigationBarController.hideAllKeyguardButtons(mDeviceIsSetUpForUser); return result; } @Override public void showKeyguard() { super.showKeyguard(); - updateNavBarForKeyguardContent(); - } - - /** - * Switch to the keyguard applicable content contained in the nav bars - */ - private void updateNavBarForKeyguardContent() { - if (mNavigationBarView != null) { - mNavigationBarView.showKeyguardButtons(); - } - if (mLeftNavigationBarView != null) { - mLeftNavigationBarView.showKeyguardButtons(); - } - if (mRightNavigationBarView != null) { - mRightNavigationBarView.showKeyguardButtons(); - } + mCarNavigationBarController.showAllKeyguardButtons(mDeviceIsSetUpForUser); } @Override @@ -628,20 +583,11 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt mNotificationDataManager = new NotificationDataManager(); mNotificationDataManager.setOnUnseenCountUpdateListener( () -> { - if (mNavigationBarView != null && mNotificationDataManager != null) { - Boolean hasUnseen = + if (mNotificationDataManager != null) { + boolean hasUnseen = mNotificationDataManager.getUnseenNotificationCount() > 0; - if (mNavigationBarView != null) { - mNavigationBarView.toggleNotificationUnseenIndicator(hasUnseen); - } - - if (mLeftNavigationBarView != null) { - mLeftNavigationBarView.toggleNotificationUnseenIndicator(hasUnseen); - } - - if (mRightNavigationBarView != null) { - mRightNavigationBarView.toggleNotificationUnseenIndicator(hasUnseen); - } + mCarNavigationBarController.toggleAllNotificationsUnseenIndicator( + mDeviceIsSetUpForUser, hasUnseen); } }); @@ -895,37 +841,27 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt @Override protected void createNavigationBar(@Nullable RegisterStatusBarResult result) { - buildNavBarWindows(); + mTopNavigationBarContainer = mStatusBarWindow + .findViewById(R.id.car_top_navigation_bar_container); + buildNavBarContent(); } private void buildNavBarContent() { buildTopBar(); - mNavigationBarView = mCarNavigationBarController.getBottomBar(mDeviceIsSetUpForUser); mCarNavigationBarController.registerBottomBarTouchListener( mNavBarNotificationTouchListener); - mLeftNavigationBarView = mCarNavigationBarController.getLeftBar(mDeviceIsSetUpForUser); mCarNavigationBarController.registerLeftBarTouchListener( mNavBarNotificationTouchListener); - mRightNavigationBarView = mCarNavigationBarController.getLeftBar(mDeviceIsSetUpForUser); mCarNavigationBarController.registerRightBarTouchListener( mNavBarNotificationTouchListener); mCarNavigationBarController.registerNotificationController(() -> togglePanel()); } - private void buildNavBarWindows() { - mTopNavigationBarContainer = mStatusBarWindow - .findViewById(R.id.car_top_navigation_bar_container); - - mNavigationBarWindow = mCarNavigationBarController.getBottomWindow(); - mLeftNavigationBarWindow = mCarNavigationBarController.getLeftWindow(); - mRightNavigationBarWindow = mCarNavigationBarController.getRightWindow(); - } - private void buildTopBar() { mTopNavigationBarContainer.removeAllViews(); mTopNavigationBarView = mCarNavigationBarController.getTopBar(mDeviceIsSetUpForUser); @@ -1099,7 +1035,7 @@ public class CarStatusBar extends StatusBar implements CarBatteryController.Batt @Override public void onDensityOrFontScaleChanged() { super.onDensityOrFontScaleChanged(); - restartNavBars(); + resetSystemBars(); // Need to update the background on density changed in case the change was due to night // mode. mNotificationPanelBackground = getDefaultWallpaper(); diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java index 20ace44cfa19..901d2006eb12 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/navigationbar/car/CarNavigationBarControllerTest.java @@ -31,7 +31,9 @@ import androidx.test.filters.SmallTest; import com.android.systemui.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.statusbar.car.hvac.HvacController; +import com.android.systemui.statusbar.phone.StatusBarIconController; import org.junit.Before; import org.junit.Test; @@ -60,6 +62,10 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mNavigationBarViewFactory = new NavigationBarViewFactory(mContext); mHvacControllerLazy = () -> mHvacController; mTestableResources = mContext.getOrCreateTestableResources(); + + // Needed to inflate top navigation bar. + mDependency.injectMockDependency(DarkIconDispatcher.class); + mDependency.injectMockDependency(StatusBarIconController.class); } @Test @@ -189,7 +195,7 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mHvacControllerLazy); ViewGroup window = mCarNavigationBar.getBottomWindow(); - mCarNavigationBar.setBottomWindowVisibility(true); + mCarNavigationBar.setBottomWindowVisibility(View.VISIBLE); assertThat(window.getVisibility()).isEqualTo(View.VISIBLE); } @@ -201,7 +207,7 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mHvacControllerLazy); ViewGroup window = mCarNavigationBar.getBottomWindow(); - mCarNavigationBar.setBottomWindowVisibility(false); + mCarNavigationBar.setBottomWindowVisibility(View.GONE); assertThat(window.getVisibility()).isEqualTo(View.GONE); } @@ -213,7 +219,7 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mHvacControllerLazy); ViewGroup window = mCarNavigationBar.getLeftWindow(); - mCarNavigationBar.setLeftWindowVisibility(true); + mCarNavigationBar.setLeftWindowVisibility(View.VISIBLE); assertThat(window.getVisibility()).isEqualTo(View.VISIBLE); } @@ -225,7 +231,7 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mHvacControllerLazy); ViewGroup window = mCarNavigationBar.getLeftWindow(); - mCarNavigationBar.setLeftWindowVisibility(false); + mCarNavigationBar.setLeftWindowVisibility(View.GONE); assertThat(window.getVisibility()).isEqualTo(View.GONE); } @@ -237,7 +243,7 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mHvacControllerLazy); ViewGroup window = mCarNavigationBar.getRightWindow(); - mCarNavigationBar.setRightWindowVisibility(true); + mCarNavigationBar.setRightWindowVisibility(View.VISIBLE); assertThat(window.getVisibility()).isEqualTo(View.VISIBLE); } @@ -249,7 +255,7 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { mHvacControllerLazy); ViewGroup window = mCarNavigationBar.getRightWindow(); - mCarNavigationBar.setRightWindowVisibility(false); + mCarNavigationBar.setRightWindowVisibility(View.GONE); assertThat(window.getVisibility()).isEqualTo(View.GONE); } @@ -313,4 +319,90 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { assertThat(controller).isNotNull(); } + + @Test + public void testShowAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsVisible() { + mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true); + mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory, + mHvacControllerLazy); + CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true); + View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons); + + mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true); + + assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void testShowAllKeyguardButtons_bottomEnabled_bottomNavButtonsGone() { + mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true); + mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory, + mHvacControllerLazy); + CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true); + View bottomButtons = bottomBar.findViewById(R.id.nav_buttons); + + mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true); + + assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void testHideAllKeyguardButtons_bottomEnabled_bottomKeyguardButtonsGone() { + mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true); + mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory, + mHvacControllerLazy); + CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true); + View bottomKeyguardButtons = bottomBar.findViewById(R.id.lock_screen_nav_buttons); + + mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true); + assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.VISIBLE); + mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true); + + assertThat(bottomKeyguardButtons.getVisibility()).isEqualTo(View.GONE); + } + + @Test + public void testHideAllKeyguardButtons_bottomEnabled_bottomNavButtonsVisible() { + mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true); + mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory, + mHvacControllerLazy); + CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true); + View bottomButtons = bottomBar.findViewById(R.id.nav_buttons); + + mCarNavigationBar.showAllKeyguardButtons(/* isSetUp= */ true); + assertThat(bottomButtons.getVisibility()).isEqualTo(View.GONE); + mCarNavigationBar.hideAllKeyguardButtons(/* isSetUp= */ true); + + assertThat(bottomButtons.getVisibility()).isEqualTo(View.VISIBLE); + } + + @Test + public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_hasUnseen_setCorrectly() { + mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true); + mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory, + mHvacControllerLazy); + CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true); + CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications); + + boolean hasUnseen = true; + mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true, + hasUnseen); + + assertThat(notifications.getUnseen()).isTrue(); + } + + @Test + public void testToggleAllNotificationsUnseenIndicator_bottomEnabled_noUnseen_setCorrectly() { + mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true); + mCarNavigationBar = new CarNavigationBarController(mContext, mNavigationBarViewFactory, + mHvacControllerLazy); + CarNavigationBarView bottomBar = mCarNavigationBar.getBottomBar(/* isSetUp= */ true); + CarNavigationButton notifications = bottomBar.findViewById(R.id.notifications); + + boolean hasUnseen = false; + mCarNavigationBar.toggleAllNotificationsUnseenIndicator(/* isSetUp= */ true, + hasUnseen); + + assertThat(notifications.getUnseen()).isFalse(); + } } |