diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 02212968cdb08b5be994ce3ad5c77626965e95dc..02304b5ba4f320a724523e85924e256b0c998493 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -1074,6 +1074,14 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan */ public interface FaceDetectionCallback { void onFaceDetected(int sensorId, int userId, boolean isStrongBiometric); + + /** + * An error has occurred with face detection. + * + * This callback signifies that this operation has been completed, and + * no more callbacks should be expected. + */ + default void onDetectionError(int errorMsgId) {} } /** @@ -1373,6 +1381,9 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan } else if (mRemovalCallback != null) { mRemovalCallback.onRemovalError(mRemovalFace, clientErrMsgId, getErrorString(mContext, errMsgId, vendorCode)); + } else if (mFaceDetectionCallback != null) { + mFaceDetectionCallback.onDetectionError(errMsgId); + mFaceDetectionCallback = null; } } diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 5bfda70f03dee16b3e88718efafc38756f1feb67..935157a48a4505a28d050569da1e5e59512cf3a3 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -462,6 +462,14 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing * Invoked when a fingerprint has been detected. */ void onFingerprintDetected(int sensorId, int userId, boolean isStrongBiometric); + + /** + * An error has occurred with fingerprint detection. + * + * This callback signifies that this operation has been completed, and + * no more callbacks should be expected. + */ + default void onDetectionError(int errorMsgId) {} } /** @@ -1484,6 +1492,9 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing ? mRemoveTracker.mSingleFingerprint : null; mRemovalCallback.onRemovalError(fp, clientErrMsgId, getErrorString(mContext, errMsgId, vendorCode)); + } else if (mFingerprintDetectionCallback != null) { + mFingerprintDetectionCallback.onDetectionError(errMsgId); + mFingerprintDetectionCallback = null; } } diff --git a/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java b/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java index 07dec5d9e2222d3fd91b394aa4b9c1482ffda383..b843ad75ac0fb5852f77959937a80a782417ef24 100644 --- a/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java +++ b/core/tests/coretests/src/android/hardware/face/FaceManagerTest.java @@ -79,6 +79,8 @@ public class FaceManagerTest { private FaceManager.AuthenticationCallback mAuthCallback; @Mock private FaceManager.EnrollmentCallback mEnrollmentCallback; + @Mock + private FaceManager.FaceDetectionCallback mFaceDetectionCallback; @Captor private ArgumentCaptor<IFaceAuthenticatorsRegisteredCallback> mCaptor; @@ -191,6 +193,23 @@ public class FaceManagerTest { any(), anyString(), any(), any(), anyBoolean()); } + @Test + public void detectClient_onError() throws RemoteException { + ArgumentCaptor<IFaceServiceReceiver> argumentCaptor = + ArgumentCaptor.forClass(IFaceServiceReceiver.class); + + CancellationSignal cancellationSignal = new CancellationSignal(); + mFaceManager.detectFace(cancellationSignal, mFaceDetectionCallback, + new FaceAuthenticateOptions.Builder().build()); + + verify(mService).detectFace(any(), argumentCaptor.capture(), any()); + + argumentCaptor.getValue().onError(5 /* error */, 0 /* vendorCode */); + mLooper.dispatchAll(); + + verify(mFaceDetectionCallback).onDetectionError(anyInt()); + } + private void initializeProperties() throws RemoteException { verify(mService).addAuthenticatorsRegisteredCallback(mCaptor.capture()); diff --git a/core/tests/coretests/src/android/hardware/fingerprint/FingerprintManagerTest.java b/core/tests/coretests/src/android/hardware/fingerprint/FingerprintManagerTest.java index 625e2e3723a70e476644b00f2f2a9b07b678d584..70313b8c9ea754ed56dd0aa45ed1a75fcca760e2 100644 --- a/core/tests/coretests/src/android/hardware/fingerprint/FingerprintManagerTest.java +++ b/core/tests/coretests/src/android/hardware/fingerprint/FingerprintManagerTest.java @@ -74,6 +74,8 @@ public class FingerprintManagerTest { private FingerprintManager.AuthenticationCallback mAuthCallback; @Mock private FingerprintManager.EnrollmentCallback mEnrollCallback; + @Mock + private FingerprintManager.FingerprintDetectionCallback mFingerprintDetectionCallback; @Captor private ArgumentCaptor<IFingerprintAuthenticatorsRegisteredCallback> mCaptor; @@ -166,4 +168,21 @@ public class FingerprintManagerTest { anyString()); verify(mService, never()).enroll(any(), any(), anyInt(), any(), anyString(), anyInt()); } + + @Test + public void detectClient_onError() throws RemoteException { + ArgumentCaptor<IFingerprintServiceReceiver> argumentCaptor = + ArgumentCaptor.forClass(IFingerprintServiceReceiver.class); + + mFingerprintManager.detectFingerprint(new CancellationSignal(), + mFingerprintDetectionCallback, + new FingerprintAuthenticateOptions.Builder().build()); + + verify(mService).detectFingerprint(any(), argumentCaptor.capture(), any()); + + argumentCaptor.getValue().onError(5 /* error */, 0 /* vendorCode */); + mLooper.dispatchAll(); + + verify(mFingerprintDetectionCallback).onDetectionError(anyInt()); + } }