diff --git a/res/values/strings.xml b/res/values/strings.xml index c19d3e3a1eb..ed2b77d5871 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1029,13 +1029,21 @@ Touch the sensor on the back of your phone. Use your index finger. - Enrollment was not completed + Can\u2019t complete fingerprint setup + + You can try again now or set up your fingerprint later in Settings. + + You can try again now or set up your fingerprint later. Fingerprint setup timed out + + You can set up your fingerprint later in Settings. + + Something went wrong. You can set up your fingerprint later in Settings. - You can set up your fingerprint later in Settings. + You can set up your fingerprint later. - Fingerprint enrollment didn\'t work. Try again or use a different finger. + Something went wrong. You can set up your fingerprint later. Add another diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index 938c075cb70..7e764059b9a 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -505,7 +505,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { // showErrorDialog() will cause onWindowFocusChanged(false), set mIsCanceled to false // before showErrorDialog() to prevent that another error dialog is triggered again. mIsCanceled = true; - FingerprintErrorDialog.showErrorDialog(this, errorMsgId); + FingerprintErrorDialog.showErrorDialog(this, errorMsgId, + this instanceof SetupFingerprintEnrollEnrolling); cancelEnrollment(); stopIconAnimation(); stopListenOrientationEvent(); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java index e54403170eb..aadc9329e4c 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java @@ -329,7 +329,8 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements if (mNextClicked && errMsgId == FingerprintManager.FINGERPRINT_ERROR_CANCELED) { proceedToEnrolling(false /* cancelEnrollment */); } else { - FingerprintErrorDialog.showErrorDialog(this, errMsgId); + FingerprintErrorDialog.showErrorDialog(this, errMsgId, + this instanceof SetupFingerprintEnrollFindSensor); } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java index f0a87a4a889..55745d043f6 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java @@ -18,11 +18,14 @@ package com.android.settings.biometrics.fingerprint; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED; import static com.android.settings.biometrics.BiometricEnrollBase.RESULT_TIMEOUT; +import static com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling.KEY_STATE_CANCELED; import android.app.Activity; import android.app.Dialog; import android.app.settings.SettingsEnums; +import android.content.Intent; import android.hardware.biometrics.BiometricConstants; +import android.hardware.biometrics.BiometricFingerprintConstants; import android.hardware.fingerprint.FingerprintManager; import android.os.Bundle; @@ -48,6 +51,8 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment { final CharSequence errorTitle = getArguments().getCharSequence(KEY_ERROR_TITLE); final int errMsgId = getArguments().getInt(KEY_ERROR_ID); final boolean wasTimeout = errMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT; + final boolean showTryAgain = errMsgId + == BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS; builder.setTitle(errorTitle) .setMessage(errorString) @@ -64,12 +69,33 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment { } activity.finish(); }); + + if (showTryAgain) { + builder.setPositiveButton( + R.string.security_settings_fingerprint_enroll_dialog_try_again, + (dialog, which) -> { + dialog.dismiss(); + final Activity activity = getActivity(); + final Intent intent = activity.getIntent(); + intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); + intent.putExtra(KEY_STATE_CANCELED, false); + activity.startActivity(intent); + activity.finish(); + }) + .setNegativeButton(R.string.security_settings_fingerprint_enroll_dialog_ok, + (dialog, which) -> { + dialog.dismiss(); + final Activity activity = getActivity(); + activity.setResult(RESULT_FINISHED); + activity.finish(); + }); + } final AlertDialog dialog = builder.create(); dialog.setCanceledOnTouchOutside(false); return dialog; } - public static void showErrorDialog(BiometricEnrollBase host, int errMsgId) { + public static void showErrorDialog(BiometricEnrollBase host, int errMsgId, boolean isSetup) { if (host.isFinishing()) { return; } @@ -77,12 +103,39 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment { if (fragmentManager.isDestroyed() || fragmentManager.isStateSaved()) { return; } - CharSequence errMsg = host.getText(getErrorMessage(errMsgId)); + CharSequence errMsg; + if (isSetup) { + errMsg = host.getText(getSetupErrorMessage(errMsgId)); + } else { + errMsg = host.getText(getErrorMessage(errMsgId)); + } final CharSequence errTitle = host.getText(getErrorTitle(errMsgId)); final FingerprintErrorDialog dialog = newInstance(errMsg, errTitle, errMsgId); dialog.show(fragmentManager, FingerprintErrorDialog.class.getName()); } + /** + * Gets dialog message as error id inside {@link FingerprintManager} + */ + public static int getSetupErrorMessage(int errMsgId) { + switch (errMsgId) { + case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT: + // This message happens when the underlying crypto layer decides to revoke + // the enrollment auth token. + return R.string + .security_settings_fingerprint_enroll_error_timeout_dialog_message_setup; + case FingerprintManager.FINGERPRINT_ERROR_BAD_CALIBRATION: + return R.string.security_settings_fingerprint_bad_calibration; + case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS: + return R.string + .security_settings_fingerprint_enroll_error_unable_to_process_message_setup; + default: + // There's nothing specific to tell the user about. Ask them to try again. + return R.string + .security_settings_fingerprint_enroll_error_generic_dialog_message_setup; + } + } + /** * Gets dialog message as error id inside {@link FingerprintManager} */ @@ -94,6 +147,9 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment { return R.string.security_settings_fingerprint_enroll_error_timeout_dialog_message; case FingerprintManager.FINGERPRINT_ERROR_BAD_CALIBRATION: return R.string.security_settings_fingerprint_bad_calibration; + case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS: + return R.string + .security_settings_fingerprint_enroll_error_unable_to_process_message; default: // There's nothing specific to tell the user about. Ask them to try again. return R.string.security_settings_fingerprint_enroll_error_generic_dialog_message; @@ -105,11 +161,11 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment { */ public static int getErrorTitle(int errMsgId) { switch (errMsgId) { - case FingerprintManager.FINGERPRINT_ERROR_UNABLE_TO_PROCESS: + case FingerprintManager.FINGERPRINT_ERROR_TIMEOUT: + return R.string.security_settings_fingerprint_enroll_error_dialog_title; + default: return R.string .security_settings_fingerprint_enroll_error_unable_to_process_dialog_title; - default: - return R.string.security_settings_fingerprint_enroll_error_dialog_title; } }