Start BiometricService even if no hardware is present
* BiometricService already has support for authenticate() to fallback to CDC.
This allows BiometricPrompt to ask for credentials when no biometric
hardware is present, rather then doing nothing.
Issue: FP2A10-159
Change-Id: Ib69b913a9e9a6d4d76de5d2ee9e618a3dfd6e5bd
diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java
index 136e932..d1090a3 100644
--- a/core/java/android/app/SystemServiceRegistry.java
+++ b/core/java/android/app/SystemServiceRegistry.java
@@ -944,17 +944,11 @@
@Override
public BiometricManager createService(ContextImpl ctx)
throws ServiceNotFoundException {
- if (BiometricManager.hasBiometrics(ctx)) {
- final IBinder binder =
- ServiceManager.getServiceOrThrow(Context.BIOMETRIC_SERVICE);
- final IBiometricService service =
- IBiometricService.Stub.asInterface(binder);
- return new BiometricManager(ctx.getOuterContext(), service);
- } else {
- // Allow access to the manager when service is null. This saves memory
- // on devices without biometric hardware.
- return new BiometricManager(ctx.getOuterContext(), null);
- }
+ final IBinder binder =
+ ServiceManager.getServiceOrThrow(Context.BIOMETRIC_SERVICE);
+ final IBiometricService service =
+ IBiometricService.Stub.asInterface(binder);
+ return new BiometricManager(ctx.getOuterContext(), service);
}
});
diff --git a/core/java/android/hardware/biometrics/BiometricPrompt.java b/core/java/android/hardware/biometrics/BiometricPrompt.java
index 1142a07..57b5493 100644
--- a/core/java/android/hardware/biometrics/BiometricPrompt.java
+++ b/core/java/android/hardware/biometrics/BiometricPrompt.java
@@ -648,15 +648,8 @@
mExecutor = executor;
mAuthenticationCallback = callback;
final long sessionId = crypto != null ? crypto.getOpId() : 0;
- if (BiometricManager.hasBiometrics(mContext)) {
- mService.authenticate(mToken, sessionId, userId, mBiometricServiceReceiver,
- mContext.getOpPackageName(), mBundle, confirmDeviceCredentialCallback);
- } else {
- mExecutor.execute(() -> {
- callback.onAuthenticationError(BiometricPrompt.BIOMETRIC_ERROR_HW_NOT_PRESENT,
- mContext.getString(R.string.biometric_error_hw_unavailable));
- });
- }
+ mService.authenticate(mToken, sessionId, userId, mBiometricServiceReceiver,
+ mContext.getOpPackageName(), mBundle, confirmDeviceCredentialCallback);
} catch (RemoteException e) {
Log.e(TAG, "Remote exception while authenticating", e);
mExecutor.execute(() -> {
diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java
index 26a1247..69c860b 100644
--- a/services/java/com/android/server/SystemServer.java
+++ b/services/java/com/android/server/SystemServer.java
@@ -1783,12 +1783,10 @@
traceEnd();
}
- if (hasFeatureFace || hasFeatureIris || hasFeatureFingerprint) {
- // Start this service after all biometric services.
- traceBeginAndSlog("StartBiometricService");
- mSystemServiceManager.startService(BiometricService.class);
- traceEnd();
- }
+ // Start this service after all biometric services.
+ traceBeginAndSlog("StartBiometricService");
+ mSystemServiceManager.startService(BiometricService.class);
+ traceEnd();
traceBeginAndSlog("StartBackgroundDexOptService");
try {