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
This commit is contained in:
Aaron Liu
2022-03-18 19:12:02 +00:00
parent 6cde647fe3
commit f8f6deb165
2 changed files with 29 additions and 2 deletions

View File

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

View File

@@ -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();