diff options
3 files changed, 103 insertions, 38 deletions
diff --git a/packages/SystemUI/res/values/ids.xml b/packages/SystemUI/res/values/ids.xml index 2d30f4c0082d..0e92c60ab823 100644 --- a/packages/SystemUI/res/values/ids.xml +++ b/packages/SystemUI/res/values/ids.xml @@ -47,7 +47,6 @@      <item type="id" name="qs_icon_tag"/>      <item type="id" name="qs_slash_tag"/>      <item type="id" name="scrim"/> -    <item type="id" name="scrim_target"/>      <item type="id" name="scrim_alpha_start"/>      <item type="id" name="scrim_alpha_end"/>      <item type="id" name="notification_power"/> diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index 2b5085389804..255e5e48dbae 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -112,7 +112,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,      protected static final float SCRIM_IN_FRONT_ALPHA_LOCKED = GRADIENT_SCRIM_ALPHA_BUSY;      static final int TAG_KEY_ANIM = R.id.scrim; -    private static final int TAG_KEY_ANIM_TARGET = R.id.scrim_target;      private static final int TAG_START_ALPHA = R.id.scrim_alpha_start;      private static final int TAG_END_ALPHA = R.id.scrim_alpha_end;      private static final float NOT_INITIALIZED = -1; @@ -138,7 +137,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,      protected float mScrimBehindAlphaKeyguard = SCRIM_BEHIND_ALPHA_KEYGUARD;      protected float mScrimBehindAlphaUnlocking = SCRIM_BEHIND_ALPHA_UNLOCKING; -    private float mFraction; +    // Assuming the shade is expanded during initialization +    private float mExpansionFraction = 1f;      private boolean mDarkenWhileDragging;      protected boolean mAnimateChange; @@ -252,6 +252,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,          mCurrentBehindTint = state.getBehindTint();          mCurrentInFrontAlpha = state.getFrontAlpha();          mCurrentBehindAlpha = state.getBehindAlpha(); +        applyExpansionToAlpha();          // Cancel blanking transitions that were pending before we requested a new state          if (mPendingFrameCallback != null) { @@ -363,45 +364,50 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,       * @param fraction From 0 to 1 where 0 means collapse and 1 expanded.       */      public void setPanelExpansion(float fraction) { -        if (mFraction != fraction) { -            mFraction = fraction; - -            if (mState == ScrimState.UNLOCKED) { -                // Darken scrim as you pull down the shade when unlocked -                float behindFraction = getInterpolatedFraction(); -                behindFraction = (float) Math.pow(behindFraction, 0.8f); -                mCurrentBehindAlpha = behindFraction * mScrimBehindAlphaKeyguard; -                mCurrentInFrontAlpha = 0; -            } else if (mState == ScrimState.KEYGUARD) { -                if (mUpdatePending) { -                    return; -                } +        if (mExpansionFraction != fraction) { +            mExpansionFraction = fraction; -                // Either darken of make the scrim transparent when you -                // pull down the shade -                float interpolatedFract = getInterpolatedFraction(); -                if (mDarkenWhileDragging) { -                    mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking, -                            mScrimBehindAlphaKeyguard, interpolatedFract); -                    mCurrentInFrontAlpha = (1f - interpolatedFract) * SCRIM_IN_FRONT_ALPHA_LOCKED; -                } else { -                    mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, mScrimBehindAlphaKeyguard, -                            interpolatedFract); -                    mCurrentInFrontAlpha = 0; -                } -            } else { +            if (!(mState == ScrimState.UNLOCKED || mState == ScrimState.KEYGUARD)) { +                return; +            } + +            applyExpansionToAlpha(); + +            if (mUpdatePending) {                  return;              }              if (mPinnedHeadsUpCount != 0) {                  updateHeadsUpScrim(false);              } -              updateScrim(false /* animate */, mScrimInFront, mCurrentInFrontAlpha);              updateScrim(false /* animate */, mScrimBehind, mCurrentBehindAlpha);          }      } +    private void applyExpansionToAlpha() { +        if (mState == ScrimState.UNLOCKED) { +            // Darken scrim as you pull down the shade when unlocked +            float behindFraction = getInterpolatedFraction(); +            behindFraction = (float) Math.pow(behindFraction, 0.8f); +            mCurrentBehindAlpha = behindFraction * mScrimBehindAlphaKeyguard; +            mCurrentInFrontAlpha = 0; +        } else if (mState == ScrimState.KEYGUARD) { +            // Either darken of make the scrim transparent when you +            // pull down the shade +            float interpolatedFract = getInterpolatedFraction(); +            if (mDarkenWhileDragging) { +                mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking, +                        mScrimBehindAlphaKeyguard, interpolatedFract); +                mCurrentInFrontAlpha = (1f - interpolatedFract) * SCRIM_IN_FRONT_ALPHA_LOCKED; +            } else { +                mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, mScrimBehindAlphaKeyguard, +                        interpolatedFract); +                mCurrentInFrontAlpha = 0; +            } +        } +    } +      /**       * Keyguard and shade scrim opacity varies according to how many notifications are visible.       * @param notificationCount Number of visible notifications. @@ -497,7 +503,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,      }      private float getInterpolatedFraction() { -        float frac = mFraction; +        float frac = mExpansionFraction;          // let's start this 20% of the way down the screen          frac = frac * 1.2f - 0.2f;          if (frac <= 0) { @@ -551,7 +557,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,          return scrim == mScrimInFront ? mCurrentInFrontTint : mCurrentBehindTint;      } -    private void startScrimAnimation(final View scrim, float current, float target) { +    private void startScrimAnimation(final View scrim, float current) {          ValueAnimator anim = ValueAnimator.ofFloat(0f, 1f);          final int initialScrimTint = scrim instanceof ScrimView ? ((ScrimView) scrim).getTint() :                  Color.TRANSPARENT; @@ -559,7 +565,9 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,              final float animAmount = (float) animation.getAnimatedValue();              final int finalScrimTint = scrim == mScrimInFront ?                      mCurrentInFrontTint : mCurrentBehindTint; -            float alpha = MathUtils.lerp(current, target, animAmount); +            float finalScrimAlpha = scrim == mScrimInFront ? +                    mCurrentInFrontAlpha : mCurrentBehindAlpha; +            float alpha = MathUtils.lerp(current, finalScrimAlpha, animAmount);              int tint = ColorUtils.blendARGB(initialScrimTint, finalScrimTint, animAmount);              updateScrimColor(scrim, alpha, tint);              dispatchScrimsVisible(); @@ -570,6 +578,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,          anim.addListener(new AnimatorListenerAdapter() {              @Override              public void onAnimationEnd(Animator animation) { +                final int finalScrimTint = scrim == mScrimInFront ? +                        mCurrentInFrontTint : mCurrentBehindTint; +                float finalScrimAlpha = scrim == mScrimInFront ? +                        mCurrentInFrontAlpha : mCurrentBehindAlpha; +                updateScrimColor(scrim, finalScrimAlpha, finalScrimTint); +                  if (mKeyguardFadingOutInProgress) {                      mKeyguardFadeoutAnimation = null;                      mKeyguardFadingOutInProgress = false; @@ -577,7 +591,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,                  onFinished();                  scrim.setTag(TAG_KEY_ANIM, null); -                scrim.setTag(TAG_KEY_ANIM_TARGET, null);                  dispatchScrimsVisible();                  if (!mDeferFinishedListener && mOnAnimationFinished != null) { @@ -592,7 +605,6 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,              mKeyguardFadeoutAnimation = anim;          }          scrim.setTag(TAG_KEY_ANIM, anim); -        scrim.setTag(TAG_KEY_ANIM_TARGET, target);      }      protected Interpolator getInterpolator() { @@ -700,7 +712,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,                  if (animate) {                      mDeferFinishedListener = true;                  } -                previousAnimator.cancel(); +                cancelAnimator(previousAnimator);                  mDeferFinishedListener = false;              } else {                  animEndValue = ViewState.getChildTag(scrim, TAG_END_ALPHA); @@ -709,9 +721,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,          if (mPendingFrameCallback != null) {              // Display is off and we're waiting. +            cancelAnimator(previousAnimator);              return;          } else if (mBlankScreen) {              // Need to blank the display before continuing. +            cancelAnimator(previousAnimator);              blankDisplay();              return;          } else if (!mScreenBlankingCallbackCalled) { @@ -737,7 +751,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,              if (animate) {                  final float fromAlpha = scrimView == null ? scrim.getAlpha()                          : scrimView.getViewAlpha(); -                startScrimAnimation(scrim, fromAlpha, alpha); +                startScrimAnimation(scrim, fromAlpha);                  scrim.setTag(TAG_START_ALPHA, currentAlpha);                  scrim.setTag(TAG_END_ALPHA, alpha);              } else { @@ -765,6 +779,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,          }      } +    @VisibleForTesting +    protected void cancelAnimator(ValueAnimator previousAnimator) { +        if (previousAnimator != null) { +            previousAnimator.cancel(); +        } +    } +      private void blankDisplay() {          updateScrimColor(mScrimInFront, 1, Color.BLACK); @@ -827,7 +848,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener,          } else {              alpha = 1.0f - mTopHeadsUpDragAmount;          } -        float expandFactor = (1.0f - mFraction); +        float expandFactor = (1.0f - mExpansionFraction);          expandFactor = Math.max(expandFactor, 0.0f);          return alpha * expandFactor;      } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java index 43e16dbeaeed..8347fb098bd5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java @@ -31,6 +31,7 @@ import static org.mockito.Mockito.verifyZeroInteractions;  import static org.mockito.Mockito.when;  import android.animation.Animator; +import android.animation.ValueAnimator;  import android.app.AlarmManager;  import android.graphics.Color;  import android.os.Handler; @@ -180,6 +181,7 @@ public class ScrimControllerTest extends SysuiTestCase {      @Test      public void transitionToUnlocked() { +        mScrimController.setPanelExpansion(0f);          mScrimController.transitionTo(ScrimState.UNLOCKED);          mScrimController.finishAnimationsImmediately();          // Front scrim should be transparent @@ -197,6 +199,7 @@ public class ScrimControllerTest extends SysuiTestCase {      public void transitionToUnlockedFromAod() {          // Simulate unlock with fingerprint          mScrimController.transitionTo(ScrimState.AOD); +        mScrimController.setPanelExpansion(0f);          mScrimController.finishAnimationsImmediately();          mScrimController.transitionTo(ScrimState.UNLOCKED);          // Immediately tinted after the transition starts @@ -324,6 +327,35 @@ public class ScrimControllerTest extends SysuiTestCase {          verify(mAlarmManager).cancel(any(AlarmManager.OnAlarmListener.class));      } +    @Test +    public void testConservesExpansionOpacityAfterTransition() { +        mScrimController.transitionTo(ScrimState.UNLOCKED); +        mScrimController.setPanelExpansion(0.5f); +        mScrimController.finishAnimationsImmediately(); + +        final float expandedAlpha = mScrimBehind.getViewAlpha(); + +        mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR); +        mScrimController.finishAnimationsImmediately(); +        mScrimController.transitionTo(ScrimState.UNLOCKED); +        mScrimController.finishAnimationsImmediately(); + +        Assert.assertEquals("Scrim expansion opacity wasn't conserved when transitioning back", +                expandedAlpha, mScrimBehind.getViewAlpha(), 0.01f); +    } + +    @Test +    public void cancelsOldAnimationBeforeBlanking() { +        mScrimController.transitionTo(ScrimState.AOD); +        mScrimController.finishAnimationsImmediately(); +        // Consume whatever value we had before +        mScrimController.wasAnimationJustCancelled(); + +        mScrimController.transitionTo(ScrimState.KEYGUARD); +        mScrimController.finishAnimationsImmediately(); +        Assert.assertTrue(mScrimController.wasAnimationJustCancelled()); +    } +      private void assertScrimTint(ScrimView scrimView, boolean tinted) {          final boolean viewIsTinted = scrimView.getTint() != Color.TRANSPARENT;          final String name = scrimView == mScrimInFront ? "front" : "back"; @@ -357,6 +389,7 @@ public class ScrimControllerTest extends SysuiTestCase {      private class SynchronousScrimController extends ScrimController {          private FakeHandler mHandler; +        private boolean mAnimationCancelled;          public SynchronousScrimController(LightBarController lightBarController,                  ScrimView scrimBehind, ScrimView scrimInFront, View headsUpScrim, @@ -385,6 +418,12 @@ public class ScrimControllerTest extends SysuiTestCase {              }          } +        public boolean wasAnimationJustCancelled() { +            final boolean wasCancelled = mAnimationCancelled; +            mAnimationCancelled = false; +            return wasCancelled; +        } +          private void endAnimation(ScrimView scrimView, int tag) {              Animator animator = (Animator) scrimView.getTag(tag);              if (animator != null) { @@ -393,6 +432,12 @@ public class ScrimControllerTest extends SysuiTestCase {          }          @Override +        protected void cancelAnimator(ValueAnimator previousAnimator) { +            super.cancelAnimator(previousAnimator); +            mAnimationCancelled = true; +        } + +        @Override          protected Handler getHandler() {              return mHandler;          }  |