diff options
3 files changed, 59 insertions, 17 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java index 62bb85ab029b..81270c55411f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java @@ -4712,6 +4712,11 @@ public class NotificationPanelViewController extends PanelViewController { duration = StackStateAnimator.ANIMATION_DURATION_STANDARD; } mKeyguardStatusBarViewController.animateKeyguardStatusBarOut(startDelay, duration); + if (mSplitShadeEnabled) { + // temporary workaround for QS height not being updated during lockscreen to + // shade transition + setQsExpanded(true); + } updateQSMinHeight(); } else if (oldState == StatusBarState.SHADE_LOCKED && statusBarState == KEYGUARD) { 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 0e77866bef1d..5e7dc115d7f9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -906,9 +906,19 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } if (mQsExpansion > 0) { behindAlpha = MathUtils.lerp(behindAlpha, mDefaultScrimAlpha, mQsExpansion); + float tintProgress = mQsExpansion; + if (mStatusBarKeyguardViewManager.isBouncerInTransit()) { + // this is case of - on lockscreen - going from expanded QS to bouncer. + // Because mQsExpansion is already interpolated and transition between tints + // is too slow, we want to speed it up and make it more aligned to bouncer + // showing up progress. This issue is visible on large screens, both portrait and + // split shade because then transition is between very different tints + tintProgress = BouncerPanelExpansionCalculator + .showBouncerProgress(mPanelExpansionFraction); + } int stateTint = mClipsQsScrim ? ScrimState.SHADE_LOCKED.getNotifTint() : ScrimState.SHADE_LOCKED.getBehindTint(); - behindTint = ColorUtils.blendARGB(behindTint, stateTint, mQsExpansion); + behindTint = ColorUtils.blendARGB(behindTint, stateTint, tintProgress); } // If the keyguard is going away, we should not be opaque. 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 5f8dda359563..09009c6ee260 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 @@ -19,6 +19,8 @@ package com.android.systemui.statusbar.phone; import static com.android.systemui.statusbar.phone.ScrimController.OPAQUE; import static com.android.systemui.statusbar.phone.ScrimController.SEMI_TRANSPARENT; import static com.android.systemui.statusbar.phone.ScrimController.TRANSPARENT; +import static com.android.systemui.statusbar.phone.ScrimState.BOUNCER; +import static com.android.systemui.statusbar.phone.ScrimState.SHADE_LOCKED; import static com.google.common.truth.Truth.assertThat; @@ -275,7 +277,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void transitionToShadeLocked() { - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); mScrimController.setQsPosition(1f, 0); finishAnimationsImmediately(); @@ -293,7 +295,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void transitionToShadeLocked_clippingQs() { mScrimController.setClipsQsScrim(true); - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); mScrimController.setQsPosition(1f, 0); finishAnimationsImmediately(); @@ -542,7 +544,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void transitionToKeyguardBouncer() { - mScrimController.transitionTo(ScrimState.BOUNCER); + mScrimController.transitionTo(BOUNCER); finishAnimationsImmediately(); // Front scrim should be transparent // Back scrim should be visible without tint @@ -561,7 +563,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void transitionToKeyguardBouncer_clippingQs() { mScrimController.setClipsQsScrim(true); - mScrimController.transitionTo(ScrimState.BOUNCER); + mScrimController.transitionTo(BOUNCER); finishAnimationsImmediately(); // Front scrim should be transparent // Back scrim should be clipping QS @@ -581,7 +583,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void disableClipQsScrimWithoutStateTransition_updatesTintAndAlpha() { mScrimController.setClipsQsScrim(true); - mScrimController.transitionTo(ScrimState.BOUNCER); + mScrimController.transitionTo(BOUNCER); mScrimController.setClipsQsScrim(false); @@ -602,7 +604,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void enableClipQsScrimWithoutStateTransition_updatesTintAndAlpha() { mScrimController.setClipsQsScrim(false); - mScrimController.transitionTo(ScrimState.BOUNCER); + mScrimController.transitionTo(BOUNCER); mScrimController.setClipsQsScrim(true); @@ -672,9 +674,9 @@ public class ScrimControllerTest extends SysuiTestCase { finishAnimationsImmediately(); assertEquals(mScrimState, ScrimState.UNLOCKED); - mScrimController.transitionTo(ScrimState.BOUNCER); + mScrimController.transitionTo(BOUNCER); finishAnimationsImmediately(); - assertEquals(mScrimState, ScrimState.BOUNCER); + assertEquals(mScrimState, BOUNCER); mScrimController.transitionTo(ScrimState.BOUNCER_SCRIMMED); finishAnimationsImmediately(); @@ -1081,9 +1083,9 @@ public class ScrimControllerTest extends SysuiTestCase { HashSet<ScrimState> lowPowerModeStates = new HashSet<>(Arrays.asList( ScrimState.OFF, ScrimState.AOD, ScrimState.PULSING)); HashSet<ScrimState> regularStates = new HashSet<>(Arrays.asList( - ScrimState.UNINITIALIZED, ScrimState.KEYGUARD, ScrimState.BOUNCER, + ScrimState.UNINITIALIZED, ScrimState.KEYGUARD, BOUNCER, ScrimState.DREAMING, ScrimState.BOUNCER_SCRIMMED, ScrimState.BRIGHTNESS_MIRROR, - ScrimState.UNLOCKED, ScrimState.SHADE_LOCKED, ScrimState.AUTH_SCRIMMED, + ScrimState.UNLOCKED, SHADE_LOCKED, ScrimState.AUTH_SCRIMMED, ScrimState.AUTH_SCRIMMED_SHADE)); for (ScrimState state : ScrimState.values()) { @@ -1228,7 +1230,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testNotificationScrimVisible_afterOpeningShadeFromLockscreen() { mScrimController.setRawPanelExpansionFraction(1); - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); finishAnimationsImmediately(); assertScrimAlpha(Map.of( @@ -1237,10 +1239,26 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test + public void qsExpansion_BehindTint_shadeLocked_bouncerActive_usesBouncerProgress() { + when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(true); + // clipping doesn't change tested logic but allows to assert scrims more in line with + // their expected large screen behaviour + mScrimController.setClipsQsScrim(false); + mScrimController.transitionTo(SHADE_LOCKED); + + mScrimController.setQsPosition(1f, 100 /* value doesn't matter */); + assertTintAfterExpansion(mScrimBehind, SHADE_LOCKED.getBehindTint(), /* expansion= */ 1f); + + mScrimController.setQsPosition(0.8f, 100 /* value doesn't matter */); + // panel expansion of 0.6 means its fully transitioned with bouncer progress interpolation + assertTintAfterExpansion(mScrimBehind, BOUNCER.getBehindTint(), /* expansion= */ 0.6f); + } + + @Test public void expansionNotificationAlpha_shadeLocked_bouncerActive_usesBouncerInterpolator() { when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(true); - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); float expansion = 0.8f; float expectedAlpha = @@ -1256,7 +1274,7 @@ public class ScrimControllerTest extends SysuiTestCase { public void expansionNotificationAlpha_shadeLocked_bouncerNotActive_usesShadeInterpolator() { when(mStatusBarKeyguardViewManager.isBouncerInTransit()).thenReturn(false); - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); float expansion = 0.8f; float expectedAlpha = ShadeInterpolation.getNotificationScrimAlpha(expansion); @@ -1352,7 +1370,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void testNotificationTransparency_followsTransitionToFullShade() { - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); mScrimController.setRawPanelExpansionFraction(1.0f); finishAnimationsImmediately(); float shadeLockedAlpha = mNotificationsScrim.getViewAlpha(); @@ -1379,7 +1397,7 @@ public class ScrimControllerTest extends SysuiTestCase { @Test public void notificationTransparency_followsNotificationScrimProgress() { - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); mScrimController.setRawPanelExpansionFraction(1.0f); finishAnimationsImmediately(); mScrimController.transitionTo(ScrimState.KEYGUARD); @@ -1473,7 +1491,7 @@ public class ScrimControllerTest extends SysuiTestCase { mScrimBehind, TRANSPARENT, mNotificationsScrim, TRANSPARENT)); - mScrimController.transitionTo(ScrimState.SHADE_LOCKED); + mScrimController.transitionTo(SHADE_LOCKED); finishAnimationsImmediately(); assertScrimAlpha(Map.of( mScrimInFront, TRANSPARENT, @@ -1504,6 +1522,15 @@ public class ScrimControllerTest extends SysuiTestCase { assertEquals(expectedAlpha, scrim.getViewAlpha(), 0.2); } + private void assertTintAfterExpansion(ScrimView scrim, int expectedTint, float expansion) { + String message = "Tint test failed with expected scrim tint: " + + Integer.toHexString(expectedTint) + " and actual tint: " + + Integer.toHexString(scrim.getTint()) + " for scrim: " + getScrimName(scrim); + mScrimController.setRawPanelExpansionFraction(expansion); + finishAnimationsImmediately(); + assertEquals(message, expectedTint, scrim.getTint(), 0.1); + } + private void assertScrimTinted(Map<ScrimView, Boolean> scrimToTint) { scrimToTint.forEach((scrim, hasTint) -> assertScrimTint(scrim, hasTint)); } |