summaryrefslogtreecommitdiff
path: root/core/java
diff options
context:
space:
mode:
authorKevin Chyn <kchyn@google.com>2020-08-05 21:56:31 -0700
committerKevin Chyn <kchyn@google.com>2020-08-13 13:20:00 -0700
commite44a86b2edebe3b57c5104514dbbcb9de2856d21 (patch)
treeabe14d35633d734d29f45ca95d209817c399343e /core/java
parent86943d140fe30654be52e83e5468e287a7035e47 (diff)
2/n: Keep track of IBiometricsFace@1.0 challenge interruptions
IBiometricsFace@1.0 only supports a single in-flight challenge. Currently, challenge owners paths are designed to never conflict lifecycle-wise. However, to decouple resetLockout (which relies on challenge) from the critical user unlock path, we need to keep track of challenge interruptions, and notify clients when an interruption starts/finishes. This change only adds the infrastructure for tracking challenge interruptions. A following change will make use of this. Bug: 145978626 Test: Builds Change-Id: I708312cafad29614e3708b5c606ae8a90704ac66
Diffstat (limited to 'core/java')
-rw-r--r--core/java/android/hardware/face/FaceManager.java49
-rw-r--r--core/java/android/hardware/face/IFaceServiceReceiver.aidl2
2 files changed, 51 insertions, 0 deletions
diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java
index 19cb13c7e114..4f949cfc62a5 100644
--- a/core/java/android/hardware/face/FaceManager.java
+++ b/core/java/android/hardware/face/FaceManager.java
@@ -72,6 +72,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
private static final int MSG_SET_FEATURE_COMPLETED = 107;
private static final int MSG_CHALLENGE_GENERATED = 108;
private static final int MSG_FACE_DETECTED = 109;
+ private static final int MSG_CHALLENGE_INTERRUPTED = 110;
+ private static final int MSG_CHALLENGE_INTERRUPT_FINISHED = 111;
private final IFaceService mService;
private final Context mContext;
@@ -150,6 +152,16 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
mHandler.obtainMessage(MSG_CHALLENGE_GENERATED, challenge).sendToTarget();
}
}
+
+ @Override
+ public void onChallengeInterrupted(int sensorId) {
+ mHandler.obtainMessage(MSG_CHALLENGE_INTERRUPTED, sensorId).sendToTarget();
+ }
+
+ @Override
+ public void onChallengeInterruptFinished(int sensorId) {
+ mHandler.obtainMessage(MSG_CHALLENGE_INTERRUPT_FINISHED, sensorId).sendToTarget();
+ }
};
/**
@@ -1071,10 +1083,25 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
}
/**
+ * Callback structure provided to {@link #generateChallenge(GenerateChallengeCallback)}.
* @hide
*/
public interface GenerateChallengeCallback {
+ /**
+ * Invoked when a challenge has been generated.
+ */
void onGenerateChallengeResult(long challenge);
+
+ /**
+ * Invoked if the challenge has not been revoked and a subsequent caller/owner invokes
+ * {@link #generateChallenge(GenerateChallengeCallback)}, but
+ */
+ default void onChallengeInterrupted(int sensorId) {}
+
+ /**
+ * Invoked when the interrupting client has finished (e.g. revoked its challenge).
+ */
+ default void onChallengeInterruptFinished(int sensorId) {}
}
private abstract static class InternalGenerateChallengeCallback
@@ -1157,6 +1184,12 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
sendFaceDetected(msg.arg1 /* sensorId */, msg.arg2 /* userId */,
(boolean) msg.obj /* isStrongBiometric */);
break;
+ case MSG_CHALLENGE_INTERRUPTED:
+ sendChallengeInterrupted((int) msg.obj /* sensorId */);
+ break;
+ case MSG_CHALLENGE_INTERRUPT_FINISHED:
+ sendChallengeInterruptFinished((int) msg.obj /* sensorId */);
+ break;
default:
Slog.w(TAG, "Unknown message: " + msg.what);
}
@@ -1193,6 +1226,22 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan
mFaceDetectionCallback.onFaceDetected(sensorId, userId, isStrongBiometric);
}
+ private void sendChallengeInterrupted(int sensorId) {
+ if (mGenerateChallengeCallback == null) {
+ Slog.e(TAG, "sendChallengeInterrupted, callback null");
+ return;
+ }
+ mGenerateChallengeCallback.onChallengeInterrupted(sensorId);
+ }
+
+ private void sendChallengeInterruptFinished(int sensorId) {
+ if (mGenerateChallengeCallback == null) {
+ Slog.e(TAG, "sendChallengeInterruptFinished, callback null");
+ return;
+ }
+ mGenerateChallengeCallback.onChallengeInterruptFinished(sensorId);
+ }
+
private void sendRemovedResult(Face face, int remaining) {
if (mRemovalCallback == null) {
return;
diff --git a/core/java/android/hardware/face/IFaceServiceReceiver.aidl b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
index 2600b7def03a..108f4f69bdd8 100644
--- a/core/java/android/hardware/face/IFaceServiceReceiver.aidl
+++ b/core/java/android/hardware/face/IFaceServiceReceiver.aidl
@@ -32,4 +32,6 @@ oneway interface IFaceServiceReceiver {
void onFeatureSet(boolean success, int feature);
void onFeatureGet(boolean success, int feature, boolean value);
void onChallengeGenerated(long challenge);
+ void onChallengeInterrupted(int sensorId);
+ void onChallengeInterruptFinished(int sensorId);
}