diff options
| author | 2022-01-13 05:17:48 +0000 | |
|---|---|---|
| committer | 2022-01-13 05:17:48 +0000 | |
| commit | 5aa8e247fd357a39ea0a06bb8d143b3310687573 (patch) | |
| tree | 250ae077fe4df885eb996392f325a58680760c72 | |
| parent | cc4caab6201f116c6877a082bbb33f2d768f12b0 (diff) | |
| parent | a25070917a62074d3506b0ded058c3e33390c195 (diff) | |
Merge "Add a sysprop to disable SysUI's nav buttons when IME is shown"
| -rw-r--r-- | core/java/android/inputmethodservice/InputMethodService.java | 40 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java | 24 |
2 files changed, 61 insertions, 3 deletions
diff --git a/core/java/android/inputmethodservice/InputMethodService.java b/core/java/android/inputmethodservice/InputMethodService.java index 93573d15bae0..afcb6fccb137 100644 --- a/core/java/android/inputmethodservice/InputMethodService.java +++ b/core/java/android/inputmethodservice/InputMethodService.java @@ -54,6 +54,7 @@ import static android.view.WindowInsets.Type.statusBars; import static java.lang.annotation.RetentionPolicy.SOURCE; +import android.annotation.AnyThread; import android.annotation.CallSuper; import android.annotation.DrawableRes; import android.annotation.IntDef; @@ -83,6 +84,7 @@ import android.os.Handler; import android.os.IBinder; import android.os.ResultReceiver; import android.os.SystemClock; +import android.os.SystemProperties; import android.os.Trace; import android.provider.Settings; import android.text.InputType; @@ -302,6 +304,44 @@ public class InputMethodService extends AbstractInputMethodService { static final boolean DEBUG = false; /** + * Key for a boolean value that tells whether {@link InputMethodService} is responsible for + * rendering the back button and the IME switcher button or not when the gestural navigation is + * enabled. + * + * <p>This sysprop is just ignored when the gestural navigation mode is not enabled.</p> + * + * <p> + * To avoid complexity that is not necessary for production, you always need to reboot the + * device after modifying this flag as follows: + * <pre> + * $ adb root + * $ adb shell setprop persist.sys.ime.can_render_gestural_nav_buttons true + * $ adb reboot + * </pre> + * </p> + */ + private static final String PROP_CAN_RENDER_GESTURAL_NAV_BUTTONS = + "persist.sys.ime.can_render_gestural_nav_buttons"; + + /** + * Returns whether {@link InputMethodService} is responsible for rendering the back button and + * the IME switcher button or not when the gestural navigation is enabled. + * + * <p>This method is supposed to be used with an assumption that the same value is returned in + * other processes. It is developers' responsibility for rebooting the device when the sysprop + * is modified.</p> + * + * @return {@code true} if {@link InputMethodService} is responsible for rendering the back + * button and the IME switcher button when the gestural navigation is enabled. + * + * @hide + */ + @AnyThread + public static boolean canImeRenderGesturalNavButtons() { + return SystemProperties.getBoolean(PROP_CAN_RENDER_GESTURAL_NAV_BUTTONS, false); + } + + /** * Allows the system to optimize the back button affordance based on the presence of software * keyboard. * diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 5fbdd88b9f66..ac816ba9e8d5 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -16,6 +16,7 @@ package com.android.systemui.navigationbar; +import static android.inputmethodservice.InputMethodService.canImeRenderGesturalNavButtons; import static android.view.WindowManagerPolicyConstants.NAV_BAR_MODE_GESTURAL; import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_HOME_DISABLED; @@ -185,6 +186,17 @@ public class NavigationBarView extends FrameLayout implements @Nullable private Rect mOrientedHandleSamplingRegion; + /** + * {@code true} if the IME can render the back button and the IME switcher button. + * + * <p>The value must be used when and only when + * {@link com.android.systemui.shared.system.QuickStepContract#isGesturalMode(int)} returns + * {@code true}</p> + * + * <p>Cache the value here for better performance.</p> + */ + private final boolean mImeCanRenderGesturalNavButtons = canImeRenderGesturalNavButtons(); + private class NavTransitionListener implements TransitionListener { private boolean mBackTransitioning; private boolean mHomeAppearing; @@ -760,9 +772,14 @@ public class NavigationBarView extends FrameLayout implements updateRecentsIcon(); + boolean isImeRenderingNavButtons = isGesturalMode(mNavBarMode) + && mImeCanRenderGesturalNavButtons; + // Update IME button visibility, a11y and rotate button always overrides the appearance - mContextualButtonGroup.setButtonVisibility(R.id.ime_switcher, - (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) != 0); + boolean disableImeSwitcher = + (mNavigationIconHints & StatusBarManager.NAVIGATION_HINT_IME_SHOWN) == 0 + || isImeRenderingNavButtons; + mContextualButtonGroup.setButtonVisibility(R.id.ime_switcher, !disableImeSwitcher); mBarTransitions.reapplyDarkIntensity(); @@ -777,7 +794,8 @@ public class NavigationBarView extends FrameLayout implements && ((mDisabledFlags & View.STATUS_BAR_DISABLE_HOME) != 0); boolean disableBack = !useAltBack && (mEdgeBackGestureHandler.isHandlingGestures() - || ((mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)); + || ((mDisabledFlags & View.STATUS_BAR_DISABLE_BACK) != 0)) + || 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, |