Launch correct enrollment activity from ChooseLock

Test: no noticable difference when setting up fingeprint work profile

Fixes: 130397083
Change-Id: I34be5262cc52052ce25a188f19bbcc13f938ac92
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index dfbc02c..76a8770 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -1562,6 +1562,11 @@
             android:exported="false"
             android:screenOrientation="portrait"/>
 
+        <!-- Must not be exported -->
+        <activity android:name=".biometrics.BiometricEnrollActivity$InternalActivity"
+            android:exported="false"
+            android:theme="@style/GlifTheme.Light"/>
+
         <activity android:name=".biometrics.BiometricEnrollActivity"
             android:exported="true"
             android:theme="@style/GlifTheme.Light">
diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index 1b41240..64ddf4f 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -20,11 +20,15 @@
 import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.os.Bundle;
+import android.os.UserHandle;
 
+import com.android.settings.SetupWizardUtils;
 import com.android.settings.biometrics.face.FaceEnrollIntroduction;
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
 import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
 import com.android.settings.core.InstrumentedActivity;
+import com.android.settings.password.ChooseLockSettingsHelper;
 
 import com.google.android.setupcompat.util.WizardManagerHelper;
 
@@ -36,6 +40,12 @@
  */
 public class BiometricEnrollActivity extends InstrumentedActivity {
 
+    private static final String TAG = "BiometricEnrollActivity";
+
+    public static final String EXTRA_SKIP_INTRO = "skip_intro";
+
+    public static final class InternalActivity extends BiometricEnrollActivity {}
+
     @Override
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
@@ -45,19 +55,43 @@
 
         // This logic may have to be modified on devices with multiple biometrics.
         if (pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
-            intent = getFingerprintEnrollIntent();
+            // ChooseLockGeneric can request to start fingerprint enroll bypassing the intro screen.
+            if (getIntent().getBooleanExtra(EXTRA_SKIP_INTRO, false)
+                    && this instanceof InternalActivity) {
+                intent = getFingerprintFindSensorIntent();
+            } else {
+                intent = getFingerprintIntroIntent();
+            }
         } else if (pm.hasSystemFeature(PackageManager.FEATURE_FACE)) {
-            intent = getFaceEnrollIntent();
+            intent = getFaceIntroIntent();
         }
 
         if (intent != null) {
             intent.setFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
+
+            if (this instanceof InternalActivity) {
+                // Propagate challenge and user Id from ChooseLockGeneric.
+                final byte[] token = getIntent()
+                        .getByteArrayExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN);
+                final int userId = getIntent()
+                        .getIntExtra(Intent.EXTRA_USER_ID, UserHandle.USER_NULL);
+
+                intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token);
+                intent.putExtra(Intent.EXTRA_USER_ID, userId);
+            }
+
             startActivity(intent);
         }
         finish();
     }
 
-    private Intent getFingerprintEnrollIntent() {
+    private Intent getFingerprintFindSensorIntent() {
+        Intent intent = new Intent(this, FingerprintEnrollFindSensor.class);
+        SetupWizardUtils.copySetupExtras(getIntent(), intent);
+        return intent;
+    }
+
+    private Intent getFingerprintIntroIntent() {
         if (WizardManagerHelper.isAnySetupWizard(getIntent())) {
             Intent intent = new Intent(this, SetupFingerprintEnrollIntroduction.class);
             WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent);
@@ -67,7 +101,7 @@
         }
     }
 
-    private Intent getFaceEnrollIntent() {
+    private Intent getFaceIntroIntent() {
         Intent intent = new Intent(this, FaceEnrollIntroduction.class);
         WizardManagerHelper.copyWizardManagerExtras(getIntent(), intent);
         return intent;
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index a8e4206..93e1fd4 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -150,7 +150,9 @@
         if (!mHasPassword) {
             // No password registered, launch into enrollment wizard.
             launchChooseLock();
-        } else if (!mLaunchedConfirmLock || mToken == null) {
+        } else if (mToken == null) {
+            // It's possible to have a token but mLaunchedConfirmLock == false, since
+            // ChooseLockGeneric can pass us a token.
             launchConfirmLock(getConfirmLockTitleResId(), getChallenge());
         }
     }
diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java
index 580c7ba..7eb8dc2 100644
--- a/src/com/android/settings/password/ChooseLockGeneric.java
+++ b/src/com/android/settings/password/ChooseLockGeneric.java
@@ -66,8 +66,8 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.SettingsPreferenceFragment;
 import com.android.settings.Utils;
+import com.android.settings.biometrics.BiometricEnrollActivity;
 import com.android.settings.biometrics.BiometricEnrollBase;
-import com.android.settings.biometrics.fingerprint.FingerprintEnrollFindSensor;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.search.SearchFeatureProvider;
 import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
@@ -76,7 +76,6 @@
 import com.android.settingslib.widget.FooterPreference;
 import com.android.settingslib.widget.FooterPreferenceMixinCompat;
 
-import java.util.Arrays;
 import java.util.List;
 
 public class ChooseLockGeneric extends SettingsActivity {
@@ -141,7 +140,7 @@
         @VisibleForTesting
         static final int CHOOSE_LOCK_REQUEST = 102;
         @VisibleForTesting
-        static final int CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST = 103;
+        static final int CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST = 103;
         @VisibleForTesting
         static final int SKIP_FINGERPRINT_REQUEST = 104;
 
@@ -366,7 +365,7 @@
                 startActivityForResult(
                         intent,
                         mIsSetNewPassword && mHasChallenge
-                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
+                                ? CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST
                                 : ENABLE_ENCRYPTION_REQUEST);
             } else {
                 if (mForChangeCredRequiredForBoot) {
@@ -411,9 +410,9 @@
                         finish();
                     }
                 }
-            } else if (requestCode == CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
+            } else if (requestCode == CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST
                     && resultCode == BiometricEnrollBase.RESULT_FINISHED) {
-                Intent intent = getFindSensorIntent(getActivity());
+                Intent intent = getBiometricEnrollIntent(getActivity());
                 if (data != null) {
                     intent.putExtras(data.getExtras());
                 }
@@ -438,8 +437,11 @@
             }
         }
 
-        protected Intent getFindSensorIntent(Context context) {
-            return new Intent(context, FingerprintEnrollFindSensor.class);
+        protected Intent getBiometricEnrollIntent(Context context) {
+            final Intent intent =
+                    new Intent(context, BiometricEnrollActivity.InternalActivity.class);
+            intent.putExtra(BiometricEnrollActivity.EXTRA_SKIP_INTRO, true);
+            return intent;
         }
 
         @Override
@@ -764,7 +766,7 @@
                 intent.putExtra(EXTRA_CHOOSE_LOCK_GENERIC_EXTRAS, getIntent().getExtras());
                 startActivityForResult(intent,
                         mIsSetNewPassword && mHasChallenge
-                                ? CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST
+                                ? CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST
                                 : CHOOSE_LOCK_REQUEST);
                 return;
             }
diff --git a/src/com/android/settings/password/SetupChooseLockGeneric.java b/src/com/android/settings/password/SetupChooseLockGeneric.java
index 346e771..72b9fa8 100644
--- a/src/com/android/settings/password/SetupChooseLockGeneric.java
+++ b/src/com/android/settings/password/SetupChooseLockGeneric.java
@@ -42,6 +42,7 @@
 import com.android.settings.R;
 import com.android.settings.SetupEncryptionInterstitial;
 import com.android.settings.SetupWizardUtils;
+import com.android.settings.biometrics.BiometricEnrollActivity;
 import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
 import com.android.settings.utils.SettingsDividerItemDecoration;
 
@@ -229,8 +230,8 @@
         }
 
         @Override
-        protected Intent getFindSensorIntent(Context context) {
-            final Intent intent = new Intent(context, SetupFingerprintEnrollFindSensor.class);
+        protected Intent getBiometricEnrollIntent(Context context) {
+            final Intent intent = getBiometricEnrollIntent(context);
             SetupWizardUtils.copySetupExtras(getActivity().getIntent(), intent);
             return intent;
         }
diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
index a1db12c..c692f55 100644
--- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
+++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java
@@ -224,7 +224,7 @@
         initActivity(null);
 
         mFragment.onActivityResult(
-                ChooseLockGenericFragment.CHOOSE_LOCK_BEFORE_FINGERPRINT_REQUEST,
+                ChooseLockGenericFragment.CHOOSE_LOCK_BEFORE_BIOMETRIC_REQUEST,
                 BiometricEnrollBase.RESULT_FINISHED, null /* data */);
 
         assertThat(mActivity.isFinishing()).isTrue();