From 9f070ee9c1b4e653d5837d9a4e1dd1e3f31beba2 Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Fri, 30 Sep 2022 13:39:07 +0000 Subject: [PATCH 1/2] overridePendingTransition in FingerprintSettings When FingerprintSettings got correct activity result from ConifrmLock or ChooseLock, and ready to add first fingerprint automatically, it shall set sud_slide_next_in and sud_slide_next_in in overridePendingTransition. Bug: 249981049 Test: Manually credential in FingerprintSettings Change-Id: If63441cf1a72c30d558e9f50a0aada36a08b211d --- .../biometrics/fingerprint/FingerprintSettings.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java index 44b3a406e6d..c031fe646dd 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java @@ -669,6 +669,14 @@ public class FingerprintSettings extends SubSettings { mLaunchedConfirm = false; if (resultCode == RESULT_FINISHED || resultCode == RESULT_OK) { if (data != null && BiometricUtils.containsGatekeeperPasswordHandle(data)) { + if (!mHasFirstEnrolled && !mIsEnrolling) { + final Activity activity = getActivity(); + if (activity != null) { + // Apply pending transition for auto adding first fingerprint case + activity.overridePendingTransition(R.anim.sud_slide_next_in, + R.anim.sud_slide_next_out); + } + } mFingerprintManager.generateChallenge(mUserId, (sensorId, userId, challenge) -> { mToken = BiometricUtils.requestGatekeeperHat(getActivity(), From 328be58b485b21eddaa991c28ca8d2205ebf673f Mon Sep 17 00:00:00 2001 From: Milton Wu Date: Wed, 5 Oct 2022 18:16:26 +0800 Subject: [PATCH 2/2] 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);