From 218a0cb4c2e8e859732ac5a4475f1fd1207782bc Mon Sep 17 00:00:00 2001 From: Lucas Dupin Date: Mon, 9 Jul 2018 14:32:53 -0700 Subject: Hide wallpaper when backdrop arrives Some apps may set a backdrop image after the device enters doze, causing the artwork to be visible in AOD. Let's draw black. Test: manual Test: packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ScrimControllerTest.java Change-Id: Ib13e14f285594349c1df263f713883449884ff00 Fixes: 110959983 --- .../android/systemui/statusbar/phone/ScrimController.java | 10 ++++++++++ .../com/android/systemui/statusbar/phone/ScrimState.java | 12 ++++++++++-- .../systemui/statusbar/phone/ScrimControllerTest.java | 14 ++++++++++++++ 3 files changed, 34 insertions(+), 2 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 61f0e1cb29c7..31e5305410e8 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -892,6 +892,16 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, OnCo for (ScrimState state : ScrimState.values()) { state.setHasBackdrop(hasBackdrop); } + + // Backdrop event may arrive after state was already applied, + // in this case, back-scrim needs to be re-evaluated + if (mState == ScrimState.AOD || mState == ScrimState.PULSING) { + float newBehindAlpha = mState.getBehindAlpha(mNotificationDensity); + if (mCurrentBehindAlpha != newBehindAlpha) { + mCurrentBehindAlpha = newBehindAlpha; + updateScrims(); + } + } } public void setLaunchingAffordanceWithPreview(boolean launchingAffordanceWithPreview) { 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 19015fcdacf7..081ebfac5f1b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -105,7 +105,6 @@ public enum ScrimState { public void prepare(ScrimState previousState) { final boolean alwaysOnEnabled = mDozeParameters.getAlwaysOn(); mBlankScreen = mDisplayRequiresBlanking; - mCurrentBehindAlpha = mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f; mCurrentInFrontAlpha = alwaysOnEnabled ? mAodFrontScrimAlpha : 1f; mCurrentInFrontTint = Color.BLACK; mCurrentBehindTint = Color.BLACK; @@ -115,6 +114,11 @@ public enum ScrimState { mAnimateChange = mDozeParameters.shouldControlScreenOff(); } + @Override + public float getBehindAlpha(float busyness) { + return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f; + } + @Override public boolean isLowPowerState() { return true; @@ -129,10 +133,14 @@ public enum ScrimState { public void prepare(ScrimState previousState) { mCurrentInFrontAlpha = 0; mCurrentInFrontTint = Color.BLACK; - mCurrentBehindAlpha = mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f; mCurrentBehindTint = Color.BLACK; mBlankScreen = mDisplayRequiresBlanking; } + + @Override + public float getBehindAlpha(float busyness) { + return mWallpaperSupportsAmbientMode && !mHasBackdrop ? 0f : 1f; + } }, /** 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 89d562a2099c..9c558748697a 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 @@ -151,6 +151,20 @@ public class ScrimControllerTest extends SysuiTestCase { assertScrimTint(mScrimInFront, true /* tinted */); } + @Test + public void setHasBackdrop_withAodWallpaperAndAlbumArt() { + mScrimController.setWallpaperSupportsAmbientMode(true); + mScrimController.transitionTo(ScrimState.AOD); + mScrimController.finishAnimationsImmediately(); + mScrimController.setHasBackdrop(true); + mScrimController.finishAnimationsImmediately(); + // Front scrim should be transparent + // Back scrim should be visible with tint + assertScrimVisibility(VISIBILITY_FULLY_TRANSPARENT, VISIBILITY_FULLY_OPAQUE); + assertScrimTint(mScrimBehind, true /* tinted */); + assertScrimTint(mScrimInFront, true /* tinted */); + } + @Test public void transitionToAod_withFrontAlphaUpdates() { // Assert that setting the AOD front scrim alpha doesn't take effect in a non-AOD state. -- cgit v1.2.3-59-g8ed1b