diff options
author | Youngjun Kwak <kwaky@google.com> | 2020-09-16 15:11:35 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2020-09-16 15:11:35 +0000 |
commit | 2d1d3d0897f66325ddd76afaf78288f453ff936e (patch) | |
tree | 05e37a94112b3aae326073da52d01334e8fe5991 | |
parent | 71f51c54cd925a14576d0f313eb703f0b99ae1e4 (diff) | |
parent | a0e8b666e4d3c8c7bd577ac34dfdccf51182246e (diff) |
Merge "DO NOT MERGE Enable hiding system bars by side when IME appears." into rvc-qpr-dev
6 files changed, 157 insertions, 17 deletions
diff --git a/packages/CarSystemUI/res/values/config.xml b/packages/CarSystemUI/res/values/config.xml index 039f2c039ded..24157f9e2038 100644 --- a/packages/CarSystemUI/res/values/config.xml +++ b/packages/CarSystemUI/res/values/config.xml @@ -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> diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java index 9584850fde7c..b6d251fbfe16 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBar.java @@ -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,17 +416,30 @@ 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; - mCarNavigationBarController.setBottomWindowVisibility( - isKeyboardVisible ? View.GONE : View.VISIBLE); + + 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 diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java index fe26040c5eae..e522d19249e3 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/CarNavigationBarController.java @@ -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); diff --git a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java index 39ea79cff718..694ae6d93b93 100644 --- a/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java +++ b/packages/CarSystemUI/src/com/android/systemui/car/navigationbar/SystemBarConfigs.java @@ -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); } } } diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java index 84c840477302..3fd0852bc0ff 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/CarNavigationBarControllerTest.java @@ -251,6 +251,28 @@ public class CarNavigationBarControllerTest extends SysuiTestCase { } @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); mCarNavigationBar = createNavigationBarController(); diff --git a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java index 19b25958c2ad..96f05045cd38 100644 --- a/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java +++ b/packages/CarSystemUI/tests/src/com/android/systemui/car/navigationbar/SystemBarConfigsTest.java @@ -17,6 +17,7 @@ package com.android.systemui.car.navigationbar; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; @@ -99,6 +100,16 @@ public class SystemBarConfigsTest extends SysuiTestCase { mSystemBarConfigs = new SystemBarConfigs(mResources); } + @Test(expected = RuntimeException.class) + public void onInit_hideBottomSystemBarForKeyboardValueDoNotSync_throwsRuntimeException() { + when(mResources.getBoolean(R.bool.config_hideBottomSystemBarForKeyboard)).thenReturn(false); + when(mResources.getBoolean( + com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard)).thenReturn( + true); + + mSystemBarConfigs = new SystemBarConfigs(mResources); + } + @Test public void onInit_topNotifPanelViewMediatorUsed_topBarEnabled_doesNotThrowException() { when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(true); @@ -146,6 +157,26 @@ public class SystemBarConfigsTest extends SysuiTestCase { } @Test + public void getTopSystemBarHideForKeyboard_hideBarForKeyboard_returnsTrue() { + when(mResources.getBoolean(R.bool.config_hideTopSystemBarForKeyboard)).thenReturn(true); + mSystemBarConfigs = new SystemBarConfigs(mResources); + + boolean hideKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.TOP); + + assertTrue(hideKeyboard); + } + + @Test + public void getTopSystemBarHideForKeyboard_topBarNotEnabled_returnsFalse() { + when(mResources.getBoolean(R.bool.config_enableTopNavigationBar)).thenReturn(false); + mSystemBarConfigs = new SystemBarConfigs(mResources); + + boolean hideKeyboard = mSystemBarConfigs.getHideForKeyboardBySide(SystemBarConfigs.TOP); + + assertFalse(hideKeyboard); + } + + @Test public void topSystemBarHasHigherZOrderThanHuns_topSystemBarIsNavigationBarPanelType() { when(mResources.getInteger(R.integer.config_topSystemBarZOrder)).thenReturn( SystemBarConfigs.getHunZOrder() + 1); @@ -192,6 +223,15 @@ public class SystemBarConfigsTest extends SysuiTestCase { when(mResources.getInteger(R.integer.config_bottomSystemBarZOrder)).thenReturn(10); when(mResources.getInteger(R.integer.config_leftSystemBarZOrder)).thenReturn(2); when(mResources.getInteger(R.integer.config_rightSystemBarZOrder)).thenReturn(3); + + when(mResources.getBoolean(R.bool.config_hideTopSystemBarForKeyboard)).thenReturn(false); + when(mResources.getBoolean( + com.android.internal.R.bool.config_automotiveHideNavBarForKeyboard)).thenReturn( + false); + when(mResources.getBoolean(R.bool.config_hideLeftSystemBarForKeyboard)).thenReturn( + false); + when(mResources.getBoolean(R.bool.config_hideRightSystemBarForKeyboard)).thenReturn( + false); } // Intentionally using a subclass of TopNotificationPanelViewMediator for testing purposes to |