From fc53675a40eb1dd78c25b194c8c6ffa81fb15d70 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Mon, 14 Sep 2020 16:46:32 -0700 Subject: [PATCH] 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 --- .../navigationbar/NavigationBarView.java | 67 ++++++++++--------- 1 file changed, 36 insertions(+), 31 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 13b9a552d75cf..37c79ccff9272 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -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 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() {