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

Commit af3b1b80 authored by Joe Bolinger's avatar Joe Bolinger
Browse files

Add enrollment sync command for virtual sensors.

Bug: 228638448
Test: atest  FingerprintInternalCleanupClientTest
Test: manual (with virtual HAL)
Change-Id: I0d011b3485e4a95425f232c24c0864cdcfad125c
parent c864aa7d
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -9658,6 +9658,13 @@ public final class Settings {
        public static final String BIOMETRIC_DEBUG_ENABLED =
                "biometric_debug_enabled";
        /**
         * Whether or not virtual sensors are enabled.
         * @hide
         */
        @Readable
        public static final String BIOMETRIC_VIRTUAL_ENABLED = "biometric_virtual_enabled";
        /**
         * Whether or not biometric is allowed on Keyguard.
         * @hide
+17 −0
Original line number Diff line number Diff line
@@ -53,6 +53,7 @@ import android.hardware.biometrics.SensorProperties;
import android.hardware.biometrics.SensorPropertiesInternal;
import android.os.Binder;
import android.os.Build;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
import android.os.UserHandle;
@@ -87,6 +88,13 @@ public class Utils {
        return true;
    }

    /** If virtualized biometrics are supported (requires debug build). */
    public static boolean isVirtualEnabled(Context context) {
        return Build.isDebuggable()
                && Settings.Secure.getIntForUser(context.getContentResolver(),
                Settings.Secure.BIOMETRIC_VIRTUAL_ENABLED, 0, UserHandle.USER_CURRENT) == 1;
    }

    /**
     * Combines {@link PromptInfo#setDeviceCredentialAllowed(boolean)} with
     * {@link PromptInfo#setAuthenticators(int)}, as the former is not flexible enough.
@@ -374,6 +382,15 @@ public class Utils {
        return false;
    }

    /** Same as checkPermission but also allows shell. */
    public static void checkPermissionOrShell(Context context, String permission) {
        if (Binder.getCallingUid() == Process.SHELL_UID) {
            return;
        }
        checkPermission(context, permission);
    }


    public static void checkPermission(Context context, String permission) {
        context.enforceCallingOrSelfPermission(permission,
                "Must have " + permission + " permission.");
+37 −1
Original line number Diff line number Diff line
@@ -19,9 +19,11 @@ package com.android.server.biometrics.sensors;
import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.os.Build;
import android.os.IBinder;
import android.util.Slog;

import com.android.internal.annotations.VisibleForTesting;
import com.android.server.biometrics.BiometricsProto;
import com.android.server.biometrics.log.BiometricContext;
import com.android.server.biometrics.log.BiometricLogger;
@@ -65,6 +67,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
    private final List<S> mEnrolledList;
    private final boolean mHasEnrollmentsBeforeStarting;
    private BaseClientMonitor mCurrentTask;
    private boolean mFavorHalEnrollments = false;

    private final ClientMonitorCallback mEnumerateCallback = new ClientMonitorCallback() {
        @Override
@@ -86,10 +89,24 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
                // No unknown HAL templates. Unknown framework templates are already cleaned up in
                // InternalEnumerateClient. Finish this client.
                mCallback.onClientFinished(InternalCleanupClient.this, success);
            } else {
                if (mFavorHalEnrollments && Build.isDebuggable()) {
                    // on debug builds, optionally allow the HAL be the source of
                    // truth for enrollments
                    try {
                        for (UserTemplate template : mUnknownHALTemplates) {
                            Slog.i(TAG, "Adding unknown HAL template: "
                                    + template.mIdentifier.getBiometricId());
                            onAddUnknownTemplate(template.mUserId, template.mIdentifier);
                        }
                    } finally {
                        mCallback.onClientFinished(InternalCleanupClient.this, success);
                    }
                } else {
                    startCleanupUnknownHalTemplates();
                }
            }
        }
    };

    private final ClientMonitorCallback mRemoveCallback = new ClientMonitorCallback() {
@@ -197,8 +214,27 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
        ((EnumerateConsumer) mCurrentTask).onEnumerationResult(identifier, remaining);
    }

    /** When set unknown templates in the HAL will be added instead of deleted. */
    public void setFavorHalEnrollments() {
        mFavorHalEnrollments = true;
    }

    /** Called when an unknown template is found and setFavorHalEnrollments was requested. */
    protected void onAddUnknownTemplate(int userId,
            @NonNull BiometricAuthenticator.Identifier identifier) {}

    @Override
    public int getProtoEnum() {
        return BiometricsProto.CM_INTERNAL_CLEANUP;
    }

    @VisibleForTesting
    public InternalEnumerateClient<T> getCurrentEnumerateClient() {
        return (InternalEnumerateClient<T>) mCurrentTask;
    }

    @VisibleForTesting
    public RemovalClient<S, T> getCurrentRemoveClient() {
        return (RemovalClient<S, T>) mCurrentTask;
    }
}
+0 −2
Original line number Diff line number Diff line
@@ -50,8 +50,6 @@ public abstract class RemovalClient<S extends BiometricAuthenticator.Identifier,
            @NonNull Map<Integer, Long> authenticatorIds) {
        super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
                logger, biometricContext);
        //, BiometricsProtoEnums.ACTION_REMOVE,
          //      BiometricsProtoEnums.CLIENT_UNKNOWN);
        mBiometricUtils = utils;
        mAuthenticatorIds = authenticatorIds;
        mHasEnrollmentsBeforeStarting = !utils.getBiometricsForUser(context, userId).isEmpty();
+9 −0
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server.biometrics.sensors.face.aidl;

import android.annotation.NonNull;
import android.content.Context;
import android.hardware.biometrics.BiometricAuthenticator;
import android.hardware.biometrics.face.IFace;
import android.hardware.face.Face;
import android.os.IBinder;
@@ -28,6 +29,7 @@ import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.InternalCleanupClient;
import com.android.server.biometrics.sensors.InternalEnumerateClient;
import com.android.server.biometrics.sensors.RemovalClient;
import com.android.server.biometrics.sensors.face.FaceUtils;

import java.util.List;
import java.util.Map;
@@ -68,4 +70,11 @@ class FaceInternalCleanupClient extends InternalCleanupClient<Face, AidlSession>
                null /* ClientMonitorCallbackConverter */, new int[] {biometricId}, userId, owner,
                utils, sensorId, logger, biometricContext, authenticatorIds);
    }

    @Override
    protected void onAddUnknownTemplate(int userId,
            @NonNull BiometricAuthenticator.Identifier identifier) {
        FaceUtils.getInstance(getSensorId()).addBiometricForUser(
                getContext(), getTargetUserId(), (Face) identifier);
    }
}
Loading