diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index b3a9505..44a874b 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -284,7 +284,7 @@
             launchCredentialOnlyEnroll();
             finish();
         } else if (canUseFace && canUseFingerprint) {
-            if (mParentalOptionsRequired && mGkPwHandle != null) {
+            if (mGkPwHandle != null) {
                 launchFaceAndFingerprintEnroll();
             } else {
                 setOrConfirmCredentialsNow();
diff --git a/tests/componenttests/Android.bp b/tests/componenttests/Android.bp
index 7d9c4b2..77ee164 100644
--- a/tests/componenttests/Android.bp
+++ b/tests/componenttests/Android.bp
@@ -21,6 +21,8 @@
     static_libs: [
         "truth-prebuilt",
         "androidx.test.core",
+        "androidx.test.espresso.core",
+        "androidx.test.espresso.intents-nodeps",
         "androidx.test.runner",
         "androidx.test.rules",
         "androidx.test.ext.junit",
diff --git a/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
new file mode 100644
index 0000000..0ef57a0
--- /dev/null
+++ b/tests/componenttests/src/com/android/settings/biometrics/BiometricEnrollActivityTest.java
@@ -0,0 +1,137 @@
+/*
+ * Copyright (C) 2021 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.android.settings.biometrics;
+
+import static android.provider.Settings.ACTION_BIOMETRIC_ENROLL;
+
+import static androidx.test.espresso.intent.Intents.intended;
+import static androidx.test.espresso.intent.matcher.IntentMatchers.hasComponent;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.junit.Assume.assumeTrue;
+
+import android.content.Context;
+import android.content.Intent;
+import android.content.pm.PackageManager;
+import android.os.UserHandle;
+
+import androidx.test.core.app.ActivityScenario;
+import androidx.test.core.app.ApplicationProvider;
+import androidx.test.espresso.intent.Intents;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+import androidx.test.filters.MediumTest;
+
+import com.android.internal.widget.LockPatternChecker;
+import com.android.internal.widget.LockPatternUtils;
+import com.android.internal.widget.LockscreenCredential;
+import com.android.settings.biometrics.face.FaceEnrollIntroduction;
+import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
+import com.android.settings.password.ChooseLockGeneric;
+import com.android.settings.password.ChooseLockSettingsHelper;
+import com.android.settings.password.ConfirmLockPassword;
+import com.android.settings.testutils.AdbUtils;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+@RunWith(AndroidJUnit4.class)
+@MediumTest
+public class BiometricEnrollActivityTest {
+
+    private static final String TAG = "BiometricEnrollActivityTest";
+    private static final int ADB_TIMEOUT_MS = 5000;
+    private static final String TEST_PIN = "1234";
+
+    private final Context  mContext = ApplicationProvider.getApplicationContext();
+    private boolean mHasFace;
+    private boolean mHasFingerprint;
+
+    @Before
+    public void setup() {
+        Intents.init();
+        final PackageManager pm = mContext.getPackageManager();
+        mHasFingerprint = pm.hasSystemFeature(PackageManager.FEATURE_FINGERPRINT);
+        mHasFace = pm.hasSystemFeature(PackageManager.FEATURE_FACE);
+    }
+
+    @After
+    public void teardown() throws Exception {
+        Intents.release();
+        AdbUtils.checkStringInAdbCommandOutput(TAG, "locksettings clear --old " + TEST_PIN,
+                "", "", ADB_TIMEOUT_MS);
+    }
+
+    @Test
+    public void launchWithoutPin_setsPin() {
+        try (ActivityScenario<BiometricEnrollActivity> scenario =
+                     ActivityScenario.launch(getIntent())) {
+            intended(hasComponent(ChooseLockGeneric.class.getName()));
+        }
+    }
+
+    @Test
+    public void launchWithPin_confirmsPin() throws Exception  {
+        setPin();
+        try (ActivityScenario<BiometricEnrollActivity> scenario =
+                     ActivityScenario.launch(getIntent())) {
+            intended(hasComponent(ConfirmLockPassword.InternalActivity.class.getName()));
+        }
+    }
+
+    @Test
+    public void launchWithPinAndPwHandle_confirmsPin() throws Exception {
+        assumeTrue(mHasFace || mHasFingerprint);
+
+        setPin();
+        final Intent intent = getIntent(true /* useInternal */);
+        LockPatternChecker.verifyCredential(new LockPatternUtils(mContext),
+                LockscreenCredential.createPin(TEST_PIN), UserHandle.myUserId(),
+                LockPatternUtils.VERIFY_FLAG_REQUEST_GK_PW_HANDLE, (response, timeoutMs) -> {
+                    assertThat(response.containsGatekeeperPasswordHandle()).isTrue();
+                    intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
+                            response.getGatekeeperPasswordHandle());
+                }).get();
+
+
+
+        try (ActivityScenario<BiometricEnrollActivity> scenario =
+                     ActivityScenario.launch(intent)) {
+            intended(hasComponent(mHasFace
+                    ? FaceEnrollIntroduction.class.getName()
+                    : FingerprintEnrollIntroduction.class.getName()));
+        }
+    }
+
+    private Intent getIntent() {
+        return getIntent(false /* useInternal */);
+    }
+
+    private Intent getIntent(boolean useInternal) {
+        final Intent intent = new Intent(mContext, useInternal
+                ? BiometricEnrollActivity.InternalActivity.class : BiometricEnrollActivity.class);
+        intent.setAction(ACTION_BIOMETRIC_ENROLL);
+        return intent;
+    }
+
+    private static void setPin() throws Exception  {
+        assertThat(AdbUtils.checkStringInAdbCommandOutput(TAG, "locksettings set-pin " + TEST_PIN,
+                "Pin set to ", "'" + TEST_PIN + "'", ADB_TIMEOUT_MS)).isTrue();
+    }
+}
