diff options
| -rw-r--r-- | services/core/java/com/android/server/biometrics/PreAuthInfo.java | 25 |
1 files changed, 21 insertions, 4 deletions
diff --git a/services/core/java/com/android/server/biometrics/PreAuthInfo.java b/services/core/java/com/android/server/biometrics/PreAuthInfo.java index ef43bc5f5cf9..262cb36d7bdb 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 @@ class PreAuthInfo { 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 @@ class PreAuthInfo { } 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 @@ class PreAuthInfo { } 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; |