From e764ba30d79178e1a9ad6fbd8bf12ee245a40983 Mon Sep 17 00:00:00 2001 From: Beverly Date: Mon, 18 Oct 2021 15:16:41 -0400 Subject: [PATCH] Respect the expanded amount with AUTH_SCRIMMED_SHADE ScrimState.UNLOCKED is used when the device is locked and an activity is occluding the keyguard (ie: camera activty on top of the lock screen, then pull down the shade). Therefore, the AUTH_SCRIMMED_SHADE (tap notification with udfps enrolled) needs to also respect the expanded state of the shade to correctly determine the behind and notification scrim alpha values. Test: atest ScrimControllerTest Fixes: 198789984 Change-Id: I36f064c84821389367a06edff736bed8a75cdc19 --- .../statusbar/phone/ScrimController.java | 6 +++ .../systemui/statusbar/phone/ScrimState.java | 11 +++++ .../systemui/statusbar/phone/StatusBar.java | 6 ++- .../statusbar/phone/ScrimControllerTest.java | 40 ++++++++++++++++++- 4 files changed, 61 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 a5cea06ad8939..dc7dc15673f63 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -675,6 +675,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } mInFrontAlpha = 0; } + } else if (mState == ScrimState.AUTH_SCRIMMED_SHADE) { + float behindFraction = getInterpolatedFraction(); + behindFraction = (float) Math.pow(behindFraction, 0.8f); + + mBehindAlpha = behindFraction * mDefaultScrimAlpha; + mNotificationsAlpha = mBehindAlpha; } else if (mState == ScrimState.KEYGUARD || mState == ScrimState.SHADE_LOCKED || mState == ScrimState.PULSING) { Pair result = calculateBackStateForState(mState); 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 850b98691e1b0..9246c0e732899 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -87,6 +87,17 @@ public enum ScrimState { } }, + AUTH_SCRIMMED_SHADE { + @Override + public void prepare(ScrimState previousState) { + // notif & behind scrim alpha values are determined by ScrimController#applyState + // based on the shade expansion + + mFrontTint = Color.BLACK; + mFrontAlpha = .66f; + } + }, + AUTH_SCRIMMED { @Override public void prepare(ScrimState previousState) { 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 2bdb0edc43988..2ebe3c5eec144 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -3837,7 +3837,11 @@ public class StatusBar extends SystemUI implements mScrimController.setLaunchingAffordanceWithPreview(launchingAffordanceWithPreview); if (mStatusBarKeyguardViewManager.isShowingAlternateAuth()) { - mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED); + if (mState == StatusBarState.SHADE || mState == StatusBarState.SHADE_LOCKED) { + mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED_SHADE); + } else { + mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED); + } } else if (mBouncerShowing) { // Bouncer needs the front scrim when it's on top of an activity, // tapping on a notification, editing QS or being dismissed by 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 705112afa93f1..6849dab1a19aa 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 @@ -1063,7 +1063,7 @@ public class ScrimControllerTest extends SysuiTestCase { HashSet regularStates = new HashSet<>(Arrays.asList( ScrimState.UNINITIALIZED, ScrimState.KEYGUARD, ScrimState.BOUNCER, ScrimState.BOUNCER_SCRIMMED, ScrimState.BRIGHTNESS_MIRROR, ScrimState.UNLOCKED, - ScrimState.SHADE_LOCKED, ScrimState.AUTH_SCRIMMED)); + ScrimState.SHADE_LOCKED, ScrimState.AUTH_SCRIMMED, ScrimState.AUTH_SCRIMMED_SHADE)); for (ScrimState state : ScrimState.values()) { if (!lowPowerModeStates.contains(state) && !regularStates.contains(state)) { @@ -1086,6 +1086,44 @@ public class ScrimControllerTest extends SysuiTestCase { mNotificationsScrim.getViewAlpha(), 1, 0.0); } + @Test + public void testAuthScrim_notifScrimOpaque_whenShadeFullyExpanded() { + // GIVEN device has an activity showing ('UNLOCKED' state can occur on the lock screen + // with the camera app occluding the keyguard) + mScrimController.transitionTo(ScrimState.UNLOCKED); + mScrimController.setRawPanelExpansionFraction(1); + // notifications scrim alpha change require calling setQsPosition + mScrimController.setQsPosition(0, 300); + finishAnimationsImmediately(); + + // WHEN the user triggers the auth bouncer + mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED_SHADE); + finishAnimationsImmediately(); + + assertEquals("Behind scrim should be opaque", + mScrimBehind.getViewAlpha(), 1, 0.0); + assertEquals("Notifications scrim should be opaque", + mNotificationsScrim.getViewAlpha(), 1, 0.0); + } + + @Test + public void testAuthScrimKeyguard() { + // GIVEN device is on the keyguard + mScrimController.transitionTo(ScrimState.KEYGUARD); + finishAnimationsImmediately(); + + // WHEN the user triggers the auth bouncer + mScrimController.transitionTo(ScrimState.AUTH_SCRIMMED); + finishAnimationsImmediately(); + + // THEN the front scrim is updated and the KEYGUARD scrims are the same as the + // KEYGUARD scrim state + assertScrimAlpha(Map.of( + mScrimInFront, SEMI_TRANSPARENT, + mScrimBehind, SEMI_TRANSPARENT, + mNotificationsScrim, TRANSPARENT)); + } + @Test public void testScrimsVisible_whenShadeVisible() { mScrimController.transitionTo(ScrimState.UNLOCKED);