diff options
| author | 2021-06-03 13:47:56 -0700 | |
|---|---|---|
| committer | 2021-06-04 12:52:36 -0700 | |
| commit | a48422c324b097c4f91668b0ba10e68fe59e6ef4 (patch) | |
| tree | fc39d33be26a99db5c4913cc082a0b4eb84c3a59 | |
| parent | d1c9c0785cbaabd04f278561e881d2bc9c94e5e9 (diff) | |
Don't blur during app launch animations
During app launch, we might poke a hole into the shade window to reveal
the app. We should not blur what's behind the shade, otherwise the app
window would also be blurred.
Also, even when dismissing the shade sliding it, the blur spring would
create an unpleasant feeling.
Test: manual
Test: atest NotificationShadeDepthControllerTest
Test: atest ActivityLaunchAnimatorTest
Test: atest KeyguardViewMediatorTest
Test: atest StatusBarNotificationActivityStarterTest
Fixes: 190086066
Change-Id: Ie5e5df7496eca74ca2715d2df8467636198c60f8
10 files changed, 47 insertions, 37 deletions
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 d185ba3615a9..8bc3d228f7a8 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 da8a3b9a7b6d..e12d6d388f93 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -107,6 +107,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; @@ -237,6 +238,7 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, private final SysuiStatusBarStateController mStatusBarStateController; private final Executor mUiBgExecutor; private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController; + private final Lazy<NotificationShadeDepthController> mNotificationShadeDepthController; private boolean mSystemReady; private boolean mBootCompleted; @@ -807,13 +809,15 @@ public class KeyguardViewMediator extends SystemUI implements Dumpable, SysuiStatusBarStateController statusBarStateController, KeyguardStateController keyguardStateController, Lazy<KeyguardUnlockAnimationController> keyguardUnlockAnimationControllerLazy, - UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, + Lazy<NotificationShadeDepthController> notificationShadeDepthController) { super(context); mFalsingCollector = falsingCollector; mLockPatternUtils = lockPatternUtils; mBroadcastDispatcher = broadcastDispatcher; mKeyguardViewControllerLazy = statusBarKeyguardViewManagerLazy; mDismissCallbackRegistry = dismissCallbackRegistry; + mNotificationShadeDepthController = notificationShadeDepthController; mUiBgExecutor = uiBgExecutor; mUpdateMonitor = keyguardUpdateMonitor; mPM = powerManager; @@ -1654,6 +1658,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 b071b943d8f0..05d1361c3ab8 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> keyguardUnlockAnimationController, - UnlockedScreenOffAnimationController unlockedScreenOffAnimationController) { + UnlockedScreenOffAnimationController unlockedScreenOffAnimationController, + Lazy<NotificationShadeDepthController> 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 b7e8bfb3f2d1..48e64272a1b3 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 @@ -109,18 +107,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() @@ -160,8 +157,6 @@ class NotificationShadeDepthController @Inject constructor( normalizedBlurRadius * ANIMATION_BLUR_FRACTION).toInt() combinedBlur = max(combinedBlur, blurUtils.blurRadiusOfRatio(qsPanelExpansion)) var shadeRadius = max(combinedBlur, wakeAndUnlockBlurRadius).toFloat() - val launchProgress = notificationLaunchAnimationParams?.linearProgress ?: 0f - shadeRadius *= (1f - launchProgress) * (1f - launchProgress) if (ignoreShadeBlurUntilHidden) { if (shadeRadius == 0f) { @@ -184,7 +179,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) { @@ -415,8 +411,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 c4e2279afdb3..bce39ce80d35 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 8e8dcbda51e6..06aedaa5d06e 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 d4990114e1c7..2c7d291033b3 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 e6f9aaf78080..d9b56a49f12a 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 4169cdd9eb12..f5cac8363fff 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 @@ -230,12 +229,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)) } @@ -256,21 +253,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 407afbe1f33e..37a6d21b690e 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 = |