diff options
| author | 2023-04-14 22:28:26 +0000 | |
|---|---|---|
| committer | 2023-04-14 22:28:26 +0000 | |
| commit | 78ae46492ead7c4a645beb971c8bacea109f9f19 (patch) | |
| tree | ba2c2699b9a5d59d2a08c7fbd6a6bcbf162fc88a | |
| parent | cf2fc89dcd093a039fc2365316c50ba6f457620c (diff) | |
| parent | 8320babad09913889e8206412134bea1f5a6f7dd (diff) | |
Merge "Send error if enroll is invoked when face is already enrolled" into udc-dev
| -rw-r--r-- | core/java/android/hardware/face/FaceManager.java | 8 | ||||
| -rw-r--r-- | core/tests/coretests/src/android/hardware/face/FaceManagerTest.java | 41 |
2 files changed, 46 insertions, 3 deletions
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 55b20e17d4d7..e0af9137db25 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -342,6 +342,14 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan return; } + if (getEnrolledFaces(userId).size() + >= mContext.getResources().getInteger(R.integer.config_faceMaxTemplatesPerUser)) { + callback.onEnrollmentError(FACE_ERROR_HW_UNAVAILABLE, + getErrorString(mContext, FACE_ERROR_HW_UNAVAILABLE, + 0 /* vendorCode */)); + return; + } + if (mService != null) { try { mEnrollmentCallback = callback; diff --git a/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java b/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java index 9a202ae4d176..1075d44b4017 100644 --- a/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java +++ b/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java @@ -21,8 +21,11 @@ import static android.hardware.biometrics.BiometricFaceConstants.FACE_ERROR_HW_U import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; @@ -38,6 +41,8 @@ import android.os.RemoteException; import android.os.test.TestLooper; import android.platform.test.annotations.Presubmit; +import com.android.internal.R; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -50,6 +55,7 @@ import org.mockito.junit.MockitoJUnitRunner; import org.mockito.junit.MockitoRule; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @Presubmit @@ -70,6 +76,8 @@ public class FaceManagerTest { private IFaceService mService; @Mock private FaceManager.AuthenticationCallback mAuthCallback; + @Mock + private FaceManager.EnrollmentCallback mEnrollmentCallback; @Captor private ArgumentCaptor<IFaceAuthenticatorsRegisteredCallback> mCaptor; @@ -107,9 +115,7 @@ public class FaceManagerTest { @Test public void getSensorPropertiesInternal_noBinderCalls() throws RemoteException { - verify(mService).addAuthenticatorsRegisteredCallback(mCaptor.capture()); - - mCaptor.getValue().onAllAuthenticatorsRegistered(mProps); + initializeProperties(); List<FaceSensorPropertiesInternal> actual = mFaceManager.getSensorPropertiesInternal(); assertThat(actual).containsExactlyElementsIn(mProps); @@ -148,4 +154,33 @@ public class FaceManagerTest { verify(mAuthCallback).onAuthenticationError(eq(FACE_ERROR_HW_UNAVAILABLE), any()); } + + @Test + public void enrollment_errorWhenFaceEnrollmentExists() throws RemoteException { + when(mResources.getInteger(R.integer.config_faceMaxTemplatesPerUser)).thenReturn(1); + when(mService.getEnrolledFaces(anyInt(), anyInt(), anyString())) + .thenReturn(Collections.emptyList()) + .thenReturn(Collections.singletonList(new Face("Face" /* name */, 0 /* faceId */, + 0 /* deviceId */))); + + initializeProperties(); + mFaceManager.enroll(USER_ID, new byte[]{}, + new CancellationSignal(), mEnrollmentCallback, null /* disabledFeatures */); + + verify(mService).enroll(eq(USER_ID), any(), any(), any(), anyString(), any(), any(), + anyBoolean()); + + mFaceManager.enroll(USER_ID, new byte[]{}, + new CancellationSignal(), mEnrollmentCallback, null /* disabledFeatures */); + + verify(mService, atMost(1 /* maxNumberOfInvocations */)).enroll(eq(USER_ID), any(), any(), + any(), anyString(), any(), any(), anyBoolean()); + verify(mEnrollmentCallback).onEnrollmentError(eq(FACE_ERROR_HW_UNAVAILABLE), anyString()); + } + + private void initializeProperties() throws RemoteException { + verify(mService).addAuthenticatorsRegisteredCallback(mCaptor.capture()); + + mCaptor.getValue().onAllAuthenticatorsRegistered(mProps); + } } |