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

Bug: 167593045
Test: Manual + Unit Tests
Change-Id: Ib0c2c70e2df361f5cce156315c7fd4ae489ae279
This commit is contained in:
kwaky
2020-09-09 13:45:19 -07:00
parent 74237cc162
commit a0e8b666e4
6 changed files with 157 additions and 17 deletions

View File

@@ -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>

View File

@@ -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

View File

@@ -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);

View File

@@ -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);
}
}
}

View File

@@ -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);

View File

@@ -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;
@@ -92,6 +93,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 getTopSystemBarLayoutParams_topBarEnabled_returnsTopSystemBarLayoutParams() {
mSystemBarConfigs = new SystemBarConfigs(mResources);
@@ -111,6 +122,26 @@ public class SystemBarConfigsTest extends SysuiTestCase {
assertNull(lp);
}
@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(
@@ -158,5 +189,14 @@ 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);
}
}