diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java b/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java index 5b1834983345f..a8250ac9e72d3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricUserState.java @@ -16,6 +16,7 @@ package com.android.server.biometrics.sensors; +import android.annotation.NonNull; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.os.AsyncTask; @@ -61,11 +62,6 @@ public abstract class BiometricUserState { private static final String TAG = "FaceState"; - private static final String FACE_FILE = "settings_face.xml"; private static final String TAG_FACES = "faces"; private static final String TAG_FACE = "face"; @@ -51,8 +50,8 @@ public class FaceUserState extends BiometricUserState { private static final String ATTR_FACE_ID = "faceId"; private static final String ATTR_DEVICE_ID = "deviceId"; - public FaceUserState(Context ctx, int userId) { - super(ctx, userId); + public FaceUserState(Context ctx, int userId, String fileName) { + super(ctx, userId, fileName); } @Override @@ -60,11 +59,6 @@ public class FaceUserState extends BiometricUserState { return TAG_FACES; } - @Override - protected String getBiometricFile() { - return FACE_FILE; - } - @Override protected int getNameTemplateResource() { return com.android.internal.R.string.face_name_template; diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java index f47b22839e709..a0ffe58c779b0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceUtils.java @@ -16,6 +16,7 @@ package com.android.server.biometrics.sensors.face; +import android.annotation.Nullable; import android.content.Context; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.face.Face; @@ -33,21 +34,56 @@ import java.util.List; public class FaceUtils implements BiometricUtils { private static final Object sInstanceLock = new Object(); - private static FaceUtils sInstance; + // Map + private static SparseArray sInstances; + private static final String LEGACY_FACE_FILE = "settings_face.xml"; @GuardedBy("this") - private final SparseArray mUsers = new SparseArray<>(); + private final SparseArray mUserStates; + private final String mFileName; - public static FaceUtils getInstance() { - synchronized (sInstanceLock) { - if (sInstance == null) { - sInstance = new FaceUtils(); - } - } - return sInstance; + public static FaceUtils getInstance(int sensorId) { + // Specify a null fileName to use an auto-generated sensorId-specific filename. + return getInstance(sensorId, null /* fileName */); } - private FaceUtils() { + /** + * Retrieves an instance for the specified sensorId. If the fileName is null, a default + * filename (e.g. settings_face_.xml will be generated. + * + * Specifying an explicit fileName allows for backward compatibility with legacy devices, + * where everything is stored in settings_face.xml. + */ + private static FaceUtils getInstance(int sensorId, @Nullable String fileName) { + final FaceUtils utils; + synchronized (sInstanceLock) { + if (sInstances == null) { + sInstances = new SparseArray<>(); + } + if (sInstances.get(sensorId) == null) { + if (fileName == null) { + fileName = "settings_face_" + sensorId + ".xml"; + } + sInstances.put(sensorId, new FaceUtils(fileName)); + } + utils = sInstances.get(sensorId); + } + return utils; + } + + /** + * 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. + */ + public static FaceUtils getInstance() { + // Note that sensorId for legacy services can be hard-coded to 0 since it's only used + // to index into the sensor states map. + return getInstance(0 /* sensorId */, LEGACY_FACE_FILE); + } + + private FaceUtils(String fileName) { + mUserStates = new SparseArray<>(); + mFileName = fileName; } @Override @@ -81,10 +117,10 @@ public class FaceUtils implements BiometricUtils { private FaceUserState getStateForUser(Context ctx, int userId) { synchronized (this) { - FaceUserState state = mUsers.get(userId); + FaceUserState state = mUserStates.get(userId); if (state == null) { - state = new FaceUserState(ctx, userId); - mUsers.put(userId, state); + state = new FaceUserState(ctx, userId, mFileName); + mUserStates.put(userId, state); } return state; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java index f32d28c4d7ee4..e56c8d5b5ceb3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUserState.java @@ -42,7 +42,6 @@ import java.util.ArrayList; public class FingerprintUserState extends BiometricUserState { private static final String TAG = "FingerprintState"; - private static final String FINGERPRINT_FILE = "settings_fingerprint.xml"; private static final String TAG_FINGERPRINTS = "fingerprints"; private static final String TAG_FINGERPRINT = "fingerprint"; @@ -51,8 +50,8 @@ public class FingerprintUserState extends BiometricUserState { private static final String ATTR_FINGER_ID = "fingerId"; private static final String ATTR_DEVICE_ID = "deviceId"; - public FingerprintUserState(Context context, int userId) { - super(context, userId); + public FingerprintUserState(Context context, int userId, String fileName) { + super(context, userId, fileName); } @Override @@ -60,11 +59,6 @@ public class FingerprintUserState extends BiometricUserState { return TAG_FINGERPRINTS; } - @Override - protected String getBiometricFile() { - return FINGERPRINT_FILE; - } - @Override protected int getNameTemplateResource() { return com.android.internal.R.string.fingerprint_name_template; diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java index 3bf3a5b3ea37d..6da86502b64c7 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintUtils.java @@ -16,8 +16,8 @@ package com.android.server.biometrics.sensors.fingerprint; +import android.annotation.Nullable; import android.content.Context; -import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.fingerprint.Fingerprint; import android.text.TextUtils; import android.util.SparseArray; @@ -33,21 +33,59 @@ import java.util.List; public class FingerprintUtils implements BiometricUtils { private static final Object sInstanceLock = new Object(); - private static FingerprintUtils sInstance; + // Map + private static SparseArray sInstances; + private static final String LEGACY_FINGERPRINT_FILE = "settings_fingerprint.xml"; @GuardedBy("this") - private final SparseArray mUsers = new SparseArray<>(); + private final SparseArray mUserStates; + private final String mFileName; - public static FingerprintUtils getInstance() { - synchronized (sInstanceLock) { - if (sInstance == null) { - sInstance = new FingerprintUtils(); - } - } - return sInstance; + /** + * Retrieves an instance for the specified sensorId. + */ + public static FingerprintUtils getInstance(int sensorId) { + // Specify a null fileName to use an auto-generated sensorId-specific filename. + return getInstance(sensorId, null /* fileName */); } - private FingerprintUtils() { + /** + * Retrieves an instance for the specified sensorId. If the fileName is null, a default + * filename (e.g. settings_fingerprint_.xml will be generated. + * + * Specifying an explicit fileName allows for backward compatibility with legacy devices, + * where everything is stored in settings_fingerprint.xml. + */ + private static FingerprintUtils getInstance(int sensorId, @Nullable String fileName) { + final FingerprintUtils utils; + synchronized (sInstanceLock) { + if (sInstances == null) { + sInstances = new SparseArray<>(); + } + if (sInstances.get(sensorId) == null) { + if (fileName == null) { + fileName = "settings_fingerprint_" + sensorId + ".xml"; + } + sInstances.put(sensorId, new FingerprintUtils(fileName)); + } + utils = sInstances.get(sensorId); + } + return utils; + } + + /** + * 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. + */ + public static FingerprintUtils getInstance() { + // Note that sensorId for legacy services can be hard-coded to 0 since it's only used + // to index into the sensor states map. + return getInstance(0 /* sensorId */, LEGACY_FINGERPRINT_FILE); + } + + private FingerprintUtils(String fileName) { + mUserStates = new SparseArray<>(); + mFileName = fileName; } @Override @@ -82,10 +120,10 @@ public class FingerprintUtils implements BiometricUtils { private FingerprintUserState getStateForUser(Context ctx, int userId) { synchronized (this) { - FingerprintUserState state = mUsers.get(userId); + FingerprintUserState state = mUserStates.get(userId); if (state == null) { - state = new FingerprintUserState(ctx, userId); - mUsers.put(userId, state); + state = new FingerprintUserState(ctx, userId, mFileName); + mUserStates.put(userId, state); } return state; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java index c96bef167e8bb..7a7ad6493c382 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java @@ -61,7 +61,7 @@ public class FingerprintEnrollClient extends EnrollClient implements U @Override protected boolean hasReachedEnrollmentLimit() { - return FingerprintUtils.getInstance() + return FingerprintUtils.getInstance(getSensorId()) .getBiometricsForUser(getContext(), getTargetUserId()).size() >= mMaxTemplatesPerUser; } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index bac83b9e21ef5..f16aa8a9763e3 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -285,7 +285,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi final FingerprintEnrollClient client = new FingerprintEnrollClient(mContext, mSensors.get(sensorId).getLazySession(), token, new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken, - opPackageName, FingerprintUtils.getInstance(), sensorId, + opPackageName, FingerprintUtils.getInstance(sensorId), sensorId, mUdfpsOverlayController, maxTemplatesPerUser); scheduleForSensor(sensorId, client, new ClientMonitor.Callback() { @Override @@ -380,7 +380,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi final FingerprintRemovalClient client = new FingerprintRemovalClient(mContext, mSensors.get(sensorId).getLazySession(), token, new ClientMonitorCallbackConverter(receiver), fingerId, userId, - opPackageName, FingerprintUtils.getInstance(), sensorId, + opPackageName, FingerprintUtils.getInstance(sensorId), sensorId, mSensors.get(sensorId).getAuthenticatorIds()); mSensors.get(sensorId).getScheduler().scheduleClientMonitor(client); } catch (RemoteException e) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java index b7aa2d579f546..5f5f44ba1fc3b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/Sensor.java @@ -162,7 +162,7 @@ class Sensor { } final int currentUserId = client.getTargetUserId(); - final CharSequence name = FingerprintUtils.getInstance() + final CharSequence name = FingerprintUtils.getInstance(sensorId) .getUniqueName(mContext, currentUserId); final Fingerprint fingerprint = new Fingerprint(name, enrollmentId, sensorId);