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

Commit 1123ba7f authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Account for lockout when determining if biometrics should be used

We should take into account lockout when determining if biometrics should
be used. Otherwise we will end up in an incorrect state.

Fixes: 118235602

Test: Tap wrong finger 5 times, then use strong auth to unlock.
      When bouncer goes away, tap fingerprint sensor. Authentication should
      not be happening.
Test: With added logs, states are now correct

Change-Id: Ia302827857c19f4d291eeb730687c5b4c332d5de
parent da3b55a1
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -88,6 +88,7 @@ import com.android.internal.widget.LockPatternUtils;
import com.android.settingslib.WirelessUtils;
import com.android.systemui.shared.system.ActivityManagerWrapper;
import com.android.systemui.shared.system.TaskStackChangeListener;

import com.google.android.collect.Lists;

import java.io.FileDescriptor;
@@ -236,6 +237,8 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    private boolean mIsDreaming;
    private final DevicePolicyManager mDevicePolicyManager;
    private boolean mLogoutEnabled;
    private boolean mFingerprintLockedOut;
    private boolean mFaceLockedOut;

    /**
     * Short delay before restarting biometric authentication after a successful try
@@ -624,7 +627,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED
                && mFingerprintRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
            setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
            startListeningForFingerprint();
            updateFingerprintListeningState();
        } else {
            setFingerprintRunningState(BIOMETRIC_STATE_STOPPED);
        }
@@ -637,6 +640,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
            }
        }

        if (msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT
                || msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) {
            mFingerprintLockedOut = true;
        }

        if (msgId == FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT) {
            mLockPatternUtils.requireStrongAuth(
                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
@@ -652,6 +660,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    }

    private void handleFingerprintLockoutReset() {
        mFingerprintLockedOut = false;
        updateFingerprintListeningState();
    }

@@ -659,7 +668,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        boolean wasRunning = mFingerprintRunningState == BIOMETRIC_STATE_RUNNING;
        boolean isRunning = fingerprintRunningState == BIOMETRIC_STATE_RUNNING;
        mFingerprintRunningState = fingerprintRunningState;

        if (DEBUG) Log.v(TAG, "Fingerprint State: " + mFingerprintRunningState);
        // Clients of KeyguardUpdateMonitor don't care about the internal state about the
        // asynchronousness of the cancel cycle. So only notify them if the actualy running state
        // has changed.
@@ -774,7 +783,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        if (msgId == FaceManager.FACE_ERROR_CANCELED
                && mFaceRunningState == BIOMETRIC_STATE_CANCELLING_RESTARTING) {
            setFaceRunningState(BIOMETRIC_STATE_STOPPED);
            startListeningForFace();
            updateFaceListeningState();
        } else {
            setFaceRunningState(BIOMETRIC_STATE_STOPPED);
        }
@@ -787,6 +796,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
            }
        }

        if (msgId == FaceManager.FACE_ERROR_LOCKOUT
                || msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) {
            mFaceLockedOut = true;
        }

        if (msgId == FaceManager.FACE_ERROR_LOCKOUT_PERMANENT) {
            mLockPatternUtils.requireStrongAuth(
                    LockPatternUtils.StrongAuthTracker.STRONG_AUTH_REQUIRED_AFTER_LOCKOUT,
@@ -803,6 +817,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    }

    private void handleFaceLockoutReset() {
        mFaceLockedOut = false;
        updateFaceListeningState();
    }

@@ -810,7 +825,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        boolean wasRunning = mFaceRunningState == BIOMETRIC_STATE_RUNNING;
        boolean isRunning = faceRunningState == BIOMETRIC_STATE_RUNNING;
        mFaceRunningState = faceRunningState;

        if (DEBUG) Log.v(TAG, "Face State: " + mFaceRunningState);
        // Clients of KeyguardUpdateMonitor don't care about the internal state or about the
        // asynchronousness of the cancel cycle. So only notify them if the actualy running state
        // has changed.
@@ -1557,7 +1572,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                (mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
                shouldListenForFingerprintAssistant() || (mKeyguardOccluded && mIsDreaming))
                && !mSwitchingUser && !isFingerprintDisabled(getCurrentUser())
                && !mKeyguardGoingAway;
                && !mKeyguardGoingAway && !mFingerprintLockedOut;
    }

    private boolean shouldListenForFace() {
@@ -1565,7 +1580,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
                (mBouncer && !mKeyguardGoingAway) || mGoingToSleep ||
                shouldListenForFaceAssistant() || (mKeyguardOccluded && mIsDreaming))
                && !mSwitchingUser && !isFaceDisabled(getCurrentUser())
                && !mKeyguardGoingAway && mFaceSettingEnabledForUser;
                && !mKeyguardGoingAway && !mFaceLockedOut && mFaceSettingEnabledForUser;
    }