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;