Make specific nav touchable region when the IME is showing

- IMEs would like to receive touches that are near the bottom
  of the screen under the nav bar so we should allow this

Bug: 168552683
Test: Verify touchable region from dumpsys input in all nav
      modes w/ ime switcher
Change-Id: Ic2ee8cc8ce59c4025c6730195d6e1050daddf87a
This commit is contained in:
Winson Chung
2020-09-14 16:46:32 -07:00
parent e9897deb31
commit fc53675a40

View File

@@ -124,7 +124,8 @@ public class NavigationBarView extends FrameLayout implements
int mNavigationIconHints = 0;
private int mNavBarMode;
private final Region mActiveRegion = new Region();
private final Region mTmpRegion = new Region();
private final int[] mTmpPosition = new int[2];
private Rect mTmpBounds = new Rect();
private KeyButtonDrawable mBackIcon;
@@ -266,24 +267,14 @@ public class NavigationBarView extends FrameLayout implements
private final OnComputeInternalInsetsListener mOnComputeInternalInsetsListener = info -> {
// When the nav bar is in 2-button or 3-button mode, or when IME is visible in fully
// gestural mode, the entire nav bar should be touchable.
if (!mEdgeBackGestureHandler.isHandlingGestures() || mImeVisible) {
if (!mEdgeBackGestureHandler.isHandlingGestures()) {
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME);
return;
}
info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_REGION);
ButtonDispatcher imeSwitchButton = getImeSwitchButton();
if (imeSwitchButton.getVisibility() == VISIBLE) {
// If the IME is not up, but the ime switch button is visible, then make sure that
// button is touchable
int[] loc = new int[2];
View buttonView = imeSwitchButton.getCurrentView();
buttonView.getLocationInWindow(loc);
info.touchableRegion.set(loc[0], loc[1], loc[0] + buttonView.getWidth(),
loc[1] + buttonView.getHeight());
return;
}
info.touchableRegion.setEmpty();
info.touchableRegion.set(getButtonLocations(false /* includeFloatingRotationButton */,
false /* inScreen */));
};
private final Consumer<Boolean> mRotationButtonListener = (visible) -> {
@@ -956,30 +947,44 @@ public class NavigationBarView extends FrameLayout implements
* Notifies the overview service of the active touch regions.
*/
public void notifyActiveTouchRegions() {
mActiveRegion.setEmpty();
updateButtonLocation(getBackButton());
updateButtonLocation(getHomeButton());
updateButtonLocation(getRecentsButton());
updateButtonLocation(getImeSwitchButton());
updateButtonLocation(getAccessibilityButton());
if (mFloatingRotationButton.isVisible()) {
View floatingRotationView = mFloatingRotationButton.getCurrentView();
floatingRotationView.getBoundsOnScreen(mTmpBounds);
mActiveRegion.op(mTmpBounds, Op.UNION);
} else {
updateButtonLocation(getRotateSuggestionButton());
}
mOverviewProxyService.onActiveNavBarRegionChanges(mActiveRegion);
mOverviewProxyService.onActiveNavBarRegionChanges(
getButtonLocations(true /* includeFloatingRotationButton */, true /* inScreen */));
}
private void updateButtonLocation(ButtonDispatcher button) {
private Region getButtonLocations(boolean includeFloatingRotationButton,
boolean inScreenSpace) {
mTmpRegion.setEmpty();
updateButtonLocation(getBackButton(), inScreenSpace);
updateButtonLocation(getHomeButton(), inScreenSpace);
updateButtonLocation(getRecentsButton(), inScreenSpace);
updateButtonLocation(getImeSwitchButton(), inScreenSpace);
updateButtonLocation(getAccessibilityButton(), inScreenSpace);
if (includeFloatingRotationButton && mFloatingRotationButton.isVisible()) {
updateButtonLocation(mFloatingRotationButton.getCurrentView(), inScreenSpace);
} else {
updateButtonLocation(getRotateSuggestionButton(), inScreenSpace);
}
return mTmpRegion;
}
private void updateButtonLocation(ButtonDispatcher button, boolean inScreenSpace) {
View view = button.getCurrentView();
if (view == null || !button.isVisible()) {
return;
}
updateButtonLocation(view, inScreenSpace);
}
view.getBoundsOnScreen(mTmpBounds);
mActiveRegion.op(mTmpBounds, Op.UNION);
private void updateButtonLocation(View view, boolean inScreenSpace) {
if (inScreenSpace) {
view.getBoundsOnScreen(mTmpBounds);
} else {
view.getLocationInWindow(mTmpPosition);
mTmpBounds.set(mTmpPosition[0], mTmpPosition[1],
mTmpPosition[0] + view.getWidth(),
mTmpPosition[1] + view.getHeight());
}
mTmpRegion.op(mTmpBounds, Op.UNION);
}
private void updateOrientationViews() {