diff options
author | Joshua Mccloskey <joshmccloskey@google.com> | 2021-04-29 17:18:39 -0700 |
---|---|---|
committer | Joshua Mccloskey <joshmccloskey@google.com> | 2021-04-29 22:50:14 -0700 |
commit | 7e45b45bf79acc1f0e2ce135df3baa4faefb46cf (patch) | |
tree | ec5532c4bea632ea98cd31ac29420aa7ef558645 | |
parent | 5f0d5d1ee2363dbccdb90c5bfe88589219d10af1 (diff) |
Added features to FaceEnrollClient
Test: Verified flags made it down to HAL
Bug: 186665578
Change-Id: I3d704221a9fec51d652ead570ce3b308bccf7830
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 { |