From c3ecb5fffb895ce55b1fd08a823ba682b3dd19cd Mon Sep 17 00:00:00 2001 From: Joshua Mccloskey Date: Fri, 18 Jun 2021 15:51:17 -0700 Subject: [PATCH] Added fingerprint bad calibration notification Test: Verified notification shows upon receiving error message and disappears after enrollment. Bug: 189133688 Change-Id: I6552326c9d9d2078fc39163be45524b3da7d00d8 --- .../fingerprint/FingerprintManager.java | 2 +- core/res/res/values/strings.xml | 11 ++- core/res/res/values/symbols.xml | 3 + ...s.java => BiometricNotificationUtils.java} | 70 +++++++++++++++++-- .../face/aidl/FaceAuthenticationClient.java | 4 +- .../sensors/face/aidl/FaceEnrollClient.java | 4 +- .../biometrics/sensors/face/hidl/Face10.java | 4 +- .../face/hidl/FaceAuthenticationClient.java | 4 +- .../aidl/FingerprintAuthenticationClient.java | 5 ++ .../aidl/FingerprintEnrollClient.java | 2 + .../hidl/FingerprintAuthenticationClient.java | 5 ++ .../hidl/FingerprintEnrollClient.java | 2 + 12 files changed, 98 insertions(+), 18 deletions(-) rename services/core/java/com/android/server/biometrics/sensors/{face/ReEnrollNotificationUtils.java => BiometricNotificationUtils.java} (50%) diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 0819835f5fb53..68dd62343eb09 100644 --- a/core/java/android/hardware/fingerprint/FingerprintManager.java +++ b/core/java/android/hardware/fingerprint/FingerprintManager.java @@ -1376,7 +1376,7 @@ public class FingerprintManager implements BiometricAuthenticator, BiometricFing return context.getString( com.android.internal.R.string.fingerprint_error_security_update_required); case FINGERPRINT_ERROR_BAD_CALIBARTION: - context.getString( + return context.getString( com.android.internal.R.string.fingerprint_error_bad_calibration); case FINGERPRINT_ERROR_VENDOR: { String[] msgArray = context.getResources().getStringArray( diff --git a/core/res/res/values/strings.xml b/core/res/res/values/strings.xml index bcd121a2caa61..d1a5cc49be9fd 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1638,8 +1638,8 @@ This device does not have a fingerprint sensor. Sensor temporarily disabled. - - Sensor needs calibration + + Can\u2019t use fingerprint sensor. Visit a repair provider Finger %d @@ -1675,6 +1675,13 @@ Tap to add a fingerprint + + Fingerprint Unlock + + Can\u2019t use fingerprint sensor + + Visit a repair provider. + Couldn\u2019t capture accurate face data. Try again. diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ea28215267683..9976f36674f4c 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2541,6 +2541,9 @@ + + + diff --git a/services/core/java/com/android/server/biometrics/sensors/face/ReEnrollNotificationUtils.java b/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java similarity index 50% rename from services/core/java/com/android/server/biometrics/sensors/face/ReEnrollNotificationUtils.java rename to services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java index f35a5208f6ed5..1f1309d4c48c0 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/ReEnrollNotificationUtils.java +++ b/services/core/java/com/android/server/biometrics/sensors/BiometricNotificationUtils.java @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.android.server.biometrics.sensors.face; +package com.android.server.biometrics.sensors; import android.annotation.NonNull; import android.app.Notification; @@ -27,11 +27,18 @@ import android.os.UserHandle; import com.android.internal.R; -public class ReEnrollNotificationUtils { +/** + * Biometric notification helper class. + */ +public class BiometricNotificationUtils { - private static final String NOTIFICATION_TAG = "FaceService"; + private static final String RE_ENROLL_NOTIFICATION_TAG = "FaceService"; + private static final String BAD_CALIBRATION_NOTIFICATION_TAG = "FingerprintService"; private static final int NOTIFICATION_ID = 1; + /** + * Shows a face re-enrollment notification. + */ public static void showReEnrollmentNotification(@NonNull Context context) { final NotificationManager notificationManager = context.getSystemService(NotificationManager.class); @@ -52,6 +59,42 @@ public class ReEnrollNotificationUtils { final String channelName = "FaceEnrollNotificationChannel"; + showNotificationHelper(context, name, title, content, pendingIntent, channelName, + RE_ENROLL_NOTIFICATION_TAG); + } + + /** + * Shows a fingerprint bad calibration notification. + */ + public static void showBadCalibrationNotification(@NonNull Context context) { + final NotificationManager notificationManager = + context.getSystemService(NotificationManager.class); + + final String name = + context.getString(R.string.fingerprint_recalibrate_notification_name); + final String title = + context.getString(R.string.fingerprint_recalibrate_notification_title); + 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 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); + } + + private static void showNotificationHelper(Context context, String name, String title, + String content, PendingIntent pendingIntent, String channelName, + String notificationTag) { + final NotificationManager notificationManager = + context.getSystemService(NotificationManager.class); final NotificationChannel channel = new NotificationChannel(channelName, name, NotificationManager.IMPORTANCE_HIGH); final Notification notification = new Notification.Builder(context, channelName) @@ -68,15 +111,28 @@ public class ReEnrollNotificationUtils { .build(); notificationManager.createNotificationChannel(channel); - notificationManager.notifyAsUser(NOTIFICATION_TAG, - NOTIFICATION_ID, notification, + notificationManager.notifyAsUser(notificationTag, NOTIFICATION_ID, notification, UserHandle.CURRENT); } - public static void cancelNotification(@NonNull Context context) { + /** + * Cancels a face re-enrollment notification + */ + public static void cancelReEnrollNotification(@NonNull Context context) { final NotificationManager notificationManager = context.getSystemService(NotificationManager.class); - notificationManager.cancelAsUser(NOTIFICATION_TAG, NOTIFICATION_ID, UserHandle.CURRENT); + notificationManager.cancelAsUser(RE_ENROLL_NOTIFICATION_TAG, NOTIFICATION_ID, + UserHandle.CURRENT); + } + + /** + * Cancels a fingerprint bad calibration notification + */ + public static void cancelBadCalibrationNotification(@NonNull Context context) { + final NotificationManager notificationManager = + context.getSystemService(NotificationManager.class); + notificationManager.cancelAsUser(BAD_CALIBRATION_NOTIFICATION_TAG, NOTIFICATION_ID, + UserHandle.CURRENT); } } diff --git a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java index 2adf5f98cee5b..da610deda0856 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/aidl/FaceAuthenticationClient.java @@ -40,11 +40,11 @@ import android.util.Slog; import com.android.internal.R; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutCache; import com.android.server.biometrics.sensors.LockoutConsumer; import com.android.server.biometrics.sensors.LockoutTracker; -import com.android.server.biometrics.sensors.face.ReEnrollNotificationUtils; import com.android.server.biometrics.sensors.face.UsageStats; import java.util.ArrayList; @@ -182,7 +182,7 @@ class FaceAuthenticationClient extends AuthenticationClient implements } break; case BiometricConstants.BIOMETRIC_ERROR_RE_ENROLL: - ReEnrollNotificationUtils.showReEnrollmentNotification(getContext()); + BiometricNotificationUtils.showReEnrollmentNotification(getContext()); break; default: break; 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 ff68aa87dbbb0..0400e2257321e 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 @@ -37,11 +37,11 @@ import android.util.Slog; import com.android.internal.R; import com.android.server.biometrics.HardwareAuthTokenUtils; import com.android.server.biometrics.Utils; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.BiometricUtils; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.EnrollClient; import com.android.server.biometrics.sensors.face.FaceUtils; -import com.android.server.biometrics.sensors.face.ReEnrollNotificationUtils; import java.io.IOException; import java.util.ArrayList; @@ -92,7 +92,7 @@ public class FaceEnrollClient extends EnrollClient { public void start(@NonNull Callback callback) { super.start(callback); - ReEnrollNotificationUtils.cancelNotification(getContext()); + BiometricNotificationUtils.cancelReEnrollNotification(getContext()); } @NonNull 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 0981f184e1437..26c5bca7f726d 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 @@ -57,6 +57,7 @@ import com.android.server.biometrics.Utils; 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.BiometricScheduler; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.EnumerateConsumer; @@ -68,7 +69,6 @@ import com.android.server.biometrics.sensors.PerformanceTracker; import com.android.server.biometrics.sensors.RemovalConsumer; import com.android.server.biometrics.sensors.face.FaceUtils; import com.android.server.biometrics.sensors.face.LockoutHalImpl; -import com.android.server.biometrics.sensors.face.ReEnrollNotificationUtils; import com.android.server.biometrics.sensors.face.ServiceProvider; import com.android.server.biometrics.sensors.face.UsageStats; @@ -574,7 +574,7 @@ public class Face10 implements IHwBinder.DeathRecipient, ServiceProvider { mHandler.post(() -> { scheduleUpdateActiveUserWithoutHandler(userId); - ReEnrollNotificationUtils.cancelNotification(mContext); + BiometricNotificationUtils.cancelReEnrollNotification(mContext); final FaceEnrollClient client = new FaceEnrollClient(mContext, mLazyDaemon, token, new ClientMonitorCallbackConverter(receiver), userId, hardwareAuthToken, diff --git a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java index 01dd18fb5cf05..38e6f083da514 100644 --- a/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/face/hidl/FaceAuthenticationClient.java @@ -35,9 +35,9 @@ import android.util.Slog; import com.android.internal.R; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutTracker; -import com.android.server.biometrics.sensors.face.ReEnrollNotificationUtils; import com.android.server.biometrics.sensors.face.UsageStats; import java.util.ArrayList; @@ -195,7 +195,7 @@ class FaceAuthenticationClient extends AuthenticationClient { mLastAcquire = acquireInfo; if (acquireInfo == FaceManager.FACE_ACQUIRED_RECALIBRATE) { - ReEnrollNotificationUtils.showReEnrollmentNotification(getContext()); + BiometricNotificationUtils.showReEnrollmentNotification(getContext()); } final boolean shouldSend = shouldSend(acquireInfo, vendorCode); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java index 3c9d802cb4b18..08732e3158bd2 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/aidl/FingerprintAuthenticationClient.java @@ -33,6 +33,7 @@ import android.util.Slog; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutCache; import com.android.server.biometrics.sensors.LockoutConsumer; @@ -102,6 +103,10 @@ class FingerprintAuthenticationClient extends AuthenticationClient imp public void onError(int errorCode, int vendorCode) { super.onError(errorCode, vendorCode); + if (errorCode == BiometricFingerprintConstants.FINGERPRINT_ERROR_BAD_CALIBARTION) { + BiometricNotificationUtils.showBadCalibrationNotification(getContext()); + } + UdfpsHelper.hideUdfpsOverlay(getSensorId(), mUdfpsOverlayController); } 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 11849661693b3..646b988545be4 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 @@ -35,6 +35,7 @@ import android.os.RemoteException; import android.util.Slog; import com.android.server.biometrics.HardwareAuthTokenUtils; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.BiometricUtils; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.EnrollClient; @@ -150,6 +151,7 @@ class FingerprintEnrollClient extends EnrollClient implements Udfps { UdfpsHelper.getReasonFromEnrollReason(mEnrollReason), mUdfpsOverlayController, this); SidefpsHelper.showOverlay(mSidefpsController); + BiometricNotificationUtils.cancelBadCalibrationNotification(getContext()); try { mCancellationSignal = getFreshDaemon().enroll( HardwareAuthTokenUtils.toHardwareAuthToken(mHardwareAuthToken)); diff --git a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java index 45e35e34b62b8..01136d619a26e 100644 --- a/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java +++ b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintAuthenticationClient.java @@ -32,6 +32,7 @@ import android.util.Slog; import com.android.server.biometrics.Utils; import com.android.server.biometrics.sensors.AuthenticationClient; +import com.android.server.biometrics.sensors.BiometricNotificationUtils; import com.android.server.biometrics.sensors.ClientMonitorCallbackConverter; import com.android.server.biometrics.sensors.LockoutTracker; import com.android.server.biometrics.sensors.fingerprint.Udfps; @@ -111,6 +112,10 @@ class FingerprintAuthenticationClient extends AuthenticationClient