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
This commit is contained in:
Milton Wu
2022-10-05 18:16:26 +08:00
parent a94259a716
commit 328be58b48
3 changed files with 17 additions and 3 deletions

View File

@@ -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();

View File

@@ -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();

View File

@@ -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);