diff options
| author | 2022-11-01 15:18:32 +0000 | |
|---|---|---|
| committer | 2022-11-01 15:26:44 +0000 | |
| commit | c32668c19b05c8c2b0f84b955f37813f6dde5190 (patch) | |
| tree | be812dbd12842a2ed89362e5e4dd4f9a341498bd | |
| parent | 07d58c6de36dbc0c0ac2c1a96e6f0226a8c9896c (diff) | |
Make sure userSwitchComplete is dispatched after screen is unfrozen.
At the end of user switch flow, registered UserSwitchObservers are
informed that user switch is complete. This should be after screen
is unfrozen. But if there is no password on the target user, keyguard
is dismissed just before unfreezing the screen and unfreezing is
postponed in handler. This causes the order to be as follows:
dismissKeyguard -> dispatchUserSwitchComplete -> unfreezeScreen
This CL makes sure the order is as follows:
dismissKeyguard -> unfreezeScreen -> dispatchUserSwitchComplete
Bug: 256576977
Test: atest FrameworksServicesTests:UserControllerTest
Change-Id: Ia1952994a59796156a66c37a62090b3875bae4de
| -rw-r--r-- | services/core/java/com/android/server/am/UserController.java | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 82d239f59f1e..8d3890ce9d5a 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -2185,8 +2185,6 @@ class UserController implements Handler.Callback { mHandler.sendMessage(mHandler.obtainMessage(COMPLETE_USER_SWITCH_MSG, newUserId, 0)); uss.switching = false; - mHandler.removeMessages(REPORT_USER_SWITCH_COMPLETE_MSG); - mHandler.sendMessage(mHandler.obtainMessage(REPORT_USER_SWITCH_COMPLETE_MSG, newUserId, 0)); stopGuestOrEphemeralUserIfBackground(oldUserId); stopUserOnSwitchIfEnforced(oldUserId); if (oldUserId == UserHandle.USER_SYSTEM) { @@ -2200,21 +2198,22 @@ class UserController implements Handler.Callback { @VisibleForTesting void completeUserSwitch(int newUserId) { - if (isUserSwitchUiEnabled()) { - // If there is no challenge set, dismiss the keyguard right away - if (!mInjector.getKeyguardManager().isDeviceSecure(newUserId)) { - // Wait until the keyguard is dismissed to unfreeze - mInjector.dismissKeyguard( - new Runnable() { - public void run() { - unfreezeScreen(); - } - }, - "User Switch"); - return; - } else { + final boolean isUserSwitchUiEnabled = isUserSwitchUiEnabled(); + final Runnable runnable = () -> { + if (isUserSwitchUiEnabled) { unfreezeScreen(); } + mHandler.removeMessages(REPORT_USER_SWITCH_COMPLETE_MSG); + mHandler.sendMessage(mHandler.obtainMessage( + REPORT_USER_SWITCH_COMPLETE_MSG, newUserId, 0)); + }; + + // If there is no challenge set, dismiss the keyguard right away + if (isUserSwitchUiEnabled && !mInjector.getKeyguardManager().isDeviceSecure(newUserId)) { + // Wait until the keyguard is dismissed to unfreeze + mInjector.dismissKeyguard(runnable, "User Switch"); + } else { + runnable.run(); } } |