Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7fb0d1dc authored by Yasin Kilicdere's avatar Yasin Kilicdere
Browse files

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
parent 2287fbb4
Loading
Loading
Loading
Loading
+9 −11
Original line number Diff line number Diff line
@@ -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();
            }
        }
    }