From f92a8c2f1492f66a8b1127855cf894c968cf8586 Mon Sep 17 00:00:00 2001 From: Winson Chung Date: Tue, 15 Feb 2022 06:37:55 +0000 Subject: [PATCH] Ensure nav bar is not touchable when the IME is handling back - During SUW we should calculate the full touchable region and not assume the entire frame is touchable if the IME reports handling the nav and the IME is currently visible. Bug: 218322263 Test: Verify touchable region in SUW, SUW + IME, post-SUW, post-SUW+IME in both nav modes Change-Id: I96126551112abdbee921ca7aee711b63899b6aa9 --- .../navigationbar/NavigationBarView.java | 35 +++++++++++++------ 1 file changed, 25 insertions(+), 10 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 6ea7aec7ba0cf..80a7a4ae2f6aa 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -274,11 +274,21 @@ 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. + // When the nav bar is in 2-button or 3-button mode, or when the back button is force-shown + // while in gesture nav in SUW, the entire nav bar should be touchable. if (!mEdgeBackGestureHandler.isHandlingGestures()) { - info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); - return; + // We're in 2/3 button mode OR back button force-shown in SUW + if (!mImeVisible) { + // IME not showing, take all touches + info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); + return; + } + + if (!isImeRenderingNavButtons()) { + // IME showing but not drawing any buttons, take all touches + info.setTouchableInsets(InternalInsetsInfo.TOUCHABLE_INSETS_FRAME); + return; + } } // When in gestural and the IME is showing, don't use the nearest region since it will take @@ -775,14 +785,10 @@ public class NavigationBarView extends FrameLayout implements updateRecentsIcon(); - boolean isImeRenderingNavButtons = mImeDrawsImeNavBar - && mImeCanRenderGesturalNavButtons - && (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0; - // Update IME button visibility, a11y and rotate button always overrides the appearance boolean disableImeSwitcher = (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SWITCHER_SHOWN) == 0 - || isImeRenderingNavButtons; + || isImeRenderingNavButtons(); mContextualButtonGroup.setButtonVisibility(R.id.ime_switcher, !disableImeSwitcher); mBarTransitions.reapplyDarkIntensity(); @@ -799,7 +805,7 @@ public class NavigationBarView extends FrameLayout implements boolean disableBack = !useAltBack && (mEdgeBackGestureHandler.isHandlingGestures() || ((mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)) - || isImeRenderingNavButtons; + || isImeRenderingNavButtons(); // When screen pinning, don't hide back and home when connected service or back and // recents buttons when disconnected from launcher service in screen pinning mode, @@ -832,6 +838,15 @@ public class NavigationBarView extends FrameLayout implements notifyActiveTouchRegions(); } + /** + * Returns whether the IME is currently visible and drawing the nav buttons. + */ + private boolean isImeRenderingNavButtons() { + return mImeDrawsImeNavBar + && mImeCanRenderGesturalNavButtons + && (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0; + } + @VisibleForTesting boolean isRecentsButtonDisabled() { return mUseCarModeUi || !isOverviewEnabled()