From f8f6deb165d1372c521f131fb4b07a35811be009 Mon Sep 17 00:00:00 2001 From: Aaron Liu Date: Fri, 18 Mar 2022 19:12:02 +0000 Subject: [PATCH] User Switcher: Prevent flickering for user switch. There is a scrim flickering when opening activity from keyguard and from QS in keyguard. From Keguard, there is a flickering of the back scrim. From QS, there is a flickering of the back scrim and the notification scrim. In order to prevent this, set alpha of these scrims to 0 when state is KEYGUARD or SHADE_LOCKED Bug: 223753460 Test: Manual on relevant devices Change-Id: Iadf199bb5905de4d9c33e6f01a3fb20993559d25 --- .../statusbar/phone/ScrimController.java | 13 +++++++++++-- .../statusbar/phone/ScrimControllerTest.java | 18 ++++++++++++++++++ 2 files changed, 29 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 0b95458b73df7..28f2e61bd8c6a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -1021,15 +1021,24 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump boolean aodWallpaperTimeout = (mState == ScrimState.AOD || mState == ScrimState.PULSING) && mWallpaperVisibilityTimedOut; // We also want to hide FLAG_SHOW_WHEN_LOCKED activities under the scrim. - boolean occludedKeyguard = (mState == ScrimState.PULSING || mState == ScrimState.AOD) + boolean hideFlagShowWhenLockedActivities = + (mState == ScrimState.PULSING || mState == ScrimState.AOD) && mKeyguardOccluded; - if (aodWallpaperTimeout || occludedKeyguard) { + if (aodWallpaperTimeout || hideFlagShowWhenLockedActivities) { mBehindAlpha = 1; } // Prevent notification scrim flicker when transitioning away from keyguard. if (mKeyguardStateController.isKeyguardGoingAway()) { mNotificationsAlpha = 0; } + + // Prevent flickering for activities above keyguard and quick settings in keyguard. + if (mKeyguardOccluded + && (mState == ScrimState.KEYGUARD || mState == ScrimState.SHADE_LOCKED)) { + mBehindAlpha = 0; + mNotificationsAlpha = 0; + } + setScrimAlpha(mScrimInFront, mInFrontAlpha); setScrimAlpha(mScrimBehind, mBehindAlpha); setScrimAlpha(mNotificationsScrim, mNotificationsAlpha); 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 b3f8f9114021e..4563239f80541 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 @@ -1383,6 +1383,24 @@ public class ScrimControllerTest extends SysuiTestCase { .isEqualTo(ScrimState.KEYGUARD.getBehindTint()); } + @Test + public void testHidesScrimFlickerInActivity() { + mScrimController.setKeyguardOccluded(true); + mScrimController.transitionTo(ScrimState.KEYGUARD); + finishAnimationsImmediately(); + assertScrimAlpha(Map.of( + mScrimInFront, TRANSPARENT, + mScrimBehind, TRANSPARENT, + mNotificationsScrim, TRANSPARENT)); + + mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + finishAnimationsImmediately(); + assertScrimAlpha(Map.of( + mScrimInFront, TRANSPARENT, + mScrimBehind, TRANSPARENT, + mNotificationsScrim, TRANSPARENT)); + } + private void assertAlphaAfterExpansion(ScrimView scrim, float expectedAlpha, float expansion) { mScrimController.setRawPanelExpansionFraction(expansion); finishAnimationsImmediately();