Merge "Ensure fingerprint setup is shown once after face" into sc-dev
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 8d18b1a..428e471 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -36,6 +36,7 @@
 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 @@
     @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 @@
             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 @@
         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 @@
     }
 
     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();
     }
 
diff --git a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
index 44d75c5..5cc45b1 100644
--- a/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
+++ b/src/com/android/settings/biometrics/MultiBiometricEnrollHelper.java
@@ -37,6 +37,7 @@
     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;
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
index f915059..08cf5ff 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollEducation.java
@@ -33,6 +33,7 @@
 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 @@
     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();
         }
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
index bee1aca..e9092c7 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollIntroduction.java
@@ -72,6 +72,20 @@
     }
 
     @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);
 
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
index 81043dc..183e05e 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
@@ -50,6 +50,16 @@
         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);
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java
index 636e703..a95a912 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollParentalConsent.java
@@ -51,6 +51,16 @@
         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);
diff --git a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java
index 4bd8afd..63faf5e 100644
--- a/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/fingerprint/SetupFingerprintEnrollIntroduction.java
@@ -29,6 +29,7 @@
 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 @@
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        // 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 lock was already present, do not return intent data since it must have been
+            // reported in previous attempts
+            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 @@
         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