Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dec2c219 authored by Yohei Yukawa's avatar Yohei Yukawa
Browse files

Support nav button color transitions

With this CL, the back and IME switcher buttons on the navigation bar
have the same color transition even when they are rendered by the IME.

Note that the behavior is still behind a flag

  persist.sys.ime.can_render_gestural_nav_buttons,

which is still off by default.  There should be no observable changes
no matter whether the flag is enabled or disabled though.

Fix: 215549533
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 "EXTENDED LIGHT NAVIGARION BAR" mode
 12. Make sure that the navigation button color changes from light
     to dark with animation.
 13. Tap "EXTENDED DARK NAVIGARION BAR" mode
 12. Make sure that the navigation button color changes from dark
     to light with animation.
Change-Id: I41a3478a97d67b238c4424d93acbcad646aee0d2
parent e139c016
Loading
Loading
Loading
Loading
+35 −1
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ package android.inputmethodservice;
import static android.content.Intent.ACTION_OVERLAY_CHANGED;
import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;

import android.animation.ValueAnimator;
import android.annotation.FloatRange;
import android.annotation.NonNull;
import android.annotation.Nullable;
@@ -44,6 +45,8 @@ import android.view.Window;
import android.view.WindowInsets;
import android.view.WindowInsetsController.Appearance;
import android.view.WindowManagerPolicyConstants;
import android.view.animation.Interpolator;
import android.view.animation.PathInterpolator;
import android.widget.FrameLayout;

import java.util.Objects;
@@ -115,6 +118,12 @@ final class NavigationBarController {
    }

    private static final class Impl implements Callback {
        private static final int DEFAULT_COLOR_ADAPT_TRANSITION_TIME = 1700;

        // Copied from com.android.systemui.animation.Interpolators#LEGACY_DECELERATE
        private static final Interpolator LEGACY_DECELERATE =
                new PathInterpolator(0f, 0f, 0.2f, 1f);

        @NonNull
        private final InputMethodService mService;

@@ -133,6 +142,12 @@ final class NavigationBarController {
        @Appearance
        private int mAppearance;

        @FloatRange(from = 0.0f, to = 1.0f)
        private float mDarkIntensity;

        @Nullable
        private ValueAnimator mTintAnimator;

        Impl(@NonNull InputMethodService inputMethodService) {
            mService = inputMethodService;
        }
@@ -368,6 +383,10 @@ final class NavigationBarController {
            if (mDestroyed) {
                return;
            }
            if (mTintAnimator != null) {
                mTintAnimator.cancel();
                mTintAnimator = null;
            }
            if (mSystemOverlayChangedReceiver != null) {
                mService.unregisterReceiver(mSystemOverlayChangedReceiver);
                mSystemOverlayChangedReceiver = null;
@@ -416,10 +435,24 @@ final class NavigationBarController {
            }

            final float targetDarkIntensity = calculateTargetDarkIntensity(mAppearance);
            setIconTintInternal(targetDarkIntensity);

            if (mTintAnimator != null) {
                mTintAnimator.cancel();
            }
            mTintAnimator = ValueAnimator.ofFloat(mDarkIntensity, targetDarkIntensity);
            mTintAnimator.addUpdateListener(
                    animation -> setIconTintInternal((Float) animation.getAnimatedValue()));
            mTintAnimator.setDuration(DEFAULT_COLOR_ADAPT_TRANSITION_TIME);
            mTintAnimator.setStartDelay(0);
            mTintAnimator.setInterpolator(LEGACY_DECELERATE);
            mTintAnimator.start();
        }

        private void setIconTintInternal(float darkIntensity) {
            mDarkIntensity = darkIntensity;
            if (mNavigationBarFrame == null) {
                return;
            }
            final NavigationBarView navigationBarView =
                    mNavigationBarFrame.findViewByPredicate(NavigationBarView.class::isInstance);
            if (navigationBarView == null) {
@@ -439,6 +472,7 @@ final class NavigationBarController {
            return "{mRenderGesturalNavButtons=" + mRenderGesturalNavButtons
                    + " mNavigationBarFrame=" + mNavigationBarFrame
                    + " mAppearance=0x" + Integer.toHexString(mAppearance)
                    + " mDarkIntensity=" + mDarkIntensity
                    + "}";
        }
    }