From e43e5b1337c34a709feca32dbacdf64cafc6c1b4 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Wed, 17 Feb 2021 12:28:31 -0800 Subject: [PATCH] Retrieve authenticatorId when already targetUserId Previous change ag/13413165 stopped the framework from retrieving authenticatorId when the current user is already the target user. However, this happens immediately after enrollment, since enroll and getAuthenticatorId are separate operations. So, add a way to retrieve authenticatorId only when necessary. Fixes: 179737483 Bug: 178018968 Test: manual Change-Id: I71673fc672c60733616634a2fdf3153a3b2d02e1 --- .../hardware/biometrics/BiometricManager.java | 1 - .../sensors/fingerprint/hidl/Fingerprint21.java | 16 ++++++++++++---- .../hidl/FingerprintUpdateActiveUserClient.java | 6 ++++-- 3 files changed, 16 insertions(+), 7 deletions(-) diff --git a/core/java/android/hardware/biometrics/BiometricManager.java b/core/java/android/hardware/biometrics/BiometricManager.java index 5f5697a4ed0b7..4ca31050bd529 100644 --- a/core/java/android/hardware/biometrics/BiometricManager.java +++ b/core/java/android/hardware/biometrics/BiometricManager.java @@ -390,7 +390,6 @@ public class BiometricManager { * in Keystore land as SIDs, and are used during key generation. * @hide */ - @RequiresPermission(USE_BIOMETRIC_INTERNAL) public long[] getAuthenticatorIds() { if (mService != null) { try { 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 7a74c6a39aa17..554e3d45a3ca3 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 @@ -463,26 +463,33 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider for (UserInfo user : UserManager.get(mContext).getAliveUsers()) { final int targetUserId = user.id; if (!mAuthenticatorIds.containsKey(targetUserId)) { - scheduleUpdateActiveUserWithoutHandler(targetUserId); + scheduleUpdateActiveUserWithoutHandler(targetUserId, true /* force */); } } }); } + private void scheduleUpdateActiveUserWithoutHandler(int targetUserId) { + scheduleUpdateActiveUserWithoutHandler(targetUserId, false /* force */); + } + /** * Schedules the {@link FingerprintUpdateActiveUserClient} without posting the work onto the * handler. Many/most APIs are user-specific. However, the HAL requires explicit "setActiveUser" * invocation prior to authenticate/enroll/etc. Thus, internally we usually want to schedule * this operation on the same lambda/runnable as those operations so that the ordering is * correct. + * + * @param targetUserId Switch to this user, and update their authenticatorId + * @param force Always retrieve the authenticatorId, even if we are already the targetUserId */ - private void scheduleUpdateActiveUserWithoutHandler(int targetUserId) { + private void scheduleUpdateActiveUserWithoutHandler(int targetUserId, boolean force) { final boolean hasEnrolled = !getEnrolledFingerprints(mSensorProperties.sensorId, targetUserId).isEmpty(); final FingerprintUpdateActiveUserClient client = new FingerprintUpdateActiveUserClient(mContext, mLazyDaemon, targetUserId, mContext.getOpPackageName(), mSensorProperties.sensorId, mCurrentUserId, - hasEnrolled, mAuthenticatorIds); + hasEnrolled, mAuthenticatorIds, force); mScheduler.scheduleClientMonitor(client, new BaseClientMonitor.Callback() { @Override public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, @@ -563,7 +570,8 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider boolean success) { if (success) { // Update authenticatorIds - scheduleUpdateActiveUserWithoutHandler(clientMonitor.getTargetUserId()); + scheduleUpdateActiveUserWithoutHandler(clientMonitor.getTargetUserId(), + true /* force */); } } }); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java index db7f4bcbec9d6..6776810c2e529 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintUpdateActiveUserClient.java @@ -41,6 +41,7 @@ public class FingerprintUpdateActiveUserClient extends HalClientMonitor mAuthenticatorIds; private File mDirectory; @@ -48,11 +49,12 @@ public class FingerprintUpdateActiveUserClient extends HalClientMonitor lazyDaemon, int userId, @NonNull String owner, int sensorId, int currentUserId, boolean hasEnrolledBiometrics, - @NonNull Map authenticatorIds) { + @NonNull Map authenticatorIds, boolean forceUpdateAuthenticatorId) { super(context, lazyDaemon, null /* token */, null /* listener */, userId, owner, 0 /* cookie */, sensorId, BiometricsProtoEnums.MODALITY_UNKNOWN, BiometricsProtoEnums.ACTION_UNKNOWN, BiometricsProtoEnums.CLIENT_UNKNOWN); mCurrentUserId = currentUserId; + mForceUpdateAuthenticatorId = forceUpdateAuthenticatorId; mHasEnrolledBiometrics = hasEnrolledBiometrics; mAuthenticatorIds = authenticatorIds; } @@ -61,7 +63,7 @@ public class FingerprintUpdateActiveUserClient extends HalClientMonitor