diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java index dbbe30beaa5..ec215670d0a 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java +++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java @@ -58,6 +58,7 @@ import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockPattern; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.google.android.setupcompat.util.WizardManagerHelper; import com.google.android.setupdesign.transition.TransitionHelper; @@ -452,7 +453,9 @@ public class BiometricEnrollActivity extends InstrumentedActivity { Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */); } else if (biometricStatus != Utils.BiometricStatus.NOT_ACTIVE) { - finish(); + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(this, + biometricStatus); } } } else { @@ -486,7 +489,11 @@ public class BiometricEnrollActivity extends InstrumentedActivity { } break; case BIOMETRIC_AUTH_REQUEST: - if (resultCode != RESULT_OK) { + if (resultCode == ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT) { + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(this, + Utils.BiometricStatus.LOCKOUT); + } else if (resultCode != RESULT_OK) { finish(); } default: diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 6f9b94a7fba..1f7b3e512b2 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -39,6 +39,7 @@ import com.android.settings.SetupWizardUtils; import com.android.settings.Utils; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settings.password.SetupSkipDialog; import com.google.android.setupcompat.template.FooterBarMixin; @@ -425,7 +426,9 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase Utils.launchBiometricPromptForMandatoryBiometrics(this, BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */); } else if (biometricStatus != Utils.BiometricStatus.NOT_ACTIVE) { - finish(); + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(this, + biometricStatus); } } else { setResult(resultCode, data); @@ -457,7 +460,13 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase } } else if (requestCode == BIOMETRIC_AUTH_REQUEST) { if (resultCode != RESULT_OK) { - finish(); + if (resultCode == ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT) { + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(this, + Utils.BiometricStatus.LOCKOUT); + } else { + finish(); + } } } super.onActivityResult(requestCode, resultCode, data); diff --git a/src/com/android/settings/biometrics/IdentityCheckBiometricErrorDialog.java b/src/com/android/settings/biometrics/IdentityCheckBiometricErrorDialog.java index 47decddc4c0..a4b10fc2e72 100644 --- a/src/com/android/settings/biometrics/IdentityCheckBiometricErrorDialog.java +++ b/src/com/android/settings/biometrics/IdentityCheckBiometricErrorDialog.java @@ -50,9 +50,11 @@ public class IdentityCheckBiometricErrorDialog extends InstrumentedDialogFragmen private static final String KEY_ERROR_CODE = "key_error_code"; private static final String KEY_TWO_FACTOR_AUTHENTICATION = "key_two_factor_authentication"; + private static final String KEY_FINISH_ACTIVITY = "key_finish_activity"; private String mActionIdentityCheckSettings = Settings.ACTION_SETTINGS; @Nullable private BroadcastReceiver mBroadcastReceiver; + private boolean mShouldFinishActivity = false; @NonNull @Override @@ -70,6 +72,9 @@ public class IdentityCheckBiometricErrorDialog extends InstrumentedDialogFragmen R.string.identity_check_settings_action); mActionIdentityCheckSettings = identityCheckSettingsAction.isEmpty() ? mActionIdentityCheckSettings : identityCheckSettingsAction; + mShouldFinishActivity = getArguments().getBoolean( + KEY_FINISH_ACTIVITY); + setTitle(customView, isLockoutError); setBody(customView, isLockoutError, twoFactorAuthentication); alertDialogBuilder.setView(customView); @@ -94,31 +99,54 @@ public class IdentityCheckBiometricErrorDialog extends InstrumentedDialogFragmen } @Override - public void dismiss() { - super.dismiss(); + public void onDestroyView() { + super.onDestroyView(); if (mBroadcastReceiver != null) { getContext().unregisterReceiver(mBroadcastReceiver); mBroadcastReceiver = null; } + if (mShouldFinishActivity && getActivity() != null) { + getActivity().finish(); + } } /** * Shows an error dialog to prompt the user to resolve biometric errors for identity check. * @param fragmentActivity calling activity * @param errorCode refers to the biometric error + * @param twoFactorAuthentication if the surface requests LSKF before identity check auth */ public static void showBiometricErrorDialog(FragmentActivity fragmentActivity, Utils.BiometricStatus errorCode, boolean twoFactorAuthentication) { + showBiometricErrorDialog(fragmentActivity, errorCode, twoFactorAuthentication, + false /* finishActivityOnDismiss */); + } + + /** + * Shows an error dialog to prompt the user to resolve biometric errors for identity check. + * Finishes the activity once the dialog is dismissed. + * @param fragmentActivity calling activity + * @param errorCode refers to the biometric error + */ + public static void showBiometricErrorDialogAndFinishActivityOnDismiss( + FragmentActivity fragmentActivity, Utils.BiometricStatus errorCode) { + showBiometricErrorDialog(fragmentActivity, errorCode, true /* twoFactorAuthentication */, + true /* finishActivityOnDismiss */); + } + + private static void showBiometricErrorDialog(FragmentActivity fragmentActivity, + Utils.BiometricStatus errorCode, boolean twoFactorAuthentication, + boolean finishActivityOnDismiss) { final IdentityCheckBiometricErrorDialog identityCheckBiometricErrorDialog = new IdentityCheckBiometricErrorDialog(); final Bundle args = new Bundle(); args.putCharSequence(KEY_ERROR_CODE, errorCode.name()); args.putBoolean(KEY_TWO_FACTOR_AUTHENTICATION, twoFactorAuthentication); + args.putBoolean(KEY_FINISH_ACTIVITY, finishActivityOnDismiss); identityCheckBiometricErrorDialog.setArguments(args); identityCheckBiometricErrorDialog.show(fragmentActivity.getSupportFragmentManager(), IdentityCheckBiometricErrorDialog.class.getName()); } - private void setTitle(View view, boolean lockout) { final TextView titleTextView = view.findViewById(R.id.title); if (lockout) { diff --git a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java index 43b5da28044..1d8b7a10a3c 100644 --- a/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java +++ b/src/com/android/settings/biometrics/combination/BiometricsSettingsBase.java @@ -46,10 +46,12 @@ import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricStatusPreferenceController; import com.android.settings.biometrics.BiometricUtils; +import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settingslib.core.AbstractPreferenceController; import com.android.settingslib.transition.SettingsTransitionHelper; @@ -323,7 +325,9 @@ public abstract class BiometricsSettingsBase extends DashboardFragment { BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */); } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) { - finish(); + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + biometricAuthStatus); return; } } else { @@ -339,7 +343,13 @@ public abstract class BiometricsSettingsBase extends DashboardFragment { } else if (requestCode == BIOMETRIC_AUTH_REQUEST) { mBiometricsAuthenticationRequested = false; if (resultCode != RESULT_OK) { - finish(); + if (resultCode == ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT) { + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + Utils.BiometricStatus.LOCKOUT); + } else { + finish(); + } } } } diff --git a/src/com/android/settings/biometrics/face/FaceSettings.java b/src/com/android/settings/biometrics/face/FaceSettings.java index d42b570b30d..5a3949b8923 100644 --- a/src/com/android/settings/biometrics/face/FaceSettings.java +++ b/src/com/android/settings/biometrics/face/FaceSettings.java @@ -45,9 +45,11 @@ import com.android.settings.SettingsActivity; import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; +import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.RestrictedLockUtilsInternal; import com.android.settingslib.core.AbstractPreferenceController; @@ -325,7 +327,9 @@ public class FaceSettings extends DashboardFragment { BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */); } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) { - finish(); + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + biometricAuthStatus); } } } else if (requestCode == ENROLL_REQUEST) { @@ -336,7 +340,13 @@ public class FaceSettings extends DashboardFragment { } else if (requestCode == BIOMETRIC_AUTH_REQUEST) { mBiometricsAuthenticationRequested = false; if (resultCode != RESULT_OK) { - finish(); + if (resultCode == ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT) { + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + Utils.BiometricStatus.LOCKOUT); + } else { + finish(); + } } } } diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 125691fbf1c..a57a6e04fee 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -71,12 +71,14 @@ import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; import com.android.settings.biometrics.GatekeeperPasswordProvider; +import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog; import com.android.settings.core.SettingsBaseActivity; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.dashboard.DashboardFragment; import com.android.settings.overlay.FeatureFactory; import com.android.settings.password.ChooseLockGeneric; import com.android.settings.password.ChooseLockSettingsHelper; +import com.android.settings.password.ConfirmDeviceCredentialActivity; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settingslib.HelpUtils; import com.android.settingslib.RestrictedLockUtils; @@ -1010,7 +1012,10 @@ public class FingerprintSettings extends SubSettings { BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */); } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) { - finish(); + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss( + getActivity(), + biometricAuthStatus); } } else { Log.d(TAG, "Data null or GK PW missing"); @@ -1065,7 +1070,13 @@ public class FingerprintSettings extends SubSettings { } else if (requestCode == BIOMETRIC_AUTH_REQUEST) { mBiometricsAuthenticationRequested = false; if (resultCode != RESULT_OK) { - finish(); + if (resultCode == ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT) { + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + Utils.BiometricStatus.LOCKOUT); + } else { + finish(); + } } } } diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 09091102f24..ef6a9ad7559 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -84,6 +84,7 @@ import com.android.settings.Utils; import com.android.settings.biometrics.BiometricEnrollActivity; import com.android.settings.biometrics.BiometricEnrollBase; import com.android.settings.biometrics.BiometricUtils; +import com.android.settings.biometrics.IdentityCheckBiometricErrorDialog; import com.android.settings.core.SubSettingLauncher; import com.android.settings.core.instrumentation.InstrumentedDialogFragment; import com.android.settings.safetycenter.LockScreenSafetySource; @@ -500,11 +501,18 @@ public class ChooseLockGeneric extends SettingsActivity { BIOMETRIC_AUTH_REQUEST, mUserId, true /* hideBackground */); } else if (biometricAuthStatus != Utils.BiometricStatus.NOT_ACTIVE) { - finish(); + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + biometricAuthStatus); } } else if (requestCode == BIOMETRIC_AUTH_REQUEST) { if (resultCode == Activity.RESULT_OK) { mBiometricsAuthSuccessful = true; + } else if (resultCode + == ConfirmDeviceCredentialActivity.BIOMETRIC_LOCKOUT_ERROR_RESULT) { + IdentityCheckBiometricErrorDialog + .showBiometricErrorDialogAndFinishActivityOnDismiss(getActivity(), + Utils.BiometricStatus.LOCKOUT); } else { finish(); }