diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java index 98cface2bc1..ad9b64e3fcb 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollBase.java +++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java @@ -60,6 +60,8 @@ public abstract class BiometricEnrollBase extends InstrumentedActivity { public static final String EXTRA_KEY_SENSOR_ID = "sensor_id"; public static final String EXTRA_KEY_CHALLENGE = "challenge"; public static final String EXTRA_KEY_MODALITY = "sensor_modality"; + public static final String EXTRA_FINISHED_ENROLL_FACE = "finished_enrolling_face"; + public static final String EXTRA_FINISHED_ENROLL_FINGERPRINT = "finished_enrolling_fingerprint"; /** * Used by the choose fingerprint wizard to indicate the wizard is diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java index 61783c5164c..62114d25353 100644 --- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java @@ -302,6 +302,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + // TODO(b/229924331): Add tests for the enrollment flows. final boolean cameFromMultiBioFpAuthAddAnother = requestCode == BiometricUtils.REQUEST_ADD_ANOTHER && BiometricUtils.isMultiBiometricFingerprintEnrollmentFlow(this); @@ -397,14 +398,20 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase return isResultSkipped(resultCode) || isResultFinished(resultCode); } - private void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { + protected void removeEnrollNextBiometric() { + getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE); + getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT); + } + + protected void removeEnrollNextBiometricIfSkipEnroll(@Nullable Intent data) { if (data != null && data.getBooleanExtra( MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) { - getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE); - getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT); + removeEnrollNextBiometric(); } - + } + protected void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) { + removeEnrollNextBiometricIfSkipEnroll(data); if (resultCode == RESULT_SKIP) { onEnrollmentSkipped(data); } else if (resultCode == RESULT_FINISHED) { diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java index 6509d4e6e2e..d2d356b1104 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java @@ -227,6 +227,10 @@ public class FaceEnrollEducation extends BiometricEnrollBase { protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); mResultIntent = data; + boolean hasEnrolledFace = false; + if (data != null) { + hasEnrolledFace = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FACE, false); + } if (resultCode == RESULT_TIMEOUT) { setResult(resultCode, data); finish(); @@ -234,7 +238,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase { || requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST) { // If the user finished or skipped enrollment, finish this activity if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED - || resultCode == SetupSkipDialog.RESULT_SKIP) { + || resultCode == SetupSkipDialog.RESULT_SKIP || hasEnrolledFace) { setResult(resultCode, data); finish(); } diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java index f8f34f91092..aa081bd82dc 100644 --- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java @@ -176,7 +176,18 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction { || requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST; final boolean isResultSkipOrFinished = resultCode == RESULT_SKIP || resultCode == SetupSkipDialog.RESULT_SKIP || resultCode == RESULT_FINISHED; - if (isEnrollRequest && isResultSkipOrFinished) { + boolean hasEnrolledFace = false; + if (data != null) { + hasEnrolledFace = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FACE, false); + } + + if (resultCode == RESULT_CANCELED && hasEnrolledFace) { + setResult(resultCode, data); + finish(); + return; + } + + if (isEnrollRequest && isResultSkipOrFinished || hasEnrolledFace) { data = setSkipPendingEnroll(data); } super.onActivityResult(requestCode, resultCode, data); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java index 66059e71256..547869f7393 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java @@ -289,6 +289,17 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + boolean enrolledFingerprint = false; + if (data != null) { + enrolledFingerprint = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FINGERPRINT, false); + } + + if (resultCode == RESULT_CANCELED && enrolledFingerprint) { + setResult(resultCode, data); + finish(); + return; + } + if (requestCode == CONFIRM_REQUEST) { if (resultCode == RESULT_OK && data != null) { throw new IllegalStateException("Pretty sure this is dead code"); diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java index 784c5438a38..0f0d047272d 100644 --- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java +++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFinish.java @@ -79,9 +79,10 @@ public class FingerprintEnrollFinish extends BiometricEnrollBase { @Override public void onBackPressed() { - super.onBackPressed(); - updateFingerprintSuggestionEnableState(); + Intent intent = getIntent().putExtra(EXTRA_FINISHED_ENROLL_FINGERPRINT, true); + setResult(RESULT_CANCELED, intent); + finish(); } @Override diff --git a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java index e88e50d9425..af25ecd8e28 100644 --- a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java +++ b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java @@ -74,6 +74,16 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { + boolean hasEnrolledFace = false; + boolean hasEnrolledFingerprint = false; + if (data != null) { + hasEnrolledFace = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FACE, false); + hasEnrolledFingerprint = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FINGERPRINT, false); + // If we've enrolled a face, we can remove the pending intent to launch FaceEnrollIntro. + if (hasEnrolledFace) { + removeEnrollNextBiometric(); + } + } if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST && isKeyguardSecure()) { // if lock was already present, do not return intent data since it must have been // reported in previous attempts @@ -85,6 +95,34 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu if (resultCode == RESULT_FINISHED) { data = setFingerprintCount(data); } + + if (resultCode == RESULT_CANCELED && hasEnrolledFingerprint) { + // If we are coming from a back press from an already enrolled fingerprint, + // we can finish this activity. + setResult(resultCode, data); + finish(); + return; + } + } else if (requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST) { + // See if we can still enroll a fingerprint + boolean canEnrollFinger = checkMaxEnrolled() == 0; + // If we came from the next biometric flow and a user has either + // finished or skipped, we will also finish. + if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED) { + // If user skips the enroll next biometric, we will also finish + setResult(RESULT_FINISHED, data); + finish(); + } else if (resultCode == RESULT_CANCELED) { + // Note that result_canceled comes from onBackPressed. + // If we can enroll a finger, Stay on this page, else we cannot, + // and finish entirely. + if (!canEnrollFinger) { + finish(); + } + } else { + super.onActivityResult(requestCode, resultCode, data); + } + return; } super.onActivityResult(requestCode, resultCode, data); }