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 2156f6462bf81..98f9fe178b9be 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 85995a5cc99cf..ba6ef29554616 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