summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yasin Kilicdere <tyk@google.com> 2022-11-01 15:18:32 +0000
committer Yasin Kilicdere <tyk@google.com> 2022-11-01 15:26:44 +0000
commitc32668c19b05c8c2b0f84b955f37813f6dde5190 (patch)
treebe812dbd12842a2ed89362e5e4dd4f9a341498bd
parent07d58c6de36dbc0c0ac2c1a96e6f0226a8c9896c (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.java29
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();
}
}