diff --git a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt index d185ba3615a9d..8bc3d228f7a8b 100644 --- a/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt +++ b/packages/SystemUI/animation/src/com/android/systemui/animation/ActivityLaunchAnimator.kt @@ -159,6 +159,7 @@ class ActivityLaunchAnimator( // If we expect an animation, post a timeout to cancel it in case the remote animation is // never started. if (willAnimate) { + keyguardHandler.disableKeyguardBlurs() runner.postTimeout() // Hide the keyguard using the launch animation instead of the default unlock animation. @@ -218,6 +219,9 @@ class ActivityLaunchAnimator( /** Hide the keyguard and animate using [runner]. */ fun hideKeyguardWithAnimation(runner: IRemoteAnimationRunner) + + /** Disable window blur so they don't overlap with the window launch animation **/ + fun disableKeyguardBlurs() } /** diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index edba8bd75b2e1..a159984ddcd35 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -110,6 +110,7 @@ import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.shared.system.QuickStepContract; import com.android.systemui.statusbar.CommandQueue; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.BiometricUnlockController; import com.android.systemui.statusbar.phone.DozeParameters; @@ -240,6 +241,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, private final SysuiStatusBarStateController mStatusBarStateController; private final Executor mUiBgExecutor; private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + private final Lazy mNotificationShadeDepthController; private boolean mSystemReady; private boolean mBootCompleted; @@ -810,13 +812,15 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, SysuiStatusBarStateController statusBarStateController, KeyguardStateController keyguardStateController, Lazy keyguardUnlockAnimationControllerLazy, - UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, + Lazy notificationShadeDepthController) { super(context); mFalsingCollector = falsingCollector; mLockPatternUtils = lockPatternUtils; mBroadcastDispatcher = broadcastDispatcher; mKeyguardViewControllerLazy = statusBarKeyguardViewManagerLazy; mDismissCallbackRegistry = dismissCallbackRegistry; + mNotificationShadeDepthController = notificationShadeDepthController; mUiBgExecutor = uiBgExecutor; mUpdateMonitor = keyguardUpdateMonitor; mPM = powerManager; @@ -1657,6 +1661,14 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, hideLocked(); } + /** + * Disable notification shade background blurs until the keyguard is dismissed. + * (Used during app launch animations) + */ + public void disableBlursUntilHidden() { + mNotificationShadeDepthController.get().setIgnoreShadeBlurUntilHidden(true); + } + public boolean isSecure() { return isSecure(KeyguardUpdateMonitor.getCurrentUser()); } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java index b071b943d8f0e..05d1361c3ab83 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -46,6 +46,7 @@ import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.KeyguardViewMediator; import com.android.systemui.navigationbar.NavigationModeController; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.DozeParameters; @@ -99,7 +100,8 @@ public class KeyguardModule { SysuiStatusBarStateController statusBarStateController, KeyguardStateController keyguardStateController, Lazy keyguardUnlockAnimationController, - UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, + Lazy notificationShadeDepthController) { return new KeyguardViewMediator( context, falsingCollector, @@ -119,7 +121,8 @@ public class KeyguardModule { statusBarStateController, keyguardStateController, keyguardUnlockAnimationController, - unlockedScreenOffAnimationController + unlockedScreenOffAnimationController, + notificationShadeDepthController ); } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index 647ab65ba352d..89005513d3d01 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -35,7 +35,6 @@ import com.android.systemui.animation.Interpolators import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.statusbar.notification.ExpandAnimationParameters 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 @@ -79,7 +78,6 @@ class NotificationShadeDepthController @Inject constructor( private var notificationAnimator: Animator? = null private var updateScheduled: Boolean = false private var shadeExpansion = 0f - private var ignoreShadeBlurUntilHidden: Boolean = false private var isClosed: Boolean = true private var isOpen: Boolean = false private var isBlurred: Boolean = false @@ -119,18 +117,17 @@ class NotificationShadeDepthController @Inject constructor( * When launching an app from the shade, the animations progress should affect how blurry the * shade is, overriding the expansion amount. */ - var notificationLaunchAnimationParams: ExpandAnimationParameters? = null + var ignoreShadeBlurUntilHidden: Boolean = false set(value) { - field = value - if (value != null) { - scheduleUpdate() + if (field == value) { return } + field = value + scheduleUpdate() if (shadeSpring.radius == 0 && shadeAnimation.radius == 0) { return } - ignoreShadeBlurUntilHidden = true shadeSpring.animateTo(0) shadeSpring.finishIfRunning() @@ -171,8 +168,6 @@ class NotificationShadeDepthController @Inject constructor( combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsPanelExpansion)) combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(transitionToFullShadeProgress)) var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius).toFloat() - val launchProgress = notificationLaunchAnimationParams?.linearProgress ?: 0f - shadeRadius *= (1f - launchProgress) * (1f - launchProgress) if (ignoreShadeBlurUntilHidden) { if (shadeRadius == 0f) { @@ -195,7 +190,8 @@ class NotificationShadeDepthController @Inject constructor( blur = 0 } - blurUtils.applyBlur(blurRoot?.viewRootImpl ?: root.viewRootImpl, blur, scrimsVisible) + val opaque = scrimsVisible && !ignoreShadeBlurUntilHidden + blurUtils.applyBlur(blurRoot?.viewRootImpl ?: root.viewRootImpl, blur, opaque) val zoomOut = blurUtils.ratioOfBlurRadius(blur) try { if (root.isAttachedToWindow && root.windowToken != null) { @@ -430,8 +426,6 @@ class NotificationShadeDepthController @Inject constructor( it.println("shadeAnimation: ${shadeAnimation.radius}") it.println("globalActionsRadius: ${globalActionsSpring.radius}") it.println("wakeAndUnlockBlur: $wakeAndUnlockBlurRadius") - it.println("notificationLaunchAnimationProgress: " + - "${notificationLaunchAnimationParams?.linearProgress}") it.println("ignoreShadeBlurUntilHidden: $ignoreShadeBlurUntilHidden") } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt index c4e2279afdb34..bce39ce80d356 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationLaunchAnimatorController.kt @@ -3,7 +3,6 @@ package com.android.systemui.statusbar.notification import android.view.ViewGroup import com.android.internal.jank.InteractionJankMonitor import com.android.systemui.animation.ActivityLaunchAnimator -import com.android.systemui.statusbar.NotificationShadeDepthController import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow import com.android.systemui.statusbar.notification.stack.NotificationListContainer import com.android.systemui.statusbar.phone.HeadsUpManagerPhone @@ -15,7 +14,6 @@ import kotlin.math.max class NotificationLaunchAnimatorControllerProvider( private val notificationShadeWindowViewController: NotificationShadeWindowViewController, private val notificationListContainer: NotificationListContainer, - private val depthController: NotificationShadeDepthController, private val headsUpManager: HeadsUpManagerPhone ) { fun getAnimatorController( @@ -24,7 +22,6 @@ class NotificationLaunchAnimatorControllerProvider( return NotificationLaunchAnimatorController( notificationShadeWindowViewController, notificationListContainer, - depthController, notification, headsUpManager ) @@ -39,7 +36,6 @@ class NotificationLaunchAnimatorControllerProvider( class NotificationLaunchAnimatorController( private val notificationShadeWindowViewController: NotificationShadeWindowViewController, private val notificationListContainer: NotificationListContainer, - private val depthController: NotificationShadeDepthController, private val notification: ExpandableNotificationRow, private val headsUpManager: HeadsUpManagerPhone ) : ActivityLaunchAnimator.Controller { @@ -128,7 +124,6 @@ class NotificationLaunchAnimatorController( private fun applyParams(params: ExpandAnimationParameters?) { notification.applyExpandAnimationParams(params) notificationListContainer.applyExpandAnimationParams(params) - depthController.notificationLaunchAnimationParams = params } override fun onLaunchAnimationProgress( 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 8e8dcbda51e64..06aedaa5d06ed 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1424,7 +1424,6 @@ public class StatusBar extends SystemUI implements DemoMode, mNotificationAnimationProvider = new NotificationLaunchAnimatorControllerProvider( mNotificationShadeWindowViewController, mStackScrollerController.getNotificationListContainer(), - mNotificationShadeDepthControllerLazy.get(), mHeadsUpManager ); @@ -2122,6 +2121,11 @@ public class StatusBar extends SystemUI implements DemoMode, mKeyguardViewMediator.hideWithAnimation(runner); } + @Override + public void disableKeyguardBlurs() { + mMainThreadHandler.post(mKeyguardViewMediator::disableBlursUntilHidden); + } + public boolean isDeviceInVrMode() { return mPresenter.isDeviceInVrMode(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt index d4990114e1c78..2c7d291033b3d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/animation/ActivityLaunchAnimatorTest.kt @@ -123,6 +123,7 @@ class ActivityLaunchAnimatorTest : SysuiTestCase() { waitForIdleSync() verify(controller).onIntentStarted(willAnimateCaptor.capture()) + verify(keyguardHandler).disableKeyguardBlurs() verify(keyguardHandler).hideKeyguardWithAnimation(any()) assertTrue(willAnimateCaptor.value) @@ -189,6 +190,10 @@ private class TestLaunchAnimatorKeyguardHandler( ) : ActivityLaunchAnimator.KeyguardHandler { override fun isOnKeyguard(): Boolean = isOnKeyguard + override fun disableKeyguardBlurs() { + // Do nothing + } + override fun hideKeyguardWithAnimation(runner: IRemoteAnimationRunner) { // Do nothing. } diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java index e6f9aaf780808..d9b56a49f12a8 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -46,6 +46,7 @@ import com.android.systemui.broadcast.BroadcastDispatcher; import com.android.systemui.classifier.FalsingCollectorFake; import com.android.systemui.dump.DumpManager; import com.android.systemui.navigationbar.NavigationModeController; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; @@ -82,6 +83,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock DozeParameters mDozeParameters; private @Mock SysuiStatusBarStateController mStatusBarStateController; private @Mock KeyguardStateController mKeyguardStateController; + private @Mock NotificationShadeDepthController mNotificationShadeDepthController; private @Mock KeyguardUnlockAnimationController mKeyguardUnlockAnimationController; private @Mock UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake(); @@ -104,7 +106,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mPowerManager, mTrustManager, mDeviceConfig, mNavigationModeController, mKeyguardDisplayManager, mDozeParameters, mStatusBarStateController, mKeyguardStateController, () -> mKeyguardUnlockAnimationController, - mUnlockedScreenOffAnimationController); + mUnlockedScreenOffAnimationController, () -> mNotificationShadeDepthController); mViewMediator.start(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt index 3d6692bcde4c5..61c3835a88d2b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/NotificationShadeDepthControllerTest.kt @@ -27,7 +27,6 @@ import androidx.test.filters.SmallTest import com.android.systemui.SysuiTestCase import com.android.systemui.dump.DumpManager import com.android.systemui.plugins.statusbar.StatusBarStateController -import com.android.systemui.statusbar.notification.ExpandAnimationParameters import com.android.systemui.statusbar.phone.BiometricUnlockController import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.ScrimController @@ -237,12 +236,10 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { } @Test - fun updateBlurCallback_appLaunchAnimation_overridesZoom() { + fun updateBlurCallback_ignoreShadeBlurUntilHidden_overridesZoom() { `when`(shadeSpring.radius).thenReturn(maxBlur) `when`(shadeAnimation.radius).thenReturn(maxBlur) - val animProgress = ExpandAnimationParameters() - animProgress.linearProgress = 1f - notificationShadeDepthController.notificationLaunchAnimationParams = animProgress + notificationShadeDepthController.ignoreShadeBlurUntilHidden = true notificationShadeDepthController.updateBlurCallback.doFrame(0) verify(blurUtils).applyBlur(any(), eq(0), eq(false)) } @@ -263,21 +260,17 @@ class NotificationShadeDepthControllerTest : SysuiTestCase() { } @Test - fun setNotificationLaunchAnimationParams_schedulesFrame() { - val animProgress = ExpandAnimationParameters() - animProgress.linearProgress = 0.5f - notificationShadeDepthController.notificationLaunchAnimationParams = animProgress + fun ignoreShadeBlurUntilHidden_schedulesFrame() { + notificationShadeDepthController.ignoreShadeBlurUntilHidden = true verify(choreographer).postFrameCallback( eq(notificationShadeDepthController.updateBlurCallback)) } @Test - fun setNotificationLaunchAnimationParams_whennNull_ignoresIfShadeHasNoBlur() { - val animProgress = ExpandAnimationParameters() - animProgress.linearProgress = 0.5f + fun ignoreShadeBlurUntilHidden_whennNull_ignoresIfShadeHasNoBlur() { `when`(shadeSpring.radius).thenReturn(0) `when`(shadeAnimation.radius).thenReturn(0) - notificationShadeDepthController.notificationLaunchAnimationParams = animProgress + notificationShadeDepthController.ignoreShadeBlurUntilHidden = true verify(shadeSpring, never()).animateTo(anyInt(), any()) verify(shadeAnimation, never()).animateTo(anyInt(), any()) } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java index 407afbe1f33ed..37a6d21b690e5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/StatusBarNotificationActivityStarterTest.java @@ -61,7 +61,6 @@ import com.android.systemui.statusbar.NotificationClickNotifier; import com.android.systemui.statusbar.NotificationLockscreenUserManager; import com.android.systemui.statusbar.NotificationPresenter; import com.android.systemui.statusbar.NotificationRemoteInputManager; -import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.RemoteInputController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.NotificationActivityStarter; @@ -191,7 +190,6 @@ public class StatusBarNotificationActivityStarterTest extends SysuiTestCase { new NotificationLaunchAnimatorControllerProvider( mock(NotificationShadeWindowViewController.class), mock( NotificationListContainer.class), - mock(NotificationShadeDepthController.class), headsUpManager); mNotificationActivityStarter =