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

Commit 0c45b07f authored by Kevin Chyn's avatar Kevin Chyn
Browse files

FP won't wake device if daemon dies

Keyguard should retry FP auth if HW unavailable occurs

Fixes: 37483809

Test: enroll FP, turn off screen (enter keyguard)
pid biometrics | xargs adb shell kill -9
after 3 seconds, FP should be able to auth again

Change-Id: Ied3a4c07de655f3145ad40e3b73078fe9b161291
parent 9098a026
Loading
Loading
Loading
Loading
+25 −0
Original line number Diff line number Diff line
@@ -197,6 +197,11 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    private int mFingerprintRunningState = FINGERPRINT_STATE_STOPPED;
    private LockPatternUtils mLockPatternUtils;

    // If FP daemon dies, keyguard should retry after a short delay
    private int mHardwareUnavailableRetryCount = 0;
    private static final int HW_UNAVAILABLE_TIMEOUT = 3000; // ms
    private static final int HW_UNAVAILABLE_RETRY_MAX = 3;

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
@@ -471,6 +476,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        }
    }

    private Runnable mRetryFingerprintAuthentication = new Runnable() {
        @Override
        public void run() {
            Log.w(TAG, "Retrying fingerprint after HW unavailable, attempt " +
                    mHardwareUnavailableRetryCount);
            updateFingerprintListeningState();
        }
    };

    private void handleFingerprintError(int msgId, String errString) {
        if (msgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED
                && mFingerprintRunningState == FINGERPRINT_STATE_CANCELLING_RESTARTING) {
@@ -479,6 +493,15 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
        } else {
            setFingerprintRunningState(FINGERPRINT_STATE_STOPPED);
        }

        if (msgId == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
            if (mHardwareUnavailableRetryCount < HW_UNAVAILABLE_RETRY_MAX) {
                mHardwareUnavailableRetryCount++;
                mHandler.removeCallbacks(mRetryFingerprintAuthentication);
                mHandler.postDelayed(mRetryFingerprintAuthentication, HW_UNAVAILABLE_TIMEOUT);
            }
        }

        for (int i = 0; i < mCallbacks.size(); i++) {
            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
            if (cb != null) {
@@ -940,6 +963,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    }

    private void handleScreenTurnedOff() {
        mHardwareUnavailableRetryCount = 0;
        final int count = mCallbacks.size();
        for (int i = 0; i < count; i++) {
            KeyguardUpdateMonitorCallback cb = mCallbacks.get(i).get();
@@ -1072,6 +1096,7 @@ public class KeyguardUpdateMonitor implements TrustManager.TrustListener {
    }

    private void updateFingerprintListeningState() {
        mHandler.removeCallbacks(mRetryFingerprintAuthentication);
        boolean shouldListenForFingerprint = shouldListenForFingerprint();
        if (mFingerprintRunningState == FINGERPRINT_STATE_RUNNING && !shouldListenForFingerprint) {
            stopListeningForFingerprint();