From 328be58b485b21eddaa991c28ca8d2205ebf673f Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Wed, 5 Oct 2022 18:16:26 +0800 Subject: [PATCH] Do not show 2nd FingerprintErrorDialog When fingerprint enrollment is stopped because of credential timeout, it pops a FingerprintErrorDialog, and this error dialog triggers onWindowFocusChanged(), and the 2nd FingerprintErrorDialog is shown. To fix this case, checking mIsCanceled flag do nothing in onWindowFocusChanged() method. On the first dialog, the 'Try again' button relaunch activity with new Intent, and it causes that activity result fails to pass back to caller. To fix this bug, add FLAG_ACTIVITY_FORWARD_RESULT on new Intent to pass result back. Bug: 248165760 Test: Manually test credential timeout behavior and dialog buttons Test: Manually test enrollment process has been cancelled for scenarios, like "Swipe down Notification Shade" and "Recents" Test: robo test for FingerprintEnrollEnrollingTest Change-Id: I4441ba026db9b594f1d6184280668a374126a2fb --- .../fingerprint/FingerprintEnrollEnrolling.java | 9 ++++++--- .../biometrics/fingerprint/FingerprintErrorDialog.java | 1 + .../fingerprint/FingerprintEnrollEnrollingTest.java | 10 ++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) 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);