diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 250317b067bf2..e680162fded28 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java @@ -137,6 +137,7 @@ import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.KeyguardBypassController; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; +import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.util.DeviceConfigProxy; @@ -851,6 +852,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void onLaunchAnimationStart(boolean isExpandingFullyAbove) { mOccludeAnimationPlaying = true; + mScrimControllerLazy.get().setOccludeAnimationPlaying(true); } @Override @@ -861,6 +863,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, // Ensure keyguard state is set correctly if we're cancelled. mCentralSurfaces.updateIsKeyguard(); + mScrimControllerLazy.get().setOccludeAnimationPlaying(false); } @Override @@ -874,6 +877,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, // Hide the keyguard now that we're done launching the occluding activity over // it. mCentralSurfaces.updateIsKeyguard(); + mScrimControllerLazy.get().setOccludeAnimationPlaying(false); mInteractionJankMonitor.end(CUJ_LOCKSCREEN_OCCLUSION); } @@ -1131,6 +1135,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, private ScreenOnCoordinator mScreenOnCoordinator; private Lazy mActivityLaunchAnimator; + private Lazy mScrimControllerLazy; /** * Injected constructor. See {@link KeyguardModule}. @@ -1161,7 +1166,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, DreamOverlayStateController dreamOverlayStateController, Lazy shadeControllerLazy, Lazy notificationShadeWindowControllerLazy, - Lazy activityLaunchAnimator) { + Lazy activityLaunchAnimator, + Lazy scrimControllerLazy) { mContext = context; mUserTracker = userTracker; mFalsingCollector = falsingCollector; @@ -1206,6 +1212,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mDreamOverlayStateController = dreamOverlayStateController; mActivityLaunchAnimator = activityLaunchAnimator; + mScrimControllerLazy = scrimControllerLazy; mPowerButtonY = context.getResources().getDimensionPixelSize( R.dimen.physical_power_button_center_screen_location_y); 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 ef3c44340e579..47ef0fac17ab3 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java +++ b/packages/SystemUI/src/com/android/systemui/keyguard/dagger/KeyguardModule.java @@ -54,6 +54,7 @@ import com.android.systemui.statusbar.NotificationShadeWindowController; import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; +import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserSwitcherController; import com.android.systemui.util.DeviceConfigProxy; @@ -113,7 +114,8 @@ public class KeyguardModule { DreamOverlayStateController dreamOverlayStateController, Lazy shadeController, Lazy notificationShadeWindowController, - Lazy activityLaunchAnimator) { + Lazy activityLaunchAnimator, + Lazy scrimControllerLazy) { return new KeyguardViewMediator( context, userTracker, @@ -142,7 +144,8 @@ public class KeyguardModule { dreamOverlayStateController, shadeController, notificationShadeWindowController, - activityLaunchAnimator); + activityLaunchAnimator, + scrimControllerLazy); } /** */ diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java index c527f30c424ce..fb0d3e4406bf6 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ScrimController.java @@ -109,6 +109,12 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump public static final int OPAQUE = 2; private boolean mClipsQsScrim; + /** + * Whether an activity is launching over the lockscreen. During the launch animation, we want to + * delay certain scrim changes until after the animation ends. + */ + private boolean mOccludeAnimationPlaying = false; + /** * The amount of progress we are currently in if we're transitioning to the full shade. * 0.0f means we're not transitioning yet, while 1 means we're all the way in the full @@ -733,6 +739,11 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump return mClipsQsScrim; } + public void setOccludeAnimationPlaying(boolean occludeAnimationPlaying) { + mOccludeAnimationPlaying = occludeAnimationPlaying; + applyAndDispatchState(); + } + private void setOrAdaptCurrentAnimation(@Nullable View scrim) { if (scrim == null) { return; @@ -772,11 +783,15 @@ public class ScrimController implements ViewTreeObserver.OnPreDrawListener, Dump } if (mState == ScrimState.UNLOCKED || mState == ScrimState.DREAMING) { - // Darken scrim as you pull down the shade when unlocked, unless the shade is expanding - // because we're doing the screen off animation OR the shade is collapsing because - // we're playing the unlock animation + final boolean occluding = + mOccludeAnimationPlaying || mState.mLaunchingAffordanceWithPreview; + + // Darken scrim as it's pulled down while unlocked. If we're unlocked but playing the + // screen off/occlusion animations, ignore expansion changes while those animations + // play. if (!mScreenOffAnimationController.shouldExpandNotifications() - && !mAnimatingPanelExpansionOnUnlock) { + && !mAnimatingPanelExpansionOnUnlock + && !occluding) { float behindFraction = getInterpolatedFraction(); behindFraction = (float) Math.pow(behindFraction, 0.8f); if (mClipsQsScrim) { 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 45aaaa2418a1d..d17e3744edc68 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java @@ -65,6 +65,7 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController; import com.android.systemui.statusbar.phone.CentralSurfaces; import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.ScreenOffAnimationController; +import com.android.systemui.statusbar.phone.ScrimController; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.UserSwitcherController; @@ -112,6 +113,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { private @Mock Lazy mNotificationShadeWindowControllerLazy; private @Mock DreamOverlayStateController mDreamOverlayStateController; private @Mock ActivityLaunchAnimator mActivityLaunchAnimator; + private @Mock ScrimController mScrimController; private DeviceConfigProxy mDeviceConfig = new DeviceConfigProxyFake(); private FakeExecutor mUiBgExecutor = new FakeExecutor(new FakeSystemClock()); @@ -314,7 +316,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mDreamOverlayStateController, () -> mShadeController, mNotificationShadeWindowControllerLazy, - () -> mActivityLaunchAnimator); + () -> mActivityLaunchAnimator, + () -> mScrimController); mViewMediator.start(); mViewMediator.registerCentralSurfaces(mCentralSurfaces, null, null, null, null, null);