From 02adb885fe493c461c35ae085f741e6f7cbb1d95 Mon Sep 17 00:00:00 2001 From: Hao Dong Date: Tue, 11 Mar 2025 00:52:10 +0000 Subject: Add some new modality-specific APIs in BiometricManager. - getEnrolledFingerprintCount() - getEnrolledFingerprintCount() Bug: 399438509 Test: atest AuthServiceTest Test: atest BiometricSimpleTests Flag: android.hardware.biometrics.move_fm_api_to_bm Change-Id: I8bdc8fdf965e65d1ecd3ed34fe469d4f7c7f3201 --- .../com/android/server/biometrics/AuthService.java | 50 ++++++++++++++++++++++ .../android/server/biometrics/AuthServiceTest.java | 39 +++++++++++++++++ 2 files changed, 89 insertions(+) (limited to 'services') diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index b6768c9c087a..eede4c9c59d0 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -36,6 +36,7 @@ import android.content.Context; import android.content.pm.PackageManager; import android.hardware.biometrics.AuthenticationStateListener; import android.hardware.biometrics.BiometricAuthenticator; +import android.hardware.biometrics.BiometricEnrollmentStatus; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.ComponentInfoInternal; import android.hardware.biometrics.IAuthService; @@ -416,6 +417,55 @@ public class AuthService extends SystemService { } } + @Override + public List getEnrollmentStatus(String opPackageName) + throws RemoteException { + checkBiometricAdvancedPermission(); + final long identity = Binder.clearCallingIdentity(); + try { + final int userId = UserHandle.myUserId(); + final List enrollmentStatusList = + new ArrayList<>(); + final IFingerprintService fingerprintService = mInjector.getFingerprintService(); + if (fingerprintService != null) { + final List fpProps = + fingerprintService.getSensorPropertiesInternal(opPackageName); + if (!fpProps.isEmpty()) { + int fpCount = fingerprintService.getEnrolledFingerprints(userId, + opPackageName, getContext().getAttributionTag()).size(); + enrollmentStatusList.add( + new BiometricEnrollmentStatus( + BiometricManager.TYPE_FINGERPRINT, fpCount)); + } else { + Slog.e(TAG, "No fingerprint sensors"); + } + } else { + Slog.e(TAG, "No fingerprint sensors"); + } + + final IFaceService faceService = mInjector.getFaceService(); + if (faceService != null) { + final List faceProps = + faceService.getSensorPropertiesInternal(opPackageName); + if (!faceProps.isEmpty()) { + int faceCount = faceService.getEnrolledFaces(faceProps.getFirst().sensorId, + userId, opPackageName).size(); + enrollmentStatusList.add( + new BiometricEnrollmentStatus( + BiometricManager.TYPE_FACE, faceCount)); + } else { + Slog.e(TAG, "No face sensors"); + } + } else { + Slog.e(TAG, "No face sensors"); + } + + return enrollmentStatusList; + } finally { + Binder.restoreCallingIdentity(identity); + } + } + @Override public void registerEnabledOnKeyguardCallback( IBiometricEnabledOnKeyguardCallback callback) throws RemoteException { diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java index c7efa318af99..cebdce9ed6cc 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java @@ -49,11 +49,14 @@ import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; import android.hardware.biometrics.IBiometricService; import android.hardware.biometrics.IBiometricServiceReceiver; import android.hardware.biometrics.PromptInfo; +import android.hardware.biometrics.SensorProperties; import android.hardware.biometrics.fingerprint.SensorProps; import android.hardware.face.FaceSensorConfigurations; +import android.hardware.face.FaceSensorProperties; import android.hardware.face.FaceSensorPropertiesInternal; import android.hardware.face.IFaceService; import android.hardware.fingerprint.FingerprintSensorConfigurations; +import android.hardware.fingerprint.FingerprintSensorProperties; import android.hardware.fingerprint.FingerprintSensorPropertiesInternal; import android.hardware.fingerprint.IFingerprintService; import android.hardware.iris.IIrisService; @@ -84,6 +87,7 @@ import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.mockito.stubbing.Stubber; +import java.util.ArrayList; import java.util.List; @Presubmit @@ -519,6 +523,41 @@ public class AuthServiceTest { verify(mBiometricService).getLastAuthenticationTime(eq(mUserId), eq(authenticators)); } + @Test + public void testGetEnrollmentStatus_callsFingerprintAndFaceService() throws Exception { + setInternalAndTestBiometricPermissions(mContext, true /* hasPermission */); + List faceProps = List.of(new FaceSensorPropertiesInternal( + 0 /* id */, + FaceSensorProperties.STRENGTH_STRONG, + 1 /* maxTemplatesAllowed */, + new ArrayList<>() /* componentInfo */, + FaceSensorProperties.TYPE_UNKNOWN, + true /* supportsFaceDetection */, + true /* supportsSelfIllumination */, + false /* resetLockoutRequiresChallenge */)); + List fpProps = List.of( + new FingerprintSensorPropertiesInternal(1 /* id */, + SensorProperties.STRENGTH_STRONG, + 5 /* maxEnrollmentsPerUser */, + new ArrayList<>() /* componentInfo */, + FingerprintSensorProperties.TYPE_UDFPS_OPTICAL, + false /* resetLockoutRequiresHardwareAuthToken */)); + when(mFaceService.getSensorPropertiesInternal(eq(TEST_OP_PACKAGE_NAME))).thenReturn( + faceProps); + when(mFingerprintService.getSensorPropertiesInternal(eq(TEST_OP_PACKAGE_NAME))).thenReturn( + fpProps); + when(mContext.getAttributionTag()).thenReturn("tag"); + mAuthService = new AuthService(mContext, mInjector); + mAuthService.onStart(); + + mAuthService.mImpl.getEnrollmentStatus(TEST_OP_PACKAGE_NAME); + + waitForIdle(); + verify(mFaceService).getEnrolledFaces(eq(0), eq(mUserId), eq(TEST_OP_PACKAGE_NAME)); + verify(mFingerprintService).getEnrolledFingerprints(eq(mUserId), eq(TEST_OP_PACKAGE_NAME), + eq("tag")); + } + private static void setInternalAndTestBiometricPermissions( Context context, boolean hasPermission) { for (String p : List.of(TEST_BIOMETRIC, MANAGE_BIOMETRIC, USE_BIOMETRIC_INTERNAL)) { -- cgit v1.2.3-59-g8ed1b