From 7fb0d1dcb013899a7a30799e2df6c6b6cebf317e Mon Sep 17 00:00:00 2001 From: Yasin Kilicdere Date: Mon, 31 Oct 2022 16:52:11 +0000 Subject: 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: Iada3131b611526a8c7a372b4500bcbc17299dcbc --- .../java/com/android/server/am/UserController.java | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 82fb1e816888..0cb34fa3424e 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -2116,8 +2116,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); @@ -2126,20 +2124,20 @@ class UserController implements Handler.Callback { @VisibleForTesting void completeUserSwitch(int newUserId) { + final Runnable runnable = () -> { + unfreezeScreen(); + mHandler.removeMessages(REPORT_USER_SWITCH_COMPLETE_MSG); + mHandler.sendMessage(mHandler.obtainMessage( + REPORT_USER_SWITCH_COMPLETE_MSG, newUserId, 0)); + }; + 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; + mInjector.dismissKeyguard(runnable, "User Switch"); } else { - unfreezeScreen(); + runnable.run(); } } } -- cgit v1.2.3-59-g8ed1b