Ensure fingerprint setup is shown once after face
Adds an activity result extra during multi-biometric enroll that ensures fingerprint setup will not be repeated multiple times if explicitly finished or skipped by the user. Also updates various activities in the stack to ensure that they handle all possible result codes correctly and pass along result data. Test: Manually skip and complete at each stage of multi-biometric enroll Test: Manually test single-biometric enroll flows for SUW and Settings Fixes: 193601823 Change-Id: Ic5a8306068eb4c32009f146ad6fff824fde25a11
This commit is contained in:
@@ -36,6 +36,7 @@ import com.android.settings.R;
|
||||
import com.android.settings.SetupWizardUtils;
|
||||
import com.android.settings.password.ChooseLockGeneric;
|
||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
import com.android.settings.password.SetupSkipDialog;
|
||||
|
||||
import com.google.android.setupcompat.template.FooterBarMixin;
|
||||
import com.google.android.setupcompat.template.FooterButton;
|
||||
@@ -284,13 +285,11 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST) {
|
||||
if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED) {
|
||||
onSkipButtonClick(mFooterBarMixin.getSecondaryButtonView());
|
||||
return;
|
||||
if (isResultSkipOrFinished(resultCode)) {
|
||||
handleBiometricResultSkipOrFinished(resultCode, data);
|
||||
} else if (resultCode == RESULT_TIMEOUT) {
|
||||
setResult(resultCode, data);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
} else if (requestCode == CHOOSE_LOCK_GENERIC_REQUEST) {
|
||||
mConfirmingCredentials = false;
|
||||
@@ -337,8 +336,8 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
|
||||
overridePendingTransition(R.anim.sud_slide_back_in, R.anim.sud_slide_back_out);
|
||||
} else if (requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST) {
|
||||
Log.d(TAG, "ENROLL_NEXT_BIOMETRIC_REQUEST, result: " + resultCode);
|
||||
if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED) {
|
||||
onSkipButtonClick(mFooterBarMixin.getSecondaryButtonView());
|
||||
if (isResultSkipOrFinished(resultCode)) {
|
||||
handleBiometricResultSkipOrFinished(resultCode, data);
|
||||
} else if (resultCode != RESULT_CANCELED) {
|
||||
setResult(resultCode, data);
|
||||
finish();
|
||||
@@ -347,6 +346,25 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
private static boolean isResultSkipOrFinished(int resultCode) {
|
||||
return resultCode == RESULT_SKIP || resultCode == SetupSkipDialog.RESULT_SKIP
|
||||
|| resultCode == RESULT_FINISHED;
|
||||
}
|
||||
|
||||
private void handleBiometricResultSkipOrFinished(int resultCode, @Nullable Intent data) {
|
||||
if (data != null
|
||||
&& data.getBooleanExtra(
|
||||
MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, false)) {
|
||||
getIntent().removeExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE);
|
||||
}
|
||||
|
||||
if (resultCode == RESULT_SKIP) {
|
||||
onEnrollmentSkipped(data);
|
||||
} else if (resultCode == RESULT_FINISHED) {
|
||||
onFinishedEnrolling(data);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Called after confirming credentials. Can be used to prevent the default
|
||||
* behavior of immediately calling #getChallenge (useful to things like intro
|
||||
@@ -364,7 +382,16 @@ public abstract class BiometricEnrollIntroduction extends BiometricEnrollBase
|
||||
}
|
||||
|
||||
protected void onSkipButtonClick(View view) {
|
||||
setResult(RESULT_SKIP);
|
||||
onEnrollmentSkipped(null /* data */);
|
||||
}
|
||||
|
||||
protected void onEnrollmentSkipped(@Nullable Intent data) {
|
||||
setResult(RESULT_SKIP, data);
|
||||
finish();
|
||||
}
|
||||
|
||||
protected void onFinishedEnrolling(@Nullable Intent data) {
|
||||
setResult(RESULT_FINISHED, data);
|
||||
finish();
|
||||
}
|
||||
|
||||
|
@@ -37,6 +37,7 @@ public class MultiBiometricEnrollHelper {
|
||||
private static final int REQUEST_FINGERPRINT_ENROLL = 3001;
|
||||
|
||||
public static final String EXTRA_ENROLL_AFTER_FACE = "enroll_after_face";
|
||||
public static final String EXTRA_SKIP_PENDING_ENROLL = "skip_pending_enroll";
|
||||
|
||||
@NonNull private final FragmentActivity mActivity;
|
||||
private final long mGkPwHandle;
|
||||
|
@@ -33,6 +33,7 @@ import com.android.settings.Utils;
|
||||
import com.android.settings.biometrics.BiometricEnrollBase;
|
||||
import com.android.settings.biometrics.BiometricUtils;
|
||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
import com.android.settings.password.SetupSkipDialog;
|
||||
|
||||
import com.airbnb.lottie.LottieAnimationView;
|
||||
import com.google.android.setupcompat.template.FooterBarMixin;
|
||||
@@ -225,13 +226,17 @@ public class FaceEnrollEducation extends BiometricEnrollBase {
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
mResultIntent = data;
|
||||
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST) {
|
||||
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST
|
||||
|| requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST) {
|
||||
// If the user finished or skipped enrollment, finish this activity
|
||||
if (resultCode == RESULT_FINISHED || resultCode == RESULT_SKIP
|
||||
|| resultCode == RESULT_TIMEOUT) {
|
||||
if (resultCode == RESULT_SKIP || resultCode == RESULT_FINISHED
|
||||
|| resultCode == SetupSkipDialog.RESULT_SKIP) {
|
||||
setResult(resultCode, data);
|
||||
finish();
|
||||
}
|
||||
} else if (resultCode == RESULT_TIMEOUT) {
|
||||
setResult(resultCode, data);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -71,6 +71,20 @@ public class FaceEnrollIntroduction extends BiometricEnrollIntroduction {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEnrollmentSkipped(@Nullable Intent data) {
|
||||
if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) {
|
||||
super.onEnrollmentSkipped(data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishedEnrolling(@Nullable Intent data) {
|
||||
if (!BiometricUtils.tryStartingNextBiometricEnroll(this, ENROLL_NEXT_BIOMETRIC_REQUEST)) {
|
||||
super.onFinishedEnrolling(data);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
@@ -50,6 +50,16 @@ public class FaceEnrollParentalConsent extends FaceEnrollIntroduction {
|
||||
onConsentResult(false /* granted */);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEnrollmentSkipped(@Nullable Intent data) {
|
||||
onConsentResult(false /* granted */);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishedEnrolling(@Nullable Intent data) {
|
||||
onConsentResult(true /* granted */);
|
||||
}
|
||||
|
||||
private void onConsentResult(boolean granted) {
|
||||
final Intent result = new Intent();
|
||||
result.putExtra(EXTRA_KEY_MODALITY, TYPE_FACE);
|
||||
|
@@ -51,6 +51,16 @@ public class FingerprintEnrollParentalConsent extends FingerprintEnrollIntroduct
|
||||
onConsentResult(false /* granted */);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onEnrollmentSkipped(@Nullable Intent data) {
|
||||
onConsentResult(false /* granted */);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onFinishedEnrolling(@Nullable Intent data) {
|
||||
onConsentResult(true /* granted */);
|
||||
}
|
||||
|
||||
private void onConsentResult(boolean granted) {
|
||||
final Intent result = new Intent();
|
||||
result.putExtra(EXTRA_KEY_MODALITY, TYPE_FINGERPRINT);
|
||||
|
@@ -29,6 +29,7 @@ import com.android.internal.widget.LockPatternUtils;
|
||||
import com.android.settings.SetupWizardUtils;
|
||||
import com.android.settings.Utils;
|
||||
import com.android.settings.biometrics.BiometricUtils;
|
||||
import com.android.settings.biometrics.MultiBiometricEnrollHelper;
|
||||
import com.android.settings.password.ChooseLockSettingsHelper;
|
||||
import com.android.settings.password.SetupChooseLockGeneric;
|
||||
import com.android.settings.password.SetupSkipDialog;
|
||||
@@ -72,19 +73,28 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu
|
||||
|
||||
@Override
|
||||
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||
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
|
||||
if (requestCode == BIOMETRIC_FIND_SENSOR_REQUEST && isKeyguardSecure()) {
|
||||
if(!mAlreadyHadLockScreenSetup) {
|
||||
if (!mAlreadyHadLockScreenSetup) {
|
||||
data = getMetricIntent(data);
|
||||
}
|
||||
|
||||
// Report fingerprint count if user adding a new fingerprint
|
||||
if(resultCode == RESULT_FINISHED) {
|
||||
if (resultCode == RESULT_FINISHED) {
|
||||
data = setFingerprintCount(data);
|
||||
}
|
||||
}
|
||||
|
||||
// If user has skipped or finished enrolling, don't restart enrollment.
|
||||
final boolean isEnrollRequest = requestCode == BIOMETRIC_FIND_SENSOR_REQUEST
|
||||
|| requestCode == ENROLL_NEXT_BIOMETRIC_REQUEST;
|
||||
final boolean isResultSkipOrFinished = resultCode == RESULT_SKIP
|
||||
|| resultCode == SetupSkipDialog.RESULT_SKIP || resultCode == RESULT_FINISHED;
|
||||
if (isEnrollRequest && isResultSkipOrFinished) {
|
||||
data = setSkipPendingEnroll(data);
|
||||
}
|
||||
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
}
|
||||
|
||||
@@ -112,17 +122,33 @@ public class SetupFingerprintEnrollIntroduction extends FingerprintEnrollIntrodu
|
||||
return data;
|
||||
}
|
||||
|
||||
private Intent setSkipPendingEnroll(Intent data) {
|
||||
if (data == null) {
|
||||
data = new Intent();
|
||||
}
|
||||
data.putExtra(MultiBiometricEnrollHelper.EXTRA_SKIP_PENDING_ENROLL, true);
|
||||
return data;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onCancelButtonClick(View view) {
|
||||
final int resultCode;
|
||||
Intent data;
|
||||
if (isKeyguardSecure()) {
|
||||
// If the keyguard is already set up securely (maybe the user added a backup screen
|
||||
// lock and skipped fingerprint), return RESULT_SKIP directly.
|
||||
setResult(RESULT_SKIP, mAlreadyHadLockScreenSetup ? null : getMetricIntent(null));
|
||||
finish();
|
||||
resultCode = RESULT_SKIP;
|
||||
data = mAlreadyHadLockScreenSetup ? null : getMetricIntent(null);
|
||||
} else {
|
||||
setResult(SetupSkipDialog.RESULT_SKIP);
|
||||
finish();
|
||||
resultCode = SetupSkipDialog.RESULT_SKIP;
|
||||
data = null;
|
||||
}
|
||||
|
||||
// User has explicitly canceled enroll. Don't restart it automatically.
|
||||
data = setSkipPendingEnroll(data);
|
||||
|
||||
setResult(resultCode, data);
|
||||
finish();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
Reference in New Issue
Block a user