Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d6ec6a7 authored by Heemin Seog's avatar Heemin Seog
Browse files

Remove references to nav bar views in StatusBar

All relevant logic is in the CarNavigationBarController which means we
don't need to account for the views in two different parts of SystemUI.

Bug: 143143539
Test: atest CarNavigationBarControllerTest
Change-Id: I0a54ddf3966a8e373909062df78ec2665f4a9c9d
parent d0cfab09
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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() {
+73 −10
Original line number Diff line number Diff line
@@ -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);
    }
}
+5 −0
Original line number Diff line number Diff line
@@ -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
+18 −82
Original line number Diff line number Diff line
@@ -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();
+98 −6
Original line number Diff line number Diff line
@@ -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();
    }
}