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
This commit is contained in:
Kevin Chyn
2020-11-02 18:42:26 -08:00
parent 02c367d8c1
commit d781e2066a
9 changed files with 165 additions and 112 deletions

View File

@@ -577,9 +577,17 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
*/
@RequiresPermission(MANAGE_BIOMETRIC)
public List<Face> getEnrolledFaces(int userId) {
final List<FaceSensorPropertiesInternal> 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<FaceSensorPropertiesInternal> 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<FaceSensorPropertiesInternal> 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<FaceSensorPropertiesInternal> getSensorPropertiesInternal() {
try {
if (mService == null || !mService.isHardwareDetected(mContext.getOpPackageName())) {
if (mService == null) {
return new ArrayList<>();
}
return mService.getSensorPropertiesInternal(mContext.getOpPackageName());

View File

@@ -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<Face> getEnrolledFaces(int userId, String opPackageName);
List<Face> 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);

View File

@@ -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<FingerprintSensorPropertiesInternal> getSensorPropertiesInternal() {
try {
if (mService == null || !mService.isHardwareDetected(mContext.getOpPackageName())) {
if (mService == null) {
return new ArrayList<>();
}
return mService.getSensorPropertiesInternal(mContext.getOpPackageName());

View File

@@ -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<Fingerprint> 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<FingerprintSensorPropertiesInternal> 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);

View File

@@ -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;

View File

@@ -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);
}
}

View File

@@ -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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Face> getEnrolledFaces(int userId, String opPackageName) {
public List<Face> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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

View File

@@ -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);
}
}

View File

@@ -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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Integer, ServiceProvider> 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<Fingerprint> getEnrolledFingerprints(int userId, String opPackageName) {
private List<Fingerprint> getEnrolledFingerprintsDeprecated(int userId, String opPackageName) {
final Pair<Integer, ServiceProvider> 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();
}