From 2cfefa80d36f6271a221e2fd11b4182d7b35621c Mon Sep 17 00:00:00 2001 From: Josh Tsuji Date: Fri, 11 Nov 2022 14:35:04 -0500 Subject: [PATCH] Update scrim controller directly with occlude animation status. updateIsKeyguard() short circuits in some cases which was preventing the scrim state from updating after the occlude animation ends. This fixes that by delivering the occlusion animation status directly (similar to clipsQsScrim and other params in ScrimController) and updating the scrims. Fixes: 258700577 Test: launch camera in both light and dark mode Test: pull down shade before/after launch to confirm notif scrim is not stuck Change-Id: Ib3762df8d51f9347c56347cc235b8c97637991c0 --- .../keyguard/KeyguardViewMediator.java | 9 +++++++- .../keyguard/dagger/KeyguardModule.java | 7 ++++-- .../statusbar/phone/ScrimController.java | 23 +++++++++++++++---- .../keyguard/KeyguardViewMediatorTest.java | 5 +++- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java b/packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java index 663582ede3858..ffda2634cc350 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; @@ -847,6 +848,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, @Override public void onLaunchAnimationStart(boolean isExpandingFullyAbove) { mOccludeAnimationPlaying = true; + mScrimControllerLazy.get().setOccludeAnimationPlaying(true); } @Override @@ -857,6 +859,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, // Ensure keyguard state is set correctly if we're cancelled. mCentralSurfaces.updateIsKeyguard(); + mScrimControllerLazy.get().setOccludeAnimationPlaying(false); } @Override @@ -870,6 +873,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); } @@ -1126,6 +1130,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, private ScreenOnCoordinator mScreenOnCoordinator; private Lazy mActivityLaunchAnimator; + private Lazy mScrimControllerLazy; /** * Injected constructor. See {@link KeyguardModule}. @@ -1156,7 +1161,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; @@ -1201,6 +1207,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);