diff options
3 files changed, 54 insertions, 5 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt index 03d8e7e03c0f..77e329f94a36 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/LightRevealScrim.kt @@ -208,6 +208,11 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, lateinit var isScrimOpaqueChangedListener: Consumer<Boolean> /** + * A runnable to call when the scrim has been fully revealed. This is only invoked once + */ + var fullyRevealedRunnable: Runnable? = null + + /** * How much of the underlying views are revealed, in percent. 0 means they will be completely * obscured and 1 means they'll be fully visible. */ @@ -218,10 +223,20 @@ class LightRevealScrim(context: Context?, attrs: AttributeSet?) : View(context, revealEffect.setRevealAmountOnScrim(value, this) updateScrimOpaque() + maybeTriggerFullyRevealedRunnable() invalidate() } } + private fun maybeTriggerFullyRevealedRunnable() { + if (revealAmount == 1.0f) { + fullyRevealedRunnable?.let { + it.run() + fullyRevealedRunnable = null + } + } + } + /** * The [LightRevealEffect] used to manipulate the radial gradient whenever [revealAmount] * changes. diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index 7aa2dc7e0785..d4f54e1cd7b1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -36,7 +36,6 @@ import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController import com.android.systemui.statusbar.phone.BiometricUnlockController -import com.android.systemui.statusbar.phone.BiometricUnlockController.MODE_WAKE_AND_UNLOCK import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.PanelExpansionListener import com.android.systemui.statusbar.phone.ScrimController @@ -73,6 +72,10 @@ class NotificationShadeDepthController @Inject constructor( private const val TAG = "DepthController" } + /** + * Did we already unblur while dozing? + */ + private var alreadyUnblurredWhileDozing = false lateinit var root: View private var blurRoot: View? = null private var keyguardAnimator: Animator? = null @@ -229,9 +232,11 @@ class NotificationShadeDepthController @Inject constructor( private val keyguardStateCallback = object : KeyguardStateController.Callback { override fun onKeyguardFadingAwayChanged() { if (!keyguardStateController.isKeyguardFadingAway || - biometricUnlockController.mode != MODE_WAKE_AND_UNLOCK) { + !biometricUnlockController.isWakeAndUnlock) { return } + // When wakeAndUnlocking the screen remains dozing, so we have to manually trigger + // the unblur earlier keyguardAnimator?.cancel() keyguardAnimator = ValueAnimator.ofFloat(1f, 0f).apply { @@ -253,6 +258,7 @@ class NotificationShadeDepthController @Inject constructor( }) start() } + alreadyUnblurredWhileDozing = statusBarStateController.dozeAmount != 0.0f } override fun onKeyguardShowingChanged() { @@ -274,10 +280,24 @@ class NotificationShadeDepthController @Inject constructor( if (isDozing) { shadeAnimation.finishIfRunning() brightnessMirrorSpring.finishIfRunning() + + // unset this for safety, to be ready for the next wakeup + alreadyUnblurredWhileDozing = false } } override fun onDozeAmountChanged(linear: Float, eased: Float) { + if (alreadyUnblurredWhileDozing) { + if (linear == 0.0f) { + // We finished waking up, let's reset + alreadyUnblurredWhileDozing = false + } else { + // We've already handled the unbluring from the keyguardAnimator above. + // if we would continue, we'd play another unzoom / blur animation from the + // dozing changing. + return + } + } wakeAndUnlockBlurRadius = blurUtils.blurRadiusOfRatio(eased) scheduleUpdate() } @@ -435,6 +455,7 @@ class NotificationShadeDepthController @Inject constructor( it.println("blursDisabledForAppLaunch: $blursDisabledForAppLaunch") it.println("qsPanelExpansion: $qsPanelExpansion") it.println("transitionToFullShadeProgress: $transitionToFullShadeProgress") + it.println("alreadyUnblurredWhileDozing: $alreadyUnblurredWhileDozing") it.println("lastAppliedBlur: $lastAppliedBlur") } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 3bdc08be63e6..1cb9ccb7b242 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -336,6 +336,7 @@ public class StatusBar extends SystemUI implements } private final LockscreenShadeTransitionController mLockscreenShadeTransitionController; + private boolean mCallingFadingAwayAfterReveal; private StatusBarCommandQueueCallbacks mCommandQueueCallbacks; void setWindowState(int state) { @@ -3120,8 +3121,20 @@ public class StatusBar extends SystemUI implements public void fadeKeyguardWhilePulsing() { mNotificationPanelViewController.fadeOut(0, FADE_KEYGUARD_DURATION_PULSING, ()-> { - hideKeyguard(); - mStatusBarKeyguardViewManager.onKeyguardFadedAway(); + Runnable finishFading = () -> { + mCallingFadingAwayAfterReveal = false; + hideKeyguard(); + mStatusBarKeyguardViewManager.onKeyguardFadedAway(); + }; + if (mLightRevealScrim.getRevealAmount() != 1.0f) { + mCallingFadingAwayAfterReveal = true; + // We're still revealing the Light reveal, let's only go to keyguard once + // that has finished and nothing moves anymore. + // Going there introduces lots of jank + mLightRevealScrim.setFullyRevealedRunnable(finishFading); + } else { + finishFading.run(); + } }).start(); } @@ -4280,7 +4293,7 @@ public class StatusBar extends SystemUI implements + "mStatusBarKeyguardViewManager was null"); return; } - if (mKeyguardStateController.isKeyguardFadingAway()) { + if (mKeyguardStateController.isKeyguardFadingAway() && !mCallingFadingAwayAfterReveal) { mStatusBarKeyguardViewManager.onKeyguardFadedAway(); } } |