diff options
| author | 2018-02-25 21:57:17 -0800 | |
|---|---|---|
| committer | 2018-02-27 00:19:24 +0000 | |
| commit | b380c882a2767405b004dd9c2cbab1444fe18526 (patch) | |
| tree | 9168a76d8b220fc43e1ad8e7625ac6e0bf449c76 | |
| parent | f3fc8a4d5897e601b11e697521a5af31b93faf30 (diff) | |
Fix scrim busyness regression
Scrim opacity on the keyguard should vary according to how many
notifications are visible.
A busy lock screen has a more opaque scrim, and an empty lock screen
has a more transparent scrim.
Test: atest packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java
Test: swipe away or receive notifications on the keyguard
Change-Id: I672b5e1a82d65dd326b40069d61223c3c0161493
3 files changed, 68 insertions, 13 deletions
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 255e5e48dbae..d8d388c4be08 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -167,6 +167,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, private Callback mCallback; private boolean mWallpaperSupportsAmbientMode; private boolean mScreenOn; + private float mNotificationDensity; // Scrim blanking callbacks private Choreographer.FrameCallback mPendingFrameCallback; @@ -251,7 +252,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, mCurrentInFrontTint = state.getFrontTint(); mCurrentBehindTint = state.getBehindTint(); mCurrentInFrontAlpha = state.getFrontAlpha(); - mCurrentBehindAlpha = state.getBehindAlpha(); + mCurrentBehindAlpha = state.getBehindAlpha(mNotificationDensity); applyExpansionToAlpha(); // Cancel blanking transitions that were pending before we requested a new state @@ -396,12 +397,13 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, // Either darken of make the scrim transparent when you // pull down the shade float interpolatedFract = getInterpolatedFraction(); + float alphaBehind = mState.getBehindAlpha(mNotificationDensity); if (mDarkenWhileDragging) { - mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking, - mScrimBehindAlphaKeyguard, interpolatedFract); + mCurrentBehindAlpha = MathUtils.lerp(mScrimBehindAlphaUnlocking, alphaBehind, + interpolatedFract); mCurrentInFrontAlpha = (1f - interpolatedFract) * SCRIM_IN_FRONT_ALPHA_LOCKED; } else { - mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, mScrimBehindAlphaKeyguard, + mCurrentBehindAlpha = MathUtils.lerp(0 /* start */, alphaBehind, interpolatedFract); mCurrentInFrontAlpha = 0; } @@ -415,15 +417,14 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, public void setNotificationCount(int notificationCount) { final float maxNotificationDensity = 3; float notificationDensity = Math.min(notificationCount / maxNotificationDensity, 1f); - float newAlpha = MathUtils.map(0, 1, - GRADIENT_SCRIM_ALPHA, GRADIENT_SCRIM_ALPHA_BUSY, - notificationDensity); - if (mScrimBehindAlphaKeyguard != newAlpha) { - mScrimBehindAlphaKeyguard = newAlpha; + if (mNotificationDensity == notificationDensity) { + return; + } + mNotificationDensity = notificationDensity; - if (mState == ScrimState.KEYGUARD || mState == ScrimState.BOUNCER) { - scheduleUpdate(); - } + if (mState == ScrimState.KEYGUARD) { + applyExpansionToAlpha(); + scheduleUpdate(); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java index 381e4af31853..053c5a3b5966 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone; import android.graphics.Color; import android.os.Trace; +import android.util.MathUtils; import com.android.keyguard.KeyguardUpdateMonitor; import com.android.systemui.statusbar.ScrimView; @@ -55,6 +56,13 @@ public enum ScrimState { mCurrentBehindAlpha = mScrimBehindAlphaKeyguard; mCurrentInFrontAlpha = 0; } + + @Override + public float getBehindAlpha(float busynessFactor) { + return MathUtils.map(0 /* start */, 1 /* stop */, + ScrimController.GRADIENT_SCRIM_ALPHA, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, + busynessFactor); + } }, /** @@ -183,7 +191,7 @@ public enum ScrimState { return mCurrentInFrontAlpha; } - public float getBehindAlpha() { + public float getBehindAlpha(float busyness) { return mCurrentBehindAlpha; } 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 8347fb098bd5..168d8d36290d 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 @@ -356,6 +356,52 @@ public class ScrimControllerTest extends SysuiTestCase { Assert.assertTrue(mScrimController.wasAnimationJustCancelled()); } + /** + * Number of visible notifications affects scrim opacity. + */ + @Test + public void testNotificationDensity() { + mScrimController.transitionTo(ScrimState.KEYGUARD); + mScrimController.finishAnimationsImmediately(); + + mScrimController.setNotificationCount(0); + mScrimController.finishAnimationsImmediately(); + Assert.assertEquals("lower density when no notifications", + ScrimController.GRADIENT_SCRIM_ALPHA, mScrimBehind.getViewAlpha(), 0.01f); + + mScrimController.setNotificationCount(3); + mScrimController.finishAnimationsImmediately(); + Assert.assertEquals("stronger density when notifications are visible", + ScrimController.GRADIENT_SCRIM_ALPHA_BUSY, mScrimBehind.getViewAlpha(), 0.01f); + } + + /** + * Moving from/to states conserves old notification density. + */ + @Test + public void testConservesNotificationDensity() { + testConservesNotificationDensity(0 /* count */, ScrimController.GRADIENT_SCRIM_ALPHA); + testConservesNotificationDensity(3 /* count */, ScrimController.GRADIENT_SCRIM_ALPHA_BUSY); + } + + /** + * Conserves old notification density after leaving state and coming back. + * + * @param count How many notification. + * @param expectedAlpha Expected alpha. + */ + private void testConservesNotificationDensity(int count, float expectedAlpha) { + mScrimController.setNotificationCount(count); + mScrimController.transitionTo(ScrimState.UNLOCKED); + mScrimController.finishAnimationsImmediately(); + + mScrimController.transitionTo(ScrimState.KEYGUARD); + mScrimController.finishAnimationsImmediately(); + + Assert.assertEquals("Doesn't respect notification busyness after transition", + expectedAlpha, mScrimBehind.getViewAlpha(), 0.01f); + } + private void assertScrimTint(ScrimView scrimView, boolean tinted) { final boolean viewIsTinted = scrimView.getTint() != Color.TRANSPARENT; final String name = scrimView == mScrimInFront ? "front" : "back"; |