diff options
12 files changed, 98 insertions, 18 deletions
diff --git a/core/java/android/hardware/fingerprint/FingerprintManager.java b/core/java/android/hardware/fingerprint/FingerprintManager.java index 0819835f5fb5..68dd62343eb0 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 bcd121a2caa6..d1a5cc49be9f 100644 --- a/core/res/res/values/strings.xml +++ b/core/res/res/values/strings.xml @@ -1638,8 +1638,8 @@ <string name="fingerprint_error_hw_not_present">This device does not have a fingerprint sensor.</string> <!-- Generic error message shown when fingerprint is not available due to a security vulnerability. [CHAR LIMIT=50] --> <string name="fingerprint_error_security_update_required">Sensor temporarily disabled.</string> - <!-- Generic error message shown when fingerprint needs calibration [CHAR LIMIT=50] --> - <string name="fingerprint_error_bad_calibration">Sensor needs calibration</string> + <!-- Generic error message shown when fingerprint needs calibration [CHAR LIMIT=150] --> + <string name="fingerprint_error_bad_calibration">Can\u2019t use fingerprint sensor. Visit a repair provider</string> <!-- Template to be used to name enrolled fingerprints by default. --> <string name="fingerprint_name_template">Finger <xliff:g id="fingerId" example="1">%d</xliff:g></string> @@ -1675,6 +1675,13 @@ <!-- Contents of a notification that directs the user to enroll a fingerprint. [CHAR LIMIT=NONE] --> <string name="fingerprint_setup_notification_content">Tap to add a fingerprint</string> + <!-- Notification name shown when the system requires the user to re-calibrate their fingerprint. [CHAR LIMIT=NONE] --> + <string name="fingerprint_recalibrate_notification_name">Fingerprint Unlock</string> + <!-- Notification title shown when the system requires the user to re-calibrate their fingerprint. [CHAR LIMIT=NONE] --> + <string name="fingerprint_recalibrate_notification_title">Can\u2019t use fingerprint sensor</string> + <!-- Notification content shown when the system requires the user to re-calibrate their fingerprint. [CHAR LIMIT=NONE] --> + <string name="fingerprint_recalibrate_notification_content">Visit a repair provider.</string> + <!-- Message shown during face acquisition when the face cannot be recognized [CHAR LIMIT=50] --> <string name="face_acquired_insufficient">Couldn\u2019t capture accurate face data. Try again.</string> <!-- Message shown during face acquisition when the image is too bright [CHAR LIMIT=50] --> diff --git a/core/res/res/values/symbols.xml b/core/res/res/values/symbols.xml index ea2821526768..9976f36674f4 100644 --- a/core/res/res/values/symbols.xml +++ b/core/res/res/values/symbols.xml @@ -2541,6 +2541,9 @@ <java-symbol type="string" name="fingerprint_error_security_update_required" /> <java-symbol type="string" name="fingerprint_error_bad_calibration" /> <java-symbol type="string" name="fingerprint_acquired_immobile" /> + <java-symbol type="string" name="fingerprint_recalibrate_notification_name" /> + <java-symbol type="string" name="fingerprint_recalibrate_notification_title" /> + <java-symbol type="string" name="fingerprint_recalibrate_notification_content" /> <!-- Fingerprint config --> <java-symbol type="integer" name="config_fingerprintMaxTemplatesPerUser"/> 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 index f35a5208f6ed..1f1309d4c48c 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 2156f6462bf8..98f9fe178b9b 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<ISession> 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 ff68aa87dbbb..0400e2257321 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<ISession> { 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 0981f184e143..26c5bca7f726 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 01dd18fb5cf0..38e6f083da51 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<IBiometricsFace> { 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 85995a5cc99c..ba6ef2955461 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<ISession> 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 11849661693b..646b988545be 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<ISession> 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 45e35e34b62b..01136d619a26 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<IBiometricsFi 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/hidl/FingerprintEnrollClient.java b/services/core/java/com/android/server/biometrics/sensors/fingerprint/hidl/FingerprintEnrollClient.java index a28a3f6bd5c3..eba445f7e7b4 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 @@ -31,6 +31,7 @@ import android.os.IBinder; import android.os.RemoteException; import android.util.Slog; +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; @@ -97,6 +98,7 @@ public class FingerprintEnrollClient extends EnrollClient<IBiometricsFingerprint UdfpsHelper.getReasonFromEnrollReason(mEnrollReason), mUdfpsOverlayController, this); SidefpsHelper.showOverlay(mSidefpsController); + BiometricNotificationUtils.cancelBadCalibrationNotification(getContext()); try { // GroupId was never used. In fact, groupId is always the same as userId. getFreshDaemon().enroll(mHardwareAuthToken, getTargetUserId(), mTimeoutSec); |