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

Commit 75dbb83f authored by Kevin Chyn's avatar Kevin Chyn
Browse files

Get correct hasEnrolled for work profiles

The check within BiometricService is done from system server process
so we need to pass in the actual userId.

Bug: 111461540

Test: With normal profile and FP enrolled, with work profile and no
      FP enrolled, launching BiometricPromptDemo for work profile
      and attempting to start authentication shows "none enrolled" message.

Change-Id: I45a1136d2b33bc7c594a3401e2a087103fb839f3
parent 5ff2b1f1
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -201,6 +201,10 @@ public interface BiometricAuthenticator {
        throw new UnsupportedOperationException("Stub!");
    }

    default boolean hasEnrolledTemplates(int userId) {
        throw new UnsupportedOperationException("Stub!");
    }

    /**
     * This call warms up the hardware and starts scanning for valid biometrics. It terminates
     * when {@link AuthenticationCallback#onAuthenticationError(int,
+1 −0
Original line number Diff line number Diff line
@@ -408,6 +408,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
    @RequiresPermission(allOf = {
            USE_BIOMETRIC_INTERNAL,
            INTERACT_ACROSS_USERS})
    @Override
    public boolean hasEnrolledTemplates(int userId) {
        if (mService != null) {
            try {
+8 −0
Original line number Diff line number Diff line
@@ -636,6 +636,14 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing
        return hasEnrolledFingerprints();
    }

    /**
     * @hide
     */
    @Override
    public boolean hasEnrolledTemplates(int userId) {
        return hasEnrolledFingerprints(userId);
    }

    /**
     * Determine if there is at least one fingerprint enrolled.
     *
+8 −4
Original line number Diff line number Diff line
@@ -260,7 +260,7 @@ public class BiometricService extends SystemService {
            final int callingUserId = UserHandle.getCallingUserId();

            mHandler.post(() -> {
                final Pair<Integer, Integer> result = checkAndGetBiometricModality();
                final Pair<Integer, Integer> result = checkAndGetBiometricModality(callingUserId);
                final int modality = result.first;
                final int error = result.second;

@@ -351,10 +351,11 @@ public class BiometricService extends SystemService {
            checkPermission();
            checkAppOp(opPackageName, Binder.getCallingUid());

            final int userId = UserHandle.getCallingUserId();
            final long ident = Binder.clearCallingIdentity();
            int error;
            try {
                final Pair<Integer, Integer> result = checkAndGetBiometricModality();
                final Pair<Integer, Integer> result = checkAndGetBiometricModality(userId);
                error = result.second;
            } finally {
                Binder.restoreCallingIdentity(ident);
@@ -466,7 +467,7 @@ public class BiometricService extends SystemService {
     * {@link #BIOMETRIC_FINGERPRINT}, {@link #BIOMETRIC_IRIS}, {@link #BIOMETRIC_FACE}
     * and the error containing one of the {@link BiometricConstants} errors.
     */
    private Pair<Integer, Integer> checkAndGetBiometricModality() {
    private Pair<Integer, Integer> checkAndGetBiometricModality(int callingUid) {
        int modality = BIOMETRIC_NONE;

        // No biometric features, send error
@@ -495,9 +496,12 @@ public class BiometricService extends SystemService {
                    // order.
                    firstHwAvailable = modality;
                }
                if (authenticator.hasEnrolledTemplates()) {
                if (authenticator.hasEnrolledTemplates(callingUid)) {
                    hasTemplatesEnrolled = true;
                    if (isEnabledForApp(modality)) {
                        // TODO(b/110907543): When face settings (and other settings) have both a
                        // user toggle as well as a work profile settings page, this needs to be
                        // updated to reflect the correct setting.
                        enabledForApps = true;
                        break;
                    }