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

Commit 5c0c5ac8 authored by Jorim Jaggi's avatar Jorim Jaggi
Browse files

Handle case correctly when screen times out and locking immediately

In case the the screen timed out and the setting was set to "lock now"
in case the screen times out, we locked before finished going to sleep,
leading to all kinds of state messups in Keyguard, including an empty
lockscreen when authenticating with fingerprint during that period.

Bug: 23952388
Change-Id: If1629be1171c841d51ec0555422e6108002fdb73
parent 2ebcf2c2
Loading
Loading
Loading
Loading
+22 −14
Original line number Diff line number Diff line
@@ -652,6 +652,7 @@ public class KeyguardViewMediator extends SystemUI {
            final boolean lockImmediately =
                    mLockPatternUtils.getPowerButtonInstantlyLocks(currentUser)
                            || !mLockPatternUtils.isSecure(currentUser);
            long timeout = getLockTimeout();

            if (mExitSecureCallback != null) {
                if (DEBUG) Log.d(TAG, "pending exit secure callback cancelled");
@@ -666,9 +667,9 @@ public class KeyguardViewMediator extends SystemUI {
                }
            } else if (mShowing) {
                mPendingReset = true;
            } else if (why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT
            } else if ((why == WindowManagerPolicy.OFF_BECAUSE_OF_TIMEOUT && timeout > 0)
                    || (why == WindowManagerPolicy.OFF_BECAUSE_OF_USER && !lockImmediately)) {
                doKeyguardLaterLocked();
                doKeyguardLaterLocked(timeout);
            } else if (!mLockPatternUtils.isLockScreenDisabled(currentUser)) {
                mPendingLock = true;
            }
@@ -703,7 +704,7 @@ public class KeyguardViewMediator extends SystemUI {
        KeyguardUpdateMonitor.getInstance(mContext).dispatchFinishedGoingToSleep(why);
    }

    private void doKeyguardLaterLocked() {
    private long getLockTimeout() {
        // if the screen turned off because of timeout or the user hit the power button
        // and we don't need to lock immediately, set an alarm
        // to enable it a little bit later (i.e, give the user a chance
@@ -732,11 +733,19 @@ public class KeyguardViewMediator extends SystemUI {
        } else {
            timeout = lockAfterTimeout;
        }
        return timeout;
    }

        if (timeout <= 0) {
            // Lock now
    private void doKeyguardLaterLocked() {
        long timeout = getLockTimeout();
        if (timeout == 0) {
            doKeyguardLocked(null);
        } else {
            doKeyguardLaterLocked(timeout);
        }
    }

    private void doKeyguardLaterLocked(long timeout) {
        // Lock in the future
        long when = SystemClock.elapsedRealtime() + timeout;
        Intent intent = new Intent(DELAYED_KEYGUARD_ACTION);
@@ -747,7 +756,6 @@ public class KeyguardViewMediator extends SystemUI {
        if (DEBUG) Log.d(TAG, "setting alarm to turn off keyguard, seq = "
                         + mDelayedShowingSequence);
    }
    }

    private void cancelDoKeyguardLaterLocked() {
        mDelayedShowingSequence++;