Loading packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +38 −5 Original line number Diff line number Diff line Loading @@ -458,6 +458,13 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, * */ private boolean mHiding; /** * Tracks SHOW/HIDE requests, in order to determine if a HIDE request show be completed after a * series of binder calls returns from WM. */ private int mLastShowRequest = 0; private int mLastHideRequest = 0; /** * we send this intent when the keyguard is dismissed. */ Loading Loading @@ -2011,6 +2018,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mNeedToReshowWhenReenabled = false; updateInputRestrictedLocked(); mHandler.removeMessages(HIDE); mHandler.removeMessages(START_KEYGUARD_EXIT_ANIM); showLocked(null); // block until we know the keyguard is done drawing (and post a message Loading Loading @@ -2381,6 +2390,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (DEBUG) Log.d(TAG, "showLocked"); // ensure we stay awake until we are finished displaying the keyguard mShowKeyguardWakeLock.acquire(); mLastShowRequest++; Message msg = mHandler.obtainMessage(SHOW, options); // Treat these messages with priority - This call can originate from #doKeyguardTimeout, // meaning the device should lock as soon as possible and not wait for other messages on Loading @@ -2393,7 +2403,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, * Send message to keyguard telling it to hide itself * @see #handleHide() */ private void hideLocked() { @VisibleForTesting void hideLocked() { Trace.beginSection("KeyguardViewMediator#hideLocked"); if (DEBUG) Log.d(TAG, "hideLocked"); Message msg = mHandler.obtainMessage(HIDE); Loading Loading @@ -2839,6 +2850,14 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, setShowingLocked(true, hidingOrGoingAway /* force */); mHiding = false; // Any valid exit animation will set this to false before proceeding mIsKeyguardExitAnimationCanceled = true; // Make sure to remove any pending exit animation requests that would override a SHOW mHandler.removeMessages(START_KEYGUARD_EXIT_ANIM); mHandler.removeMessages(HIDE); mShadeController.get().instantCollapseShade(); mKeyguardStateController.notifyKeyguardGoingAway(false); if (!mFeatureFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) { // Handled directly in StatusBarKeyguardViewManager if enabled. mKeyguardViewControllerLazy.get().show(options); Loading Loading @@ -3014,7 +3033,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (DEBUG) Log.d(TAG, "handleHide"); mHiding = true; mLastHideRequest = mLastShowRequest; // If waking and unlocking, waking from dream has been set properly. if (!mWakeAndUnlocking) { setUnlockAndWakeFromDream(mStatusBarStateController.isDreaming() Loading @@ -3027,6 +3046,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } mKeyguardGoingAwayRunnable.run(); } else { mGoingAwayRequestedForUserId = KeyguardUpdateMonitor.getCurrentUser(); // TODO(bc-unlock): Fill parameters mNotificationShadeWindowControllerLazy.get().batchApplyWindowLayoutParams(() -> { handleStartKeyguardExitAnimation( Loading @@ -3053,11 +3073,22 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime + " fadeoutDuration=" + fadeoutDuration); int currentUserId = KeyguardUpdateMonitor.getCurrentUser(); // Requests to exit directly from WM are valid if the lockscreen can be dismissed if (mKeyguardStateController.canDismissLockScreen()) { mLastHideRequest = mLastShowRequest; } String error = null; if (mGoingAwayRequestedForUserId != currentUserId) { Log.e(TAG, "Not executing handleStartKeyguardExitAnimationInner() due to userId " error = "Not executing handleStartKeyguardExitAnimationInner() due to userId " + "mismatch. Requested: " + mGoingAwayRequestedForUserId + ", current: " + currentUserId); mIsKeyguardExitAnimationCanceled = true; + currentUserId; } else if (mLastHideRequest != mLastShowRequest) { error = "Show requested after hide, cancel animation"; } if (error != null) { Log.e(TAG, error); if (finishedCallback != null) { // There will not execute animation, send a finish callback to ensure the remote // animation won't hang there. Loading Loading @@ -3422,6 +3453,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (KeyguardUnlockAnimationController.Companion.isNexusLauncherUnderneath()) { flags |= KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT; } mLastHideRequest = mLastShowRequest; mIsKeyguardExitAnimationCanceled = false; if (!mFeatureFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) { mGoingAwayRequestedForUserId = KeyguardUpdateMonitor.getCurrentUser(); Loading packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -775,7 +775,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { IRemoteAnimationFinishedCallback callback = mock(IRemoteAnimationFinishedCallback.class); when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true); mViewMediator.mKeyguardGoingAwayRunnable.run(); mViewMediator.hideLocked(); processAllMessagesAndBgExecutorMessages(); mViewMediator.startKeyguardExitAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, apps, wallpapers, null, callback); processAllMessagesAndBgExecutorMessages(); Loading Loading @@ -1089,6 +1090,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mViewMediator.getViewMediatorCallback().onBouncerSwipeDown(); verify(mStatusBarKeyguardViewManager).reset(true); } private void createAndStartViewMediator() { createAndStartViewMediator(false); } Loading Loading
packages/SystemUI/src/com/android/systemui/keyguard/KeyguardViewMediator.java +38 −5 Original line number Diff line number Diff line Loading @@ -458,6 +458,13 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, * */ private boolean mHiding; /** * Tracks SHOW/HIDE requests, in order to determine if a HIDE request show be completed after a * series of binder calls returns from WM. */ private int mLastShowRequest = 0; private int mLastHideRequest = 0; /** * we send this intent when the keyguard is dismissed. */ Loading Loading @@ -2011,6 +2018,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, mNeedToReshowWhenReenabled = false; updateInputRestrictedLocked(); mHandler.removeMessages(HIDE); mHandler.removeMessages(START_KEYGUARD_EXIT_ANIM); showLocked(null); // block until we know the keyguard is done drawing (and post a message Loading Loading @@ -2381,6 +2390,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (DEBUG) Log.d(TAG, "showLocked"); // ensure we stay awake until we are finished displaying the keyguard mShowKeyguardWakeLock.acquire(); mLastShowRequest++; Message msg = mHandler.obtainMessage(SHOW, options); // Treat these messages with priority - This call can originate from #doKeyguardTimeout, // meaning the device should lock as soon as possible and not wait for other messages on Loading @@ -2393,7 +2403,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, * Send message to keyguard telling it to hide itself * @see #handleHide() */ private void hideLocked() { @VisibleForTesting void hideLocked() { Trace.beginSection("KeyguardViewMediator#hideLocked"); if (DEBUG) Log.d(TAG, "hideLocked"); Message msg = mHandler.obtainMessage(HIDE); Loading Loading @@ -2839,6 +2850,14 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, setShowingLocked(true, hidingOrGoingAway /* force */); mHiding = false; // Any valid exit animation will set this to false before proceeding mIsKeyguardExitAnimationCanceled = true; // Make sure to remove any pending exit animation requests that would override a SHOW mHandler.removeMessages(START_KEYGUARD_EXIT_ANIM); mHandler.removeMessages(HIDE); mShadeController.get().instantCollapseShade(); mKeyguardStateController.notifyKeyguardGoingAway(false); if (!mFeatureFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) { // Handled directly in StatusBarKeyguardViewManager if enabled. mKeyguardViewControllerLazy.get().show(options); Loading Loading @@ -3014,7 +3033,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (DEBUG) Log.d(TAG, "handleHide"); mHiding = true; mLastHideRequest = mLastShowRequest; // If waking and unlocking, waking from dream has been set properly. if (!mWakeAndUnlocking) { setUnlockAndWakeFromDream(mStatusBarStateController.isDreaming() Loading @@ -3027,6 +3046,7 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, } mKeyguardGoingAwayRunnable.run(); } else { mGoingAwayRequestedForUserId = KeyguardUpdateMonitor.getCurrentUser(); // TODO(bc-unlock): Fill parameters mNotificationShadeWindowControllerLazy.get().batchApplyWindowLayoutParams(() -> { handleStartKeyguardExitAnimation( Loading @@ -3053,11 +3073,22 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, Log.d(TAG, "handleStartKeyguardExitAnimation startTime=" + startTime + " fadeoutDuration=" + fadeoutDuration); int currentUserId = KeyguardUpdateMonitor.getCurrentUser(); // Requests to exit directly from WM are valid if the lockscreen can be dismissed if (mKeyguardStateController.canDismissLockScreen()) { mLastHideRequest = mLastShowRequest; } String error = null; if (mGoingAwayRequestedForUserId != currentUserId) { Log.e(TAG, "Not executing handleStartKeyguardExitAnimationInner() due to userId " error = "Not executing handleStartKeyguardExitAnimationInner() due to userId " + "mismatch. Requested: " + mGoingAwayRequestedForUserId + ", current: " + currentUserId); mIsKeyguardExitAnimationCanceled = true; + currentUserId; } else if (mLastHideRequest != mLastShowRequest) { error = "Show requested after hide, cancel animation"; } if (error != null) { Log.e(TAG, error); if (finishedCallback != null) { // There will not execute animation, send a finish callback to ensure the remote // animation won't hang there. Loading Loading @@ -3422,6 +3453,8 @@ public class KeyguardViewMediator implements CoreStartable, Dumpable, if (KeyguardUnlockAnimationController.Companion.isNexusLauncherUnderneath()) { flags |= KEYGUARD_GOING_AWAY_FLAG_TO_LAUNCHER_CLEAR_SNAPSHOT; } mLastHideRequest = mLastShowRequest; mIsKeyguardExitAnimationCanceled = false; if (!mFeatureFlags.isEnabled(Flags.KEYGUARD_WM_STATE_REFACTOR)) { mGoingAwayRequestedForUserId = KeyguardUpdateMonitor.getCurrentUser(); Loading
packages/SystemUI/tests/src/com/android/systemui/keyguard/KeyguardViewMediatorTest.java +3 −1 Original line number Diff line number Diff line Loading @@ -775,7 +775,8 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { IRemoteAnimationFinishedCallback callback = mock(IRemoteAnimationFinishedCallback.class); when(mKeyguardStateController.isKeyguardGoingAway()).thenReturn(true); mViewMediator.mKeyguardGoingAwayRunnable.run(); mViewMediator.hideLocked(); processAllMessagesAndBgExecutorMessages(); mViewMediator.startKeyguardExitAnimation(TRANSIT_OLD_KEYGUARD_GOING_AWAY, apps, wallpapers, null, callback); processAllMessagesAndBgExecutorMessages(); Loading Loading @@ -1089,6 +1090,7 @@ public class KeyguardViewMediatorTest extends SysuiTestCase { mViewMediator.getViewMediatorCallback().onBouncerSwipeDown(); verify(mStatusBarKeyguardViewManager).reset(true); } private void createAndStartViewMediator() { createAndStartViewMediator(false); } Loading