diff options
| author | 2025-03-04 08:23:37 -0800 | |
|---|---|---|
| committer | 2025-03-04 08:23:37 -0800 | |
| commit | 7fdb63a26a25d8e2bc8dabe974b9964d272d9c88 (patch) | |
| tree | ee319c02d054b70aaac44f2863532a5e53f3b935 | |
| parent | a17dc87c00f15cacebbbf250d949818c09ba8c94 (diff) | |
| parent | 68ccd4981729060e3a4aa61f9161d7ba9e650326 (diff) | |
Merge "Don't disable the Shade's blur during launches." into main
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt | 57 | ||||
| -rw-r--r-- | packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java | 20 |
2 files changed, 73 insertions, 4 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index 3db004848d22..bdfdb8191356 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -60,6 +60,8 @@ import java.util.Optional import javax.inject.Inject import kotlin.math.max import kotlin.math.sign +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.launch /** * Responsible for blurring the notification shade window, and applying a zoom effect to the @@ -92,6 +94,7 @@ constructor( private const val MIN_VELOCITY = -MAX_VELOCITY private const val INTERACTION_BLUR_FRACTION = 0.8f private const val ANIMATION_BLUR_FRACTION = 1f - INTERACTION_BLUR_FRACTION + private const val TRANSITION_THRESHOLD = 0.98f private const val TAG = "DepthController" } @@ -156,6 +159,9 @@ constructor( /** * When launching an app from the shade, the animations progress should affect how blurry the * shade is, overriding the expansion amount. + * + * TODO(b/399617511): remove this once [Flags.notificationShadeBlur] is launched and the Shade + * closing is actually instantaneous. */ var blursDisabledForAppLaunch: Boolean = false set(value) { @@ -185,8 +191,12 @@ constructor( return } - shadeAnimation.animateTo(0) - shadeAnimation.finishIfRunning() + if (Flags.notificationShadeBlur()) { + shadeAnimation.skipTo(0) + } else { + shadeAnimation.animateTo(0) + shadeAnimation.finishIfRunning() + } } @Deprecated( message = @@ -487,6 +497,22 @@ constructor( scheduleUpdate() } + fun onTransitionAnimationProgress(progress: Float) { + if (!Flags.notificationShadeBlur() || !Flags.moveTransitionAnimationLayer()) return + // Because the Shade takes a few frames to actually trigger the unblur after a transition + // has ended, we need to disable it manually, or the opening window itself will be blurred + // for a few frames due to relative ordering. We do this towards the end, so that the + // window is already covering the background and the unblur is not visible. + if (progress >= TRANSITION_THRESHOLD && shadeAnimation.radius > 0) { + blursDisabledForAppLaunch = true + } + } + + fun onTransitionAnimationEnd() { + if (!Flags.notificationShadeBlur() || !Flags.moveTransitionAnimationLayer()) return + blursDisabledForAppLaunch = false + } + private fun updateShadeAnimationBlur( expansion: Float, tracking: Boolean, @@ -631,6 +657,20 @@ constructor( springAnimation.addEndListener { _, _, _, _ -> pendingRadius = -1 } } + /** + * Starts an animation to [newRadius], or updates the current one if already ongoing. + * IMPORTANT: do NOT use this method + [finishIfRunning] to instantaneously change the value + * of the animation. The change will NOT be instantaneous. Use [skipTo] instead. + * + * Explanation: + * 1. If idle, [SpringAnimation.animateToFinalPosition] requests a start to the animation. + * 2. On the first frame after an idle animation is requested to start, the animation simply + * acquires the starting value and does nothing else. + * 3. [SpringAnimation.skipToEnd] requests a fast-forward to the end value, but this happens + * during calculation of the next animation value. Because on the first frame no such + * calculation happens (point #2), there is one lagging frame where we still see the old + * value. + */ fun animateTo(newRadius: Int) { if (pendingRadius == newRadius) { return @@ -639,6 +679,19 @@ constructor( springAnimation.animateToFinalPosition(newRadius.toFloat()) } + /** + * Instantaneously set a new blur radius to this animation. Always use this instead of + * [animateTo] and [finishIfRunning] to make sure that the change takes effect in the next + * frame. See the doc for [animateTo] for an explanation. + */ + fun skipTo(newRadius: Int) { + if (pendingRadius == newRadius) return + pendingRadius = newRadius + springAnimation.cancel() + springAnimation.setStartValue(newRadius.toFloat()) + springAnimation.animateToFinalPosition(newRadius.toFloat()) + } + fun finishIfRunning() { if (springAnimation.isRunning) { springAnimation.skipToEnd() diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java index face1c7512ce..fc721bfae369 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/CentralSurfacesImpl.java @@ -109,6 +109,7 @@ import com.android.systemui.AutoReinflateContainer; import com.android.systemui.CoreStartable; import com.android.systemui.DejankUtils; import com.android.systemui.EventLogTags; +import com.android.systemui.Flags; import com.android.systemui.InitController; import com.android.systemui.Prefs; import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController; @@ -3183,12 +3184,27 @@ public class CentralSurfacesImpl implements CoreStartable, CentralSurfaces { new ActivityTransitionAnimator.Listener() { @Override public void onTransitionAnimationStart() { - mKeyguardViewMediator.setBlursDisabledForAppLaunch(true); + if (!Flags.notificationShadeBlur() || !Flags.moveTransitionAnimationLayer()) { + mKeyguardViewMediator.setBlursDisabledForAppLaunch(true); + } + } + + @Override + public void onTransitionAnimationProgress(float linearProgress) { + if (Flags.notificationShadeBlur() && Flags.moveTransitionAnimationLayer()) { + mNotificationShadeDepthControllerLazy.get() + .onTransitionAnimationProgress(linearProgress); + } } @Override public void onTransitionAnimationEnd() { - mKeyguardViewMediator.setBlursDisabledForAppLaunch(false); + if (Flags.notificationShadeBlur() && Flags.moveTransitionAnimationLayer()) { + mNotificationShadeDepthControllerLazy.get() + .onTransitionAnimationEnd(); + } else { + mKeyguardViewMediator.setBlursDisabledForAppLaunch(false); + } } }; |