diff options
| author | 2021-08-24 16:09:28 +0000 | |
|---|---|---|
| committer | 2021-08-24 16:09:28 +0000 | |
| commit | 7e347965077d6461636ac52b541aa3b59d8564e4 (patch) | |
| tree | 4ed8a3d3bf18a4c0c3176fcfba23b8092731c9b5 | |
| parent | 504e61e8de4336a59f20ddd5c7063af794285e2f (diff) | |
| parent | b7299f30accf28a8f6499e9b1ca21078c7ab0a52 (diff) | |
Merge "Fix flicker when unlocking the screen." into sc-v2-dev
3 files changed, 50 insertions, 5 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 e3319e5ef200..59da27af9376 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -402,7 +402,7 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump if (mKeyguardUpdateMonitor.needsSlowUnlockTransition() && mState == ScrimState.UNLOCKED) { mAnimationDelay = StatusBar.FADE_KEYGUARD_START_DELAY; scheduleUpdate(); - } else if ((oldState == ScrimState.AOD // leaving doze + } else if (((oldState == ScrimState.AOD || oldState == ScrimState.PULSING) // leaving doze && (!mDozeParameters.getAlwaysOn() || mState == ScrimState.UNLOCKED)) || (mState == ScrimState.AOD && !mDozeParameters.getDisplayNeedsBlanking())) { // Scheduling a frame isn't enough when: 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 e33c9f84aa73..850b98691e1b 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -229,7 +229,8 @@ public enum ScrimState { ? mKeyguardFadingAwayDuration : StatusBar.FADE_KEYGUARD_DURATION; - mAnimateChange = !mLaunchingAffordanceWithPreview; + boolean fromAod = previousState == AOD || previousState == PULSING; + mAnimateChange = !mLaunchingAffordanceWithPreview && !fromAod; mFrontTint = Color.TRANSPARENT; mBehindTint = Color.BLACK; 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 195390347d1c..69e9d939ac33 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 @@ -20,6 +20,8 @@ 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.google.common.truth.Truth.assertThat; + import static org.junit.Assert.assertEquals; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyFloat; @@ -741,9 +743,9 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test - public void transitionToUnlockedFromAod() { - // Simulate unlock with fingerprint - mScrimController.transitionTo(ScrimState.AOD); + public void transitionToUnlockedFromOff() { + // Simulate unlock with fingerprint without AOD + mScrimController.transitionTo(ScrimState.OFF); mScrimController.setPanelExpansion(0f); finishAnimationsImmediately(); mScrimController.transitionTo(ScrimState.UNLOCKED); @@ -769,6 +771,28 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test + public void transitionToUnlockedFromAod() { + // Simulate unlock with fingerprint + mScrimController.transitionTo(ScrimState.AOD); + mScrimController.setPanelExpansion(0f); + finishAnimationsImmediately(); + mScrimController.transitionTo(ScrimState.UNLOCKED); + + finishAnimationsImmediately(); + + // All scrims should be transparent at the end of fade transition. + assertScrimAlpha(Map.of( + mScrimInFront, TRANSPARENT, + mScrimBehind, TRANSPARENT)); + + // Make sure at the very end of the animation, we're reset to transparent + assertScrimTinted(Map.of( + mScrimInFront, false, + mScrimBehind, true + )); + } + + @Test public void scrimBlanksBeforeLeavingAod() { // Simulate unlock with fingerprint mScrimController.transitionTo(ScrimState.AOD); @@ -1082,6 +1106,26 @@ public class ScrimControllerTest extends SysuiTestCase { } @Test + public void testDoesntAnimate_whenUnlocking() { + // LightRevealScrim will animate the transition, we should only hide the keyguard scrims. + ScrimState.UNLOCKED.prepare(ScrimState.KEYGUARD); + assertThat(ScrimState.UNLOCKED.getAnimateChange()).isTrue(); + ScrimState.UNLOCKED.prepare(ScrimState.PULSING); + assertThat(ScrimState.UNLOCKED.getAnimateChange()).isFalse(); + + ScrimState.UNLOCKED.prepare(ScrimState.KEYGUARD); + assertThat(ScrimState.UNLOCKED.getAnimateChange()).isTrue(); + ScrimState.UNLOCKED.prepare(ScrimState.AOD); + assertThat(ScrimState.UNLOCKED.getAnimateChange()).isFalse(); + + // LightRevealScrim doesn't animate when AOD is disabled. We need to use the legacy anim. + ScrimState.UNLOCKED.prepare(ScrimState.KEYGUARD); + assertThat(ScrimState.UNLOCKED.getAnimateChange()).isTrue(); + ScrimState.UNLOCKED.prepare(ScrimState.OFF); + assertThat(ScrimState.UNLOCKED.getAnimateChange()).isTrue(); + } + + @Test public void testScrimsVisible_whenShadeVisible_clippingQs() { mScrimController.setClipsQsScrim(true); mScrimController.transitionTo(ScrimState.UNLOCKED); |