summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Mccloskey <joshmccloskey@google.com>2021-04-30 20:00:57 +0000
committerAndroid (Google) Code Review <android-gerrit@google.com>2021-04-30 20:00:57 +0000
commit6e729ee310a0c616adee340cc251182eeacb465f (patch)
tree7f9c2937f7d7475a60036fd47b4c1644a8ec6f95
parent2c389bf6ef399733d3e4ae5cea397a66462ef8da (diff)
parent7e45b45bf79acc1f0e2ce135df3baa4faefb46cf (diff)
Merge "Added features to FaceEnrollClient" into sc-dev
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java29
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java38
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java64
-rw-r--r--services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java14
4 files changed, 82 insertions, 63 deletions
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java
index 043260c840bc..6ad4308d7608 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/AidlConversionUtils.java
@@ -26,17 +26,22 @@ import android.hardware.biometrics.face.Cell;
import android.hardware.biometrics.face.EnrollmentFrame;
import android.hardware.biometrics.face.EnrollmentStage;
import android.hardware.biometrics.face.Error;
+import android.hardware.biometrics.face.Feature;
import android.hardware.face.FaceAuthenticationFrame;
import android.hardware.face.FaceDataFrame;
import android.hardware.face.FaceEnrollCell;
import android.hardware.face.FaceEnrollFrame;
import android.hardware.face.FaceEnrollStages;
import android.hardware.face.FaceEnrollStages.FaceEnrollStage;
+import android.util.Slog;
/**
* Utilities for converting from hardware to framework-defined AIDL models.
*/
final class AidlConversionUtils {
+
+ private static final String TAG = "AidlConversionUtils";
+
// Prevent instantiation.
private AidlConversionUtils() {
}
@@ -174,4 +179,28 @@ final class AidlConversionUtils {
public static FaceEnrollCell toFrameworkCell(@Nullable Cell cell) {
return cell == null ? null : new FaceEnrollCell(cell.x, cell.y, cell.z);
}
+
+ public static byte convertFrameworkToAidlFeature(int feature) throws IllegalArgumentException {
+ switch (feature) {
+ case BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION:
+ return Feature.REQUIRE_ATTENTION;
+ case BiometricFaceConstants.FEATURE_REQUIRE_REQUIRE_DIVERSITY:
+ return Feature.REQUIRE_DIVERSE_POSES;
+ default:
+ Slog.e(TAG, "Unsupported feature : " + feature);
+ throw new IllegalArgumentException();
+ }
+ }
+
+ public static int convertAidlToFrameworkFeature(byte feature) throws IllegalArgumentException {
+ switch (feature) {
+ case Feature.REQUIRE_ATTENTION:
+ return BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION;
+ case Feature.REQUIRE_DIVERSE_POSES:
+ return BiometricFaceConstants.FEATURE_REQUIRE_REQUIRE_DIVERSITY;
+ default:
+ Slog.e(TAG, "Unsupported feature : " + feature);
+ throw new IllegalArgumentException();
+ }
+ }
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java
index 58eb3ba9e722..f97414780247 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceEnrollClient.java
@@ -45,6 +45,7 @@ import com.android.server.biometrics.sensors.face.ReEnrollNotificationUtils;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.List;
/**
* Face-specific enroll client for the {@link IFace} AIDL HAL interface.
@@ -55,6 +56,7 @@ public class FaceEnrollClient extends EnrollClient<ISession> {
@NonNull private final int[] mEnrollIgnoreList;
@NonNull private final int[] mEnrollIgnoreListVendor;
+ @NonNull private final int[] mDisabledFeatures;
@Nullable private ICancellationSignal mCancellationSignal;
@Nullable private android.hardware.common.NativeHandle mPreviewSurface;
private final int mMaxTemplatesPerUser;
@@ -75,6 +77,7 @@ public class FaceEnrollClient extends EnrollClient<ISession> {
.getIntArray(R.array.config_face_acquire_vendor_enroll_ignorelist);
mMaxTemplatesPerUser = maxTemplatesPerUser;
mDebugConsent = debugConsent;
+ mDisabledFeatures = disabledFeatures;
try {
// We must manually close the duplicate handle after it's no longer needed.
// The caller is responsible for closing the original handle.
@@ -144,27 +147,34 @@ public class FaceEnrollClient extends EnrollClient<ISession> {
@Override
protected void startHalOperation() {
- final ArrayList<Byte> token = new ArrayList<>();
- for (byte b : mHardwareAuthToken) {
- token.add(b);
- }
-
try {
- // TODO(b/172593978): Pass features.
- // TODO(b/174619156): Handle accessibility enrollment.
- byte[] features;
+ List<Byte> featureList = new ArrayList<Byte>();
if (mDebugConsent) {
- features = new byte[1];
- features[0] = Feature.DEBUG;
- } else {
- features = new byte[0];
+ featureList.add(new Byte(Feature.DEBUG));
+ }
+
+ boolean shouldAddDiversePoses = true;
+ for (int i = 0; i < mDisabledFeatures.length; i++) {
+ if (AidlConversionUtils.convertFrameworkToAidlFeature(mDisabledFeatures[i])
+ == Feature.REQUIRE_DIVERSE_POSES) {
+ shouldAddDiversePoses = false;
+ }
+ }
+
+ if (shouldAddDiversePoses) {
+ featureList.add(new Byte(Feature.REQUIRE_DIVERSE_POSES));
+ }
+
+ byte[] features = new byte[featureList.size()];
+ for (int i = 0; i < featureList.size(); i++) {
+ features[i] = featureList.get(i);
}
mCancellationSignal = getFreshDaemon().enroll(
HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken),
EnrollmentType.DEFAULT, features, mPreviewSurface);
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception when requesting enroll", e);
+ } catch (RemoteException | IllegalArgumentException e) {
+ Slog.e(TAG, "Exception when requesting enroll", e);
onError(BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS, 0 /* vendorCode */);
mCallback.onClientFinished(this, false /* success */);
}
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java
index 12f3e87dd37e..315ede8bc5df 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceGetFeatureClient.java
@@ -21,7 +21,6 @@ import android.annotation.Nullable;
import android.content.Context;
import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.face.Feature;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.ISession;
import android.os.IBinder;
@@ -82,36 +81,38 @@ public class FaceGetFeatureClient extends HalClientMonitor<ISession> implements
}
public void onFeatureGet(boolean success, byte[] features) {
- HashMap<Integer, Boolean> featureMap = getFeatureMap();
- int[] featuresToSend = new int[featureMap.size()];
- boolean[] featureState = new boolean[featureMap.size()];
-
- // The AIDL get feature api states that the presence of a feature means
- // it is enabled, while the lack thereof means its disabled.
- for (int i = 0; i < features.length; i++) {
- Integer feature = convertAidlToFrameworkFeature(features[i]);
- if (feature != null) {
- featureMap.put(feature, true);
+ try {
+ HashMap<Integer, Boolean> featureMap = getFeatureMap();
+ int[] featuresToSend = new int[featureMap.size()];
+ boolean[] featureState = new boolean[featureMap.size()];
+
+ // The AIDL get feature api states that the presence of a feature means
+ // it is enabled, while the lack thereof means its disabled.
+ for (int i = 0; i < features.length; i++) {
+ featureMap.put(AidlConversionUtils.convertAidlToFrameworkFeature(features[i]),
+ true);
}
- }
- int i = 0;
- for (Map.Entry<Integer, Boolean> entry : featureMap.entrySet()) {
- featuresToSend[i] = entry.getKey();
- featureState[i] = entry.getValue();
- i++;
- }
+ int i = 0;
+ for (Map.Entry<Integer, Boolean> entry : featureMap.entrySet()) {
+ featuresToSend[i] = entry.getKey();
+ featureState[i] = entry.getValue();
+ i++;
+ }
+
+ boolean attentionEnabled =
+ featureMap.get(BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION);
+ Slog.d(TAG, "Updating attention value for user: " + mUserId
+ + " to value: " + attentionEnabled);
+ Settings.Secure.putIntForUser(getContext().getContentResolver(),
+ Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED,
+ attentionEnabled ? 1 : 0, mUserId);
- boolean attentionEnabled = featureMap.get(BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION);
- Slog.d(TAG, "Updating attention value for user: " + mUserId
- + " to value: " + attentionEnabled);
- Settings.Secure.putIntForUser(getContext().getContentResolver(),
- Settings.Secure.FACE_UNLOCK_ATTENTION_REQUIRED,
- attentionEnabled ? 1 : 0, mUserId);
- try {
getListener().onFeatureGet(success, featuresToSend, featureState);
- } catch (RemoteException e) {
- Slog.e(TAG, "Remote exception", e);
+ } catch (RemoteException | IllegalArgumentException e) {
+ Slog.e(TAG, "exception", e);
+ mCallback.onClientFinished(this, false /* success */);
+ return;
}
mCallback.onClientFinished(this, true /* success */);
@@ -123,15 +124,6 @@ public class FaceGetFeatureClient extends HalClientMonitor<ISession> implements
return featureMap;
}
- private Integer convertAidlToFrameworkFeature(byte feature) {
- switch (feature) {
- case Feature.REQUIRE_ATTENTION:
- return new Integer(BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION);
- default:
- return null;
- }
- }
-
@Override
public void onError(int errorCode, int vendorCode) {
try {
diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java
index c3abfc2ddd0b..4515d0421a58 100644
--- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java
+++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceSetFeatureClient.java
@@ -18,9 +18,7 @@ package com.android.server.biometrics.sensors.face.aidl;
import android.annotation.NonNull;
import android.content.Context;
-import android.hardware.biometrics.BiometricFaceConstants;
import android.hardware.biometrics.BiometricsProtoEnums;
-import android.hardware.biometrics.face.Feature;
import android.hardware.biometrics.face.IFace;
import android.hardware.biometrics.face.ISession;
import android.hardware.keymaster.HardwareAuthToken;
@@ -77,7 +75,7 @@ public class FaceSetFeatureClient extends HalClientMonitor<ISession> implements
try {
getFreshDaemon()
.setFeature(mHardwareAuthToken,
- convertFrameworkToAidlFeature(mFeature), mEnabled);
+ AidlConversionUtils.convertFrameworkToAidlFeature(mFeature), mEnabled);
} catch (RemoteException | IllegalArgumentException e) {
Slog.e(TAG, "Unable to set feature: " + mFeature + " to enabled: " + mEnabled, e);
mCallback.onClientFinished(this, false /* success */);
@@ -99,16 +97,6 @@ public class FaceSetFeatureClient extends HalClientMonitor<ISession> implements
mCallback.onClientFinished(this, true /* success */);
}
- private byte convertFrameworkToAidlFeature(int feature) throws IllegalArgumentException {
- switch (feature) {
- case BiometricFaceConstants.FEATURE_REQUIRE_ATTENTION:
- return Feature.REQUIRE_ATTENTION;
- default:
- Slog.e(TAG, "Unsupported feature : " + feature);
- throw new IllegalArgumentException();
- }
- }
-
@Override
public void onError(int errorCode, int vendorCode) {
try {