From 0c596f11e227cad08991a327a19bd68968847a19 Mon Sep 17 00:00:00 2001 From: Wenhui Yang Date: Wed, 2 Aug 2023 18:01:27 +0000 Subject: [PATCH] [3/n] FRR notifications Add methods in BiometricNotificationUtils for face and fp enrollment. Bug: 258872351 Test: atest AuthenticationStatsCollectorTest Change-Id: Id1100a6cb8113c4c52bfdb5d64b7e8b086d3d559 --- core/res/res/values/symbols.xml | 3 + .../AuthenticationStatsCollector.java | 50 ++++- .../sensors/BiometricNotification.java | 36 ++++ .../sensors/BiometricNotificationImpl.java | 38 ++++ .../sensors/BiometricNotificationUtils.java | 115 +++++++++-- .../sensors/face/aidl/FaceEnrollClient.java | 3 +- .../sensors/face/aidl/FaceProvider.java | 3 +- .../biometrics/sensors/face/hidl/Face10.java | 6 +- .../sensors/face/hidl/FaceEnrollClient.java | 9 + .../aidl/FingerprintEnrollClient.java | 7 + .../fingerprint/aidl/FingerprintProvider.java | 3 +- .../fingerprint/hidl/Fingerprint21.java | 3 +- .../hidl/FingerprintEnrollClient.java | 7 + .../AuthenticationStatsCollectorTest.java | 185 +++++++++++++++++- 14 files changed, 431 insertions(+), 37 deletions(-) create mode 100644 services/core/java/com/android/server/biometrics/sensors/BiometricNotification.java create mode 100644 services/core/java/com/android/server/biometrics/sensors/BiometricNotificationImpl.java diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index 9cc78ad4d852c..3babf49da0150 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2623,6 +2623,8 @@ + + @@ -2690,6 +2692,7 @@ + diff --git a/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java b/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java index 85125d294015b..0380756addeab 100644 --- a/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java +++ b/services/core/java/com/android/server/biometrics/AuthenticationStatsCollector.java @@ -19,9 +19,13 @@ package com.android.server.biometrics; import android.annotation.NonNull; import android.annotation.Nullable; import android.content.Context; +import android.content.pm.PackageManager; +import android.hardware.face.FaceManager; +import android.hardware.fingerprint.FingerprintManager; import com.android.internal.R; import com.android.internal.annotations.VisibleForTesting; +import com.android.server.biometrics.sensors.BiometricNotification; import java.util.HashMap; import java.util.Map; @@ -50,13 +54,16 @@ public class AuthenticationStatsCollector { @NonNull private final Map mUserAuthenticationStatsMap; @NonNull private AuthenticationStatsPersister mAuthenticationStatsPersister; + @NonNull private BiometricNotification mBiometricNotification; - public AuthenticationStatsCollector(@NonNull Context context, int modality) { + public AuthenticationStatsCollector(@NonNull Context context, int modality, + @NonNull BiometricNotification biometricNotification) { mContext = context; mThreshold = context.getResources() .getFraction(R.fraction.config_biometricNotificationFrrThreshold, 1, 1); mUserAuthenticationStatsMap = new HashMap<>(); mModality = modality; + mBiometricNotification = biometricNotification; } private void initializeUserAuthenticationStatsMap() { @@ -86,16 +93,45 @@ public class AuthenticationStatsCollector { sendNotificationIfNeeded(userId); } + /** Check if a notification should be sent after a calculation cycle. */ private void sendNotificationIfNeeded(int userId) { AuthenticationStats authenticationStats = mUserAuthenticationStatsMap.get(userId); - if (authenticationStats.getTotalAttempts() >= MINIMUM_ATTEMPTS) { - // Send notification if FRR exceeds the threshold - if (authenticationStats.getEnrollmentNotifications() < MAXIMUM_ENROLLMENT_NOTIFICATIONS - && authenticationStats.getFrr() >= mThreshold) { - // TODO(wenhuiy): Send notifications. - } + if (authenticationStats.getTotalAttempts() < MINIMUM_ATTEMPTS) { + return; + } + // Don't send notification if FRR below the threshold. + if (authenticationStats.getEnrollmentNotifications() >= MAXIMUM_ENROLLMENT_NOTIFICATIONS + || authenticationStats.getFrr() < mThreshold) { authenticationStats.resetData(); + return; + } + + authenticationStats.resetData(); + + final PackageManager packageManager = mContext.getPackageManager(); + + // Don't send notification to single-modality devices. + if (!packageManager.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT) + || !packageManager.hasSystemFeature(PackageManager.FEATURE_FACE)) { + return; + } + + final FaceManager faceManager = mContext.getSystemService(FaceManager.class); + final boolean hasEnrolledFace = faceManager.hasEnrolledTemplates(userId); + + final FingerprintManager fingerprintManager = mContext + .getSystemService(FingerprintManager.class); + final boolean hasEnrolledFingerprint = fingerprintManager.hasEnrolledTemplates(userId); + + // Don't send notification when both face and fingerprint are enrolled. + if (hasEnrolledFace && hasEnrolledFingerprint) { + return; + } + if (hasEnrolledFace && !hasEnrolledFingerprint) { + mBiometricNotification.sendFpEnrollNotification(mContext); + } else if (!hasEnrolledFace && hasEnrolledFingerprint) { + mBiometricNotification.sendFaceEnrollNotification(mContext); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricNotification.java b/services/core/java/com/android/server/biometrics/sensors/BiometricNotification.java new file mode 100644 index 0000000000000..90e18604d9456 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricNotification.java @@ -0,0 +1,36 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics.sensors; + +import android.annotation.NonNull; +import android.content.Context; + +/** + * Interface for biometrics to send notifications. + */ +public interface BiometricNotification { + + /** + * Sends a face enrollment notification. + */ + void sendFaceEnrollNotification(@NonNull Context context); + + /** + * Sends a fingerprint enrollment notification. + */ + void sendFpEnrollNotification(@NonNull Context context); +} diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationImpl.java b/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationImpl.java new file mode 100644 index 0000000000000..7b420468f6285 --- /dev/null +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationImpl.java @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2023 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.biometrics.sensors; + +import android.annotation.NonNull; +import android.content.Context; + +import com.android.server.biometrics.AuthenticationStatsCollector; + +/** + * Implementation to send biometric notifications for {@link AuthenticationStatsCollector}. + */ +public class BiometricNotificationImpl implements BiometricNotification { + + @Override + public void sendFaceEnrollNotification(@NonNull Context context) { + BiometricNotificationUtils.showFaceEnrollNotification(context); + } + + @Override + public void sendFpEnrollNotification(@NonNull Context context) { + BiometricNotificationUtils.showFingerprintEnrollNotification(context); + } +} diff --git a/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java b/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java index f516a4930a588..230ba63fe5e18 100644 --- a/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java @@ -35,9 +35,22 @@ import com.android.internal.R; public class BiometricNotificationUtils { private static final String TAG = "BiometricNotificationUtils"; - private static final String RE_ENROLL_NOTIFICATION_TAG = "FaceService"; - private static final String BAD_CALIBRATION_NOTIFICATION_TAG = "FingerprintService"; + private static final String FACE_RE_ENROLL_NOTIFICATION_TAG = "FaceReEnroll"; + private static final String FACE_ENROLL_NOTIFICATION_TAG = "FaceEnroll"; + private static final String FINGERPRINT_ENROLL_NOTIFICATION_TAG = "FingerprintEnroll"; + private static final String BAD_CALIBRATION_NOTIFICATION_TAG = "FingerprintBadCalibration"; private static final String KEY_RE_ENROLL_FACE = "re_enroll_face_unlock"; + private static final String FACE_SETTINGS_ACTION = "android.settings.FACE_SETTINGS"; + private static final String FINGERPRINT_SETTINGS_ACTION = + "android.settings.FINGERPRINT_SETTINGS"; + private static final String FACE_ENROLL_ACTION = "android.settings.FACE_ENROLL"; + private static final String FINGERPRINT_ENROLL_ACTION = "android.settings.FINGERPRINT_ENROLL"; + private static final String SETTINGS_PACKAGE = "com.android.settings"; + private static final String FACE_ENROLL_CHANNEL = "FaceEnrollNotificationChannel"; + private static final String FACE_RE_ENROLL_CHANNEL = "FaceReEnrollNotificationChannel"; + private static final String FINGERPRINT_ENROLL_CHANNEL = "FingerprintEnrollNotificationChannel"; + private static final String FINGERPRINT_BAD_CALIBRATION_CHANNEL = + "FingerprintBadCalibrationNotificationChannel"; private static final int NOTIFICATION_ID = 1; private static final long NOTIFICATION_INTERVAL_MS = 24 * 60 * 60 * 1000; private static long sLastAlertTime = 0; @@ -56,18 +69,67 @@ public class BiometricNotificationUtils { final String content = context.getString(R.string.face_recalibrate_notification_content); - final Intent intent = new Intent("android.settings.FACE_SETTINGS"); - intent.setPackage("com.android.settings"); + final Intent intent = new Intent(FACE_SETTINGS_ACTION); + intent.setPackage(SETTINGS_PACKAGE); intent.putExtra(KEY_RE_ENROLL_FACE, true); final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0 /* requestCode */, intent, PendingIntent.FLAG_IMMUTABLE /* flags */, null /* options */, UserHandle.CURRENT); - final String channelName = "FaceEnrollNotificationChannel"; + showNotificationHelper(context, name, title, content, pendingIntent, FACE_RE_ENROLL_CHANNEL, + FACE_RE_ENROLL_NOTIFICATION_TAG, Notification.VISIBILITY_SECRET); + } - showNotificationHelper(context, name, title, content, pendingIntent, channelName, - RE_ENROLL_NOTIFICATION_TAG); + /** + * Shows a face enrollment notification. + */ + public static void showFaceEnrollNotification(@NonNull Context context) { + + final String name = + context.getString(R.string.face_recalibrate_notification_name); + final String title = + context.getString(R.string.fingerprint_setup_notification_title); + final String content = + context.getString(R.string.face_setup_notification_title); + + final Intent intent = new Intent(FACE_ENROLL_ACTION); + intent.setPackage(SETTINGS_PACKAGE); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + + final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, + 0 /* requestCode */, intent, PendingIntent.FLAG_IMMUTABLE /* flags */, + null /* options */, UserHandle.CURRENT); + + showNotificationHelper(context, name, title, content, pendingIntent, FACE_ENROLL_CHANNEL, + FACE_ENROLL_NOTIFICATION_TAG, Notification.VISIBILITY_PUBLIC); + } + + /** + * Shows a fingerprint enrollment notification. + */ + public static void showFingerprintEnrollNotification(@NonNull Context context) { + + final String name = + context.getString(R.string.fingerprint_recalibrate_notification_name); + final String title = + context.getString(R.string.fingerprint_setup_notification_title); + final String content = + context.getString(R.string.fingerprint_setup_notification_content); + + final Intent intent = new Intent(FINGERPRINT_ENROLL_ACTION); + intent.setPackage(SETTINGS_PACKAGE); + intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + + final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, + 0 /* requestCode */, intent, PendingIntent.FLAG_IMMUTABLE /* flags */, + null /* options */, UserHandle.CURRENT); + + showNotificationHelper(context, name, title, content, pendingIntent, + FINGERPRINT_ENROLL_CHANNEL, FINGERPRINT_ENROLL_NOTIFICATION_TAG, + Notification.VISIBILITY_PUBLIC); } /** @@ -93,22 +155,21 @@ public class BiometricNotificationUtils { final String content = context.getString(R.string.fingerprint_recalibrate_notification_content); - final Intent intent = new Intent("android.settings.FINGERPRINT_SETTINGS"); - intent.setPackage("com.android.settings"); + final Intent intent = new Intent(FINGERPRINT_SETTINGS_ACTION); + intent.setPackage(SETTINGS_PACKAGE); final PendingIntent pendingIntent = PendingIntent.getActivityAsUser(context, 0 /* requestCode */, intent, PendingIntent.FLAG_IMMUTABLE /* flags */, null /* options */, UserHandle.CURRENT); - final String channelName = "FingerprintBadCalibrationNotificationChannel"; - - showNotificationHelper(context, name, title, content, pendingIntent, channelName, - BAD_CALIBRATION_NOTIFICATION_TAG); + showNotificationHelper(context, name, title, content, pendingIntent, + FINGERPRINT_BAD_CALIBRATION_CHANNEL, BAD_CALIBRATION_NOTIFICATION_TAG, + Notification.VISIBILITY_SECRET); } private static void showNotificationHelper(Context context, String name, String title, String content, PendingIntent pendingIntent, String channelName, - String notificationTag) { + String notificationTag, int visibility) { final NotificationManager notificationManager = context.getSystemService(NotificationManager.class); final NotificationChannel channel = new NotificationChannel(channelName, name, @@ -123,7 +184,7 @@ public class BiometricNotificationUtils { .setAutoCancel(true) .setCategory(Notification.CATEGORY_SYSTEM) .setContentIntent(pendingIntent) - .setVisibility(Notification.VISIBILITY_SECRET) + .setVisibility(visibility) .build(); notificationManager.createNotificationChannel(channel); @@ -134,10 +195,30 @@ public class BiometricNotificationUtils { /** * Cancels a face re-enrollment notification */ - public static void cancelReEnrollNotification(@NonNull Context context) { + public static void cancelFaceReEnrollNotification(@NonNull Context context) { final NotificationManager notificationManager = context.getSystemService(NotificationManager.class); - notificationManager.cancelAsUser(RE_ENROLL_NOTIFICATION_TAG, NOTIFICATION_ID, + notificationManager.cancelAsUser(FACE_RE_ENROLL_NOTIFICATION_TAG, NOTIFICATION_ID, + UserHandle.CURRENT); + } + + /** + * Cancels a face enrollment notification + */ + public static void cancelFaceEnrollNotification(@NonNull Context context) { + final NotificationManager notificationManager = + context.getSystemService(NotificationManager.class); + notificationManager.cancelAsUser(FACE_ENROLL_NOTIFICATION_TAG, NOTIFICATION_ID, + UserHandle.CURRENT); + } + + /** + * Cancels a fingerprint enrollment notification + */ + public static void cancelFingerprintEnrollNotification(@NonNull Context context) { + final NotificationManager notificationManager = + context.getSystemService(NotificationManager.class); + notificationManager.cancelAsUser(FINGERPRINT_ENROLL_NOTIFICATION_TAG, NOTIFICATION_ID, UserHandle.CURRENT); } 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 722c9afbeaf8f..f55cf0549382e 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 @@ -109,7 +109,8 @@ public class FaceEnrollClient extends EnrollClient { public void start(@NonNull ClientMonitorCallback callback) { super.start(callback); - BiometricNotificationUtils.cancelReEnrollNotification(getContext()); + BiometricNotificationUtils.cancelFaceEnrollNotification(getContext()); + BiometricNotificationUtils.cancelFaceReEnrollNotification(getContext()); } @NonNull 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 a7d160c4fa604..28f0a4dadbd5b 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 @@ -56,6 +56,7 @@ import com.android.server.biometrics.log.BiometricLogger; import com.android.server.biometrics.sensors.AuthSessionCoordinator; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.BaseClientMonitor; +import com.android.server.biometrics.sensors.BiometricNotificationImpl; import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; @@ -177,7 +178,7 @@ public class FaceProvider implements IBinder.DeathRecipient, ServiceProvider { mDaemon = daemon; mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext, - BiometricsProtoEnums.MODALITY_FACE); + BiometricsProtoEnums.MODALITY_FACE, new BiometricNotificationImpl()); for (SensorProps prop : props) { final int sensorId = prop.commonProps.sensorId; 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 10991d5f91337..808626120c1e8 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 @@ -62,7 +62,7 @@ import com.android.server.biometrics.log.BiometricLogger; import com.android.server.biometrics.sensors.AcquisitionClient; import com.android.server.biometrics.sensors.AuthenticationConsumer; import com.android.server.biometrics.sensors.BaseClientMonitor; -import com.android.server.biometrics.sensors.BiometricNotificationUtils; +import com.android.server.biometrics.sensors.BiometricNotificationImpl; import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; @@ -367,7 +367,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { }); mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext, - BiometricsProtoEnums.MODALITY_FACE); + BiometricsProtoEnums.MODALITY_FACE, new BiometricNotificationImpl()); try { ActivityManager.getService().registerUserSwitchObserver(mUserSwitchObserver, TAG); @@ -615,8 +615,6 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId); - BiometricNotificationUtils.cancelReEnrollNotification(mContext); - final FaceEnrollClient client = new FaceEnrollClient(mContext, mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken, opPackageName, id, FaceUtils.getLegacyInstance(mSensorId), disabledFeatures, diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java index 16d2f7a03c6db..27b9c79516af9 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceEnrollClient.java @@ -33,6 +33,7 @@ import com.android.internal.R; import com.android.server.biometrics.Utils; import com.android.server.biometrics.log.BiometricContext; import com.android.server.biometrics.log.BiometricLogger; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.BiometricUtils; import com.android.server.biometrics.sensors.ClientMonitorCallback; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; @@ -71,6 +72,14 @@ public class FaceEnrollClient extends EnrollClient { .getIntArray(R.array.config_face_acquire_vendor_enroll_ignorelist); } + @Override + public void start(@NonNull ClientMonitorCallback callback) { + super.start(callback); + + BiometricNotificationUtils.cancelFaceEnrollNotification(getContext()); + BiometricNotificationUtils.cancelFaceReEnrollNotification(getContext()); + } + @NonNull @Override protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java index f9e08d69ef48e..46ff6b4fab1a8 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintEnrollClient.java @@ -104,6 +104,13 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps } } + @Override + public void start(@NonNull ClientMonitorCallback callback) { + super.start(callback); + + BiometricNotificationUtils.cancelFingerprintEnrollNotification(getContext()); + } + @NonNull @Override protected ClientMonitorCallback wrapCallbackForStart(@NonNull ClientMonitorCallback callback) { diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java index 2d062db12cdc9..5f4b89439fd06 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintProvider.java @@ -64,6 +64,7 @@ import com.android.server.biometrics.log.BiometricLogger; import com.android.server.biometrics.sensors.AuthSessionCoordinator; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.BaseClientMonitor; +import com.android.server.biometrics.sensors.BiometricNotificationImpl; import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; @@ -184,7 +185,7 @@ public class FingerprintProvider implements IBinder.DeathRecipient, ServiceProvi mDaemon = daemon; mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext, - BiometricsProtoEnums.MODALITY_FINGERPRINT); + BiometricsProtoEnums.MODALITY_FINGERPRINT, new BiometricNotificationImpl()); final List workaroundLocations = getWorkaroundSensorProps(context); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java index 4b07dca75e9e8..d0b71fcf2dbb1 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/Fingerprint21.java @@ -66,6 +66,7 @@ import com.android.server.biometrics.sensors.AcquisitionClient; import com.android.server.biometrics.sensors.AuthenticationClient; import com.android.server.biometrics.sensors.AuthenticationConsumer; import com.android.server.biometrics.sensors.BaseClientMonitor; +import com.android.server.biometrics.sensors.BiometricNotificationImpl; import com.android.server.biometrics.sensors.BiometricScheduler; import com.android.server.biometrics.sensors.BiometricStateCallback; import com.android.server.biometrics.sensors.ClientMonitorCallback; @@ -354,7 +355,7 @@ public class Fingerprint21 implements IHwBinder.DeathRecipient, ServiceProvider }); mAuthenticationStatsCollector = new AuthenticationStatsCollector(mContext, - BiometricsProtoEnums.MODALITY_FINGERPRINT); + BiometricsProtoEnums.MODALITY_FINGERPRINT, new BiometricNotificationImpl()); try { ActivityManager.getService().registerUserSwitchObserver(mUserSwitchObserver, TAG); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java index 6fee84a5e0570..382e7e2121f49 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java @@ -81,6 +81,13 @@ public class FingerprintEnrollClient extends EnrollClient