diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java index d65c8c76ab0..9598019f93d 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrolling.java @@ -168,7 +168,8 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { private Vibrator mVibrator; private boolean mIsSetupWizard; private boolean mIsOrientationChanged; - private boolean mIsCanceled; + @VisibleForTesting + boolean mIsCanceled; private AccessibilityManager mAccessibilityManager; private boolean mIsAccessibilityEnabled; private LottieAnimationView mIllustrationLottie; @@ -196,7 +197,7 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { @Override public void onWindowFocusChanged(boolean hasFocus) { - if (hasFocus) { + if (hasFocus || mIsCanceled) { return; } @@ -411,8 +412,10 @@ public class FingerprintEnrollEnrolling extends BiometricsEnrollEnrolling { @VisibleForTesting void onCancelEnrollment(@IdRes int errorMsgId) { - FingerprintErrorDialog.showErrorDialog(this, errorMsgId); + // 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); mIsOrientationChanged = false; cancelEnrollment(); stopIconAnimation(); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java index 9f9efdc6995..39d35dcc09b 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintErrorDialog.java @@ -72,6 +72,7 @@ public class FingerprintErrorDialog extends InstrumentedDialogFragment { dialog.dismiss(); Activity activity = getActivity(); Intent intent = activity.getIntent(); + intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.putExtra(KEY_STATE_CANCELED, false); activity.startActivity(intent); activity.finish(); diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java index 3a890b4b63b..a9f41822346 100644 --- a/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java +++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollEnrollingTest.java @@ -150,6 +150,16 @@ public class FingerprintEnrollEnrollingTest { verify(mActivity, never()).onCancelEnrollment(anyInt()); } + @Test + public void fingerprintUdfpsOverlayEnrollment_loseFocusWithCancelFlag_shouldNotCancelAgain() { + initializeActivityFor(TYPE_UDFPS_OPTICAL); + + mActivity.mIsCanceled = true; + mActivity.onWindowFocusChanged(true); + + verify(mActivity, never()).onCancelEnrollment(anyInt()); + } + @Test public void fingerprintSfpsEnroll_PlaysAllAnimationsAssetsCorrectly() { initializeActivityFor(TYPE_POWER_BUTTON);