Merge "Fixing tiles on lockscreen and scrims transitions with QS expanded" into tm-dev am: 3950e281b0 am: b4bd10d570

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18436783

Change-Id: I26da0692db8bde3ffb4a77478da47c6ea78d1c22
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Michał Brzeziński
2022-05-20 22:48:20 +00:00
committed by Automerger Merge Worker
3 changed files with 59 additions and 17 deletions

View File

@@ -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) {

View File

@@ -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.

View File

@@ -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(
@@ -1236,11 +1238,27 @@ public class ScrimControllerTest extends SysuiTestCase {
mNotificationsScrim, OPAQUE));
}
@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));
}