From db778a5e9c44a62aafb6e8a0b1a7b52785ad6208 Mon Sep 17 00:00:00 2001 From: Joshua Mccloskey Date: Tue, 26 Jan 2021 18:27:27 -0800 Subject: [PATCH] Added debug parameter to FaceService Bug: 177244088 Test: Verified debug parameter is correctly sent to the hal. Change-Id: If71d86528f1bd9c6d0b75cdff36ec9fdbee47fa6 --- .../android/hardware/face/FaceManager.java | 23 +++++++++++-------- .../android/hardware/face/IFaceService.aidl | 2 +- .../biometrics/sensors/face/FaceService.java | 4 ++-- .../sensors/face/ServiceProvider.java | 3 ++- .../face/aidl/BiometricTestSessionImpl.java | 3 ++- .../sensors/face/aidl/FaceEnrollClient.java | 16 +++++++++++-- .../sensors/face/aidl/FaceProvider.java | 5 ++-- .../face/hidl/BiometricTestSessionImpl.java | 2 +- .../biometrics/sensors/face/hidl/Face10.java | 2 +- 9 files changed, 39 insertions(+), 21 deletions(-) diff --git a/core/java/android/hardware/face/FaceManager.java b/core/java/android/hardware/face/FaceManager.java index 75893d978749b..588bc01d7d420 100644 --- a/core/java/android/hardware/face/FaceManager.java +++ b/core/java/android/hardware/face/FaceManager.java @@ -301,7 +301,8 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan @RequiresPermission(MANAGE_BIOMETRIC) public void enroll(int userId, byte[] hardwareAuthToken, CancellationSignal cancel, EnrollmentCallback callback, int[] disabledFeatures) { - enroll(userId, hardwareAuthToken, cancel, callback, disabledFeatures, null /* surface */); + enroll(userId, hardwareAuthToken, cancel, callback, disabledFeatures, null /* surface */, + false /* debugConsent */); } /** @@ -313,18 +314,20 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan * which point the object is no longer valid. The operation can be canceled by using the * provided cancel object. * - * @param token a unique token provided by a recent creation or verification of device - * credentials (e.g. pin, pattern or password). - * @param cancel an object that can be used to cancel enrollment - * @param userId the user to whom this face will belong to - * @param callback an object to receive enrollment events - * @param surface optional camera preview surface for a single-camera device. Must be null if - * not used. + * @param hardwareAuthToken a unique token provided by a recent creation or + * verification of device credentials (e.g. pin, pattern or password). + * @param cancel an object that can be used to cancel enrollment + * @param userId the user to whom this face will belong to + * @param callback an object to receive enrollment events + * @param surface optional camera preview surface for a single-camera device. + * Must be null if not used. + * @param debugConsent a feature flag that the user has consented to debug. * @hide */ @RequiresPermission(MANAGE_BIOMETRIC) public void enroll(int userId, byte[] hardwareAuthToken, CancellationSignal cancel, - EnrollmentCallback callback, int[] disabledFeatures, @Nullable Surface surface) { + EnrollmentCallback callback, int[] disabledFeatures, @Nullable Surface surface, + boolean debugConsent) { if (callback == null) { throw new IllegalArgumentException("Must supply an enrollment callback"); } @@ -343,7 +346,7 @@ public class FaceManager implements BiometricAuthenticator, BiometricFaceConstan mEnrollmentCallback = callback; Trace.beginSection("FaceManager#enroll"); mService.enroll(userId, mToken, hardwareAuthToken, mServiceReceiver, - mContext.getOpPackageName(), disabledFeatures, surface); + mContext.getOpPackageName(), disabledFeatures, surface, debugConsent); } catch (RemoteException e) { Slog.w(TAG, "Remote exception in enroll: ", e); // Though this may not be a hardware issue, it will cause apps to give up or diff --git a/core/java/android/hardware/face/IFaceService.aidl b/core/java/android/hardware/face/IFaceService.aidl index 1b188e87e90fa..a3e7e2d2c5cbc 100644 --- a/core/java/android/hardware/face/IFaceService.aidl +++ b/core/java/android/hardware/face/IFaceService.aidl @@ -74,7 +74,7 @@ interface IFaceService { // Start face enrollment void enroll(int userId, IBinder token, in byte [] hardwareAuthToken, IFaceServiceReceiver receiver, - String opPackageName, in int [] disabledFeatures, in Surface surface); + String opPackageName, in int [] disabledFeatures, in Surface surface, boolean debugConsent); // Start remote face enrollment void enrollRemotely(int userId, IBinder token, in byte [] hardwareAuthToken, IFaceServiceReceiver receiver, diff --git a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java index 1a63dded4298f..825392762c8ce 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/FaceService.java @@ -218,7 +218,7 @@ public class FaceService extends SystemService implements BiometricServiceCallba @Override // Binder call public void enroll(int userId, final IBinder token, final byte[] hardwareAuthToken, final IFaceServiceReceiver receiver, final String opPackageName, - final int[] disabledFeatures, Surface surface) { + final int[] disabledFeatures, Surface surface, boolean debugConsent) { Utils.checkPermission(getContext(), MANAGE_BIOMETRIC); final Pair provider = getSingleProvider(); @@ -229,7 +229,7 @@ public class FaceService extends SystemService implements BiometricServiceCallba provider.second.scheduleEnroll(provider.first, token, hardwareAuthToken, userId, receiver, opPackageName, disabledFeatures, - convertSurfaceToNativeHandle(surface)); + convertSurfaceToNativeHandle(surface), debugConsent); } @Override // Binder call diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java index 32428ac131142..cc24b8960e756 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/ServiceProvider.java @@ -94,7 +94,8 @@ public interface ServiceProvider { void scheduleEnroll(int sensorId, @NonNull IBinder token, @NonNull byte[] hardwareAuthToken, int userId, @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName, - @NonNull int[] disabledFeatures, @Nullable NativeHandle surfaceHandle); + @NonNull int[] disabledFeatures, @Nullable NativeHandle surfaceHandle, + boolean debugConsent); void cancelEnrollment(int sensorId, @NonNull IBinder token); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java index 211d79c6a2636..d2673d2969c91 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/BiometricTestSessionImpl.java @@ -142,7 +142,8 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { Utils.checkPermission(mContext, TEST_BIOMETRIC); mProvider.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver, - mContext.getOpPackageName(), new int[0] /* disabledFeatures */, null /* surface */); + mContext.getOpPackageName(), new int[0] /* disabledFeatures */, null /* surface */, + false /* debugConsent */); } @Override 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 d60bb79de2d7e..afc7f6485bc94 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 @@ -23,6 +23,7 @@ import android.hardware.biometrics.BiometricFaceConstants; import android.hardware.biometrics.BiometricsProtoEnums; import android.hardware.biometrics.common.ICancellationSignal; import android.hardware.biometrics.face.EnrollmentType; +import android.hardware.biometrics.face.Feature; import android.hardware.biometrics.face.IFace; import android.hardware.biometrics.face.ISession; import android.hardware.face.Face; @@ -55,12 +56,14 @@ public class FaceEnrollClient extends EnrollClient { @Nullable private ICancellationSignal mCancellationSignal; @Nullable private android.hardware.common.NativeHandle mPreviewSurface; private final int mMaxTemplatesPerUser; + private final boolean mDebugConsent; FaceEnrollClient(@NonNull Context context, @NonNull LazyDaemon lazyDaemon, @NonNull IBinder token, @NonNull ClientMonitorCallbackConverter listener, int userId, @NonNull byte[] hardwareAuthToken, @NonNull String opPackageName, @NonNull BiometricUtils utils, @NonNull int[] disabledFeatures, int timeoutSec, - @Nullable NativeHandle previewSurface, int sensorId, int maxTemplatesPerUser) { + @Nullable NativeHandle previewSurface, int sensorId, int maxTemplatesPerUser, + boolean debugConsent) { super(context, lazyDaemon, token, listener, userId, hardwareAuthToken, opPackageName, utils, timeoutSec, BiometricsProtoEnums.MODALITY_FACE, sensorId, false /* shouldVibrate */); @@ -69,6 +72,7 @@ public class FaceEnrollClient extends EnrollClient { mEnrollIgnoreListVendor = getContext().getResources() .getIntArray(R.array.config_face_acquire_vendor_enroll_ignorelist); mMaxTemplatesPerUser = maxTemplatesPerUser; + mDebugConsent = debugConsent; try { // We must manually close the duplicate handle after it's no longer needed. // The caller is responsible for closing the original handle. @@ -116,9 +120,17 @@ public class FaceEnrollClient extends EnrollClient { try { // TODO(b/172593978): Pass features. // TODO(b/174619156): Handle accessibility enrollment. + byte[] features; + if (mDebugConsent) { + features = new byte[1]; + features[0] = Feature.DEBUG; + } else { + features = new byte[0]; + } + mCancellationSignal = getFreshDaemon().enroll(mSequentialId, HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken), - EnrollmentType.DEFAULT, new byte[0], mPreviewSurface); + EnrollmentType.DEFAULT, features, mPreviewSurface); } catch (RemoteException e) { Slog.e(TAG, "Remote exception when requesting enroll", e); onError(BiometricFaceConstants.FACE_ERROR_UNABLE_TO_PROCESS, 0 /* vendorCode */); diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java index f7feffddb3437..e685ee2899afa 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceProvider.java @@ -382,7 +382,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { public void scheduleEnroll(int sensorId, @NonNull IBinder token, @NonNull byte[] hardwareAuthToken, int userId, @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName, @NonNull int[] disabledFeatures, - @Nullable NativeHandle previewSurface) { + @Nullable NativeHandle previewSurface, boolean debugConsent) { mHandler.post(() -> { final IFace daemon = getHalInstance(); if (daemon == null) { @@ -404,7 +404,8 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { mSensors.get(sensorId).getLazySession(), token, new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken, opPackageName, FaceUtils.getInstance(sensorId), disabledFeatures, - ENROLL_TIMEOUT_SEC, previewSurface, sensorId, maxTemplatesPerUser); + ENROLL_TIMEOUT_SEC, previewSurface, sensorId, maxTemplatesPerUser, + debugConsent); scheduleForSensor(sensorId, client, new BaseClientMonitor.Callback() { @Override public void onClientFinished(@NonNull BaseClientMonitor clientMonitor, diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java index 9ed8f789aaa27..4142a52c9253b 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/BiometricTestSessionImpl.java @@ -131,7 +131,7 @@ public class BiometricTestSessionImpl extends ITestSession.Stub { mFace10.scheduleEnroll(mSensorId, new Binder(), new byte[69], userId, mReceiver, mContext.getOpPackageName(), new int[0] /* disabledFeatures */, - null /* surfaceHandle */); + null /* surfaceHandle */, false /* debugConsent */); } @Override diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java index 775d8d417dda7..e46661a5e985f 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/Face10.java @@ -602,7 +602,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { public void scheduleEnroll(int sensorId, @NonNull IBinder token, @NonNull byte[] hardwareAuthToken, int userId, @NonNull IFaceServiceReceiver receiver, @NonNull String opPackageName, @NonNull int[] disabledFeatures, - @Nullable NativeHandle surfaceHandle) { + @Nullable NativeHandle surfaceHandle, boolean debugConsent) { mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId);