Update error prioritization in PreAutInfo

See the documentation in the CL for more context

Bug: 152240892
Test: atest BiometricSimpleTests
Change-Id: I077b2bcb26564e4dbb18de39a9259757a8422ca7
diff --git a/services/core/java/com/android/server/biometrics/PreAuthInfo.java b/services/core/java/com/android/server/biometrics/PreAuthInfo.java
index ef43bc5..262cb36 100644
--- a/services/core/java/com/android/server/biometrics/PreAuthInfo.java
+++ b/services/core/java/com/android/server/biometrics/PreAuthInfo.java
@@ -259,6 +259,21 @@
         this.confirmationRequested = confirmationRequested;
     }
 
+    private Pair<BiometricSensor, Integer> calculateErrorByPriority() {
+        // If the caller requested STRONG, and the device contains both STRONG and non-STRONG
+        // sensors, prioritize BIOMETRIC_NOT_ENROLLED over the weak sensor's
+        // BIOMETRIC_INSUFFICIENT_STRENGTH error. Pretty sure we can always prioritize
+        // BIOMETRIC_NOT_ENROLLED over any other error (unless of course its calculation is
+        // wrong, in which case we should fix that instead).
+        for (Pair<BiometricSensor, Integer> pair : ineligibleSensors) {
+            if (pair.second == BIOMETRIC_NOT_ENROLLED) {
+                return pair;
+            }
+        }
+
+        return ineligibleSensors.get(0);
+    }
+
     /**
      * With {@link PreAuthInfo} generated with the requested authenticators from the public API
      * surface, combined with the actual sensor/credential and user/system settings, calculate the
@@ -281,8 +296,9 @@
             } else {
                 // Pick the first sensor error if it exists
                 if (!ineligibleSensors.isEmpty()) {
-                    modality |= ineligibleSensors.get(0).first.modality;
-                    status = ineligibleSensors.get(0).second;
+                    final Pair<BiometricSensor, Integer> pair = calculateErrorByPriority();
+                    modality |= pair.first.modality;
+                    status = pair.second;
                 } else {
                     modality |= TYPE_CREDENTIAL;
                     status = CREDENTIAL_NOT_ENROLLED;
@@ -297,8 +313,9 @@
             } else {
                 // Pick the first sensor error if it exists
                 if (!ineligibleSensors.isEmpty()) {
-                    modality |= ineligibleSensors.get(0).first.modality;
-                    status = ineligibleSensors.get(0).second;
+                    final Pair<BiometricSensor, Integer> pair = calculateErrorByPriority();
+                    modality |= pair.first.modality;
+                    status = pair.second;
                 } else {
                     modality |= TYPE_NONE;
                     status = BIOMETRIC_NO_HARDWARE;