From d781e2066a3b1006ad29a68da2c01748b6bfbe95 Mon Sep 17 00:00:00 2001 From: Kevin Chyn Date: Mon, 2 Nov 2020 18:42:26 -0800 Subject: [PATCH] Add sensorId to IBiometricAuthenticator methods IBiometricAuthenticator is the interface that BiometricService uses to do BiometricManager/BiometricPrompt-related stuff. This change updates the implementations to pass sensorId as a parameter, since the current design allows for FingerprintService, FaceService etc to host multiple HALs and/or sensors. Maintains functionality of deprecated FingerprintManager APIs. Since getSensorProperties() requires internal or test permission, use different binder calls for FingerprintManager invocations vs BiometricService invocations of methods such as isHardwareDetected and hasEnrolledFingerprints. Moves HIDL HAL registration out of *Authenticator class and up one layer (into AuthService), since *Authenticator code is to be shared with AIDL HALs, which provide sensorId, strength, and other configuration via the HAL interface. Bug: 172291793 Test: Enroll, auth (BiometricPrompt and Lockscreen) on face and fingerprint devices Change-Id: Ib2d8b792f0afde49550f320c4041ff1b1b3d5a50 --- .../android/hardware/face/FaceManager.java | 42 ++++++---- .../android/hardware/face/IFaceService.aidl | 16 ++-- .../fingerprint/FingerprintManager.java | 14 +--- .../fingerprint/IFingerprintService.aidl | 24 +++--- .../server/biometrics/AuthService.java | 8 ++ .../sensors/face/FaceAuthenticator.java | 22 +++--- .../biometrics/sensors/face/FaceService.java | 53 +++++++------ .../fingerprint/FingerprintAuthenticator.java | 21 ++--- .../fingerprint/FingerprintService.java | 77 +++++++++++++------ 9 files changed, 165 insertions(+), 112 deletions(-) diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 9f322fbad51d9..75893d978749b 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -577,9 +577,17 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan */ @RequiresPermission(MANAGE_BIOMETRIC) public List getEnrolledFaces(int userId) { + final List faceSensorProperties = + getSensorPropertiesInternal(); + if (faceSensorProperties.isEmpty()) { + Slog.e(TAG, "No sensors"); + return new ArrayList<>(); + } + if (mService != null) { try { - return mService.getEnrolledFaces(userId, mContext.getOpPackageName()); + return mService.getEnrolledFaces(faceSensorProperties.get(0).sensorId, userId, + mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -606,15 +614,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan */ @RequiresPermission(USE_BIOMETRIC_INTERNAL) public boolean hasEnrolledTemplates() { - if (mService != null) { - try { - return mService.hasEnrolledFaces( - UserHandle.myUserId(), mContext.getOpPackageName()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - } - return false; + return hasEnrolledTemplates(UserHandle.myUserId()); } /** @@ -624,9 +624,17 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan USE_BIOMETRIC_INTERNAL, INTERACT_ACROSS_USERS}) public boolean hasEnrolledTemplates(int userId) { + final List faceSensorProperties = + getSensorPropertiesInternal(); + if (faceSensorProperties.isEmpty()) { + Slog.e(TAG, "No sensors"); + return false; + } + if (mService != null) { try { - return mService.hasEnrolledFaces(userId, mContext.getOpPackageName()); + return mService.hasEnrolledFaces(faceSensorProperties.get(0).sensorId, userId, + mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -642,9 +650,17 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan */ @RequiresPermission(USE_BIOMETRIC_INTERNAL) public boolean isHardwareDetected() { + final List faceSensorProperties = + getSensorPropertiesInternal(); + if (faceSensorProperties.isEmpty()) { + Slog.e(TAG, "No sensors"); + return false; + } + if (mService != null) { try { - return mService.isHardwareDetected(mContext.getOpPackageName()); + return mService.isHardwareDetected(faceSensorProperties.get(0).sensorId, + mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -677,7 +693,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan @NonNull public List getSensorPropertiesInternal() { try { - if (mService == null || !mService.isHardwareDetected(mContext.getOpPackageName())) { + if (mService == null) { return new ArrayList<>(); } return mService.getSensorPropertiesInternal(mContext.getOpPackageName()); diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 490c95bfe1bb7..27cdda7b07239 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -44,12 +44,12 @@ interface IFaceService { // called from BiometricService. The additional uid, pid, userId arguments should be determined // by BiometricService. To start authentication after the clients are ready, use // startPreparedClient(). - void prepareForAuthentication(boolean requireConfirmation, IBinder token, long operationId, + void prepareForAuthentication(int sensorId, boolean requireConfirmation, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId); // Starts authentication with the previously prepared client. - void startPreparedClient(int cookie); + void startPreparedClient(int sensorId, int cookie); // Cancel authentication for the given sessionId void cancelAuthentication(IBinder token, String opPackageName); @@ -58,7 +58,7 @@ interface IFaceService { void cancelFaceDetect(IBinder token, String opPackageName); // Same as above, with extra arguments. - void cancelAuthenticationFromService(IBinder token, String opPackageName, + void cancelAuthenticationFromService(int sensorId, IBinder token, String opPackageName, int callingUid, int callingPid, int callingUserId); // Start face enrollment @@ -77,10 +77,10 @@ interface IFaceService { String opPackageName); // Get the enrolled face for user. - List getEnrolledFaces(int userId, String opPackageName); + List getEnrolledFaces(int sensorId, int userId, String opPackageName); // Determine if HAL is loaded and ready - boolean isHardwareDetected(String opPackageName); + boolean isHardwareDetected(int sensorId, String opPackageName); // Get a pre-enrollment authentication token void generateChallenge(IBinder token, int sensorId, int userId, IFaceServiceReceiver receiver, String opPackageName); @@ -89,13 +89,13 @@ interface IFaceService { void revokeChallenge(IBinder token, int sensorId, int userId, String opPackageName, long challenge); // Determine if a user has at least one enrolled face - boolean hasEnrolledFaces(int userId, String opPackageName); + boolean hasEnrolledFaces(int sensorId, int userId, String opPackageName); // Return the LockoutTracker status for the specified user - int getLockoutModeForUser(int userId); + int getLockoutModeForUser(int sensorId, int userId); // Gets the authenticator ID for face - long getAuthenticatorId(int callingUserId); + long getAuthenticatorId(int sensorId, int callingUserId); // Reset the lockout when user authenticates with strong auth (e.g. PIN, pattern or password) void resetLockout(IBinder token, int sensorId, int userId, in byte [] hardwareAuthToken, String opPackageName); diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 4afe4b3d126bc..51e0eba1ec23c 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -846,13 +846,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing @Deprecated @RequiresPermission(USE_FINGERPRINT) public boolean hasEnrolledFingerprints() { - if (mService != null) try { - return mService.hasEnrolledFingerprints( - mContext.getUserId(), mContext.getOpPackageName()); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } - return false; + return hasEnrolledFingerprints(UserHandle.myUserId()); } /** @@ -863,7 +857,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing INTERACT_ACROSS_USERS}) public boolean hasEnrolledFingerprints(int userId) { if (mService != null) try { - return mService.hasEnrolledFingerprints(userId, mContext.getOpPackageName()); + return mService.hasEnrolledFingerprintsDeprecated(userId, mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -882,7 +876,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing public boolean isHardwareDetected() { if (mService != null) { try { - return mService.isHardwareDetected(mContext.getOpPackageName()); + return mService.isHardwareDetectedDeprecated(mContext.getOpPackageName()); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } @@ -900,7 +894,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing @NonNull public List getSensorPropertiesInternal() { try { - if (mService == null || !mService.isHardwareDetected(mContext.getOpPackageName())) { + if (mService == null) { return new ArrayList<>(); } return mService.getSensorPropertiesInternal(mContext.getOpPackageName()); diff --git a/core/java/android/hardware/fingerprint/IFingerprintService.aidl b/core/java/android/hardware/fingerprint/IFingerprintService.aidl index 5b14ef7966162..2128d67f80aeb 100644 --- a/core/java/android/hardware/fingerprint/IFingerprintService.aidl +++ b/core/java/android/hardware/fingerprint/IFingerprintService.aidl @@ -53,12 +53,12 @@ interface IFingerprintService { // called from BiometricService. The additional uid, pid, userId arguments should be determined // by BiometricService. To start authentication after the clients are ready, use // startPreparedClient(). - void prepareForAuthentication(IBinder token, long operationId, int userId, + void prepareForAuthentication(int sensorId, IBinder token, long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId); // Starts authentication with the previously prepared client. - void startPreparedClient(int cookie); + void startPreparedClient(int sensorId, int cookie); // Cancel authentication for the given sessionId void cancelAuthentication(IBinder token, String opPackageName); @@ -68,7 +68,7 @@ interface IFingerprintService { // Same as above, except this is protected by the MANAGE_BIOMETRIC signature permission. Takes // an additional uid, pid, userid. - void cancelAuthenticationFromService(IBinder token, String opPackageName, + void cancelAuthenticationFromService(int sensorId, IBinder token, String opPackageName, int callingUid, int callingPid, int callingUserId); // Start fingerprint enrollment @@ -88,8 +88,11 @@ interface IFingerprintService { // Get a list of enrolled fingerprints in the given userId. List getEnrolledFingerprints(int userId, String opPackageName); - // Determine if HAL is loaded and ready - boolean isHardwareDetected(String opPackageName); + // Determine if the HAL is loaded and ready. Meant to support the deprecated FingerprintManager APIs + boolean isHardwareDetectedDeprecated(String opPackageName); + + // Determine if the specified HAL is loaded and ready + boolean isHardwareDetected(int sensorId, String opPackageName); // Get a pre-enrollment authentication token void generateChallenge(IBinder token, int sensorId, int userId, IFingerprintServiceReceiver receiver, String opPackageName); @@ -97,17 +100,20 @@ interface IFingerprintService { // Finish an enrollment sequence and invalidate the authentication token void revokeChallenge(IBinder token, int sensorId, int userId, String opPackageName, long challenge); - // Determine if a user has at least one enrolled fingerprint - boolean hasEnrolledFingerprints(int userId, String opPackageName); + // Determine if a user has at least one enrolled fingerprint. Meant to support the deprecated FingerprintManager APIs + boolean hasEnrolledFingerprintsDeprecated(int userId, String opPackageName); + + // Determine if a user has at least one enrolled fingerprint. + boolean hasEnrolledFingerprints(int sensorId, int userId, String opPackageName); // Determine if a user has at least one enrolled fingerprint in any of the specified sensors boolean hasEnrolledTemplatesForAnySensor(int userId, in List sensors, String opPackageName); // Return the LockoutTracker status for the specified user - int getLockoutModeForUser(int userId); + int getLockoutModeForUser(int sensorId, int userId); // Gets the authenticator ID for fingerprint - long getAuthenticatorId(int callingUserId); + long getAuthenticatorId(int sensorId, int callingUserId); // Reset the timeout when user authenticates with strong auth (e.g. PIN, pattern or password) void resetLockout(IBinder token, int sensorId, int userId, in byte[] hardwareAuthToken, String opPackageNAame); diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index 54c1790309295..d52cf024f7ce4 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -329,6 +329,10 @@ public class AuthService extends SystemService { return; } + // Initialize this outside of FingerprintAuthenticator. Only HIDL HALs require + // initialization from here. AIDL HALs are initialized by FingerprintService since + // the HAL interface provides ID, strength, and other configuration information. + fingerprintService.initializeConfiguration(config.id, config.strength); authenticator = new FingerprintAuthenticator(fingerprintService, config); break; @@ -340,6 +344,10 @@ public class AuthService extends SystemService { return; } + // Initialize this outside of FingerprintAuthenticator. Only HIDL HALs require + // initialization from here. AIDL HALs are initialized by FaceService since + // the HAL interface provides ID, strength, and other configuration information. + faceService.initializeConfiguration(config.id, config.strength); authenticator = new FaceAuthenticator(faceService, config); break; diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java index 3318bcb8d593a..e742d102b967a 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceAuthenticator.java @@ -30,11 +30,12 @@ import com.android.server.biometrics.sensors.LockoutTracker; */ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub { private final IFaceService mFaceService; + private final int mSensorId; public FaceAuthenticator(IFaceService faceService, SensorConfig config) throws RemoteException { mFaceService = faceService; - mFaceService.initializeConfiguration(config.id, config.strength); + mSensorId = config.id; } @Override @@ -42,40 +43,41 @@ public final class FaceAuthenticator extends IBiometricAuthenticator.Stub { long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId) throws RemoteException { - mFaceService.prepareForAuthentication(requireConfirmation, token, operationId, userId, - sensorReceiver, opPackageName, cookie, callingUid, callingPid, callingUserId); + mFaceService.prepareForAuthentication(mSensorId, requireConfirmation, token, operationId, + userId, sensorReceiver, opPackageName, cookie, callingUid, callingPid, + callingUserId); } @Override public void startPreparedClient(int cookie) throws RemoteException { - mFaceService.startPreparedClient(cookie); + mFaceService.startPreparedClient(mSensorId, cookie); } @Override public void cancelAuthenticationFromService(IBinder token, String opPackageName, int callingUid, int callingPid, int callingUserId) throws RemoteException { - mFaceService.cancelAuthenticationFromService(token, opPackageName, callingUid, callingPid, - callingUserId); + mFaceService.cancelAuthenticationFromService(mSensorId, token, opPackageName, callingUid, + callingPid, callingUserId); } @Override public boolean isHardwareDetected(String opPackageName) throws RemoteException { - return mFaceService.isHardwareDetected(opPackageName); + return mFaceService.isHardwareDetected(mSensorId, opPackageName); } @Override public boolean hasEnrolledTemplates(int userId, String opPackageName) throws RemoteException { - return mFaceService.hasEnrolledFaces(userId, opPackageName); + return mFaceService.hasEnrolledFaces(mSensorId, userId, opPackageName); } @Override public @LockoutTracker.LockoutMode int getLockoutModeForUser(int userId) throws RemoteException { - return mFaceService.getLockoutModeForUser(userId); + return mFaceService.getLockoutModeForUser(mSensorId, userId); } @Override public long getAuthenticatorId(int callingUserId) throws RemoteException { - return mFaceService.getAuthenticatorId(callingUserId); + return mFaceService.getAuthenticatorId(mSensorId, callingUserId); } } 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 a298e19e4b02f..c63518279cafe 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 @@ -255,35 +255,35 @@ public class FaceService extends SystemService { } @Override // Binder call - public void prepareForAuthentication(boolean requireConfirmation, IBinder token, - long operationId, int userId, IBiometricSensorReceiver sensorReceiver, - String opPackageName, int cookie, int callingUid, int callingPid, - int callingUserId) { + public void prepareForAuthentication(int sensorId, boolean requireConfirmation, + IBinder token, long operationId, int userId, + IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, + int callingUid, int callingPid, int callingUserId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for prepareForAuthentication"); return; } final boolean restricted = true; // BiometricPrompt is always restricted - provider.second.scheduleAuthenticate(provider.first, token, operationId, userId, cookie, + provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie, new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, false /* isKeyguard */); } @Override // Binder call - public void startPreparedClient(int cookie) { + public void startPreparedClient(int sensorId, int cookie) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for startPreparedClient"); return; } - provider.second.startPreparedClient(provider.first, cookie); + provider.startPreparedClient(sensorId, cookie); } @Override // Binder call @@ -312,17 +312,17 @@ public class FaceService extends SystemService { } @Override // Binder call - public void cancelAuthenticationFromService(final IBinder token, final String opPackageName, - int callingUid, int callingPid, int callingUserId) { + public void cancelAuthenticationFromService(int sensorId, final IBinder token, + final String opPackageName, int callingUid, int callingPid, int callingUserId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for cancelAuthenticationFromService"); return; } - provider.second.cancelAuthentication(provider.first, token); + provider.cancelAuthentication(sensorId, token); } @Override // Binder call @@ -384,24 +384,24 @@ public class FaceService extends SystemService { } @Override // Binder call - public boolean isHardwareDetected(String opPackageName) { + public boolean isHardwareDetected(int sensorId, String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); final long token = Binder.clearCallingIdentity(); try { - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for isHardwareDetected, caller: " + opPackageName); return false; } - return provider.second.isHardwareDetected(provider.first); + return provider.isHardwareDetected(sensorId); } finally { Binder.restoreCallingIdentity(token); } } @Override // Binder call - public List getEnrolledFaces(int userId, String opPackageName) { + public List getEnrolledFaces(int sensorId, int userId, String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); if (userId != UserHandle.getCallingUserId()) { @@ -412,7 +412,7 @@ public class FaceService extends SystemService { } @Override // Binder call - public boolean hasEnrolledFaces(int userId, String opPackageName) { + public boolean hasEnrolledFaces(int sensorId, int userId, String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); if (userId != UserHandle.getCallingUserId()) { @@ -423,30 +423,29 @@ public class FaceService extends SystemService { } @Override // Binder call - @LockoutTracker.LockoutMode - public int getLockoutModeForUser(int userId) { + public @LockoutTracker.LockoutMode int getLockoutModeForUser(int sensorId, int userId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for getLockoutModeForUser"); return LockoutTracker.LOCKOUT_NONE; } - return provider.second.getLockoutModeForUser(provider.first, userId); + return provider.getLockoutModeForUser(sensorId, userId); } @Override // Binder call - public long getAuthenticatorId(int userId) { + public long getAuthenticatorId(int sensorId, int userId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for getAuthenticatorId"); return 0; } - return provider.second.getAuthenticatorId(provider.first, userId); + return provider.getAuthenticatorId(sensorId, userId); } @Override // Binder call @@ -454,13 +453,13 @@ public class FaceService extends SystemService { String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for resetLockout, caller: " + opPackageName); return; } - provider.second.scheduleResetLockout(provider.first, userId, hardwareAuthToken); + provider.scheduleResetLockout(sensorId, userId, hardwareAuthToken); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java index 4b59112b3524d..f77bc79744ea8 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintAuthenticator.java @@ -30,11 +30,12 @@ import com.android.server.biometrics.sensors.LockoutTracker; */ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub { private final IFingerprintService mFingerprintService; + private final int mSensorId; public FingerprintAuthenticator(IFingerprintService fingerprintService, SensorConfig config) throws RemoteException { mFingerprintService = fingerprintService; - mFingerprintService.initializeConfiguration(config.id, config.strength); + mSensorId = config.id; } @Override @@ -42,40 +43,40 @@ public final class FingerprintAuthenticator extends IBiometricAuthenticator.Stub long operationId, int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId) throws RemoteException { - mFingerprintService.prepareForAuthentication(token, operationId, userId, sensorReceiver, - opPackageName, cookie, callingUid, callingPid, callingUserId); + mFingerprintService.prepareForAuthentication(mSensorId, token, operationId, userId, + sensorReceiver, opPackageName, cookie, callingUid, callingPid, callingUserId); } @Override public void startPreparedClient(int cookie) throws RemoteException { - mFingerprintService.startPreparedClient(cookie); + mFingerprintService.startPreparedClient(mSensorId, cookie); } @Override public void cancelAuthenticationFromService(IBinder token, String opPackageName, int callingUid, int callingPid, int callingUserId) throws RemoteException { - mFingerprintService.cancelAuthenticationFromService(token, opPackageName, callingUid, - callingPid, callingUserId); + mFingerprintService.cancelAuthenticationFromService(mSensorId, token, opPackageName, + callingUid, callingPid, callingUserId); } @Override public boolean isHardwareDetected(String opPackageName) throws RemoteException { - return mFingerprintService.isHardwareDetected(opPackageName); + return mFingerprintService.isHardwareDetected(mSensorId, opPackageName); } @Override public boolean hasEnrolledTemplates(int userId, String opPackageName) throws RemoteException { - return mFingerprintService.hasEnrolledFingerprints(userId, opPackageName); + return mFingerprintService.hasEnrolledFingerprints(mSensorId, userId, opPackageName); } @Override public @LockoutTracker.LockoutMode int getLockoutModeForUser(int userId) throws RemoteException { - return mFingerprintService.getLockoutModeForUser(userId); + return mFingerprintService.getLockoutModeForUser(mSensorId, userId); } @Override public long getAuthenticatorId(int callingUserId) throws RemoteException { - return mFingerprintService.getAuthenticatorId(callingUserId); + return mFingerprintService.getAuthenticatorId(mSensorId, callingUserId); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java index 265ba0545395d..99569b14bb6fb 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/FingerprintService.java @@ -255,34 +255,34 @@ public class FingerprintService extends SystemService { } @Override // Binder call - public void prepareForAuthentication(IBinder token, long operationId, int userId, - IBiometricSensorReceiver sensorReceiver, String opPackageName, + public void prepareForAuthentication(int sensorId, IBinder token, long operationId, + int userId, IBiometricSensorReceiver sensorReceiver, String opPackageName, int cookie, int callingUid, int callingPid, int callingUserId) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for prepareForAuthentication"); return; } final boolean restricted = true; // BiometricPrompt is always restricted - provider.second.scheduleAuthenticate(provider.first, token, operationId, userId, cookie, + provider.scheduleAuthenticate(sensorId, token, operationId, userId, cookie, new ClientMonitorCallbackConverter(sensorReceiver), opPackageName, restricted, BiometricsProtoEnums.CLIENT_BIOMETRIC_PROMPT, false /* isKeyguard */); } @Override // Binder call - public void startPreparedClient(int cookie) { + public void startPreparedClient(int sensorId, int cookie) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for startPreparedClient"); return; } - provider.second.startPreparedClient(provider.first, cookie); + provider.startPreparedClient(sensorId, cookie); } @@ -328,17 +328,17 @@ public class FingerprintService extends SystemService { } @Override // Binder call - public void cancelAuthenticationFromService(final IBinder token, final String opPackageName, - int callingUid, int callingPid, int callingUserId) { + public void cancelAuthenticationFromService(final int sensorId, final IBinder token, + final String opPackageName, int callingUid, int callingPid, int callingUserId) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for cancelAuthenticationFromService"); return; } - provider.second.cancelAuthentication(provider.first, token); + provider.cancelAuthentication(sensorId, token); } @Override // Binder call @@ -402,7 +402,7 @@ public class FingerprintService extends SystemService { } @Override // Binder call - public boolean isHardwareDetected(String opPackageName) { + public boolean isHardwareDetectedDeprecated(String opPackageName) { if (!canUseFingerprint(opPackageName, false /* foregroundOnly */, Binder.getCallingUid(), Binder.getCallingPid(), UserHandle.getCallingUserId())) { @@ -413,7 +413,8 @@ public class FingerprintService extends SystemService { try { final Pair provider = getSingleProvider(); if (provider == null) { - Slog.w(TAG, "Null provider for isHardwareDetected, caller: " + opPackageName); + Slog.w(TAG, "Null provider for isHardwareDetectedDeprecated, caller: " + + opPackageName); return false; } return provider.second.isHardwareDetected(provider.first); @@ -422,6 +423,19 @@ public class FingerprintService extends SystemService { } } + @Override // Binder call + public boolean isHardwareDetected(int sensorId, String opPackageName) { + Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); + + final ServiceProvider provider = getProviderForSensor(sensorId); + if (provider == null) { + Slog.w(TAG, "Null provider for isHardwareDetected, caller: " + opPackageName); + return false; + } + + return provider.isHardwareDetected(sensorId); + } + @Override // Binder call public void rename(final int fingerId, final int userId, final String name) { Utils.checkPermission(getContext(), MANAGE_FINGERPRINT); @@ -450,11 +464,11 @@ public class FingerprintService extends SystemService { Utils.checkPermission(getContext(), INTERACT_ACROSS_USERS); } - return FingerprintService.this.getEnrolledFingerprints(userId, opPackageName); + return FingerprintService.this.getEnrolledFingerprintsDeprecated(userId, opPackageName); } @Override // Binder call - public boolean hasEnrolledFingerprints(int userId, String opPackageName) { + public boolean hasEnrolledFingerprintsDeprecated(int userId, String opPackageName) { if (!canUseFingerprint(opPackageName, false /* foregroundOnly */, Binder.getCallingUid(), Binder.getCallingPid(), UserHandle.getCallingUserId())) { @@ -464,7 +478,7 @@ public class FingerprintService extends SystemService { if (userId != UserHandle.getCallingUserId()) { Utils.checkPermission(getContext(), INTERACT_ACROSS_USERS); } - return !FingerprintService.this.getEnrolledFingerprints(userId, opPackageName) + return !FingerprintService.this.getEnrolledFingerprintsDeprecated(userId, opPackageName) .isEmpty(); } @@ -489,28 +503,40 @@ public class FingerprintService extends SystemService { return false; } - @Override // Binder call - public @LockoutTracker.LockoutMode int getLockoutModeForUser(int userId) { + public boolean hasEnrolledFingerprints(int sensorId, int userId, String opPackageName) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); + if (provider == null) { + Slog.w(TAG, "Null provider for hasEnrolledFingerprints, caller: " + opPackageName); + return false; + } + + return provider.getEnrolledFingerprints(sensorId, userId).size() > 0; + } + + @Override // Binder call + public @LockoutTracker.LockoutMode int getLockoutModeForUser(int sensorId, int userId) { + Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); + + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for getLockoutModeForUser"); return LockoutTracker.LOCKOUT_NONE; } - return provider.second.getLockoutModeForUser(provider.first, userId); + return provider.getLockoutModeForUser(sensorId, userId); } @Override // Binder call - public long getAuthenticatorId(int userId) { + public long getAuthenticatorId(int sensorId, int userId) { Utils.checkPermission(getContext(), USE_BIOMETRIC_INTERNAL); - final Pair provider = getSingleProvider(); + final ServiceProvider provider = getProviderForSensor(sensorId); if (provider == null) { Slog.w(TAG, "Null provider for getAuthenticatorId"); return 0; } - return provider.second.getAuthenticatorId(provider.first, userId); + return provider.getAuthenticatorId(sensorId, userId); } @Override // Binder call @@ -691,10 +717,11 @@ public class FingerprintService extends SystemService { } @NonNull - private List getEnrolledFingerprints(int userId, String opPackageName) { + private List getEnrolledFingerprintsDeprecated(int userId, String opPackageName) { final Pair provider = getSingleProvider(); if (provider == null) { - Slog.w(TAG, "Null provider for getEnrolledFingerprints, caller: " + opPackageName); + Slog.w(TAG, "Null provider for getEnrolledFingerprintsDeprecated, caller: " + + opPackageName); return Collections.emptyList(); }