From c60ff20ecb0caec9daf4e23398b9b1cdac01d7a6 Mon Sep 17 00:00:00 2001 From: Matt Pietal Date: Fri, 13 May 2022 08:43:11 -0400 Subject: [PATCH] Don't blend front scrim on AOD The scrim tint is always blended with the main color, as determined by color extraction and the theme. For AOD, it should always fade to dark and never be blended with a light color. This is most noticeable in low light environments when the front scrim is animated and then blended with white. Fixes: 223592183 Test: atest ScrimControllerTest + manual (phone in low light, transition to AOD) Change-Id: I6b7b78b26bcbf63989580d2f46981d79bcc9a99b --- .../com/android/systemui/scrim/ScrimView.java | 21 +++++++++++++++++-- .../statusbar/phone/ScrimController.java | 2 ++ .../systemui/statusbar/phone/ScrimState.java | 14 ++++++++++++- .../statusbar/phone/ScrimControllerTest.java | 7 +++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java b/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java index 7530681c82b2d..f68e0429ef7c7 100644 --- a/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java +++ b/packages/SystemUI/src/com/android/systemui/scrim/ScrimView.java @@ -58,6 +58,7 @@ public class ScrimView extends View { private Drawable mDrawable; private PorterDuffColorFilter mColorFilter; private int mTintColor; + private boolean mBlendWithMainColor = true; private Runnable mChangeRunnable; private Executor mChangeRunnableExecutor; private Executor mExecutor; @@ -191,6 +192,19 @@ public class ScrimView extends View { setTint(color, false); } + /** + * The call to {@link #setTint} will blend with the main color, with the amount + * determined by the alpha of the tint. Set to false to avoid this blend. + */ + public void setBlendWithMainColor(boolean blend) { + mBlendWithMainColor = blend; + } + + /** @return true if blending tint color with main color */ + public boolean shouldBlendWithMainColor() { + return mBlendWithMainColor; + } + /** * Tints this view, optionally animating it. * @param color The color. @@ -211,8 +225,11 @@ public class ScrimView extends View { // Optimization to blend colors and avoid a color filter ScrimDrawable drawable = (ScrimDrawable) mDrawable; float tintAmount = Color.alpha(mTintColor) / 255f; - int mainTinted = ColorUtils.blendARGB(mColors.getMainColor(), mTintColor, - tintAmount); + + int mainTinted = mTintColor; + if (mBlendWithMainColor) { + mainTinted = ColorUtils.blendARGB(mColors.getMainColor(), mTintColor, tintAmount); + } drawable.setColor(mainTinted, animated); } else { boolean hasAlpha = Color.alpha(mTintColor) != 0; 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 f9e17da9773f5..0e77866bef1de 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -402,6 +402,8 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump mScrimBehind.setFocusable(!state.isLowPowerState()); mNotificationsScrim.setFocusable(!state.isLowPowerState()); + mScrimInFront.setBlendWithMainColor(state.shouldBlendWithMainColor()); + // Cancel blanking transitions that were pending before we requested a new state if (mPendingFrameCallback != null) { mScrimBehind.removeCallbacks(mPendingFrameCallback); 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 47b705845fceb..4a5f712d587c6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -203,6 +203,11 @@ public enum ScrimState { public boolean isLowPowerState() { return true; } + + @Override + public boolean shouldBlendWithMainColor() { + return false; + } }, /** @@ -325,6 +330,13 @@ public enum ScrimState { public void prepare(ScrimState previousState) { } + /** + * Whether a particular state should enable blending with extracted theme colors. + */ + public boolean shouldBlendWithMainColor() { + return true; + } + public float getFrontAlpha() { return mFrontAlpha; } @@ -422,4 +434,4 @@ public enum ScrimState { public void setClipQsScrim(boolean clipsQsScrim) { mClipQsScrim = clipsQsScrim; } -} \ No newline at end of file +} 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 dce520c0973df..5f8dda3595633 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 @@ -1490,6 +1490,13 @@ public class ScrimControllerTest extends SysuiTestCase { assertAlphaAfterExpansion(mNotificationsScrim, 0f, expansion); } + @Test + public void aodStateSetsFrontScrimToNotBlend() { + mScrimController.transitionTo(ScrimState.AOD); + Assert.assertFalse("Front scrim should not blend with main color", + mScrimInFront.shouldBlendWithMainColor()); + } + private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) { mScrimController.setRawPanelExpansionFraction(expansion); finishAnimationsImmediately();