diff options
| author | 2017-04-24 16:27:11 -0700 | |
|---|---|---|
| committer | 2017-04-25 18:23:37 -0700 | |
| commit | 0c45b07fe238b3e88f30c67219440669818aa1ee (patch) | |
| tree | 5eeaaf5bf057e39882bfd8d42f7a14468c8d6435 | |
| parent | 9098a0260f43e89165783089e025f5fd51da78f3 (diff) | |
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
| -rw-r--r-- | packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java index 7a6ac571f9e0..67a29895958e 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardUpdateMonitor.java @@ -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(); |