diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt index c1f376286164a..4167287a504e3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/UnlockedScreenOffAnimationController.kt @@ -56,6 +56,13 @@ class UnlockedScreenOffAnimationController @Inject constructor( private var lightRevealAnimationPlaying = false private var aodUiAnimationPlaying = false + /** + * The result of our decision whether to play the screen off animation in + * [onStartedGoingToSleep], or null if we haven't made that decision yet or aren't going to + * sleep. + */ + private var decidedToAnimateGoingToSleep: Boolean? = null + private val lightRevealAnimator = ValueAnimator.ofFloat(1f, 0f).apply { duration = LIGHT_REVEAL_ANIMATION_DURATION interpolator = Interpolators.LINEAR @@ -120,11 +127,17 @@ class UnlockedScreenOffAnimationController @Inject constructor( // Run the callback given to us by the KeyguardVisibilityHelper. after.run() + + // Done going to sleep, reset this flag. + decidedToAnimateGoingToSleep = null } .start() } override fun onStartedWakingUp() { + // Waking up, so reset this flag. + decidedToAnimateGoingToSleep = null + lightRevealAnimator.cancel() handler.removeCallbacksAndMessages(null) } @@ -148,6 +161,8 @@ class UnlockedScreenOffAnimationController @Inject constructor( override fun onStartedGoingToSleep() { if (dozeParameters.get().shouldControlUnlockedScreenOff()) { + decidedToAnimateGoingToSleep = true + lightRevealAnimationPlaying = true lightRevealAnimator.start() @@ -157,6 +172,8 @@ class UnlockedScreenOffAnimationController @Inject constructor( // Show AOD. That'll cause the KeyguardVisibilityHelper to call #animateInKeyguard. statusBar.notificationPanelViewController.showAodUi() }, ANIMATE_IN_KEYGUARD_DELAY) + } else { + decidedToAnimateGoingToSleep = false } } @@ -165,6 +182,12 @@ class UnlockedScreenOffAnimationController @Inject constructor( * on the current state of the device. */ fun shouldPlayUnlockedScreenOffAnimation(): Boolean { + // If we explicitly already decided not to play the screen off animation, then never change + // our mind. + if (decidedToAnimateGoingToSleep == false) { + return false + } + if (!dozeParameters.get().canControlUnlockedScreenOff()) { return false } @@ -178,7 +201,8 @@ class UnlockedScreenOffAnimationController @Inject constructor( // already expanded and showing notifications/QS, the animation looks really messy. For now, // disable it if the notification panel is expanded. if (!this::statusBar.isInitialized || - statusBar.notificationPanelViewController.isFullyExpanded) { + statusBar.notificationPanelViewController.isFullyExpanded || + statusBar.notificationPanelViewController.isExpanding) { return false }