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

Commit cc4104fd authored by Brian Colonna's avatar Brian Colonna
Browse files

Suppressing FUL after user switch (fix b/7316467)

When switching users, Face Unlock starts in onResume().  However,
there is no signal to indicate when the user actually sees their
unlock screen.  This means Face Unlock could be running unseen, timing
out soon after it becomes visible, or letting the user in before they
see the preview.

This fix simply suppresses Face Unlock immediately after switching
users.  This is not the ideal behavior, but there is no easy way to
make Face Unlock start only after the unlock screen becomes visible.
When the user changes screens it becomes unsuppressed, so if they go
back to the multi-select widget screen or login, Face Unlock works as
expected and is only suppressed again when the user is switched.

Change-Id: I80a302b0aefc1dee3c2dc77557978cbe062de435
parent eb7f1571
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -248,6 +248,9 @@ public class KeyguardHostView extends KeyguardViewBase {
        }

        public void dismiss(boolean authenticated) {
            // If the biometric unlock was suppressed due to a user switch, it can now be safely
            // unsuppressed because the user has left the unlock screen.
            KeyguardUpdateMonitor.getInstance(mContext).clearBiometricUnlockUserSwitched();
            showNextSecurityScreenOrFinish(authenticated);
        }

+2 −1
Original line number Diff line number Diff line
@@ -65,7 +65,8 @@ public class KeyguardSecurityModel {
        KeyguardUpdateMonitor monitor = KeyguardUpdateMonitor.getInstance(mContext);
        final boolean backupIsTimedOut = monitor.getFailedUnlockAttempts() >=
                LockPatternUtils.FAILED_ATTEMPTS_BEFORE_TIMEOUT;
        return monitor.getMaxBiometricUnlockAttemptsReached() || backupIsTimedOut;
        return monitor.getMaxBiometricUnlockAttemptsReached() || backupIsTimedOut
                || monitor.didBiometricUnlockUserSwitch();
    }

    SecurityMode getSecurityMode() {
+11 −0
Original line number Diff line number Diff line
@@ -102,6 +102,8 @@ public class KeyguardUpdateMonitor {
    private int mFailedAttempts = 0;
    private int mFailedBiometricUnlockAttempts = 0;

    private boolean mBiometricUnlockUserSwitched;

    private boolean mClockVisible;

    private final ArrayList<WeakReference<KeyguardUpdateMonitorCallback>>
@@ -404,6 +406,7 @@ public class KeyguardUpdateMonitor {
                cb.onUserSwitched(userId);
            }
        }
        mBiometricUnlockUserSwitched = true;
        try {
            reply.sendResult(null);
        } catch (RemoteException e) {
@@ -721,6 +724,14 @@ public class KeyguardUpdateMonitor {
        return mFailedBiometricUnlockAttempts >= FAILED_BIOMETRIC_UNLOCK_ATTEMPTS_BEFORE_BACKUP;
    }

    public boolean didBiometricUnlockUserSwitch() {
        return mBiometricUnlockUserSwitched;
    }

    public void clearBiometricUnlockUserSwitched() {
        mBiometricUnlockUserSwitched = false;
    }

    public boolean isSimLocked() {
        return isSimLocked(mSimState);
    }