diff options
author | Selim Cinek <cinek@google.com> | 2021-08-23 21:26:23 +0200 |
---|---|---|
committer | Android Build Coastguard Worker <android-build-coastguard-worker@google.com> | 2021-08-25 02:36:43 +0000 |
commit | ca5c198e6e5543683bca02bf21711a55b057a83d (patch) | |
tree | 04d7042fba269439ba53251b08e305377a8db44a | |
parent | 5231cd22966f3a60707be89b6a11f5bf293686b7 (diff) | |
download | base-ca5c198e6e5543683bca02bf21711a55b057a83d.tar.gz |
Fix flicker when unlocking the screen.
Fixes: 197113783
Test: atest ScrimControllerTest
Test: fp from: shade locked, aod, lock screen
Test: switch between light and dark themes, look at scrim anim
Change-Id: Iacd46b99c5a86c8f7a7706b91b0b78a3beb4c414
Merged-In: Iacd46b99c5a86c8f7a7706b91b0b78a3beb4c414
(cherry picked from commit c2dda240a72d254df893de857f1d2a76e9940942)
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 c1fdef12410b..2ae59f12b25c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -432,7 +432,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 06811932ac0c..2c0de629de8a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimState.java @@ -244,7 +244,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 2d7aa3e663a1..1b2d5cdcbf0d 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; @@ -734,9 +736,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); @@ -765,6 +767,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); @@ -1081,6 +1105,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); |