Merge "Add more robust handling of daemon crashes"
diff --git a/services/core/java/com/android/server/fingerprint/FingerprintService.java b/services/core/java/com/android/server/fingerprint/FingerprintService.java
index bdba64f..7d97ce4 100644
--- a/services/core/java/com/android/server/fingerprint/FingerprintService.java
+++ b/services/core/java/com/android/server/fingerprint/FingerprintService.java
@@ -217,6 +217,7 @@
 
     public synchronized IBiometricsFingerprint getFingerprintDaemon() {
         if (mDaemon == null) {
+            Slog.v(TAG, "mDeamon was null, reconnect to fingerprint");
             try {
                 mDaemon = IBiometricsFingerprint.getService();
             } catch (java.util.NoSuchElementException e) {
@@ -292,6 +293,13 @@
                 startClient(mPendingClient, false);
                 mPendingClient = null;
             }
+        } else if (error == FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE) {
+            // If we get HW_UNAVAILABLE, try to connect again later...
+            Slog.w(TAG, "Got ERROR_HW_UNAVAILABLE; try reconnecting next client.");
+            synchronized (this) {
+                mDaemon = null;
+                mHalDeviceId = 0;
+            }
         }
     }
 
@@ -995,7 +1003,8 @@
                     Binder.getCallingUid(), Binder.getCallingPid())) {
                 return false;
             }
-            return mHalDeviceId != 0;
+            IBiometricsFingerprint daemon = getFingerprintDaemon();
+            return daemon != null && mHalDeviceId != 0;
         }
 
         @Override // Binder call