Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2656f221 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Update error prioritization in PreAutInfo

See the documentation in the CL for more context

Bug: 152240892
Test: atest BiometricSimpleTests
Change-Id: I077b2bcb26564e4dbb18de39a9259757a8422ca7
parent c5f71969
Loading
Loading
Loading
Loading
+21 −4
Original line number Diff line number Diff line
@@ -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;