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
This commit is contained in:
Kevin Chyn
2020-12-03 17:42:12 -08:00
parent 2384b262cf
commit d21d2184c9
7 changed files with 41 additions and 32 deletions

View File

@@ -72,13 +72,13 @@ public class FaceUtils implements BiometricUtils<Face> {
}
/**
* 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.
* Legacy getter for {@link android.hardware.biometrics.face.V1_0} and its extended subclasses.
* 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
// to index into the sensor states map.
return getInstance(0 /* sensorId */, LEGACY_FACE_FILE);
return getInstance(sensorId, LEGACY_FACE_FILE);
}
private FaceUtils(String fileName) {

View File

@@ -153,7 +153,8 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
// 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()) {
Slog.w(TAG, "No faces, returning");
return;

View File

@@ -166,7 +166,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override
public void onEnrollResult(long deviceId, int faceId, int userId, int remaining) {
mHandler.post(() -> {
final CharSequence name = FaceUtils.getInstance()
final CharSequence name = FaceUtils.getLegacyInstance(mSensorId)
.getUniqueName(mContext, userId);
final Face face = new Face(name, faceId, deviceId);
@@ -477,7 +477,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
@Override
@NonNull
public List<Face> getEnrolledFaces(int sensorId, int userId) {
return FaceUtils.getInstance().getBiometricsForUser(mContext, userId);
return FaceUtils.getLegacyInstance(mSensorId).getBiometricsForUser(mContext, userId);
}
@Override
@@ -616,8 +616,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceEnrollClient client = new FaceEnrollClient(mContext, mLazyDaemon, token,
new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken,
opPackageName, FaceUtils.getInstance(), disabledFeatures, ENROLL_TIMEOUT_SEC,
surfaceHandle, mSensorId);
opPackageName, FaceUtils.getLegacyInstance(mSensorId), disabledFeatures,
ENROLL_TIMEOUT_SEC, surfaceHandle, mSensorId);
mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
@Override
@@ -671,7 +671,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final FaceRemovalClient client = new FaceRemovalClient(mContext, mLazyDaemon, token,
new ClientMonitorCallbackConverter(receiver), faceId, userId, opPackageName,
FaceUtils.getInstance(), mSensorId, mAuthenticatorIds);
FaceUtils.getLegacyInstance(mSensorId), mSensorId, mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client);
});
}
@@ -754,7 +754,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final List<Face> enrolledList = getEnrolledFaces(mSensorId, userId);
final FaceInternalCleanupClient client = new FaceInternalCleanupClient(mContext,
mLazyDaemon, userId, mContext.getOpPackageName(), mSensorId, enrolledList,
FaceUtils.getInstance(), mAuthenticatorIds);
FaceUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client);
});
}
@@ -783,7 +783,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
final long userToken = proto.start(SensorStateProto.USER_STATES);
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());
proto.end(userToken);
}
@@ -807,7 +807,8 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider {
JSONArray sets = new JSONArray();
for (UserInfo user : UserManager.get(mContext).getUsers()) {
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();
set.put("id", userId);
set.put("count", c);

View File

@@ -75,12 +75,12 @@ public class FingerprintUtils implements BiometricUtils<Fingerprint> {
/**
* 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
// to index into the sensor states map.
return getInstance(0 /* sensorId */, LEGACY_FINGERPRINT_FILE);
return getInstance(sensorId, LEGACY_FINGERPRINT_FILE);
}
private FingerprintUtils(String fileName) {

View File

@@ -144,7 +144,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub {
Utils.checkPermission(mContext, TEST_BIOMETRIC);
// Fake authentication with any of the existing fingers
List<Fingerprint> fingerprints = FingerprintUtils.getInstance()
List<Fingerprint> fingerprints = FingerprintUtils.getLegacyInstance(mSensorId)
.getBiometricsForUser(mContext, userId);
if (fingerprints.isEmpty()) {
Slog.w(TAG, "No fingerprints, returning");

View File

@@ -111,6 +111,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@NonNull private final HalResultController mHalResultController;
@Nullable private IUdfpsOverlayController mUdfpsOverlayController;
private int mCurrentUserId = UserHandle.USER_NULL;
private final int mSensorId;
private final class BiometricTaskStackListener extends TaskStackListener {
@Override
@@ -171,13 +172,15 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
void onHardwareUnavailable();
}
private final int mSensorId;
@NonNull private final Context mContext;
@NonNull final Handler mHandler;
@NonNull final BiometricScheduler mScheduler;
@Nullable private Callback mCallback;
HalResultController(@NonNull Context context, @NonNull Handler handler,
HalResultController(int sensorId, @NonNull Context context, @NonNull Handler handler,
@NonNull BiometricScheduler scheduler) {
mSensorId = sensorId;
mContext = context;
mHandler = handler;
mScheduler = scheduler;
@@ -198,7 +201,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
}
final int currentUserId = client.getTargetUserId();
final CharSequence name = FingerprintUtils.getInstance()
final CharSequence name = FingerprintUtils.getLegacyInstance(mSensorId)
.getUniqueName(mContext, currentUserId);
final Fingerprint fingerprint = new Fingerprint(name, groupId, fingerId, deviceId);
@@ -311,6 +314,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@NonNull LockoutResetDispatcher lockoutResetDispatcher,
@NonNull HalResultController controller) {
mContext = context;
mSensorId = sensorId;
mScheduler = scheduler;
mHandler = handler;
mActivityTaskManager = ActivityTaskManager.getService();
@@ -365,7 +369,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
final Handler handler = new Handler(Looper.getMainLooper());
final BiometricScheduler scheduler =
new BiometricScheduler(TAG, gestureAvailabilityDispatcher);
final HalResultController controller = new HalResultController(context, handler, scheduler);
final HalResultController controller = new HalResultController(sensorId, context, handler,
scheduler);
return new Fingerprint21(context, scheduler, handler, sensorId, strength,
lockoutResetDispatcher, controller);
}
@@ -553,7 +558,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
final FingerprintEnrollClient client = new FingerprintEnrollClient(mContext,
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId,
hardwareAuthToken, opPackageName, FingerprintUtils.getInstance(),
hardwareAuthToken, opPackageName, FingerprintUtils.getLegacyInstance(mSensorId),
ENROLL_TIMEOUT_SEC, mSensorProperties.sensorId, mUdfpsOverlayController);
mScheduler.scheduleClientMonitor(client, new ClientMonitor.Callback() {
@Override
@@ -628,7 +633,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
final FingerprintRemovalClient client = new FingerprintRemovalClient(mContext,
mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), fingerId,
userId, opPackageName, FingerprintUtils.getInstance(),
userId, opPackageName, FingerprintUtils.getLegacyInstance(mSensorId),
mSensorProperties.sensorId, mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client);
});
@@ -642,8 +647,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
mSensorProperties.sensorId, userId);
final FingerprintInternalCleanupClient client = new FingerprintInternalCleanupClient(
mContext, mLazyDaemon, userId, mContext.getOpPackageName(),
mSensorProperties.sensorId, enrolledList, FingerprintUtils.getInstance(),
mAuthenticatorIds);
mSensorProperties.sensorId, enrolledList,
FingerprintUtils.getLegacyInstance(mSensorId), mAuthenticatorIds);
mScheduler.scheduleClientMonitor(client);
});
}
@@ -661,14 +666,15 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
@Override
public void rename(int sensorId, int fingerId, int userId, @NonNull String name) {
mHandler.post(() -> {
FingerprintUtils.getInstance().renameBiometricForUser(mContext, userId, fingerId, name);
FingerprintUtils.getLegacyInstance(mSensorId)
.renameBiometricForUser(mContext, userId, fingerId, name);
});
}
@Override
@NonNull
public List<Fingerprint> getEnrolledFingerprints(int sensorId, int userId) {
return FingerprintUtils.getInstance().getBiometricsForUser(mContext, userId);
return FingerprintUtils.getLegacyInstance(mSensorId).getBiometricsForUser(mContext, userId);
}
@Override
@@ -720,7 +726,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
final long userToken = proto.start(SensorStateProto.USER_STATES);
proto.write(UserStateProto.USER_ID, userId);
proto.write(UserStateProto.NUM_ENROLLED, FingerprintUtils.getInstance()
proto.write(UserStateProto.NUM_ENROLLED, FingerprintUtils.getLegacyInstance(mSensorId)
.getBiometricsForUser(mContext, userId).size());
proto.end(userToken);
}
@@ -741,7 +747,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
proto.write(FingerprintUserStatsProto.USER_ID, userId);
proto.write(FingerprintUserStatsProto.NUM_FINGERPRINTS,
FingerprintUtils.getInstance().getBiometricsForUser(mContext, userId).size());
FingerprintUtils.getLegacyInstance(mSensorId)
.getBiometricsForUser(mContext, userId).size());
// Normal fingerprint authentications (e.g. lockscreen)
long countsToken = proto.start(FingerprintUserStatsProto.NORMAL);
@@ -781,7 +788,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider
JSONArray sets = new JSONArray();
for (UserInfo user : UserManager.get(mContext).getUsers()) {
final int userId = user.getUserHandle().getIdentifier();
final int N = FingerprintUtils.getInstance()
final int N = FingerprintUtils.getLegacyInstance(mSensorId)
.getBiometricsForUser(mContext, userId).size();
JSONObject set = new JSONObject();
set.put("id", userId);

View File

@@ -210,9 +210,9 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
@NonNull private Fingerprint21UdfpsMock mFingerprint21;
@Nullable private LastAuthArgs mLastAuthArgs;
MockHalResultController(@NonNull Context context, @NonNull Handler handler,
MockHalResultController(int sensorId, @NonNull Context context, @NonNull Handler handler,
@NonNull BiometricScheduler scheduler) {
super(context, handler, scheduler);
super(sensorId, context, handler, scheduler);
}
void init(@NonNull RestartAuthRunnable restartAuthRunnable,
@@ -280,7 +280,7 @@ public class Fingerprint21UdfpsMock extends Fingerprint21 implements TrustManage
final TestableBiometricScheduler scheduler =
new TestableBiometricScheduler(TAG, gestureAvailabilityDispatcher);
final MockHalResultController controller =
new MockHalResultController(context, handler, scheduler);
new MockHalResultController(sensorId, context, handler, scheduler);
return new Fingerprint21UdfpsMock(context, scheduler, handler, sensorId, strength,
lockoutResetDispatcher, controller);
}