From ddefd4535873161505bc3b97cddc40fa5159fa66 Mon Sep 17 00:00:00 2001 From: Selim Cinek Date: Fri, 20 Aug 2021 15:34:30 +0200 Subject: Fixes two bright flashes of the notification scrim We were previously going to UNLOCKED state if if there was no camera preview leading to a bright flash in light mode. we now only do this when the whole screen is obscured anyway by the camera preview. This also fixes another scrim issue where the unocclusion would flash the notification scrim, because it's expanding, which usually shows the bouncer with a bright background during the expansion. Test: atest SystemUITests Fixes: 197160246 Change-Id: I418e878698c2606856b93faf774cd87830773815 --- .../systemui/statusbar/phone/ScrimController.java | 19 +++++++++++++++++ .../systemui/statusbar/phone/StatusBar.java | 7 +++---- .../statusbar/phone/ScrimControllerTest.java | 13 ++++++++++++ .../systemui/statusbar/phone/StatusBarTest.java | 24 ++++++++++++++++++++++ 4 files changed, 59 insertions(+), 4 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 b3e8dc402f28..e3319e5ef200 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -111,6 +111,20 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump */ private boolean mTransitioningToFullShade; + /** + * Is there currently an unocclusion animation running. Used to avoid bright flickers + * of the notification scrim. + */ + private boolean mUnOcclusionAnimationRunning; + + /** + * Set whether an unocclusion animation is currently running on the notification panel. Used + * to avoid bright flickers of the notification scrim. + */ + public void setUnocclusionAnimationRunning(boolean unocclusionAnimationRunning) { + mUnOcclusionAnimationRunning = unocclusionAnimationRunning; + } + @IntDef(prefix = {"VISIBILITY_"}, value = { TRANSPARENT, SEMI_TRANSPARENT, @@ -436,6 +450,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump public void onExpandingFinished() { mTracking = false; + setUnocclusionAnimationRunning(false); } @VisibleForTesting @@ -679,6 +694,10 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (mKeyguardOccluded) { mNotificationsAlpha = 0; } + if (mUnOcclusionAnimationRunning && mState == ScrimState.KEYGUARD) { + // We're unoccluding the keyguard and don't want to have a bright flash. + mNotificationsAlpha = 0f; + } } assertAlphasValid(); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 30ea084b7728..0cfdf79b5497 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3092,6 +3092,7 @@ public class StatusBar extends SystemUI implements public void animateKeyguardUnoccluding() { mNotificationPanelViewController.setExpandedFraction(0f); mCommandQueueCallbacks.animateExpandNotificationsPanel(); + mScrimController.setUnocclusionAnimationRunning(true); } /** @@ -3755,10 +3756,8 @@ public class StatusBar extends SystemUI implements ScrimState state = mStatusBarKeyguardViewManager.bouncerNeedsScrimming() ? ScrimState.BOUNCER_SCRIMMED : ScrimState.BOUNCER; mScrimController.transitionTo(state); - } else if (isInLaunchTransition() - || mLaunchCameraWhenFinishedWaking - || launchingAffordanceWithPreview) { - // TODO(b/170133395) Investigate whether Emergency Gesture flag should be included here. + } else if (launchingAffordanceWithPreview) { + // We want to avoid animating when launching with a preview. mScrimController.transitionTo(ScrimState.UNLOCKED, mUnlockScrimCallback); } else if (mBrightnessMirrorVisible) { mScrimController.transitionTo(ScrimState.BRIGHTNESS_MIRROR); 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 30fc13b168f3..195390347d1c 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 @@ -1138,6 +1138,19 @@ public class ScrimControllerTest extends SysuiTestCase { assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.47f, /* expansion */ 0.2f); } + @Test + public void testNotificationTransparency_unnocclusion() { + mScrimController.transitionTo(ScrimState.KEYGUARD); + mScrimController.setUnocclusionAnimationRunning(true); + + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.0f, /* expansion */ 0.0f); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.0f, /* expansion */ 1.0f); + + // Verify normal behavior after + mScrimController.setUnocclusionAnimationRunning(false); + assertAlphaAfterExpansion(mNotificationsScrim, /* alpha */ 0.2f, /* expansion */ 0.4f); + } + @Test public void testNotificationTransparency_inKeyguardState() { mScrimController.transitionTo(ScrimState.KEYGUARD); diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java index 6c59c3e27f23..71c61ab7f9b7 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarTest.java @@ -774,6 +774,30 @@ public class StatusBarTest extends SysuiTestCase { verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any()); } + @Test + public void testTransitionLaunch_goesToUnlocked() { + mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD); + mStatusBar.showKeyguardImpl(); + + // Starting a pulse should change the scrim controller to the pulsing state + when(mNotificationPanelViewController.isLaunchTransitionRunning()).thenReturn(true); + when(mNotificationPanelViewController.isLaunchingAffordanceWithPreview()).thenReturn(true); + mStatusBar.updateScrimController(); + verify(mScrimController).transitionTo(eq(ScrimState.UNLOCKED), any()); + } + + @Test + public void testTransitionLaunch_noPreview_doesntGoUnlocked() { + mStatusBar.setBarStateForTest(StatusBarState.KEYGUARD); + mStatusBar.showKeyguardImpl(); + + // Starting a pulse should change the scrim controller to the pulsing state + when(mNotificationPanelViewController.isLaunchTransitionRunning()).thenReturn(true); + when(mNotificationPanelViewController.isLaunchingAffordanceWithPreview()).thenReturn(false); + mStatusBar.updateScrimController(); + verify(mScrimController).transitionTo(eq(ScrimState.KEYGUARD)); + } + @Test public void testSetOccluded_propagatesToScrimController() { mStatusBar.setOccluded(true); -- cgit v1.2.3-59-g8ed1b