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

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

Do not assume that legacy HIDL HAL sensorIds == 0

HIDL HALs (IBiometricsFingerprint, IBiometricsFace) have their
sensorIds configured in config_biometric_sensors, and are not
always 0. Update framework logic to reflect this, otherwise
framework-side cache may clash with AIDL HALs.

Bug: 172957689
Test: atest CtsBiometricsTestCases
Change-Id: I24fd9dad6683bf9d49e32eef2f6b13e8fd832e16
parent 2384b262
Loading
Loading
Loading
Loading
+4 −4
Original line number Original line Diff line number Diff line
@@ -72,13 +72,13 @@ public class FaceUtils implements BiometricUtils<Face> {
    }
    }


    /**
    /**
     * Legacy getter for {@link android.hardware.biometrics.face.V1_0} and its extended subclasses,
     * Legacy getter for {@link android.hardware.biometrics.face.V1_0} and its extended subclasses.
     * which do not support a well defined sensorId from the HAL.
     * Framework-side cache is always stored in the same file, regardless of sensorId.
     */
     */
    public static FaceUtils getInstance() {
    public static FaceUtils getLegacyInstance(int sensorId) {
        // Note that sensorId for legacy services can be hard-coded to 0 since it's only used
        // Note that sensorId for legacy services can be hard-coded to 0 since it's only used
        // to index into the sensor states map.
        // to index into the sensor states map.
        return getInstance(0 /* sensorId */, LEGACY_FACE_FILE);
        return getInstance(sensorId, LEGACY_FACE_FILE);
    }
    }


    private FaceUtils(String fileName) {
    private FaceUtils(String fileName) {
+2 −1
Original line number Original line Diff line number Diff line
@@ -153,7 +153,8 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
        Utils.checkPermission(mContext, TEST_BIOMETRIC);
        Utils.checkPermission(mContext, TEST_BIOMETRIC);


        // Fake authentication with any of the existing fingers
        // Fake authentication with any of the existing fingers
        List<Face> faces = FaceUtils.getInstance().getBiometricsForUser(mContext, userId);
        List<Face> faces = FaceUtils.getLegacyInstance(mSensorId)
                .getBiometricsForUser(mContext, userId);
        if (faces.isEmpty()) {
        if (faces.isEmpty()) {
            Slog.w(TAG, "No faces, returning");
            Slog.w(TAG, "No faces, returning");
            return;
            return;
+9 −8
Original line number Original line Diff line number Diff line
@@ -166,7 +166,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
        @Override
        @Override
        public void onEnrollResult(long deviceId, int faceId, int userId, int remaining) {
        public void onEnrollResult(long deviceId, int faceId, int userId, int remaining) {
            mHandler.post(() -> {
            mHandler.post(() -> {
                final CharSequence name = FaceUtils.getInstance()
                final CharSequence name = FaceUtils.getLegacyInstance(mSensorId)
                        .getUniqueName(mContext, userId);
                        .getUniqueName(mContext, userId);
                final Face face = new Face(name, faceId, deviceId);
                final Face face = new Face(name, faceId, deviceId);


@@ -477,7 +477,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
    @Override
    @Override
    @NonNull
    @NonNull
    public List<Face> getEnrolledFaces(int sensorId, int userId) {
    public List<Face> getEnrolledFaces(int sensorId, int userId) {
        return FaceUtils.getInstance().getBiometricsForUser(mContext, userId);
        return FaceUtils.getLegacyInstance(mSensorId).getBiometricsForUser(mContext, userId);
    }
    }


    @Override
    @Override
@@ -616,8 +616,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {


            final FaceEnrollClient client = new FaceEnrollClient(mContext, mLazyDaemon, token,
            final FaceEnrollClient client = new FaceEnrollClient(mContext, mLazyDaemon, token,
                    new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
                    new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
                    opPackageName, FaceUtils.getInstance(), disabledFeatures, ENROLL_TIMEOUT_SEC,
                    opPackageName, FaceUtils.getLegacyInstance(mSensorId), disabledFeatures,
                    surfaceHandle, mSensorId);
                    ENROLL_TIMEOUT_SEC, surfaceHandle, mSensorId);


            mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
            mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
                @Override
                @Override
@@ -671,7 +671,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {


            final FaceRemovalClient client = new FaceRemovalClient(mContext, mLazyDaemon, token,
            final FaceRemovalClient client = new FaceRemovalClient(mContext, mLazyDaemon, token,
                    new ClientMonitorCallbackConverter(receiver), faceId, userId, opPackageName,
                    new ClientMonitorCallbackConverter(receiver), faceId, userId, opPackageName,
                    FaceUtils.getInstance(), mSensorId, mAuthenticatorIds);
                    FaceUtils.getLegacyInstance(mSensorId), mSensorId, mAuthenticatorIds);
            mScheduler.scheduleClientMonitor(client);
            mScheduler.scheduleClientMonitor(client);
        });
        });
    }
    }
@@ -754,7 +754,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
            final List<Face> enrolledList = getEnrolledFaces(mSensorId, userId);
            final List<Face> enrolledList = getEnrolledFaces(mSensorId, userId);
            final FaceInternalCleanupClient client = new FaceInternalCleanupClient(mContext,
            final FaceInternalCleanupClient client = new FaceInternalCleanupClient(mContext,
                    mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId, enrolledList,
                    mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId, enrolledList,
                    FaceUtils.getInstance(), mAuthenticatorIds);
                    FaceUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
            mScheduler.scheduleClientMonitor(client);
            mScheduler.scheduleClientMonitor(client);
        });
        });
    }
    }
@@ -783,7 +783,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {


            final long userToken = proto.start(SensorStateProto.USER_STATES);
            final long userToken = proto.start(SensorStateProto.USER_STATES);
            proto.write(UserStateProto.USER_ID, userId);
            proto.write(UserStateProto.USER_ID, userId);
            proto.write(UserStateProto.NUM_ENROLLED, FaceUtils.getInstance()
            proto.write(UserStateProto.NUM_ENROLLED, FaceUtils.getLegacyInstance(mSensorId)
                    .getBiometricsForUser(mContext, userId).size());
                    .getBiometricsForUser(mContext, userId).size());
            proto.end(userToken);
            proto.end(userToken);
        }
        }
@@ -807,7 +807,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
            JSONArray sets = new JSONArray();
            JSONArray sets = new JSONArray();
            for (UserInfo user : UserManager.get(mContext).getUsers()) {
            for (UserInfo user : UserManager.get(mContext).getUsers()) {
                final int userId = user.getUserHandle().getIdentifier();
                final int userId = user.getUserHandle().getIdentifier();
                final int c = FaceUtils.getInstance().getBiometricsForUser(mContext, userId).size();
                final int c = FaceUtils.getLegacyInstance(mSensorId)
                        .getBiometricsForUser(mContext, userId).size();
                JSONObject set = new JSONObject();
                JSONObject set = new JSONObject();
                set.put("id", userId);
                set.put("id", userId);
                set.put("count", c);
                set.put("count", c);
+3 −3
Original line number Original line Diff line number Diff line
@@ -75,12 +75,12 @@ public class FingerprintUtils implements BiometricUtils<Fingerprint> {


    /**
    /**
     * Legacy getter for {@link android.hardware.biometrics.fingerprint.V2_1} ands its extended
     * Legacy getter for {@link android.hardware.biometrics.fingerprint.V2_1} ands its extended
     * subclasses, which do not support a well defined sensorId from the HAL.
     * subclasses. Framework-side cache is always stored in the same file, regardless of sensorId.
     */
     */
    public static FingerprintUtils getInstance() {
    public static FingerprintUtils getLegacyInstance(int sensorId) {
        // Note that sensorId for legacy services can be hard-coded to 0 since it's only used
        // Note that sensorId for legacy services can be hard-coded to 0 since it's only used
        // to index into the sensor states map.
        // to index into the sensor states map.
        return getInstance(0 /* sensorId */, LEGACY_FINGERPRINT_FILE);
        return getInstance(sensorId, LEGACY_FINGERPRINT_FILE);
    }
    }


    private FingerprintUtils(String fileName) {
    private FingerprintUtils(String fileName) {
+1 −1
Original line number Original line Diff line number Diff line
@@ -144,7 +144,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
        Utils.checkPermission(mContext, TEST_BIOMETRIC);
        Utils.checkPermission(mContext, TEST_BIOMETRIC);


        // Fake authentication with any of the existing fingers
        // Fake authentication with any of the existing fingers
        List<Fingerprint> fingerprints = FingerprintUtils.getInstance()
        List<Fingerprint> fingerprints = FingerprintUtils.getLegacyInstance(mSensorId)
                .getBiometricsForUser(mContext, userId);
                .getBiometricsForUser(mContext, userId);
        if (fingerprints.isEmpty()) {
        if (fingerprints.isEmpty()) {
            Slog.w(TAG, "No fingerprints, returning");
            Slog.w(TAG, "No fingerprints, returning");
Loading