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

Commit dc5a7985 authored by Kevin Chyn's avatar Kevin Chyn
Browse files

28/n: Move authenticatorId update to RemovalClient

When the last biometric is removed for a user, the authenticatorId
must be changed to 0. This CL moves the logic into RemovalClient.
Note that multiple things can cause a biometric to be removed (user
remove from settings, or internal cleanup for mismatched templates).
RemovalClient is the common code path for all of this.

Bug: 157790417
Test: Enroll fingerprint, remove fingerprint, see authenticatorId
      updated to 0
Change-Id: I5539d311f8f7ced9d8cfc13f64a10583e487cb28
parent 4130c6d4
Loading
Loading
Loading
Loading
+0 −13
Original line number Diff line number Diff line
@@ -104,19 +104,6 @@ public abstract class BiometricServiceBase<T> extends SystemService

    protected final ClientMonitor.FinishCallback mClientFinishCallback =
            (clientMonitor, success) -> {
        if (clientMonitor instanceof RemovalConsumer) {
            // When the last biometric of a group is removed, update the authenticator id.
            // Note that 1) multiple ClientMonitors may be cause onRemoved (e.g. internal cleanup),
            // and 2) updateActiveGroup updates/relies on global state, so there's no good way to
            // compartmentalize this yet.
            final int userId = clientMonitor.getTargetUserId();
            if (!hasEnrolledBiometrics(userId)) {
                Slog.d(getTag(), "Last biometric removed for user: " + userId
                        + ", updating active group");
                updateActiveGroup(userId);
            }
        }

        removeClient(clientMonitor);
    };

+7 −3
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import com.android.internal.util.FrameworkStatsLog;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * Wraps {@link InternalEnumerateClient} and {@link RemovalClient}. Keeps track of all the
@@ -57,6 +58,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide

    private final ArrayList<UserTemplate> mUnknownHALTemplates = new ArrayList<>();
    private final BiometricUtils mBiometricUtils;
    private final Map<Integer, Long> mAuthenticatorIds;
    private final List<S> mEnrolledList;
    private ClientMonitor<T> mCurrentTask;

@@ -91,15 +93,17 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide

    protected abstract RemovalClient<T> getRemovalClient(Context context, LazyDaemon<T> lazyDaemon,
            IBinder token, int biometricId, int userId, String owner, BiometricUtils utils,
            int sensorId);
            int sensorId, Map<Integer, Long> authenticatorIds);

    protected InternalCleanupClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
            int userId, @NonNull String owner, int sensorId, int statsModality,
            @NonNull List<S> enrolledList, @NonNull BiometricUtils utils) {
            @NonNull List<S> enrolledList, @NonNull BiometricUtils utils,
            @NonNull Map<Integer, Long> authenticatorIds) {
        super(context, lazyDaemon, null /* token */, null /* ClientMonitorCallbackConverter */,
                userId, owner, 0 /* cookie */, sensorId, statsModality,
                BiometricsProtoEnums.ACTION_ENUMERATE, BiometricsProtoEnums.CLIENT_UNKNOWN);
        mBiometricUtils = utils;
        mAuthenticatorIds = authenticatorIds;
        mEnrolledList = enrolledList;
    }

@@ -108,7 +112,7 @@ public abstract class InternalCleanupClient<S extends BiometricAuthenticator.Ide
        mUnknownHALTemplates.remove(template);
        mCurrentTask = getRemovalClient(getContext(), mLazyDaemon, getToken(),
                template.mIdentifier.getBiometricId(), template.mUserId,
                getContext().getPackageName(), mBiometricUtils, getSensorId());
                getContext().getPackageName(), mBiometricUtils, getSensorId(), mAuthenticatorIds);
        FrameworkStatsLog.write(FrameworkStatsLog.BIOMETRIC_SYSTEM_HEALTH_ISSUE_DETECTED,
                mStatsModality,
                BiometricsProtoEnums.ISSUE_UNKNOWN_TEMPLATE_ENROLLED_HAL);
+12 −1
Original line number Diff line number Diff line
@@ -24,6 +24,8 @@ import android.os.IBinder;
import android.os.RemoteException;
import android.util.Slog;

import java.util.Map;

/**
 * A class to keep track of the remove state for a given client.
 */
@@ -33,16 +35,18 @@ public abstract class RemovalClient<T> extends ClientMonitor<T> implements Remov

    protected final int mBiometricId;
    private final BiometricUtils mBiometricUtils;
    private final Map<Integer, Long> mAuthenticatorIds;

    public RemovalClient(@NonNull Context context, @NonNull LazyDaemon<T> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
            int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils,
            int sensorId, int statsModality) {
            int sensorId, @NonNull Map<Integer, Long> authenticatorIds, int statsModality) {
        super(context, lazyDaemon, token, listener, userId, owner, 0 /* cookie */, sensorId,
                statsModality, BiometricsProtoEnums.ACTION_REMOVE,
                BiometricsProtoEnums.CLIENT_UNKNOWN);
        mBiometricId = biometricId;
        mBiometricUtils = utils;
        mAuthenticatorIds = authenticatorIds;
    }

    @Override
@@ -74,6 +78,13 @@ public abstract class RemovalClient<T> extends ClientMonitor<T> implements Remov
        }

        if (remaining == 0) {
            if (mBiometricUtils.getBiometricsForUser(getContext(), getTargetUserId()).isEmpty()) {
                Slog.d(TAG, "Last biometric removed for user: " + getTargetUserId());
                // When the last biometric of a group is removed, update the authenticator id.
                // Note that multiple ClientMonitors may be cause onRemoved (e.g. internal
                // cleanup).
                mAuthenticatorIds.put(getTargetUserId(), 0L);
            }
            mFinishCallback.onClientFinished(this, true /* success */);
        }
    }
+7 −4
Original line number Diff line number Diff line
@@ -29,6 +29,7 @@ import com.android.server.biometrics.sensors.InternalEnumerateClient;
import com.android.server.biometrics.sensors.RemovalClient;

import java.util.List;
import java.util.Map;

/**
 * Face-specific internal cleanup client supporting the
@@ -39,9 +40,10 @@ class FaceInternalCleanupClient extends InternalCleanupClient<Face, IBiometricsF

    FaceInternalCleanupClient(@NonNull Context context,
            @NonNull LazyDaemon<IBiometricsFace> lazyDaemon, int userId, @NonNull String owner,
            int sensorId, @NonNull List<Face> enrolledList, @NonNull BiometricUtils utils) {
            int sensorId, @NonNull List<Face> enrolledList, @NonNull BiometricUtils utils,
            @NonNull Map<Integer, Long> authenticatorIds) {
        super(context, lazyDaemon, userId, owner, sensorId, BiometricsProtoEnums.MODALITY_FACE,
                enrolledList, utils);
                enrolledList, utils, authenticatorIds);
    }

    @Override
@@ -55,11 +57,12 @@ class FaceInternalCleanupClient extends InternalCleanupClient<Face, IBiometricsF
    @Override
    protected RemovalClient<IBiometricsFace> getRemovalClient(Context context,
            LazyDaemon<IBiometricsFace> lazyDaemon, IBinder token,
            int biometricId, int userId, String owner, BiometricUtils utils, int sensorId) {
            int biometricId, int userId, String owner, BiometricUtils utils, int sensorId,
            Map<Integer, Long> authenticatorIds) {
        // Internal remove does not need to send results to anyone. Cleanup (enumerate + remove)
        // is all done internally.
        return new FaceRemovalClient(context, lazyDaemon, token,
                null /* ClientMonitorCallbackConverter */, biometricId, userId, owner, utils,
                sensorId);
                sensorId, authenticatorIds);
    }
}
+4 −2
Original line number Diff line number Diff line
@@ -28,6 +28,8 @@ import com.android.server.biometrics.sensors.BiometricUtils;
import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter;
import com.android.server.biometrics.sensors.RemovalClient;

import java.util.Map;

/**
 * Face-specific removal client supporting the {@link android.hardware.biometrics.face.V1_0}
 * and {@link android.hardware.biometrics.face.V1_1} HIDL interfaces.
@@ -38,9 +40,9 @@ class FaceRemovalClient extends RemovalClient<IBiometricsFace> {
    FaceRemovalClient(@NonNull Context context, @NonNull LazyDaemon<IBiometricsFace> lazyDaemon,
            @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener,
            int biometricId, int userId, @NonNull String owner, @NonNull BiometricUtils utils,
            int sensorId) {
            int sensorId, @NonNull Map<Integer, Long> authenticatorIds) {
        super(context, lazyDaemon, token, listener, biometricId, userId, owner, utils, sensorId,
                BiometricsProtoEnums.MODALITY_FACE);
                authenticatorIds, BiometricsProtoEnums.MODALITY_FACE);
    }

    @Override
Loading