diff --git a/src/com/android/settings/biometrics/BiometricEnrollActivity.java b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
index dda3997..e682934 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollActivity.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollActivity.java
@@ -333,6 +333,8 @@
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
         super.onActivityResult(requestCode, resultCode, data);
 
+        Log.d(TAG,
+                "onActivityResult(requestCode=" + requestCode + ", resultCode=" + resultCode + ")");
         // single enrollment is handled entirely by the launched activity
         // this handles multi enroll or if parental consent is required
         if (mParentalConsentHelper != null) {
diff --git a/src/com/android/settings/biometrics/BiometricEnrollBase.java b/src/com/android/settings/biometrics/BiometricEnrollBase.java
index ad9b64e..eea1bad 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollBase.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollBase.java
@@ -184,7 +184,8 @@
     @Override
     protected void onStop() {
         super.onStop();
-        if (!isChangingConfigurations() && shouldFinishWhenBackgrounded()) {
+        if (!isChangingConfigurations() && shouldFinishWhenBackgrounded()
+                && !BiometricUtils.isAnyMultiBiometricFlow(this)) {
             setResult(RESULT_TIMEOUT);
             finish();
         }
diff --git a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
index 62114d2..acfe5a1 100644
--- a/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
+++ b/src/com/android/settings/biometrics/BiometricEnrollIntroduction.java
@@ -24,6 +24,7 @@
 import android.os.Bundle;
 import android.os.UserHandle;
 import android.os.UserManager;
+import android.util.Log;
 import android.view.View;
 import android.widget.TextView;
 
@@ -302,7 +303,8 @@
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
-        // TODO(b/229924331): Add tests for the enrollment flows.
+        Log.d(TAG,
+                "onActivityResult(requestCode=" + requestCode + ", resultCode=" + resultCode + ")");
         final boolean cameFromMultiBioFpAuthAddAnother =
                 requestCode == BiometricUtils.REQUEST_ADD_ANOTHER
                 && BiometricUtils.isMultiBiometricFingerprintEnrollmentFlow(this);
diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java
index 7e5a22f..f395aca 100644
--- a/src/com/android/settings/biometrics/BiometricUtils.java
+++ b/src/com/android/settings/biometrics/BiometricUtils.java
@@ -240,7 +240,6 @@
         return activity.getIntent().hasExtra(MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FACE);
     }
 
-
     /**
      * Used for checking if a multi-biometric enrollment flowstarts with Fingerprint
      * and ends with Face.
@@ -254,6 +253,18 @@
                 MultiBiometricEnrollHelper.EXTRA_ENROLL_AFTER_FINGERPRINT);
     }
 
+    /**
+     * Used to check if the activity is a multi biometric flow activity.
+     *
+     * @param activity Activity to check
+     * @return True if the activity is going through a multi-biometric enrollment flow, that starts
+     * with Fingerprint.
+     */
+    public static boolean isAnyMultiBiometricFlow(@NonNull Activity activity) {
+        return isMultiBiometricFaceEnrollmentFlow(activity)
+                || isMultiBiometricFingerprintEnrollmentFlow(activity);
+    }
+
     public static void copyMultiBiometricExtras(@NonNull Intent fromIntent,
             @NonNull Intent toIntent) {
         PendingIntent pendingIntent = (PendingIntent) fromIntent.getExtra(
diff --git a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
index 302c9e1..3a61d5e 100644
--- a/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
+++ b/src/com/android/settings/biometrics/BiometricsEnrollEnrolling.java
@@ -74,7 +74,8 @@
                 getSupportFragmentManager()
                         .beginTransaction().remove(mSidecar).commitAllowingStateLoss();
             }
-            if (!WizardManagerHelper.isAnySetupWizard(getIntent())) {
+            if (!WizardManagerHelper.isAnySetupWizard(getIntent())
+                    && !BiometricUtils.isAnyMultiBiometricFlow(this)) {
                 setResult(RESULT_TIMEOUT);
             }
             finish();
diff --git a/src/com/android/settings/biometrics/ParentalConsentHelper.java b/src/com/android/settings/biometrics/ParentalConsentHelper.java
index 40ff8ea..f39f876 100644
--- a/src/com/android/settings/biometrics/ParentalConsentHelper.java
+++ b/src/com/android/settings/biometrics/ParentalConsentHelper.java
@@ -139,12 +139,12 @@
 
     @Nullable
     private Intent getNextConsentIntent(@NonNull Context context) {
-        if (mRequireFace && mConsentFace == null) {
-            return new Intent(context, FaceEnrollParentalConsent.class);
-        }
         if (mRequireFingerprint && mConsentFingerprint == null) {
             return new Intent(context, FingerprintEnrollParentalConsent.class);
         }
+        if (mRequireFace && mConsentFace == null) {
+            return new Intent(context, FaceEnrollParentalConsent.class);
+        }
         return null;
     }
 
diff --git a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
index 0f384c2..a3a745d 100644
--- a/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
+++ b/src/com/android/settings/biometrics/face/FaceEnrollParentalConsent.java
@@ -53,11 +53,7 @@
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
-        final String text =
-                getText(R.string.security_settings_face_enroll_introduction_consent_message_0)
-                + "\n\n"
-                + getText(R.string.security_settings_face_enroll_introduction_consent_message);
-        setDescriptionText(text);
+        setDescriptionText(R.string.security_settings_face_enroll_introduction_consent_message_0);
     }
 
     @Override
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
index 387f216..627a514 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintEnrollFindSensor.java
@@ -21,6 +21,7 @@
 import android.hardware.fingerprint.FingerprintManager;
 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
 import android.os.Bundle;
+import android.util.Log;
 import android.view.OrientationEventListener;
 import android.view.Surface;
 import android.view.View;
@@ -48,6 +49,9 @@
 public class FingerprintEnrollFindSensor extends BiometricEnrollBase implements
         BiometricEnrollSidecar.Listener {
 
+
+    private static final String TAG = "FingerprintEnrollFindSensor";
+
     @Nullable
     private FingerprintFindSensorAnimation mAnimation;
 
@@ -294,6 +298,8 @@
 
     @Override
     protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+        Log.d(TAG,
+                "onActivityResult(requestCode=" + requestCode + ", resultCode=" + resultCode + ")");
         boolean enrolledFingerprint = false;
         if (data != null) {
             enrolledFingerprint = data.getBooleanExtra(EXTRA_FINISHED_ENROLL_FINGERPRINT, false);
diff --git a/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java b/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java
index abb5355..175c2cf 100644
--- a/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java
+++ b/tests/unit/src/com/android/settings/biometrics/ParentalConsentHelperTest.java
@@ -82,7 +82,7 @@
     }
 
     @Test
-    public void testLaunchNext_face_and_fingerprint_all_consent() {
+    public void testLaunchNext__fingerprint_all_consent() {
         testLaunchNext(
                 true /* requireFace */, true /* grantFace */,
                 true /* requireFingerprint */, true /* grantFace */,
@@ -158,13 +158,13 @@
             boolean requireFingerprint, boolean grantFingerprint,
             long gkpw) {
         final List<Pair<String, Boolean>> expectedLaunches = new ArrayList<>();
-        if (requireFace) {
-            expectedLaunches.add(new Pair(FaceEnrollParentalConsent.class.getName(), grantFace));
-        }
         if (requireFingerprint) {
             expectedLaunches.add(
                     new Pair(FingerprintEnrollParentalConsent.class.getName(), grantFingerprint));
         }
+        if (requireFace) {
+            expectedLaunches.add(new Pair(FaceEnrollParentalConsent.class.getName(), grantFace));
+        }
 
         // initial consent status
         final ParentalConsentHelper helper = new ParentalConsentHelper(gkpw);
