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

Commit a0e8b666 authored by kwaky's avatar kwaky
Browse files

DO NOT MERGE Enable hiding system bars by side when IME appears.

Bug: 167593045
Test: Manual + Unit Tests
Change-Id: Ib0c2c70e2df361f5cce156315c7fd4ae489ae279
parent 74237cc1
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -53,6 +53,16 @@
    <integer name="config_rightSystemBarZOrder">0</integer>
    <integer name="config_bottomSystemBarZOrder">10</integer>

    <!-- If set to true, the corresponding system bar will be hidden when Keyboard (IME) appears.
         NOTE: hideBottomSystemBarKeyboard must not be overlaid directly here. To change its value,
         overlay config_automotiveHideNavBarForKeyboard in framework/base/core/res/res. -->
    <bool name="config_hideTopSystemBarForKeyboard">false</bool>
    <bool name="config_hideBottomSystemBarForKeyboard">
        @*android:bool/config_automotiveHideNavBarForKeyboard
    </bool>
    <bool name="config_hideLeftSystemBarForKeyboard">false</bool>
    <bool name="config_hideRightSystemBarForKeyboard">false</bool>

    <!-- Disable normal notification rendering; we handle that ourselves -->
    <bool name="config_renderNotifications">false</bool>

+31 −9
Original line number Diff line number Diff line
@@ -91,7 +91,11 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
    private ActivityManagerWrapper mActivityManagerWrapper;

    // If the nav bar should be hidden when the soft keyboard is visible.
    private boolean mHideNavBarForKeyboard;
    private boolean mHideTopBarForKeyboard;
    private boolean mHideLeftBarForKeyboard;
    private boolean mHideRightBarForKeyboard;
    private boolean mHideBottomBarForKeyboard;

    private boolean mBottomNavBarVisible;

    // Nav bar views.
@@ -160,8 +164,13 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
    @Override
    public void start() {
        // Set initial state.
        mHideNavBarForKeyboard = mResources.getBoolean(
                com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard);
        mHideTopBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.TOP);
        mHideBottomBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(
                SystemBarConfigs.BOTTOM);
        mHideLeftBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.LEFT);
        mHideRightBarForKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(
                SystemBarConfigs.RIGHT);

        mBottomNavBarVisible = false;

        // Connect into the status bar manager service
@@ -407,19 +416,32 @@ public class CarNavigationBar extends SystemUI implements CommandQueue.Callbacks
    @Override
    public void setImeWindowStatus(int displayId, IBinder token, int vis, int backDisposition,
            boolean showImeSwitcher) {
        if (!mHideNavBarForKeyboard) {
            return;
        }

        if (mContext.getDisplayId() != displayId) {
            return;
        }

        boolean isKeyboardVisible = (vis & InputMethodService.IME_VISIBLE) != 0;

        if (mHideTopBarForKeyboard) {
            mCarNavigationBarController.setTopWindowVisibility(
                    isKeyboardVisible ? View.GONE : View.VISIBLE);
        }

        if (mHideBottomBarForKeyboard) {
            mCarNavigationBarController.setBottomWindowVisibility(
                    isKeyboardVisible ? View.GONE : View.VISIBLE);
        }

        if (mHideLeftBarForKeyboard) {
            mCarNavigationBarController.setLeftWindowVisibility(
                    isKeyboardVisible ? View.GONE : View.VISIBLE);
        }
        if (mHideRightBarForKeyboard) {
            mCarNavigationBarController.setRightWindowVisibility(
                    isKeyboardVisible ? View.GONE : View.VISIBLE);
        }
    }

    @Override
    public void onSystemBarAppearanceChanged(
            int displayId,
+7 −6
Original line number Diff line number Diff line
@@ -79,9 +79,7 @@ public class CarNavigationBarController {
     * Hides all system bars.
     */
    public void hideBars() {
        if (mTopView != null) {
            mTopView.setVisibility(View.GONE);
        }
        setTopWindowVisibility(View.GONE);
        setBottomWindowVisibility(View.GONE);
        setLeftWindowVisibility(View.GONE);
        setRightWindowVisibility(View.GONE);
@@ -91,9 +89,7 @@ public class CarNavigationBarController {
     * Shows all system bars.
     */
    public void showBars() {
        if (mTopView != null) {
            mTopView.setVisibility(View.VISIBLE);
        }
        setTopWindowVisibility(View.VISIBLE);
        setBottomWindowVisibility(View.VISIBLE);
        setLeftWindowVisibility(View.VISIBLE);
        setRightWindowVisibility(View.VISIBLE);
@@ -135,6 +131,11 @@ public class CarNavigationBarController {
        return mShowRight ? mNavigationBarViewFactory.getRightWindow() : null;
    }

    /** Toggles the top nav bar visibility. */
    public boolean setTopWindowVisibility(@View.Visibility int visibility) {
        return setWindowVisibility(getTopWindow(), visibility);
    }

    /** Toggles the bottom nav bar visibility. */
    public boolean setBottomWindowVisibility(@View.Visibility int visibility) {
        return setWindowVisibility(getBottomWindow(), visibility);
+47 −2
Original line number Diff line number Diff line
@@ -98,6 +98,7 @@ public class SystemBarConfigs {
        readConfigs();
        checkEnabledBarsHaveUniqueBarTypes();
        checkSystemBarEnabledForNotificationPanel();
        checkHideBottomBarForKeyboardConfigSync();
        setInsetPaddingsForOverlappingCorners();
        sortSystemBarSidesByZOrder();
    }
@@ -122,6 +123,11 @@ public class SystemBarConfigs {
        }
    }

    protected boolean getHideForKeyboardBySide(@SystemBarSide int side) {
        return mSystemBarConfigMap.get(side) != null
                && mSystemBarConfigMap.get(side).getHideForKeyboard();
    }

    protected void insetSystemBar(@SystemBarSide int side, CarNavigationBarView view) {
        int[] paddings = mSystemBarConfigMap.get(side).getPaddings();
        view.setPadding(paddings[2], paddings[0], paddings[3], paddings[1]);
@@ -167,6 +173,8 @@ public class SystemBarConfigs {
                                    com.android.internal.R.dimen.status_bar_height))
                            .setBarType(mResources.getInteger(R.integer.config_topSystemBarType))
                            .setZOrder(mResources.getInteger(R.integer.config_topSystemBarZOrder))
                            .setHideForKeyboard(mResources.getBoolean(
                                    R.bool.config_hideTopSystemBarForKeyboard))
                            .build();
            mSystemBarConfigMap.put(TOP, topBarConfig);
        }
@@ -180,6 +188,8 @@ public class SystemBarConfigs {
                            .setBarType(mResources.getInteger(R.integer.config_bottomSystemBarType))
                            .setZOrder(
                                    mResources.getInteger(R.integer.config_bottomSystemBarZOrder))
                            .setHideForKeyboard(mResources.getBoolean(
                                    R.bool.config_hideBottomSystemBarForKeyboard))
                            .build();
            mSystemBarConfigMap.put(BOTTOM, bottomBarConfig);
        }
@@ -192,6 +202,8 @@ public class SystemBarConfigs {
                                    R.dimen.car_left_navigation_bar_width))
                            .setBarType(mResources.getInteger(R.integer.config_leftSystemBarType))
                            .setZOrder(mResources.getInteger(R.integer.config_leftSystemBarZOrder))
                            .setHideForKeyboard(mResources.getBoolean(
                                    R.bool.config_hideLeftSystemBarForKeyboard))
                            .build();
            mSystemBarConfigMap.put(LEFT, leftBarConfig);
        }
@@ -204,6 +216,8 @@ public class SystemBarConfigs {
                                    R.dimen.car_right_navigation_bar_width))
                            .setBarType(mResources.getInteger(R.integer.config_rightSystemBarType))
                            .setZOrder(mResources.getInteger(R.integer.config_rightSystemBarZOrder))
                            .setHideForKeyboard(mResources.getBoolean(
                                    R.bool.config_hideRightSystemBarForKeyboard))
                            .build();
            mSystemBarConfigMap.put(RIGHT, rightBarConfig);
        }
@@ -252,6 +266,24 @@ public class SystemBarConfigs {
        }
    }

    private void checkHideBottomBarForKeyboardConfigSync() throws RuntimeException {
        if (mBottomNavBarEnabled) {
            boolean actual = mResources.getBoolean(R.bool.config_hideBottomSystemBarForKeyboard);
            boolean expected = mResources.getBoolean(
                    com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard);

            if (actual != expected) {
                throw new RuntimeException("config_hideBottomSystemBarForKeyboard must not be "
                        + "overlaid directly and should always refer to"
                        + "config_automotiveHideNavBarForKeyboard. However, their values "
                        + "currently do not sync. Set config_hideBottomSystemBarForKeyguard to "
                        + "@*android:bool/config_automotiveHideNavBarForKeyboard. To change its "
                        + "value, overlay config_automotiveHideNavBarForKeyboard in "
                        + "framework/base/core/res/res.");
            }
        }
    }

    private void setInsetPaddingsForOverlappingCorners() {
        setInsetPaddingForOverlappingCorner(TOP, LEFT);
        setInsetPaddingForOverlappingCorner(TOP, RIGHT);
@@ -320,14 +352,17 @@ public class SystemBarConfigs {
        private final int mBarType;
        private final int mGirth;
        private final int mZOrder;
        private final boolean mHideForKeyboard;

        private int[] mPaddings = new int[]{0, 0, 0, 0};

        private SystemBarConfig(@SystemBarSide int side, int barType, int girth, int zOrder) {
        private SystemBarConfig(@SystemBarSide int side, int barType, int girth, int zOrder,
                boolean hideForKeyboard) {
            mSide = side;
            mBarType = barType;
            mGirth = girth;
            mZOrder = zOrder;
            mHideForKeyboard = hideForKeyboard;
        }

        private int getSide() {
@@ -346,6 +381,10 @@ public class SystemBarConfigs {
            return mZOrder;
        }

        private boolean getHideForKeyboard() {
            return mHideForKeyboard;
        }

        private int[] getPaddings() {
            return mPaddings;
        }
@@ -383,6 +422,7 @@ public class SystemBarConfigs {
        private int mBarType;
        private int mGirth;
        private int mZOrder;
        private boolean mHideForKeyboard;

        private SystemBarConfigBuilder setSide(@SystemBarSide int side) {
            mSide = side;
@@ -404,8 +444,13 @@ public class SystemBarConfigs {
            return this;
        }

        private SystemBarConfigBuilder setHideForKeyboard(boolean hide) {
            mHideForKeyboard = hide;
            return this;
        }

        private SystemBarConfig build() {
            return new SystemBarConfig(mSide, mBarType, mGirth, mZOrder);
            return new SystemBarConfig(mSide, mBarType, mGirth, mZOrder, mHideForKeyboard);
        }
    }
}
+22 −0
Original line number Diff line number Diff line
@@ -250,6 +250,28 @@ public class CarNavigationBarControllerTest extends SysuiTestCase {
        assertThat(window1).isEqualTo(window2);
    }

    @Test
    public void testSetTopWindowVisibility_setTrue_isVisible() {
        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
        mCarNavigationBar = createNavigationBarController();

        ViewGroup window = mCarNavigationBar.getTopWindow();
        mCarNavigationBar.setTopWindowVisibility(View.VISIBLE);

        assertThat(window.getVisibility()).isEqualTo(View.VISIBLE);
    }

    @Test
    public void testSetTopWindowVisibility_setFalse_isGone() {
        mTestableResources.addOverride(R.bool.config_enableTopNavigationBar, true);
        mCarNavigationBar = createNavigationBarController();

        ViewGroup window = mCarNavigationBar.getTopWindow();
        mCarNavigationBar.setTopWindowVisibility(View.GONE);

        assertThat(window.getVisibility()).isEqualTo(View.GONE);
    }

    @Test
    public void testSetBottomWindowVisibility_setTrue_isVisible() {
        mTestableResources.addOverride(R.bool.config_enableBottomNavigationBar, true);
Loading