diff options
author | 2020-12-04 19:38:11 +0000 | |
---|---|---|
committer | 2020-12-04 19:38:11 +0000 | |
commit | a3b82500edb0ea66b42040a1ffebdf48101d6b61 (patch) | |
tree | 37ac364ab6b8691a81a9049544020955f0f74218 | |
parent | 1bc53046e2296158516bd6cd2eb55b516b77e8ba (diff) | |
parent | 8e6c6bd68f57ebdf5475d8753e07871ebd5c9b7c (diff) |
Merge changes I8a307450,I24fd9dad
* changes:
Update logic when multiple face sensors exist
Do not assume that legacy HIDL HAL sensorIds == 0
8 files changed, 59 insertions, 45 deletions
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java index 7dc2cba0b974..cb56e8cd4b7f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java @@ -127,17 +127,6 @@ public class FaceService extends SystemService implements BiometricServiceCallba return properties; } - @NonNull - private List<Face> getEnrolledFaces(int userId, String opPackageName) { - final Pair<Integer, ServiceProvider> provider = getSingleProvider(); - if (provider == null) { - Slog.w(TAG, "Null provider for getEnrolledFaces, caller: " + opPackageName); - return Collections.emptyList(); - } - - return provider.second.getEnrolledFaces(provider.first, userId); - } - /** * Receives the incoming binder calls from FaceManager. */ @@ -438,6 +427,7 @@ public class FaceService extends SystemService implements BiometricServiceCallba pw.println("Dumping for sensorId: " + props.sensorId + ", provider: " + provider.getClass().getSimpleName()); provider.dumpInternal(props.sensorId, pw); + pw.println(); } } } @@ -471,7 +461,13 @@ public class FaceService extends SystemService implements BiometricServiceCallba Utils.checkPermission(getContext(), INTERACT_ACROSS_USERS); } - return FaceService.this.getEnrolledFaces(userId, opPackageName); + final ServiceProvider provider = getProviderForSensor(sensorId); + if (provider == null) { + Slog.w(TAG, "Null provider for getEnrolledFaces, caller: " + opPackageName); + return Collections.emptyList(); + } + + return provider.getEnrolledFaces(sensorId, userId); } @Override // Binder call @@ -482,7 +478,16 @@ public class FaceService extends SystemService implements BiometricServiceCallba Utils.checkPermission(getContext(), INTERACT_ACROSS_USERS); } - return !FaceService.this.getEnrolledFaces(userId, opPackageName).isEmpty(); + final ServiceProvider provider = getProviderForSensor(sensorId); + if (provider == null) { + Slog.w(TAG, "Null provider for hasEnrolledFaces, caller: " + opPackageName); + return false; + } + + final boolean enrolled = provider.getEnrolledFaces(sensorId, userId).size() > 0; + Slog.d(TAG, "hasEnrolledFaces, sensor: " + sensorId + ", enrolled: " + enrolled); + + return provider.getEnrolledFaces(sensorId, userId).size() > 0; } @Override // Binder call 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 a0ffe58c779b..a0cd4a56ea12 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 @@ -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) { diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java index 4c983fb5fa6c..9ed8f789aaa2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java @@ -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; diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java index d384bc645d61..c4e4d1fe0f82 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java @@ -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); @@ -471,7 +471,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 @@ -610,8 +610,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 @@ -665,7 +665,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); }); } @@ -748,7 +748,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); }); } @@ -777,7 +777,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); } @@ -801,7 +801,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); 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 6da86502b64c..b3d2419901e4 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 @@ -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) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java index 65ce34d31b61..74549b917e82 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/BiometricTestSessionImpl.java @@ -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"); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 7c5b7c92c1c6..b8d27aa61806 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -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 @@ -167,13 +168,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; @@ -194,7 +197,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); @@ -307,6 +310,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider @NonNull LockoutResetDispatcher lockoutResetDispatcher, @NonNull HalResultController controller) { mContext = context; + mSensorId = sensorId; mScheduler = scheduler; mHandler = handler; mActivityTaskManager = ActivityTaskManager.getInstance(); @@ -361,7 +365,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); } @@ -549,7 +554,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 @@ -624,7 +629,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); }); @@ -638,8 +643,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); }); } @@ -657,14 +662,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 @@ -716,7 +722,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); } @@ -737,7 +743,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); @@ -777,7 +784,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); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java index e4933e40ccd5..791d224b9728 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21UdfpsMock.java @@ -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); } |