diff options
| author | Yohei Yukawa <yukawa@google.com> | 2022-01-31 18:56:59 -0800 |
|---|---|---|
| committer | Yohei Yukawa <yukawa@google.com> | 2022-01-31 18:56:59 -0800 |
| commit | c98b9c8f407f8acc98490c017ff3862f449c45ba (patch) | |
| tree | 4d458f17f92b54e03145c987462319d39165fa96 /core/java/android/inputmethodservice/NavigationBarController.java | |
| parent | af1695a78aaf307fc7b9284aafefff5bab5a1448 (diff) | |
Support floating IMEs even when IMEs render the nav buttons
As discussed in Bug 201375975, the nevigation bar handling for
floating IMEs is a bit tricky.
This CL tweaks DecorView behabior only when
InputMethodService#canImeRenderGesturalNavButtons(),
is true and the IME is floating in the gestural navigation mode.
Fix: 215550296
Test: Manually tested with ThemedNavBarKeyboard sample
1. Build aosp_coral-userdebug and flash it
2. adb root
3. adb shell setprop \
persist.sys.ime.can_render_gestural_nav_buttons true
4. adb reboot
5. make -j ThemedNavBarKeyboard
6. adb install -r \
$OUT/system/app/ThemedNavBarKeyboard/ThemedNavBarKeyboard.apk
7. adb shell ime enable \
com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
8. adb shell ime set \
com.example.android.themednavbarkeyboard/.ThemedNavBarKeyboard
9. Open the Dialer app
10. Focus in the top edit field.
11. Tap "FLOATING MODE" mode
12. Make sure that the navigation buttons are visible.
Change-Id: Ia54499a3c2ac6e33e72f625eba3477fd81649d32
Diffstat (limited to 'core/java/android/inputmethodservice/NavigationBarController.java')
| -rw-r--r-- | core/java/android/inputmethodservice/NavigationBarController.java | 42 |
1 files changed, 37 insertions, 5 deletions
diff --git a/core/java/android/inputmethodservice/NavigationBarController.java b/core/java/android/inputmethodservice/NavigationBarController.java index 9cea82b91f5a..e5c22e4de08e 100644 --- a/core/java/android/inputmethodservice/NavigationBarController.java +++ b/core/java/android/inputmethodservice/NavigationBarController.java @@ -29,6 +29,7 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.content.res.Resources; +import android.graphics.Color; import android.graphics.Insets; import android.graphics.Rect; import android.graphics.Region; @@ -158,6 +159,8 @@ final class NavigationBarController { @Nullable private ValueAnimator mTintAnimator; + private boolean mDrawLegacyNavigationBarBackground; + Impl(@NonNull InputMethodService inputMethodService) { mService = inputMethodService; } @@ -226,9 +229,14 @@ final class NavigationBarController { mLastInsets = systemInsets; } - mNavigationBarFrame.setBackground(null); + if (mDrawLegacyNavigationBarBackground) { + mNavigationBarFrame.setBackgroundColor(Color.BLACK); + } else { + mNavigationBarFrame.setBackground(null); + } - setIconTintInternal(calculateTargetDarkIntensity(mAppearance)); + setIconTintInternal(calculateTargetDarkIntensity(mAppearance, + mDrawLegacyNavigationBarBackground)); } private void uninstallNavigationBarFrameIfNecessary() { @@ -478,7 +486,8 @@ final class NavigationBarController { return; } - final float targetDarkIntensity = calculateTargetDarkIntensity(mAppearance); + final float targetDarkIntensity = calculateTargetDarkIntensity(mAppearance, + mDrawLegacyNavigationBarBackground); if (mTintAnimator != null) { mTintAnimator.cancel(); @@ -506,18 +515,41 @@ final class NavigationBarController { } @FloatRange(from = 0.0f, to = 1.0f) - private static float calculateTargetDarkIntensity(@Appearance int appearance) { - final boolean lightNavBar = (appearance & APPEARANCE_LIGHT_NAVIGATION_BARS) != 0; + private static float calculateTargetDarkIntensity(@Appearance int appearance, + boolean drawLegacyNavigationBarBackground) { + final boolean lightNavBar = !drawLegacyNavigationBarBackground + && (appearance & APPEARANCE_LIGHT_NAVIGATION_BARS) != 0; return lightNavBar ? 1.0f : 0.0f; } @Override + public boolean onDrawLegacyNavigationBarBackgroundChanged( + boolean drawLegacyNavigationBarBackground) { + if (mDestroyed) { + return false; + } + + if (drawLegacyNavigationBarBackground != mDrawLegacyNavigationBarBackground) { + mDrawLegacyNavigationBarBackground = drawLegacyNavigationBarBackground; + if (mDrawLegacyNavigationBarBackground) { + mNavigationBarFrame.setBackgroundColor(Color.BLACK); + } else { + mNavigationBarFrame.setBackground(null); + } + scheduleRelayout(); + onSystemBarAppearanceChanged(mAppearance); + } + return drawLegacyNavigationBarBackground; + } + + @Override public String toDebugString() { return "{mRenderGesturalNavButtons=" + mRenderGesturalNavButtons + " mNavigationBarFrame=" + mNavigationBarFrame + " mShouldShowImeSwitcherWhenImeIsShown" + mShouldShowImeSwitcherWhenImeIsShown + " mAppearance=0x" + Integer.toHexString(mAppearance) + " mDarkIntensity=" + mDarkIntensity + + " mDrawLegacyNavigationBarBackground=" + mDrawLegacyNavigationBarBackground + "}"; } } |
