Modified Fp -> Face setup flow

Test: Skip FP, Enroll Face, hit back button, observe that you will go
back to Fingerprint enrollment.
Test: Verify that after completing a biometric enroll we no longer
show the introduction activity with a "Done" button.
Fixes: 229813512

Change-Id: Ie0d7ce5d5cef084b3614afce10e05dc72c86b492
This commit is contained in:
Joshua McCloskey
2022-04-21 00:25:07 +00:00
parent 7fe08d0272
commit 10d0cd52d6
7 changed files with 82 additions and 8 deletions

View File

@@ -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_SENSOR_ID = "sensor_id";
public static final String EXTRA_KEY_CHALLENGE = "challenge"; public static final String EXTRA_KEY_CHALLENGE = "challenge";
public static final String EXTRA_KEY_MODALITY = "sensor_modality"; 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 * Used by the choose fingerprint wizard to indicate the wizard is

View File

@@ -302,6 +302,7 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// TODO(b/229924331): Add tests for the enrollment flows.
final boolean cameFromMultiBioFpAuthAddAnother = final boolean cameFromMultiBioFpAuthAddAnother =
requestCode == BiometricUtils.REQUEST_ADD_ANOTHER requestCode == BiometricUtils.REQUEST_ADD_ANOTHER
&& BiometricUtils.isMultiBiometricFingerprintEnrollmentFlow(this); && BiometricUtils.isMultiBiometricFingerprintEnrollmentFlow(this);
@@ -397,14 +398,20 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
return isResultSkipped(resultCode) || isResultFinished(resultCode); 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 if (data != null
&& data.getBooleanExtra( && data.getBooleanExtra(
MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) { MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) {
getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE); removeEnrollNextBiometric();
getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT);
} }
}
protected void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) {
removeEnrollNextBiometricIfSkipEnroll(data);
if (resultCode == RESULT_SKIP) { if (resultCode == RESULT_SKIP) {
onEnrollmentSkipped(data); onEnrollmentSkipped(data);
} else if (resultCode == RESULT_FINISHED) { } else if (resultCode == RESULT_FINISHED) {

View File

@@ -227,6 +227,10 @@ public class FaceEnrollEducation extends BiometricEnrollBase {
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);
mResultIntent = data; mResultIntent = data;
boolean hasEnrolledFace = false;
if (data != null) {
hasEnrolledFace = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FACE, false);
}
if (resultCode == RESULT_TIMEOUT) { if (resultCode == RESULT_TIMEOUT) {
setResult(resultCode, data); setResult(resultCode, data);
finish(); finish();
@@ -234,7 +238,7 @@ public class FaceEnrollEducation extends BiometricEnrollBase {
|| requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST) { || requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST) {
// If the user finished or skipped enrollment, finish this activity // If the user finished or skipped enrollment, finish this activity
if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED
|| resultCode == SetupSkipDialog.RESULT_SKIP) { || resultCode == SetupSkipDialog.RESULT_SKIP || hasEnrolledFace) {
setResult(resultCode, data); setResult(resultCode, data);
finish(); finish();
} }

View File

@@ -176,7 +176,18 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
|| requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST; || requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST;
final boolean isResultSkipOrFinished = resultCode == RESULT_SKIP final boolean isResultSkipOrFinished = resultCode == RESULT_SKIP
|| resultCode == SetupSkipDialog.RESULT_SKIP || resultCode == RESULT_FINISHED; || 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); data = setSkipPendingEnroll(data);
} }
super.onActivityResult(requestCode, resultCode, data); super.onActivityResult(requestCode, resultCode, data);

View File

@@ -289,6 +289,17 @@ public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 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 (requestCode == CONFIRM_REQUEST) {
if (resultCode == RESULT_OK && data != null) { if (resultCode == RESULT_OK && data != null) {
throw new IllegalStateException("Pretty sure this is dead code"); throw new IllegalStateException("Pretty sure this is dead code");

View File

@@ -79,9 +79,10 @@ public class FingerprintEnrollFinish extends BiometricEnrollBase {
@Override @Override
public void onBackPressed() { public void onBackPressed() {
super.onBackPressed();
updateFingerprintSuggestionEnableState(); updateFingerprintSuggestionEnableState();
Intent intent = getIntent().putExtra(EXTRA_FINISHED_ENROLL_FINGERPRINT, true);
setResult(RESULT_CANCELED, intent);
finish();
} }
@Override @Override

View File

@@ -74,6 +74,16 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 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 (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST && isKeyguardSecure()) {
// if lock was already present, do not return intent data since it must have been // if lock was already present, do not return intent data since it must have been
// reported in previous attempts // reported in previous attempts
@@ -85,6 +95,34 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu
if (resultCode == RESULT_FINISHED) { if (resultCode == RESULT_FINISHED) {
data = setFingerprintCount(data); 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); super.onActivityResult(requestCode, resultCode, data);
} }