AnimateKeyguardInDelay should use the animator duration scale

Additionally, be defensive about showing the keyguard after
screen off in case something is holding up the choreography
and the light reveal finishes before the keyguard gets a chance
to animate in.

Bug: 194812424
Test:
  1. manually set animator duration to .5
  2. go to home screen
  3. press power button for device to go into doze
  4. check systemui logs that dozing=true
Change-Id: Iae4498189a61fa9d8fa78ef4888aea840eaf3682
This commit is contained in:
Beverly
2021-08-26 16:25:07 -04:00
committed by Beverly Tai
parent e454d516ec
commit 5cfc835d82
2 changed files with 34 additions and 8 deletions

View File

@@ -132,8 +132,7 @@ public class KeyguardVisibilityHelper {
.alpha(1f)
.withEndAction(mAnimateKeyguardStatusViewVisibleEndRunnable)
.start();
} else if (mUnlockedScreenOffAnimationController
.isScreenOffLightRevealAnimationPlaying()) {
} else if (mUnlockedScreenOffAnimationController.shouldAnimateInKeyguard()) {
mKeyguardViewVisibilityAnimating = true;
// Ask the screen off animation controller to animate the keyguard visibility for us

View File

@@ -5,20 +5,23 @@ import android.animation.AnimatorListenerAdapter
import android.animation.ValueAnimator
import android.content.Context
import android.content.res.Configuration
import android.database.ContentObserver
import android.os.Handler
import android.provider.Settings
import com.android.systemui.statusbar.StatusBarState
import android.view.View
import com.android.systemui.animation.Interpolators
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.keyguard.KeyguardViewMediator
import com.android.systemui.keyguard.WakefulnessLifecycle
import com.android.systemui.statusbar.LightRevealScrim
import com.android.systemui.statusbar.StatusBarState
import com.android.systemui.statusbar.StatusBarStateControllerImpl
import com.android.systemui.statusbar.notification.AnimatableProperty
import com.android.systemui.statusbar.notification.PropertyAnimator
import com.android.systemui.statusbar.notification.stack.AnimationProperties
import com.android.systemui.statusbar.notification.stack.StackStateAnimator
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.util.settings.GlobalSettings
import javax.inject.Inject
/**
@@ -46,13 +49,16 @@ class UnlockedScreenOffAnimationController @Inject constructor(
private val statusBarStateControllerImpl: StatusBarStateControllerImpl,
private val keyguardViewMediatorLazy: dagger.Lazy<KeyguardViewMediator>,
private val keyguardStateController: KeyguardStateController,
private val dozeParameters: dagger.Lazy<DozeParameters>
private val dozeParameters: dagger.Lazy<DozeParameters>,
private val globalSettings: GlobalSettings
) : WakefulnessLifecycle.Observer {
private val handler = Handler()
private lateinit var statusBar: StatusBar
private lateinit var lightRevealScrim: LightRevealScrim
private var animatorDurationScale = 1f
private var shouldAnimateInKeyguard = false
private var lightRevealAnimationPlaying = false
private var aodUiAnimationPlaying = false
@@ -79,6 +85,12 @@ class UnlockedScreenOffAnimationController @Inject constructor(
})
}
val animatorDurationScaleObserver = object : ContentObserver(null) {
override fun onChange(selfChange: Boolean) {
updateAnimatorDurationScale()
}
}
fun initialize(
statusBar: StatusBar,
lightRevealScrim: LightRevealScrim
@@ -86,14 +98,25 @@ class UnlockedScreenOffAnimationController @Inject constructor(
this.lightRevealScrim = lightRevealScrim
this.statusBar = statusBar
updateAnimatorDurationScale()
globalSettings.registerContentObserver(
Settings.Global.getUriFor(Settings.Global.ANIMATOR_DURATION_SCALE),
/* notify for descendants */ false,
animatorDurationScaleObserver)
wakefulnessLifecycle.addObserver(this)
}
fun updateAnimatorDurationScale() {
animatorDurationScale =
globalSettings.getFloat(Settings.Global.ANIMATOR_DURATION_SCALE, 1f)
}
/**
* Animates in the provided keyguard view, ending in the same position that it will be in on
* AOD.
*/
fun animateInKeyguard(keyguardView: View, after: Runnable) {
shouldAnimateInKeyguard = false
keyguardView.alpha = 0f
keyguardView.visibility = View.VISIBLE
@@ -138,6 +161,7 @@ class UnlockedScreenOffAnimationController @Inject constructor(
// Waking up, so reset this flag.
decidedToAnimateGoingToSleep = null
shouldAnimateInKeyguard = false
lightRevealAnimator.cancel()
handler.removeCallbacksAndMessages(null)
}
@@ -146,7 +170,6 @@ class UnlockedScreenOffAnimationController @Inject constructor(
// Set this to false in onFinishedWakingUp rather than onStartedWakingUp so that other
// observers (such as StatusBar) can ask us whether we were playing the screen off animation
// and reset accordingly.
lightRevealAnimationPlaying = false
aodUiAnimationPlaying = false
// If we can't control the screen off animation, we shouldn't mess with the StatusBar's
@@ -167,15 +190,15 @@ class UnlockedScreenOffAnimationController @Inject constructor(
if (dozeParameters.get().shouldControlUnlockedScreenOff()) {
decidedToAnimateGoingToSleep = true
shouldAnimateInKeyguard = true
lightRevealAnimationPlaying = true
lightRevealAnimator.start()
handler.postDelayed({
aodUiAnimationPlaying = true
// Show AOD. That'll cause the KeyguardVisibilityHelper to call #animateInKeyguard.
statusBar.notificationPanelViewController.showAodUi()
}, ANIMATE_IN_KEYGUARD_DELAY)
}, (ANIMATE_IN_KEYGUARD_DELAY * animatorDurationScale).toLong())
} else {
decidedToAnimateGoingToSleep = false
}
@@ -228,6 +251,10 @@ class UnlockedScreenOffAnimationController @Inject constructor(
return lightRevealAnimationPlaying || aodUiAnimationPlaying
}
fun shouldAnimateInKeyguard(): Boolean {
return shouldAnimateInKeyguard
}
/**
* Whether the light reveal animation is playing. The second part of the screen off animation,
* where AOD animates in, might still be playing if this returns false.
@@ -235,4 +262,4 @@ class UnlockedScreenOffAnimationController @Inject constructor(
fun isScreenOffLightRevealAnimationPlaying(): Boolean {
return lightRevealAnimationPlaying
}
}
}