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

Commit 2bf3691e authored by Tony Mak's avatar Tony Mak
Browse files

Fix IME is not working after reboot in kiosk mode

Problem:
If there is no secure lock screen and the device is in kiosk mode,
ime is not working after reboot

Reason:
Reboot -> starting kiosk activity in lock task mode -> AMS tries to
disable the keyguard while the "swipe to unlock" keyguard is showing.
mNeedToReshowWhenReenabled is set to be True, and system still considers
the keyguard is On (i.e. keyguardOn returns True). Thus, IME is not
allowed to bring up the window.
For the seucre lock screen case, it is fine because:
Reboot -> DE storage -> user enters credentail to unlock it ->
CE storage -> bring up kiosk activity in lock task mode -> AMS
disables keyguard while keyguard is already dismissed.

Solution:
Special handling the non secure case.
Dismiss the keyguard before disabling it.

FIXES: 74381063
Test: atest com.android.cts.devicepolicy.DeviceOwnerTest#testLockTaskAfterReboot_deviceOwnerUser
Test: atest com.android.cts.devicepolicy.DeviceOwnerTest#testLockTask_deviceOwnerUser

Change-Id: I31ea924fff6f63741e74c36ef3c90c6b78fc9fe9
parent 34aae0da
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -62,6 +62,7 @@ import android.util.SparseArray;
import android.util.SparseIntArray;

import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.policy.IKeyguardDismissCallback;
import com.android.internal.statusbar.IStatusBarService;
import com.android.internal.widget.LockPatternUtils;
import com.android.server.LocalServices;
@@ -729,9 +730,31 @@ public class LockTaskController {
        } else if (lockTaskModeState == LOCK_TASK_MODE_LOCKED) {
            if (isKeyguardAllowed(userId)) {
                mWindowManager.reenableKeyguard(mToken);
            } else {
                // If keyguard is not secure and it is locked, dismiss the keyguard before
                // disabling it, which avoids the platform to think the keyguard is still on.
                if (mWindowManager.isKeyguardLocked() && !mWindowManager.isKeyguardSecure()) {
                    mWindowManager.dismissKeyguard(new IKeyguardDismissCallback.Stub() {
                        @Override
                        public void onDismissError() throws RemoteException {
                            Slog.i(TAG, "setKeyguardState: failed to dismiss keyguard");
                        }

                        @Override
                        public void onDismissSucceeded() throws RemoteException {
                            mHandler.post(
                                    () -> mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG));
                        }

                        @Override
                        public void onDismissCancelled() throws RemoteException {
                            Slog.i(TAG, "setKeyguardState: dismiss cancelled");
                        }
                    }, null);
                } else {
                    mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);
                }
            }

        } else { // lockTaskModeState == LOCK_TASK_MODE_PINNED
            mWindowManager.disableKeyguard(mToken, LOCK_TASK_TAG);