diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index f1c91ee..223b473f 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2815,20 +2815,6 @@
             </intent-filter>
         </activity>
 
-        <activity android:name=".biometrics2.ui.view.FingerprintEnrollmentActivity"
-            android:exported="true"
-            android:theme="@style/GlifTheme.Light" />
-
-        <activity android:name=".biometrics2.ui.view.FingerprintEnrollmentActivity$InternalActivity"
-            android:exported="false"
-            android:theme="@style/GlifTheme.Light"
-            android:taskAffinity="com.android.settings.root" />
-
-        <activity android:name=".biometrics2.ui.view.FingerprintEnrollmentActivity$SetupActivity"
-            android:exported="true"
-            android:permission="android.permission.MANAGE_FINGERPRINT"
-            android:theme="@style/GlifTheme.Light" />
-
         <activity android:name=".biometrics.fingerprint.FingerprintEnrollIntroductionInternal"
                   android:exported="false"
                   android:theme="@style/GlifTheme.Light"
diff --git a/aconfig/settings_flag_declarations.aconfig b/aconfig/settings_flag_declarations.aconfig
index b90ff9f..2c8eade 100644
--- a/aconfig/settings_flag_declarations.aconfig
+++ b/aconfig/settings_flag_declarations.aconfig
@@ -42,3 +42,10 @@
     description: "Feature flag to remove relevant slices dependencies."
     bug: "297367302"
 }
+
+flag {
+    name: "support_raw_dynamic_icons"
+    namespace: "android_settings"
+    description: "Flag to gate support of injected preference icons containing raw data"
+    bug: "351884562"
+}
diff --git a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
index f4c928c..1ee980e 100644
--- a/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
+++ b/src/com/android/settings/activityembedding/ActivityEmbeddingRulesController.java
@@ -43,7 +43,6 @@
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal;
-import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity;
 import com.android.settings.core.FeatureFlags;
 import com.android.settings.homepage.DeepLinkHomepageActivity;
 import com.android.settings.homepage.DeepLinkHomepageActivityInternal;
@@ -255,8 +254,6 @@
                     .buildSearchIntent(mContext, SettingsEnums.SETTINGS_HOMEPAGE);
             addActivityFilter(activityFilters, searchIntent);
         }
-        addActivityFilter(activityFilters, FingerprintEnrollmentActivity.class);
-        addActivityFilter(activityFilters, FingerprintEnrollmentActivity.InternalActivity.class);
         addActivityFilter(activityFilters, FingerprintEnrollIntroduction.class);
         addActivityFilter(activityFilters, FingerprintEnrollIntroductionInternal.class);
         addActivityFilter(activityFilters, FingerprintEnrollEnrolling.class);
diff --git a/src/com/android/settings/biometrics/BiometricUtils.java b/src/com/android/settings/biometrics/BiometricUtils.java
index 3376d86..09b2dba 100644
--- a/src/com/android/settings/biometrics/BiometricUtils.java
+++ b/src/com/android/settings/biometrics/BiometricUtils.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.biometrics;
 
-import static android.util.FeatureFlagUtils.SETTINGS_BIOMETRICS2_ENROLLMENT;
 
 import android.annotation.IntDef;
 import android.app.Activity;
@@ -33,7 +32,6 @@
 import android.os.storage.StorageManager;
 import android.text.BidiFormatter;
 import android.text.SpannableStringBuilder;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.view.Surface;
 
@@ -50,7 +48,6 @@
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroduction;
 import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollFindSensor;
 import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction;
-import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity;
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settings.password.ChooseLockGeneric;
 import com.android.settings.password.ChooseLockSettingsHelper;
@@ -254,17 +251,8 @@
     public static Intent getFingerprintFindSensorIntent(@NonNull Context context,
             @NonNull Intent activityIntent) {
         final boolean isSuw =  WizardManagerHelper.isAnySetupWizard(activityIntent);
-        final Intent intent;
-        if (FeatureFlagUtils.isEnabled(context, SETTINGS_BIOMETRICS2_ENROLLMENT)) {
-            intent = new Intent(context, isSuw
-                    ? FingerprintEnrollmentActivity.SetupActivity.class
-                    : FingerprintEnrollmentActivity.class);
-            intent.putExtra(BiometricEnrollActivity.EXTRA_SKIP_INTRO, true);
-        } else {
-            intent = new Intent(context, isSuw
-                    ? SetupFingerprintEnrollFindSensor.class
-                    : FingerprintEnrollFindSensor.class);
-        }
+        final Intent intent = new Intent(context, isSuw
+                ? SetupFingerprintEnrollFindSensor.class : FingerprintEnrollFindSensor.class);
         if (isSuw) {
             SetupWizardUtils.copySetupExtras(activityIntent, intent);
         }
@@ -279,16 +267,8 @@
     public static Intent getFingerprintIntroIntent(@NonNull Context context,
             @NonNull Intent activityIntent) {
         final boolean isSuw = WizardManagerHelper.isAnySetupWizard(activityIntent);
-        final Intent intent;
-        if (FeatureFlagUtils.isEnabled(context, SETTINGS_BIOMETRICS2_ENROLLMENT)) {
-            intent = new Intent(context, isSuw
-                    ? FingerprintEnrollmentActivity.SetupActivity.class
-                    : FingerprintEnrollmentActivity.class);
-        } else {
-            intent = new Intent(context, isSuw
-                    ? SetupFingerprintEnrollIntroduction.class
-                    : FingerprintEnrollIntroduction.class);
-        }
+        final Intent intent = new Intent(context, isSuw
+                ? SetupFingerprintEnrollIntroduction.class : FingerprintEnrollIntroduction.class);
         if (isSuw) {
             WizardManagerHelper.copyWizardManagerExtras(activityIntent, intent);
         }
diff --git a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
index d35cda4..cb7d617 100644
--- a/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
+++ b/src/com/android/settings/biometrics/fingerprint/FingerprintSettings.java
@@ -45,7 +45,6 @@
 import android.text.InputFilter;
 import android.text.Spanned;
 import android.text.TextUtils;
-import android.util.FeatureFlagUtils;
 import android.util.Log;
 import android.view.View;
 import android.widget.ImeAwareEditText;
@@ -70,8 +69,6 @@
 import com.android.settings.biometrics.BiometricEnrollBase;
 import com.android.settings.biometrics.BiometricUtils;
 import com.android.settings.biometrics.GatekeeperPasswordProvider;
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
-import com.android.settings.biometrics2.ui.view.FingerprintEnrollmentActivity;
 import com.android.settings.core.SettingsBaseActivity;
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment;
 import com.android.settings.dashboard.DashboardFragment;
@@ -833,15 +830,8 @@
             if (KEY_FINGERPRINT_ADD.equals(key)) {
                 mIsEnrolling = true;
                 Intent intent = new Intent();
-                if (FeatureFlagUtils.isEnabled(getContext(),
-                        FeatureFlagUtils.SETTINGS_BIOMETRICS2_ENROLLMENT)) {
-                    intent.setClassName(SETTINGS_PACKAGE_NAME,
-                            FingerprintEnrollmentActivity.InternalActivity.class.getName());
-                    intent.putExtra(EnrollmentRequest.EXTRA_SKIP_FIND_SENSOR, true);
-                } else {
-                    intent.setClassName(SETTINGS_PACKAGE_NAME,
-                            FingerprintEnrollEnrolling.class.getName());
-                }
+                intent.setClassName(SETTINGS_PACKAGE_NAME,
+                        FingerprintEnrollEnrolling.class.getName());
                 intent.putExtra(Intent.EXTRA_USER_ID, mUserId);
                 intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, mToken);
                 if (mCalibrator != null) {
@@ -1126,12 +1116,7 @@
         private void addFirstFingerprint(@Nullable Long gkPwHandle) {
             Intent intent = new Intent();
             intent.setClassName(SETTINGS_PACKAGE_NAME,
-                    FeatureFlagUtils.isEnabled(getActivity(),
-                            FeatureFlagUtils.SETTINGS_BIOMETRICS2_ENROLLMENT)
-                            ? FingerprintEnrollmentActivity.InternalActivity.class.getName()
-                            : FingerprintEnrollIntroductionInternal.class.getName()
-            );
-
+                    FingerprintEnrollIntroductionInternal.class.getName());
             intent.putExtra(EXTRA_FROM_SETTINGS_SUMMARY, true);
             intent.putExtra(SettingsBaseActivity.EXTRA_PAGE_TRANSITION_TYPE,
                     SettingsTransitionHelper.TransitionType.TRANSITION_SLIDE);
diff --git a/src/com/android/settings/biometrics2/OWNERS b/src/com/android/settings/biometrics2/OWNERS
deleted file mode 100644
index ac806eb..0000000
--- a/src/com/android/settings/biometrics2/OWNERS
+++ /dev/null
@@ -1,4 +0,0 @@
-# The Android Biometric team should approve all changes to biometrics2 subdirectories.
-set noparent
-
-include /src/com/android/settings/biometrics/OWNERS
diff --git a/src/com/android/settings/biometrics2/data/repository/FingerprintRepository.java b/src/com/android/settings/biometrics2/data/repository/FingerprintRepository.java
deleted file mode 100644
index 6a9892a..0000000
--- a/src/com/android/settings/biometrics2/data/repository/FingerprintRepository.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.data.repository;
-
-import static android.hardware.biometrics.BiometricAuthenticator.TYPE_FINGERPRINT;
-
-import android.app.admin.DevicePolicyManager;
-import android.content.Context;
-import android.content.res.Resources;
-import android.hardware.fingerprint.Fingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.settings.R;
-import com.android.settings.biometrics.ParentalControlsUtils;
-import com.android.settingslib.RestrictedLockUtilsInternal;
-
-import java.util.List;
-
-/**
- * This repository is used to call all APIs in {@link FingerprintManager}
- */
-public class FingerprintRepository {
-
-    private static final String TAG = "FingerprintRepository";
-    @NonNull
-    private final FingerprintManager mFingerprintManager;
-
-    private List<FingerprintSensorPropertiesInternal> mSensorPropertiesCache;
-
-    public FingerprintRepository(@NonNull FingerprintManager fingerprintManager) {
-        mFingerprintManager = fingerprintManager;
-        mFingerprintManager.addAuthenticatorsRegisteredCallback(
-                new IFingerprintAuthenticatorsRegisteredCallback.Stub() {
-                    @Override
-                    public void onAllAuthenticatorsRegistered(
-                            List<FingerprintSensorPropertiesInternal> sensors) {
-                        mSensorPropertiesCache = sensors;
-                    }
-                });
-    }
-
-    /**
-     * The first sensor type is UDFPS sensor or not
-     */
-    public boolean canAssumeUdfps() {
-        FingerprintSensorPropertiesInternal prop = getFirstFingerprintSensorPropertiesInternal();
-        return prop != null && prop.isAnyUdfpsType();
-    }
-
-    /**
-     * The first sensor type is Side fps sensor or not
-     */
-    public boolean canAssumeSfps() {
-        FingerprintSensorPropertiesInternal prop = getFirstFingerprintSensorPropertiesInternal();
-        return prop != null && prop.isAnySidefpsType();
-    }
-
-    /**
-     * Get max possible number of fingerprints for a user
-     */
-    public int getMaxFingerprints() {
-        FingerprintSensorPropertiesInternal prop = getFirstFingerprintSensorPropertiesInternal();
-        return prop != null ? prop.maxEnrollmentsPerUser : 0;
-    }
-
-    /**
-     * Get number of fingerprints that this user enrolled.
-     */
-    public int getNumOfEnrolledFingerprintsSize(int userId) {
-        final List<Fingerprint> list = mFingerprintManager.getEnrolledFingerprints(userId);
-        return list != null ? list.size() : 0;
-    }
-
-    /**
-     * Get maximum possible fingerprints in setup wizard flow
-     */
-    public int getMaxFingerprintsInSuw(@NonNull Resources resources) {
-        return resources.getInteger(R.integer.suw_max_fingerprints_enrollable);
-    }
-
-    /**
-     * Gets the first FingerprintSensorPropertiesInternal from FingerprintManager
-     */
-    @Nullable
-    public FingerprintSensorPropertiesInternal getFirstFingerprintSensorPropertiesInternal() {
-        final List<FingerprintSensorPropertiesInternal> props = mSensorPropertiesCache;
-        if (props == null) {
-            // Handle this case if it really happens
-            Log.e(TAG, "Sensor properties cache is null");
-            return null;
-        }
-        return props.size() > 0 ? props.get(0) : null;
-    }
-
-    /**
-     * Call FingerprintManager to generate challenge for first sensor
-     */
-    public void generateChallenge(int userId,
-            @NonNull FingerprintManager.GenerateChallengeCallback callback) {
-        mFingerprintManager.generateChallenge(userId, callback);
-    }
-
-    /**
-     * Get parental consent required or not during enrollment process
-     */
-    public boolean isParentalConsentRequired(@NonNull Context context) {
-        return ParentalControlsUtils.parentConsentRequired(context, TYPE_FINGERPRINT) != null;
-    }
-
-    /**
-     * Get fingerprint is disable by admin or not
-     */
-    public boolean isDisabledByAdmin(@NonNull Context context, int userId) {
-        return RestrictedLockUtilsInternal.checkIfKeyguardFeaturesDisabled(
-                context, DevicePolicyManager.KEYGUARD_DISABLE_FINGERPRINT, userId) != null;
-    }
-
-    /**
-     * Get fingerprint enroll stage threshold
-     */
-    public float getEnrollStageThreshold(int index) {
-        return mFingerprintManager.getEnrollStageThreshold(index);
-    }
-
-    /**
-     * Get fingerprint enroll stage count
-     */
-    public int getEnrollStageCount() {
-        return mFingerprintManager.getEnrollStageCount();
-    }
-}
diff --git a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java b/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java
deleted file mode 100644
index fdc5745..0000000
--- a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProvider.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.factory;
-
-import android.app.Application;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-
-/**
- * Interface for BiometricsRepositoryProvider
- */
-public interface BiometricsRepositoryProvider {
-
-    /**
-     * Get FingerprintRepository
-     */
-    @Nullable
-    FingerprintRepository getFingerprintRepository(@NonNull Application application);
-}
diff --git a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java b/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java
deleted file mode 100644
index 22409c8..0000000
--- a/src/com/android/settings/biometrics2/factory/BiometricsRepositoryProviderImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.factory;
-
-import android.app.Application;
-import android.hardware.fingerprint.FingerprintManager;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.settings.Utils;
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-
-/**
- * Implementation for BiometricsRepositoryProvider
- */
-public class BiometricsRepositoryProviderImpl implements BiometricsRepositoryProvider {
-
-    private static volatile FingerprintRepository sFingerprintRepository;
-
-    /**
-     * Get FingerprintRepository
-     */
-    @Nullable
-    @Override
-    public FingerprintRepository getFingerprintRepository(@NonNull Application application) {
-        final FingerprintManager fingerprintManager =
-                Utils.getFingerprintManagerOrNull(application);
-        if (fingerprintManager == null) {
-            return null;
-        }
-        if (sFingerprintRepository == null) {
-            synchronized (FingerprintRepository.class) {
-                if (sFingerprintRepository == null) {
-                    sFingerprintRepository = new FingerprintRepository(fingerprintManager);
-                }
-            }
-        }
-        return sFingerprintRepository;
-    }
-}
diff --git a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java b/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java
deleted file mode 100644
index 516f471..0000000
--- a/src/com/android/settings/biometrics2/factory/BiometricsViewModelFactory.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.factory;
-
-import android.app.Application;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.ViewModel;
-import androidx.lifecycle.ViewModelProvider;
-import androidx.lifecycle.ViewModelProvider.AndroidViewModelFactory;
-import androidx.lifecycle.viewmodel.CreationExtras;
-
-import com.android.internal.widget.LockPatternUtils;
-import com.android.settings.biometrics.fingerprint.FingerprintUpdater;
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-import com.android.settings.biometrics2.ui.model.CredentialModel;
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
-import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.ChallengeGenerator;
-import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel;
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel;
-import com.android.settings.overlay.FeatureFactory;
-import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
-
-/**
- * View model factory for biometric enrollment fragment
- */
-public class BiometricsViewModelFactory implements ViewModelProvider.Factory {
-
-    private static final String TAG = "BiometricsViewModelFactory";
-
-    public static final CreationExtras.Key<ChallengeGenerator> CHALLENGE_GENERATOR_KEY =
-            new CreationExtras.Key<ChallengeGenerator>() {};
-    public static final CreationExtras.Key<EnrollmentRequest> ENROLLMENT_REQUEST_KEY =
-            new CreationExtras.Key<EnrollmentRequest>() {};
-    public static final CreationExtras.Key<CredentialModel> CREDENTIAL_MODEL_KEY =
-            new CreationExtras.Key<CredentialModel>() {};
-
-    @NonNull
-    @Override
-    @SuppressWarnings("unchecked")
-    public <T extends ViewModel> T create(@NonNull Class<T> modelClass,
-            @NonNull CreationExtras extras) {
-        final Application application = extras.get(AndroidViewModelFactory.APPLICATION_KEY);
-
-        if (application == null) {
-            Log.w(TAG, "create, null application");
-            return create(modelClass);
-        }
-        final FeatureFactory featureFactory = FeatureFactory.getFeatureFactory();
-        final BiometricsRepositoryProvider provider =
-                featureFactory.getBiometricsRepositoryProvider();
-
-        if (modelClass.isAssignableFrom(AutoCredentialViewModel.class)) {
-            final LockPatternUtils lockPatternUtils =
-                    featureFactory.getSecurityFeatureProvider().getLockPatternUtils(application);
-            final ChallengeGenerator challengeGenerator = extras.get(CHALLENGE_GENERATOR_KEY);
-            final CredentialModel credentialModel = extras.get(CREDENTIAL_MODEL_KEY);
-            if (challengeGenerator != null && credentialModel != null) {
-                return (T) new AutoCredentialViewModel(application, lockPatternUtils,
-                        challengeGenerator, credentialModel);
-            }
-        } else if (modelClass.isAssignableFrom(DeviceFoldedViewModel.class)) {
-            return (T) new DeviceFoldedViewModel(new ScreenSizeFoldProvider(application),
-                    application.getMainExecutor());
-        } else if (modelClass.isAssignableFrom(DeviceRotationViewModel.class)) {
-            return (T) new DeviceRotationViewModel(application);
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollFindSensorViewModel.class)) {
-            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
-            if (request != null) {
-                return (T) new FingerprintEnrollFindSensorViewModel(application, request.isSuw());
-            }
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollIntroViewModel.class)) {
-            final FingerprintRepository repository = provider.getFingerprintRepository(application);
-            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
-            final CredentialModel credentialModel = extras.get(CREDENTIAL_MODEL_KEY);
-            if (repository != null && request != null && credentialModel != null) {
-                return (T) new FingerprintEnrollIntroViewModel(application, repository, request,
-                        credentialModel.getUserId());
-            }
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollmentViewModel.class)) {
-            final FingerprintRepository repository = provider.getFingerprintRepository(application);
-            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
-            if (repository != null && request != null) {
-                return (T) new FingerprintEnrollmentViewModel(application, repository, request);
-            }
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollProgressViewModel.class)) {
-            final CredentialModel credentialModel = extras.get(CREDENTIAL_MODEL_KEY);
-            if (credentialModel != null) {
-                return (T) new FingerprintEnrollProgressViewModel(application,
-                        new FingerprintUpdater(application), credentialModel.getUserId());
-            }
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollEnrollingViewModel.class)) {
-            final CredentialModel credentialModel = extras.get(CREDENTIAL_MODEL_KEY);
-            final FingerprintRepository fingerprint = provider.getFingerprintRepository(
-                    application);
-            if (fingerprint != null && credentialModel != null) {
-                return (T) new FingerprintEnrollEnrollingViewModel(application,
-                        credentialModel.getUserId(), fingerprint);
-            }
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollFinishViewModel.class)) {
-            final CredentialModel credentialModel = extras.get(CREDENTIAL_MODEL_KEY);
-            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
-            final FingerprintRepository fingerprint = provider.getFingerprintRepository(
-                    application);
-            if (fingerprint != null && credentialModel != null && request != null) {
-                return (T) new FingerprintEnrollFinishViewModel(application,
-                        credentialModel.getUserId(), request, fingerprint);
-            }
-        } else if (modelClass.isAssignableFrom(FingerprintEnrollErrorDialogViewModel.class)) {
-            final EnrollmentRequest request = extras.get(ENROLLMENT_REQUEST_KEY);
-            if (request != null) {
-                return (T) new FingerprintEnrollErrorDialogViewModel(application, request.isSuw());
-            }
-        }
-        return create(modelClass);
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/model/CredentialModel.kt b/src/com/android/settings/biometrics2/ui/model/CredentialModel.kt
deleted file mode 100644
index 5350733..0000000
--- a/src/com/android/settings/biometrics2/ui/model/CredentialModel.kt
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-import android.content.Intent.EXTRA_USER_ID
-import android.os.Bundle
-import android.os.UserHandle
-import androidx.annotation.VisibleForTesting
-import com.android.settings.biometrics.BiometricEnrollBase.EXTRA_KEY_CHALLENGE
-import com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN
-import com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE
-import java.time.Clock
-
-/**
- * Secret credential data including
- * 1. userId
- * 2. challenge
- * 3. token
- * 4. gkPwHandle
- */
-class CredentialModel(bundle: Bundle?, private val clock: Clock) {
-
-    private val mInitMillis = clock.millis()
-
-    /** userId for this credential */
-    val userId: Int = (bundle ?: Bundle()).getInt(EXTRA_USER_ID, UserHandle.myUserId())
-
-    private var clearGkPwHandleMillis: Long? = null
-
-    /** Gatekeeper password handle */
-    var gkPwHandle: Long = (bundle ?: Bundle()).getLong(EXTRA_KEY_GK_PW_HANDLE, INVALID_GK_PW_HANDLE)
-        private set
-
-    val isValidGkPwHandle: Boolean
-        get() = gkPwHandle != INVALID_GK_PW_HANDLE
-
-    /** Clear gatekeeper password handle data */
-    fun clearGkPwHandle() {
-        clearGkPwHandleMillis = clock.millis()
-        gkPwHandle = INVALID_GK_PW_HANDLE
-    }
-
-    /** Check user id is valid or not */
-    val isValidUserId: Boolean
-        get() = userId != UserHandle.USER_NULL
-
-    private var updateChallengeMillis: Long? = null
-
-    var challenge: Long = (bundle ?: Bundle()).getLong(EXTRA_KEY_CHALLENGE, INVALID_CHALLENGE)
-        set(value) {
-            updateChallengeMillis = clock.millis()
-            field = value
-        }
-
-    val isValidChallenge: Boolean
-        get() = challenge != INVALID_CHALLENGE
-
-    private var updateTokenMillis: Long? = null
-
-    /** Challenge token */
-    var token: ByteArray? = (bundle ?: Bundle()).getByteArray(EXTRA_KEY_CHALLENGE_TOKEN)
-        set(value) {
-            updateTokenMillis = clock.millis()
-            field = value
-        }
-
-    val isValidToken: Boolean
-        get() = token != null
-
-    /** Returns a string representation of the object */
-    override fun toString(): String {
-        val gkPwHandleLen = "$gkPwHandle".length
-        val tokenLen = token?.size ?: 0
-        val challengeLen = "$challenge".length
-        return (javaClass.simpleName + ":{initMillis:$mInitMillis"
-                + ", userId:$userId"
-                + ", challenge:{len:$challengeLen"
-                + ", updateMillis:$updateChallengeMillis}"
-                + ", token:{len:$tokenLen, isValid:$isValidToken"
-                + ", updateMillis:$updateTokenMillis}"
-                + ", gkPwHandle:{len:$gkPwHandleLen, isValid:$isValidGkPwHandle"
-                + ", clearMillis:$clearGkPwHandleMillis}"
-                + " }")
-    }
-
-    companion object {
-        /** Default value for an invalid challenge */
-        @VisibleForTesting
-        const val INVALID_CHALLENGE = -1L
-
-        /** Default value if GkPwHandle is invalid */
-        @VisibleForTesting
-        const val INVALID_GK_PW_HANDLE = 0L
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/model/EnrollmentProgress.kt b/src/com/android/settings/biometrics2/ui/model/EnrollmentProgress.kt
deleted file mode 100644
index 7b35a68..0000000
--- a/src/com/android/settings/biometrics2/ui/model/EnrollmentProgress.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-/** Biometric Enrollment progress */
-class EnrollmentProgress(val steps: Int, val remaining: Int) {
-
-    val isInitialStep: Boolean
-        get() = steps == INITIAL_STEPS
-
-    override fun toString(): String {
-        return ("${javaClass.simpleName}@${Integer.toHexString(hashCode())}"
-                + "{steps:$steps, remaining:$remaining}")
-    }
-
-    companion object {
-        const val INITIAL_STEPS = -1
-        const val INITIAL_REMAINING = 0
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/model/EnrollmentRequest.kt b/src/com/android/settings/biometrics2/ui/model/EnrollmentRequest.kt
deleted file mode 100644
index 4696c62..0000000
--- a/src/com/android/settings/biometrics2/ui/model/EnrollmentRequest.kt
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-import android.content.Context
-import android.content.Intent
-import android.os.Bundle
-import com.android.settings.SetupWizardUtils
-import com.android.settings.biometrics.BiometricEnrollActivity.EXTRA_SKIP_INTRO
-import com.google.android.setupcompat.util.WizardManagerHelper
-import com.google.android.setupcompat.util.WizardManagerHelper.EXTRA_IS_SUW_SUGGESTED_ACTION_FLOW
-
-/**
- * Biometric enrollment generic intent data, which includes
- * 1. isSuw
- * 2. isAfterSuwOrSuwSuggestedAction
- * 3. theme
- * 4. isFromSettingsSummery
- * 5. isSkipIntro
- * 6. isSkipFindSensor
- * 7. a helper method, getSetupWizardExtras
- */
-class EnrollmentRequest(
-    intent: Intent,
-    context: Context,
-    isSetupActivity: Boolean
-) {
-    val isSuw: Boolean = isSetupActivity && WizardManagerHelper.isAnySetupWizard(intent)
-
-    val isAfterSuwOrSuwSuggestedAction = (isSetupActivity
-            && (WizardManagerHelper.isDeferredSetupWizard(intent)
-            || WizardManagerHelper.isPortalSetupWizard(intent)
-            || intent.getBooleanExtra(EXTRA_IS_SUW_SUGGESTED_ACTION_FLOW, false)))
-
-    private val _suwExtras = getSuwExtras(isSuw, intent)
-
-    val isSkipIntro = intent.getBooleanExtra(EXTRA_SKIP_INTRO, false)
-
-    val isSkipFindSensor = intent.getBooleanExtra(EXTRA_SKIP_FIND_SENSOR, false)
-
-    val theme = SetupWizardUtils.getTheme(context, intent)
-
-    val suwExtras: Bundle
-        get() = Bundle(_suwExtras)
-
-    /**
-     * Returns a string representation of the object
-     */
-    override fun toString(): String {
-        return (javaClass.simpleName + ":{isSuw:" + isSuw
-                + ", isAfterSuwOrSuwSuggestedAction:" + isAfterSuwOrSuwSuggestedAction
-                + "}")
-    }
-
-    companion object {
-        const val EXTRA_SKIP_FIND_SENSOR = "skip_find_sensor"
-        private fun getSuwExtras(isSuw: Boolean, intent: Intent): Bundle {
-            val toIntent = Intent()
-            if (isSuw) {
-                SetupWizardUtils.copySetupExtras(intent, toIntent)
-            }
-            return toIntent.extras ?: Bundle()
-        }
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/model/EnrollmentStatusMessage.kt b/src/com/android/settings/biometrics2/ui/model/EnrollmentStatusMessage.kt
deleted file mode 100644
index 6dd0c5c..0000000
--- a/src/com/android/settings/biometrics2/ui/model/EnrollmentStatusMessage.kt
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-/** Enrolling status message (help or error) */
-class EnrollmentStatusMessage(val msgId: Int, string: CharSequence?) {
-
-    /** Status string */
-    val str: CharSequence = string ?: ""
-
-    override fun toString(): String {
-        return "${javaClass.simpleName}@${Integer.toHexString(hashCode())}{id:$msgId, str:$str}"
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/model/FingerprintEnrollIntroStatus.kt b/src/com/android/settings/biometrics2/ui/model/FingerprintEnrollIntroStatus.kt
deleted file mode 100644
index 4cbaffa..0000000
--- a/src/com/android/settings/biometrics2/ui/model/FingerprintEnrollIntroStatus.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-
-enum class FingerprintEnrollable {
-    // Unconfirmed case, this value is invalid, and view shall bypass this value
-    FINGERPRINT_ENROLLABLE_UNKNOWN,
-    // User is allowed to enrolled a new fingerprint
-    FINGERPRINT_ENROLLABLE_OK,
-    // User is not allowed to enroll because the number has reached maximum
-    FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-}
-
-/**
- * Fingerprint onboarding introduction page data, it contains following information which needs
- * to be passed from view model to view.
- * 1. mEnrollableStatus: User is allowed to enroll a new fingerprint or not.
- * 2. mHasScrollToBottom: User has scrolled to the bottom of this page or not.
- */
-class FingerprintEnrollIntroStatus(
-    private val mHasScrollToBottom: Boolean,
-    /** Enrollable status. It means that user is allowed to enroll a new fingerprint or not. */
-    val enrollableStatus: FingerprintEnrollable
-) {
-    /** Get info for this onboarding introduction page has scrolled to bottom or not */
-    fun hasScrollToBottom(): Boolean {
-        return mHasScrollToBottom
-    }
-
-    override fun toString(): String {
-        return ("${javaClass.simpleName}@${Integer.toHexString(hashCode())}"
-                + "{scrollToBottom:$mHasScrollToBottom"
-                + ", enrollableStatus:$enrollableStatus}")
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.kt
deleted file mode 100644
index 9f99d17..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingIconTouchDialog.kt
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.app.Dialog
-import android.content.Context
-import android.content.DialogInterface
-import android.os.Bundle
-import androidx.appcompat.app.AlertDialog
-import androidx.fragment.app.DialogFragment
-import com.android.settings.R
-
-/**
- * Icon Touch dialog
- */
-class FingerprintEnrollEnrollingIconTouchDialog : DialogFragment() {
-    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
-        requireActivity().bindFingerprintEnrollEnrollingIconTouchDialog()
-}
-
-fun Context.bindFingerprintEnrollEnrollingIconTouchDialog(): AlertDialog =
-    AlertDialog.Builder(this, R.style.Theme_AlertDialog)
-        .setTitle(R.string.security_settings_fingerprint_enroll_touch_dialog_title)
-        .setMessage(R.string.security_settings_fingerprint_enroll_touch_dialog_message)
-        .setPositiveButton(R.string.security_settings_fingerprint_enroll_dialog_ok) {
-            dialog: DialogInterface?, _: Int -> dialog?.dismiss()
-        }
-        .create()
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.kt
deleted file mode 100644
index 2530628..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingRfpsFragment.kt
+++ /dev/null
@@ -1,513 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.animation.Animator
-import android.animation.ObjectAnimator
-import android.content.Context
-import android.graphics.PorterDuff
-import android.graphics.drawable.Animatable2
-import android.graphics.drawable.AnimatedVectorDrawable
-import android.graphics.drawable.Drawable
-import android.graphics.drawable.LayerDrawable
-import android.hardware.fingerprint.FingerprintManager.ENROLL_ENROLL
-import android.os.Bundle
-import android.text.TextUtils
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.MotionEvent
-import android.view.View
-import android.view.ViewGroup
-import android.view.animation.AnimationUtils.loadInterpolator
-import android.view.animation.Interpolator
-import android.widget.ProgressBar
-import android.widget.TextView
-import androidx.activity.OnBackPressedCallback
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-import kotlinx.coroutines.launch
-
-/**
- * Fragment is used to handle enrolling process for rfps
- */
-class FingerprintEnrollEnrollingRfpsFragment : Fragment() {
-
-    private var _enrollingViewModel: FingerprintEnrollEnrollingViewModel? = null
-    private val enrollingViewModel: FingerprintEnrollEnrollingViewModel
-        get() = _enrollingViewModel!!
-
-    private var _progressViewModel: FingerprintEnrollProgressViewModel? = null
-    private val progressViewModel: FingerprintEnrollProgressViewModel
-        get() = _progressViewModel!!
-
-    private var _errorDialogViewModel: FingerprintEnrollErrorDialogViewModel? = null
-    private val errorDialogViewModel: FingerprintEnrollErrorDialogViewModel
-        get() = _errorDialogViewModel!!
-
-    private var fastOutSlowInInterpolator: Interpolator? = null
-    private var linearOutSlowInInterpolator: Interpolator? = null
-    private var fastOutLinearInInterpolator: Interpolator? = null
-
-    private var isAnimationCancelled = false
-
-    private var enrollingView: GlifLayout? = null
-    private val progressBar: ProgressBar
-        get() = enrollingView!!.findViewById(R.id.fingerprint_progress_bar)!!
-
-    private var progressAnim: ObjectAnimator? = null
-
-    private val errorText: TextView
-        get() = enrollingView!!.findViewById(R.id.error_text)!!
-
-    private val iconAnimationDrawable: AnimatedVectorDrawable?
-        get() = (progressBar.background as LayerDrawable)
-            .findDrawableByLayerId(R.id.fingerprint_animation) as AnimatedVectorDrawable?
-
-    private val iconBackgroundBlinksDrawable: AnimatedVectorDrawable?
-        get() = (progressBar.background as LayerDrawable)
-            .findDrawableByLayerId(R.id.fingerprint_background) as AnimatedVectorDrawable?
-
-    private var iconTouchCount = 0
-
-    private val touchAgainRunnable = Runnable {
-        showError(
-            // Use enrollingView to getString to prevent activity is missing during rotation
-            enrollingView!!.context.getString(
-                R.string.security_settings_fingerprint_enroll_lift_touch_again
-            )
-        )
-    }
-
-    private val onSkipClickListener = View.OnClickListener { _: View? ->
-        enrollingViewModel.setOnSkipPressed()
-        cancelEnrollment(true)
-    }
-
-    private var enrollingCancelSignal: Any? = null
-
-    private val progressObserver = Observer { progress: EnrollmentProgress? ->
-        if (progress != null && progress.steps >= 0) {
-            onEnrollmentProgressChange(progress)
-        }
-    }
-
-    private val helpMessageObserver = Observer { helpMessage: EnrollmentStatusMessage? ->
-        helpMessage?.let { onEnrollmentHelp(it) }
-    }
-
-    private val errorMessageObserver = Observer { errorMessage: EnrollmentStatusMessage? ->
-        Log.d(TAG, "errorMessageObserver($errorMessage)")
-        errorMessage?.let { onEnrollmentError(it) }
-   }
-
-    private val canceledSignalObserver = Observer { canceledSignal: Any? ->
-        canceledSignal?.let { onEnrollmentCanceled(it) }
-    }
-
-    private val onBackPressedCallback: OnBackPressedCallback =
-        object : OnBackPressedCallback(true) {
-            override fun handleOnBackPressed() {
-                isEnabled = false
-                enrollingViewModel.setOnBackPressed()
-                cancelEnrollment(true)
-            }
-        }
-
-    override fun onAttach(context: Context) {
-        ViewModelProvider(requireActivity()).let { provider ->
-            _enrollingViewModel = provider[FingerprintEnrollEnrollingViewModel::class.java]
-            _progressViewModel = provider[FingerprintEnrollProgressViewModel::class.java]
-            _errorDialogViewModel = provider[FingerprintEnrollErrorDialogViewModel::class.java]
-        }
-        super.onAttach(context)
-        requireActivity().onBackPressedDispatcher.addCallback(onBackPressedCallback)
-    }
-
-    override fun onDetach() {
-        onBackPressedCallback.isEnabled = false
-        super.onDetach()
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        enrollingView = inflater.inflate(
-                R.layout.fingerprint_enroll_enrolling, container, false
-        ) as GlifLayout
-        return enrollingView!!
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-
-        iconAnimationDrawable!!.registerAnimationCallback(iconAnimationCallback)
-
-        progressBar.setOnTouchListener { _: View?, event: MotionEvent ->
-            if (event.actionMasked == MotionEvent.ACTION_DOWN) {
-                iconTouchCount++
-                if (iconTouchCount == ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN) {
-                    showIconTouchDialog()
-                } else {
-                    progressBar.postDelayed(
-                        showDialogRunnable,
-                        ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN
-                    )
-                }
-            } else if (event.actionMasked == MotionEvent.ACTION_CANCEL
-                || event.actionMasked == MotionEvent.ACTION_UP
-            ) {
-                progressBar.removeCallbacks(showDialogRunnable)
-            }
-            true
-        }
-
-        requireActivity().bindFingerprintEnrollEnrollingRfpsView(
-            view = enrollingView!!,
-            onSkipClickListener = onSkipClickListener
-        )
-
-        fastOutSlowInInterpolator =
-            loadInterpolator(requireContext(), android.R.interpolator.fast_out_slow_in)
-        linearOutSlowInInterpolator =
-            loadInterpolator(requireContext(), android.R.interpolator.linear_out_slow_in)
-        fastOutLinearInInterpolator =
-            loadInterpolator(requireContext(), android.R.interpolator.fast_out_linear_in)
-
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.triggerRetryFlow.collect { retryEnrollment() }
-            }
-        }
-    }
-
-    private fun retryEnrollment() {
-        isAnimationCancelled = false
-        startIconAnimation()
-        startEnrollment()
-
-        clearError()
-        updateProgress(false /* animate */, progressViewModel.progressLiveData.value!!)
-        updateTitleAndDescription()
-    }
-
-    override fun onStart() {
-        super.onStart()
-
-        val isEnrolling = progressViewModel.isEnrolling
-        val isErrorDialogShown = errorDialogViewModel.isDialogShown
-        Log.d(TAG, "onStart(), isEnrolling:$isEnrolling, isErrorDialog:$isErrorDialogShown")
-        if (!isErrorDialogShown) {
-            isAnimationCancelled = false
-            startIconAnimation()
-            startEnrollment()
-        }
-
-        updateProgress(false /* animate */, progressViewModel.progressLiveData.value!!)
-        updateTitleAndDescription()
-    }
-
-    private fun startIconAnimation() {
-        iconAnimationDrawable?.start()
-    }
-
-    private fun stopIconAnimation() {
-        isAnimationCancelled = true
-        iconAnimationDrawable?.stop()
-    }
-
-    override fun onStop() {
-        stopIconAnimation()
-        removeEnrollmentObservers()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isConfigChange = requireActivity().isChangingConfigurations
-        Log.d(TAG, "onStop(), enrolling:$isEnrolling isConfigChange:$isConfigChange")
-        if (isEnrolling && !isConfigChange) {
-            cancelEnrollment(false)
-        }
-        super.onStop()
-    }
-
-    private fun removeEnrollmentObservers() {
-        progressViewModel.errorMessageLiveData.removeObserver(errorMessageObserver)
-        progressViewModel.progressLiveData.removeObserver(progressObserver)
-        progressViewModel.helpMessageLiveData.removeObserver(helpMessageObserver)
-    }
-
-    private fun cancelEnrollment(waitForLastCancelErrMsg: Boolean) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "cancelEnrollment(), failed because isEnrolling is false")
-            return
-        }
-        removeEnrollmentObservers()
-        if (waitForLastCancelErrMsg) {
-            progressViewModel.canceledSignalLiveData.observe(this, canceledSignalObserver)
-        } else {
-            enrollingCancelSignal = null
-        }
-        val cancelResult: Boolean = progressViewModel.cancelEnrollment()
-        if (!cancelResult) {
-            Log.e(TAG, "cancelEnrollment(), failed to cancel enrollment")
-        }
-    }
-
-    private fun startEnrollment() {
-        enrollingCancelSignal = progressViewModel.startEnrollment(ENROLL_ENROLL)
-        if (enrollingCancelSignal == null) {
-            Log.e(TAG, "startEnrollment(), failed")
-        } else {
-            Log.d(TAG, "startEnrollment(), success")
-        }
-        progressViewModel.progressLiveData.observe(this, progressObserver)
-        progressViewModel.helpMessageLiveData.observe(this, helpMessageObserver)
-        progressViewModel.errorMessageLiveData.observe(this, errorMessageObserver)
-    }
-
-    private fun onEnrollmentHelp(helpMessage: EnrollmentStatusMessage) {
-        Log.d(TAG, "onEnrollmentHelp($helpMessage)")
-        val helpStr: CharSequence = helpMessage.str
-        if (!TextUtils.isEmpty(helpStr)) {
-            errorText.removeCallbacks(touchAgainRunnable)
-            showError(helpStr)
-        }
-    }
-
-    private fun onEnrollmentError(errorMessage: EnrollmentStatusMessage) {
-        stopIconAnimation()
-
-        cancelEnrollment(true)
-        lifecycleScope.launch {
-            Log.d(TAG, "newDialog $errorMessage")
-            errorDialogViewModel.newDialog(errorMessage.msgId)
-        }
-    }
-
-    private fun onEnrollmentCanceled(canceledSignal: Any) {
-        Log.d(
-            TAG,
-            "onEnrollmentCanceled enrolling:$enrollingCancelSignal, canceled:$canceledSignal"
-        )
-        if (enrollingCancelSignal === canceledSignal) {
-            progressViewModel.canceledSignalLiveData.removeObserver(canceledSignalObserver)
-            progressViewModel.clearProgressLiveData()
-            if (enrollingViewModel.onBackPressed) {
-                enrollingViewModel.onCancelledDueToOnBackPressed()
-            } else if (enrollingViewModel.onSkipPressed) {
-                enrollingViewModel.onCancelledDueToOnSkipPressed()
-            }
-        }
-    }
-
-    private fun onEnrollmentProgressChange(progress: EnrollmentProgress) {
-        updateProgress(true /* animate */, progress)
-        updateTitleAndDescription()
-        animateFlash()
-        errorText.removeCallbacks(touchAgainRunnable)
-        errorText.postDelayed(touchAgainRunnable, HINT_TIMEOUT_DURATION.toLong())
-    }
-
-    private fun updateProgress(animate: Boolean, enrollmentProgress: EnrollmentProgress) {
-        val progress = getProgress(enrollmentProgress)
-        Log.d(TAG, "updateProgress($animate, $enrollmentProgress), old:${progressBar.progress}"
-                + ", new:$progress")
-
-        // Only clear the error when progress has been made.
-        // TODO (b/234772728) Add tests.
-        if (progressBar.progress < progress) {
-            clearError()
-        }
-        if (animate) {
-            animateProgress(progress)
-        } else {
-            progressBar.progress = progress
-            if (progress >= PROGRESS_BAR_MAX) {
-                delayedFinishRunnable.run()
-            }
-        }
-    }
-
-    private fun getProgress(progress: EnrollmentProgress): Int {
-        if (progress.steps == -1) {
-            return 0
-        }
-        val displayProgress = 0.coerceAtLeast(progress.steps + 1 - progress.remaining)
-        return PROGRESS_BAR_MAX * displayProgress / (progress.steps + 1)
-    }
-
-    private fun showError(error: CharSequence) {
-        errorText.text = error
-        if (errorText.visibility == View.INVISIBLE) {
-            errorText.visibility = View.VISIBLE
-            errorText.translationY = enrollingView!!.context.resources.getDimensionPixelSize(
-                R.dimen.fingerprint_error_text_appear_distance
-            ).toFloat()
-            errorText.alpha = 0f
-            errorText.animate()
-                .alpha(1f)
-                .translationY(0f)
-                .setDuration(200)
-                .setInterpolator(linearOutSlowInInterpolator)
-                .start()
-        } else {
-            errorText.animate().cancel()
-            errorText.alpha = 1f
-            errorText.translationY = 0f
-        }
-        if (isResumed && enrollingViewModel.isAccessibilityEnabled) {
-            enrollingViewModel.vibrateError(javaClass.simpleName + "::showError")
-        }
-    }
-
-    private fun clearError() {
-        if (errorText.visibility == View.VISIBLE) {
-            errorText.animate()
-                .alpha(0f)
-                .translationY(
-                    resources.getDimensionPixelSize(
-                        R.dimen.fingerprint_error_text_disappear_distance
-                    ).toFloat()
-                )
-                .setDuration(100)
-                .setInterpolator(fastOutLinearInInterpolator)
-                .withEndAction { errorText.visibility = View.INVISIBLE }
-                .start()
-        }
-    }
-
-    private fun animateProgress(progress: Int) {
-        progressAnim?.cancel()
-        val anim = ObjectAnimator.ofInt(
-            progressBar /* target */,
-            "progress" /* propertyName */,
-            progressBar.progress /* values[0] */,
-            progress /* values[1] */
-        )
-        anim.addListener(progressAnimationListener)
-        anim.interpolator = fastOutSlowInInterpolator
-        anim.setDuration(ANIMATION_DURATION)
-        anim.start()
-        progressAnim = anim
-    }
-
-    private fun animateFlash() {
-        iconBackgroundBlinksDrawable?.start()
-    }
-
-    private fun updateTitleAndDescription() {
-        val progressLiveData: EnrollmentProgress = progressViewModel.progressLiveData.value!!
-        GlifLayoutHelper(activity!!, enrollingView!!).setDescriptionText(
-            enrollingView!!.context.getString(
-                if (progressLiveData.steps == -1)
-                    R.string.security_settings_fingerprint_enroll_start_message
-                else
-                    R.string.security_settings_fingerprint_enroll_repeat_message
-            )
-        )
-    }
-
-    private fun showIconTouchDialog() {
-        iconTouchCount = 0
-        enrollingViewModel.showIconTouchDialog()
-    }
-
-    private val showDialogRunnable = Runnable { showIconTouchDialog() }
-
-    private val progressAnimationListener: Animator.AnimatorListener =
-        object : Animator.AnimatorListener {
-            override fun onAnimationStart(animation: Animator) {
-                startIconAnimation()
-            }
-
-            override fun onAnimationRepeat(animation: Animator) {}
-            override fun onAnimationEnd(animation: Animator) {
-                stopIconAnimation()
-                if (progressBar.progress >= PROGRESS_BAR_MAX) {
-                    progressBar.postDelayed(delayedFinishRunnable, ANIMATION_DURATION)
-                }
-            }
-
-            override fun onAnimationCancel(animation: Animator) {}
-        }
-
-    // Give the user a chance to see progress completed before jumping to the next stage.
-    private val delayedFinishRunnable = Runnable { enrollingViewModel.onEnrollingDone() }
-
-    private val iconAnimationCallback: Animatable2.AnimationCallback =
-        object : Animatable2.AnimationCallback() {
-            override fun onAnimationEnd(d: Drawable) {
-                if (isAnimationCancelled) {
-                    return
-                }
-
-                // Start animation after it has ended.
-                progressBar.post { startIconAnimation() }
-            }
-        }
-
-    companion object {
-        private const val DEBUG = false
-        private const val TAG = "FingerprintEnrollEnrollingRfpsFragment"
-        private const val PROGRESS_BAR_MAX = 10000
-        private const val ANIMATION_DURATION = 250L
-        private const val ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN: Long = 500
-        private const val ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN = 3
-
-        /**
-         * If we don't see progress during this time, we show an error message to remind the users that
-         * they need to lift the finger and touch again.
-         */
-        private const val HINT_TIMEOUT_DURATION = 2500
-    }
-}
-
-fun FragmentActivity.bindFingerprintEnrollEnrollingRfpsView(
-    view: GlifLayout,
-    onSkipClickListener: View.OnClickListener
-) {
-    GlifLayoutHelper(this, view).let {
-        it.setDescriptionText(
-            getString(
-                R.string.security_settings_fingerprint_enroll_start_message
-            )
-        )
-        it.setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title)
-    }
-
-    view.findViewById<ProgressBar>(R.id.fingerprint_progress_bar)!!
-        .progressBackgroundTintMode = PorterDuff.Mode.SRC
-
-    view.getMixin(FooterBarMixin::class.java).secondaryButton =
-        FooterButton.Builder(this)
-            .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-            .setListener(onSkipClickListener)
-            .setButtonType(FooterButton.ButtonType.SKIP)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
-            .build()
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.kt
deleted file mode 100644
index 7faeeac..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingSfpsFragment.kt
+++ /dev/null
@@ -1,669 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.animation.Animator
-import android.animation.ObjectAnimator
-import android.annotation.RawRes
-import android.content.Context
-import android.content.res.ColorStateList
-import android.content.res.Configuration
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffColorFilter
-import android.hardware.fingerprint.FingerprintManager.ENROLL_ENROLL
-import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.MotionEvent
-import android.view.View
-import android.view.ViewGroup
-import android.view.animation.AccelerateDecelerateInterpolator
-import android.view.animation.AnimationUtils
-import android.view.animation.Interpolator
-import android.widget.ProgressBar
-import android.widget.RelativeLayout
-import androidx.activity.OnBackPressedCallback
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.airbnb.lottie.LottieAnimationView
-import com.airbnb.lottie.LottieComposition
-import com.airbnb.lottie.LottieCompositionFactory
-import com.airbnb.lottie.LottieProperty
-import com.airbnb.lottie.model.KeyPath
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-import com.google.android.setupdesign.template.DescriptionMixin
-import com.google.android.setupdesign.template.HeaderMixin
-import kotlin.math.roundToInt
-import kotlinx.coroutines.launch
-
-/**
- * Fragment is used to handle enrolling process for sfps
- */
-class FingerprintEnrollEnrollingSfpsFragment : Fragment() {
-
-    private var _enrollingViewModel: FingerprintEnrollEnrollingViewModel? = null
-    private val enrollingViewModel: FingerprintEnrollEnrollingViewModel
-        get() = _enrollingViewModel!!
-
-    private var _progressViewModel: FingerprintEnrollProgressViewModel? = null
-    private val progressViewModel: FingerprintEnrollProgressViewModel
-        get() = _progressViewModel!!
-
-    private var _errorDialogViewModel: FingerprintEnrollErrorDialogViewModel? = null
-    private val errorDialogViewModel: FingerprintEnrollErrorDialogViewModel
-        get() = _errorDialogViewModel!!
-
-    private val fastOutSlowInInterpolator: Interpolator
-        get() = AnimationUtils.loadInterpolator(
-            activity,
-            androidx.appcompat.R.interpolator.fast_out_slow_in,
-        )
-
-    private var enrollingView: GlifLayout? = null
-
-    private val progressBar: ProgressBar
-        get() = enrollingView!!.findViewById(R.id.fingerprint_progress_bar)!!
-
-    private var progressAnim: ObjectAnimator? = null
-
-    private val progressAnimationListener: Animator.AnimatorListener =
-        object : Animator.AnimatorListener {
-            override fun onAnimationStart(animation: Animator) {}
-            override fun onAnimationRepeat(animation: Animator) {}
-            override fun onAnimationEnd(animation: Animator) {
-                if (progressBar.progress >= PROGRESS_BAR_MAX) {
-                    progressBar.postDelayed(delayedFinishRunnable, PROGRESS_ANIMATION_DURATION)
-                }
-            }
-
-            override fun onAnimationCancel(animation: Animator) {}
-        }
-
-    private val illustrationLottie: LottieAnimationView
-        get() = enrollingView!!.findViewById(R.id.illustration_lottie)!!
-
-    private var haveShownSfpsNoAnimationLottie = false
-    private var haveShownSfpsCenterLottie = false
-    private var haveShownSfpsTipLottie = false
-    private var haveShownSfpsLeftEdgeLottie = false
-    private var haveShownSfpsRightEdgeLottie = false
-
-    private var helpAnimation: ObjectAnimator? = null
-
-    private var iconTouchCount = 0
-
-    private val showIconTouchDialogRunnable = Runnable { showIconTouchDialog() }
-
-    private var enrollingCancelSignal: Any? = null
-
-    // Give the user a chance to see progress completed before jumping to the next stage.
-    private val delayedFinishRunnable = Runnable { enrollingViewModel.onEnrollingDone() }
-
-    private val onSkipClickListener = View.OnClickListener { _: View? ->
-        enrollingViewModel.setOnSkipPressed()
-        cancelEnrollment(true)
-    }
-
-    private val progressObserver = Observer { progress: EnrollmentProgress? ->
-        if (progress != null && progress.steps >= 0) {
-            onEnrollmentProgressChange(progress)
-        }
-    }
-
-    private val helpMessageObserver = Observer { helpMessage: EnrollmentStatusMessage? ->
-        helpMessage?.let { onEnrollmentHelp(it) }
-    }
-
-    private val errorMessageObserver = Observer { errorMessage: EnrollmentStatusMessage? ->
-        Log.d(TAG, "errorMessageObserver($errorMessage)")
-        errorMessage?.let { onEnrollmentError(it) }
-    }
-
-    private val canceledSignalObserver = Observer { canceledSignal: Any? ->
-        Log.d(TAG, "canceledSignalObserver($canceledSignal)")
-        canceledSignal?.let { onEnrollmentCanceled(it) }
-    }
-
-    private val onBackPressedCallback: OnBackPressedCallback =
-        object : OnBackPressedCallback(true) {
-            override fun handleOnBackPressed() {
-                isEnabled = false
-                enrollingViewModel.setOnBackPressed()
-                cancelEnrollment(true)
-            }
-        }
-
-    override fun onAttach(context: Context) {
-        ViewModelProvider(requireActivity()).let { provider ->
-            _enrollingViewModel = provider[FingerprintEnrollEnrollingViewModel::class.java]
-            _progressViewModel = provider[FingerprintEnrollProgressViewModel::class.java]
-            _errorDialogViewModel = provider[FingerprintEnrollErrorDialogViewModel::class.java]
-        }
-        super.onAttach(context)
-        requireActivity().onBackPressedDispatcher.addCallback(onBackPressedCallback)
-    }
-
-    override fun onDetach() {
-        onBackPressedCallback.isEnabled = false
-        super.onDetach()
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View? {
-        enrollingView = inflater.inflate(
-            R.layout.sfps_enroll_enrolling,
-            container, false
-        ) as GlifLayout
-        return enrollingView
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-
-        requireActivity().bindFingerprintEnrollEnrollingSfpsView(
-            view = enrollingView!!,
-            onSkipClickListener = onSkipClickListener
-        )
-
-        // setHelpAnimation()
-        helpAnimation = ObjectAnimator.ofFloat(
-            enrollingView!!.findViewById<RelativeLayout>(R.id.progress_lottie)!!,
-            "translationX" /* propertyName */,
-            0f,
-            HELP_ANIMATION_TRANSLATION_X,
-            -1 * HELP_ANIMATION_TRANSLATION_X,
-            HELP_ANIMATION_TRANSLATION_X,
-            0f
-        ).also {
-            it.interpolator = AccelerateDecelerateInterpolator()
-            it.setDuration(HELP_ANIMATION_DURATION)
-            it.setAutoCancel(false)
-        }
-
-        progressBar.setOnTouchListener { _: View?, event: MotionEvent ->
-            if (event.actionMasked == MotionEvent.ACTION_DOWN) {
-                iconTouchCount++
-                if (iconTouchCount == ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN) {
-                    showIconTouchDialog()
-                } else {
-                    progressBar.postDelayed(
-                        showIconTouchDialogRunnable,
-                        ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN
-                    )
-                }
-            } else if (event.actionMasked == MotionEvent.ACTION_CANCEL
-                || event.actionMasked == MotionEvent.ACTION_UP
-            ) {
-                progressBar.removeCallbacks(showIconTouchDialogRunnable)
-            }
-            true
-        }
-
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.triggerRetryFlow.collect { retryEnrollment() }
-            }
-        }
-    }
-
-    private fun retryEnrollment() {
-        startEnrollment()
-        updateProgress(false /* animate */, progressViewModel.progressLiveData.value!!)
-    }
-
-    override fun onStart() {
-        super.onStart()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isErrorDialogShown = errorDialogViewModel.isDialogShown
-        Log.d(TAG, "onStart(), isEnrolling:$isEnrolling, isErrorDialog:$isErrorDialogShown")
-        if (!isErrorDialogShown) {
-            startEnrollment()
-        }
-
-        updateProgress(false /* animate */, progressViewModel.progressLiveData.value!!)
-        progressViewModel.helpMessageLiveData.value.let {
-            if (it != null) {
-                onEnrollmentHelp(it)
-            } else {
-                clearError()
-                updateTitleAndDescription()
-            }
-        }
-    }
-
-    override fun onStop() {
-        removeEnrollmentObservers()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isConfigChange = requireActivity().isChangingConfigurations
-        Log.d(TAG, "onStop(), enrolling:$isEnrolling isConfigChange:$isConfigChange")
-        if (isEnrolling && !isConfigChange) {
-            cancelEnrollment(false)
-        }
-        super.onStop()
-    }
-
-    private fun removeEnrollmentObservers() {
-        progressViewModel.errorMessageLiveData.removeObserver(errorMessageObserver)
-        progressViewModel.progressLiveData.removeObserver(progressObserver)
-        progressViewModel.helpMessageLiveData.removeObserver(helpMessageObserver)
-    }
-
-    private fun cancelEnrollment(waitForLastCancelErrMsg: Boolean) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "cancelEnrollment(), failed because isEnrolling is false")
-            return
-        }
-        removeEnrollmentObservers()
-        if (waitForLastCancelErrMsg) {
-            progressViewModel.canceledSignalLiveData.observe(this, canceledSignalObserver)
-        } else {
-            enrollingCancelSignal = null
-        }
-        val cancelResult: Boolean = progressViewModel.cancelEnrollment()
-        if (!cancelResult) {
-            Log.e(TAG, "cancelEnrollment(), failed to cancel enrollment")
-        }
-    }
-
-    private fun startEnrollment() {
-        enrollingCancelSignal = progressViewModel.startEnrollment(ENROLL_ENROLL)
-        if (enrollingCancelSignal == null) {
-            Log.e(TAG, "startEnrollment(), failed")
-        } else {
-            Log.d(TAG, "startEnrollment(), success")
-        }
-        progressViewModel.progressLiveData.observe(this, progressObserver)
-        progressViewModel.helpMessageLiveData.observe(this, helpMessageObserver)
-        progressViewModel.errorMessageLiveData.observe(this, errorMessageObserver)
-    }
-
-    private fun configureEnrollmentStage(description: CharSequence, @RawRes lottie: Int) {
-        GlifLayoutHelper(requireActivity(), enrollingView!!).setDescriptionText(description)
-        LottieCompositionFactory.fromRawRes(activity, lottie)
-            .addListener { c: LottieComposition ->
-                illustrationLottie.setComposition(c)
-                illustrationLottie.visibility = View.VISIBLE
-                illustrationLottie.playAnimation()
-            }
-    }
-
-    private val currentSfpsStage: Int
-        get() {
-            val progressLiveData: EnrollmentProgress =
-                progressViewModel.progressLiveData.value
-                    ?: return STAGE_UNKNOWN
-            val progressSteps: Int = progressLiveData.steps - progressLiveData.remaining
-            return if (progressSteps < getStageThresholdSteps(0)) {
-                SFPS_STAGE_NO_ANIMATION
-            } else if (progressSteps < getStageThresholdSteps(1)) {
-                SFPS_STAGE_CENTER
-            } else if (progressSteps < getStageThresholdSteps(2)) {
-                SFPS_STAGE_FINGERTIP
-            } else if (progressSteps < getStageThresholdSteps(3)) {
-                SFPS_STAGE_LEFT_EDGE
-            } else {
-                SFPS_STAGE_RIGHT_EDGE
-            }
-        }
-
-    private fun onEnrollmentHelp(helpMessage: EnrollmentStatusMessage) {
-        Log.d(TAG, "onEnrollmentHelp($helpMessage)")
-        val helpStr: CharSequence = helpMessage.str
-        if (helpStr.isNotEmpty()) {
-            showError(helpStr)
-        }
-    }
-
-    private fun onEnrollmentError(errorMessage: EnrollmentStatusMessage) {
-        cancelEnrollment(true)
-        lifecycleScope.launch {
-            Log.d(TAG, "newDialog $errorMessage")
-            errorDialogViewModel.newDialog(errorMessage.msgId)
-        }
-    }
-
-    private fun onEnrollmentCanceled(canceledSignal: Any) {
-        Log.d(
-            TAG,
-            "onEnrollmentCanceled enrolling:$enrollingCancelSignal, canceled:$canceledSignal"
-        )
-        if (enrollingCancelSignal === canceledSignal) {
-            progressViewModel.canceledSignalLiveData.removeObserver(canceledSignalObserver)
-            progressViewModel.clearProgressLiveData()
-            if (enrollingViewModel.onBackPressed) {
-                enrollingViewModel.onCancelledDueToOnBackPressed()
-            } else if (enrollingViewModel.onSkipPressed) {
-                enrollingViewModel.onCancelledDueToOnSkipPressed()
-            }
-        }
-    }
-
-    private fun announceEnrollmentProgress(announcement: CharSequence) {
-        enrollingViewModel.sendAccessibilityEvent(announcement)
-    }
-
-    private fun onEnrollmentProgressChange(progress: EnrollmentProgress) {
-        updateProgress(true /* animate */, progress)
-        if (enrollingViewModel.isAccessibilityEnabled) {
-            val percent: Int =
-                ((progress.steps - progress.remaining).toFloat() / progress.steps.toFloat() * 100).toInt()
-            val announcement: CharSequence = getString(
-                R.string.security_settings_sfps_enroll_progress_a11y_message, percent
-            )
-            announceEnrollmentProgress(announcement)
-            illustrationLottie.contentDescription =
-                getString(R.string.security_settings_sfps_animation_a11y_label, percent)
-        }
-        updateTitleAndDescription()
-    }
-
-    private fun updateProgress(animate: Boolean, enrollmentProgress: EnrollmentProgress) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "Enrollment not started yet")
-            return
-        }
-
-        val progress = getProgress(enrollmentProgress)
-        Log.d(TAG, "updateProgress($animate, $enrollmentProgress), old:${progressBar.progress}"
-                + ", new:$progress")
-
-        // Only clear the error when progress has been made.
-        // TODO (b/234772728) Add tests.
-        if (progressBar.progress < progress) {
-            clearError()
-        }
-        if (animate) {
-            animateProgress(progress)
-        } else {
-            progressBar.progress = progress
-            if (progress >= PROGRESS_BAR_MAX) {
-                delayedFinishRunnable.run()
-            }
-        }
-    }
-
-    private fun getProgress(progress: EnrollmentProgress): Int {
-        if (progress.steps == -1) {
-            return 0
-        }
-        val displayProgress = 0.coerceAtLeast(progress.steps + 1 - progress.remaining)
-        return PROGRESS_BAR_MAX * displayProgress / (progress.steps + 1)
-    }
-
-    private fun showError(error: CharSequence) {
-        enrollingView!!.let {
-            it.headerText = error
-            it.headerTextView.contentDescription = error
-            GlifLayoutHelper(requireActivity(), it).setDescriptionText("")
-        }
-
-        if (isResumed && !helpAnimation!!.isRunning) {
-            helpAnimation!!.start()
-        }
-        applySfpsErrorDynamicColors(true)
-        if (isResumed && enrollingViewModel.isAccessibilityEnabled) {
-            enrollingViewModel.vibrateError(javaClass.simpleName + "::showError")
-        }
-    }
-
-    private fun clearError() {
-        applySfpsErrorDynamicColors(false)
-    }
-
-    private fun animateProgress(progress: Int) {
-        progressAnim?.cancel()
-        progressAnim = ObjectAnimator.ofInt(
-            progressBar,
-            "progress",
-            progressBar.progress,
-            progress
-        ).also {
-            it.addListener(progressAnimationListener)
-            it.interpolator = fastOutSlowInInterpolator
-            it.setDuration(PROGRESS_ANIMATION_DURATION)
-            it.start()
-        }
-    }
-
-    /**
-     * Applies dynamic colors corresponding to showing or clearing errors on the progress bar
-     * and finger lottie for SFPS
-     */
-    private fun applySfpsErrorDynamicColors(isError: Boolean) {
-        progressBar.applyProgressBarDynamicColor(requireContext(), isError)
-        illustrationLottie.applyLottieDynamicColor(requireContext(), isError)
-    }
-
-    private fun getStageThresholdSteps(index: Int): Int {
-        val progressLiveData: EnrollmentProgress? =
-            progressViewModel.progressLiveData.value
-        if (progressLiveData == null || progressLiveData.steps == -1) {
-            Log.w(TAG, "getStageThresholdSteps: Enrollment not started yet")
-            return 1
-        }
-        return (progressLiveData.steps
-                * enrollingViewModel.getEnrollStageThreshold(index)).roundToInt()
-    }
-
-    private fun updateTitleAndDescription() {
-        val helper = GlifLayoutHelper(requireActivity(), enrollingView!!)
-        if (enrollingViewModel.isAccessibilityEnabled) {
-            enrollingViewModel.clearTalkback()
-            helper.glifLayout.descriptionTextView.accessibilityLiveRegion =
-                View.ACCESSIBILITY_LIVE_REGION_POLITE
-        }
-        val stage = currentSfpsStage
-        if (DEBUG) {
-            Log.d(
-                TAG, "updateTitleAndDescription, stage:" + stage
-                        + ", noAnimation:" + haveShownSfpsNoAnimationLottie
-                        + ", center:" + haveShownSfpsCenterLottie
-                        + ", tip:" + haveShownSfpsTipLottie
-                        + ", leftEdge:" + haveShownSfpsLeftEdgeLottie
-                        + ", rightEdge:" + haveShownSfpsRightEdgeLottie
-            )
-        }
-        when (stage) {
-            SFPS_STAGE_NO_ANIMATION -> {
-                helper.setHeaderText(R.string.security_settings_fingerprint_enroll_repeat_title)
-                if (!haveShownSfpsNoAnimationLottie) {
-                    haveShownSfpsNoAnimationLottie = true
-                    illustrationLottie.contentDescription =
-                        getString(R.string.security_settings_sfps_animation_a11y_label, 0)
-                    configureEnrollmentStage(
-                        getString(R.string.security_settings_sfps_enroll_start_message),
-                        R.raw.sfps_lottie_no_animation
-                    )
-                }
-            }
-
-            SFPS_STAGE_CENTER -> {
-                helper.setHeaderText(R.string.security_settings_sfps_enroll_finger_center_title)
-                if (!haveShownSfpsCenterLottie) {
-                    haveShownSfpsCenterLottie = true
-                    configureEnrollmentStage(
-                        getString(R.string.security_settings_sfps_enroll_start_message),
-                        R.raw.sfps_lottie_pad_center
-                    )
-                }
-            }
-
-            SFPS_STAGE_FINGERTIP -> {
-                helper.setHeaderText(R.string.security_settings_sfps_enroll_fingertip_title)
-                if (!haveShownSfpsTipLottie) {
-                    haveShownSfpsTipLottie = true
-                    configureEnrollmentStage("", R.raw.sfps_lottie_tip)
-                }
-            }
-
-            SFPS_STAGE_LEFT_EDGE -> {
-                helper.setHeaderText(R.string.security_settings_sfps_enroll_left_edge_title)
-                if (!haveShownSfpsLeftEdgeLottie) {
-                    haveShownSfpsLeftEdgeLottie = true
-                    configureEnrollmentStage("", R.raw.sfps_lottie_left_edge)
-                }
-            }
-
-            SFPS_STAGE_RIGHT_EDGE -> {
-                helper.setHeaderText(R.string.security_settings_sfps_enroll_right_edge_title)
-                if (!haveShownSfpsRightEdgeLottie) {
-                    haveShownSfpsRightEdgeLottie = true
-                    configureEnrollmentStage("", R.raw.sfps_lottie_right_edge)
-                }
-            }
-
-            STAGE_UNKNOWN -> {
-                // Don't use BiometricEnrollBase#setHeaderText, since that invokes setTitle,
-                // which gets announced for a11y upon entering the page. For SFPS, we want to
-                // announce a different string for a11y upon entering the page.
-                helper.setHeaderText(R.string.security_settings_sfps_enroll_find_sensor_title)
-                helper.setDescriptionText(
-                    getString(R.string.security_settings_sfps_enroll_start_message)
-                )
-                val description: CharSequence = getString(
-                    R.string.security_settings_sfps_enroll_find_sensor_message
-                )
-                helper.glifLayout.headerTextView.contentDescription = description
-                helper.activity.title = description
-            }
-
-            else -> {
-                helper.setHeaderText(R.string.security_settings_sfps_enroll_find_sensor_title)
-                helper.setDescriptionText(
-                    getString(R.string.security_settings_sfps_enroll_start_message)
-                )
-                val description: CharSequence = getString(
-                    R.string.security_settings_sfps_enroll_find_sensor_message
-                )
-                helper.glifLayout.headerTextView.contentDescription = description
-                helper.activity.title = description
-            }
-        }
-    }
-
-    private fun showIconTouchDialog() {
-        iconTouchCount = 0
-        enrollingViewModel.showIconTouchDialog()
-    }
-
-    companion object {
-        private val TAG = FingerprintEnrollEnrollingSfpsFragment::class.java.simpleName
-        private const val DEBUG = false
-        private const val PROGRESS_BAR_MAX = 10000
-        private const val HELP_ANIMATION_DURATION = 550L
-        private const val HELP_ANIMATION_TRANSLATION_X = 40f
-        private const val PROGRESS_ANIMATION_DURATION = 250L
-        private const val ICON_TOUCH_DURATION_UNTIL_DIALOG_SHOWN: Long = 500
-        private const val ICON_TOUCH_COUNT_SHOW_UNTIL_DIALOG_SHOWN = 3
-        private const val STAGE_UNKNOWN = -1
-        private const val SFPS_STAGE_NO_ANIMATION = 0
-        private const val SFPS_STAGE_CENTER = 1
-        private const val SFPS_STAGE_FINGERTIP = 2
-        private const val SFPS_STAGE_LEFT_EDGE = 3
-        private const val SFPS_STAGE_RIGHT_EDGE = 4
-    }
-}
-
-fun FragmentActivity.bindFingerprintEnrollEnrollingSfpsView(
-    view: GlifLayout,
-    onSkipClickListener: View.OnClickListener
-) {
-    GlifLayoutHelper(this, view).setDescriptionText(
-        getString(R.string.security_settings_fingerprint_enroll_start_message)
-    )
-
-    view.getMixin(FooterBarMixin::class.java).secondaryButton = FooterButton.Builder(this)
-        .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-        .setListener(onSkipClickListener)
-        .setButtonType(FooterButton.ButtonType.SKIP)
-        .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
-        .build()
-
-    view.findViewById<ProgressBar>(R.id.fingerprint_progress_bar)!!.progressBackgroundTintMode =
-        PorterDuff.Mode.SRC
-
-    view.findViewById<ProgressBar>(R.id.fingerprint_progress_bar)!!
-        .applyProgressBarDynamicColor(this, false)
-
-    view.findViewById<LottieAnimationView>(R.id.illustration_lottie)!!
-        .applyLottieDynamicColor(this, false)
-
-    view.maybeHideSfpsText(resources.configuration.orientation)
-}
-
-private fun ProgressBar.applyProgressBarDynamicColor(context: Context, isError: Boolean) {
-    progressTintList = ColorStateList.valueOf(
-        context.getColor(
-            if (isError)
-                R.color.sfps_enrollment_progress_bar_error_color
-            else
-                R.color.sfps_enrollment_progress_bar_fill_color
-        )
-    )
-    progressTintMode = PorterDuff.Mode.SRC
-    invalidate()
-}
-
-fun LottieAnimationView.applyLottieDynamicColor(context: Context, isError: Boolean) {
-    addValueCallback(
-        KeyPath(".blue100", "**"),
-        LottieProperty.COLOR_FILTER
-    ) {
-        PorterDuffColorFilter(
-            context.getColor(
-                if (isError)
-                    R.color.sfps_enrollment_fp_error_color
-                else
-                    R.color.sfps_enrollment_fp_captured_color
-            ),
-            PorterDuff.Mode.SRC_ATOP
-        )
-    }
-    invalidate()
-}
-
-fun GlifLayout.maybeHideSfpsText(@Configuration.Orientation orientation: Int) {
-    val headerMixin: HeaderMixin = getMixin(HeaderMixin::class.java)
-    val descriptionMixin: DescriptionMixin = getMixin(DescriptionMixin::class.java)
-
-    val isLandscape = (orientation == Configuration.ORIENTATION_LANDSCAPE)
-    headerMixin.setAutoTextSizeEnabled(isLandscape)
-    if (isLandscape) {
-        headerMixin.textView.minLines = 0
-        headerMixin.textView.maxLines = 10
-        descriptionMixin.textView.minLines = 0
-        descriptionMixin.textView.maxLines = 10
-    } else {
-        headerMixin.textView.setLines(4)
-        // hide the description
-        descriptionMixin.textView.setLines(0)
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.kt
deleted file mode 100644
index 7e754ac..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollEnrollingUdfpsFragment.kt
+++ /dev/null
@@ -1,707 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.annotation.RawRes
-import android.content.Context
-import android.hardware.biometrics.BiometricFingerprintConstants
-import android.hardware.fingerprint.FingerprintManager.ENROLL_ENROLL
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
-import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.Surface
-import android.view.Surface.ROTATION_270
-import android.view.Surface.ROTATION_90
-import android.view.View
-import android.view.ViewGroup
-import android.widget.Button
-import android.widget.ImageView
-import android.widget.RelativeLayout
-import android.widget.TextView
-import androidx.activity.OnBackPressedCallback
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.MutableLiveData
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.airbnb.lottie.LottieAnimationView
-import com.airbnb.lottie.LottieComposition
-import com.airbnb.lottie.LottieCompositionFactory
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage
-import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel
-import com.android.settings.biometrics2.ui.widget.UdfpsEnrollView
-import com.android.settingslib.display.DisplayDensityUtils
-import kotlinx.coroutines.launch
-import kotlin.math.roundToInt
-
-/**
- * Fragment is used to handle enrolling process for udfps
- */
-class FingerprintEnrollEnrollingUdfpsFragment : Fragment() {
-
-    private var _enrollingViewModel: FingerprintEnrollEnrollingViewModel? = null
-    private val enrollingViewModel: FingerprintEnrollEnrollingViewModel
-        get() = _enrollingViewModel!!
-
-    private var _rotationViewModel: DeviceRotationViewModel? = null
-    private val rotationViewModel: DeviceRotationViewModel
-        get() = _rotationViewModel!!
-
-    private var _progressViewModel: FingerprintEnrollProgressViewModel? = null
-    private val progressViewModel: FingerprintEnrollProgressViewModel
-        get() = _progressViewModel!!
-
-    private var _errorDialogViewModel: FingerprintEnrollErrorDialogViewModel? = null
-    private val errorDialogViewModel: FingerprintEnrollErrorDialogViewModel
-        get() = _errorDialogViewModel!!
-
-    private var illustrationLottie: LottieAnimationView? = null
-
-    private var haveShownTipLottie = false
-    private var haveShownLeftEdgeLottie = false
-    private var haveShownRightEdgeLottie = false
-    private var haveShownCenterLottie = false
-    private var haveShownGuideLottie = false
-
-    private var enrollingView: RelativeLayout? = null
-
-    private val titleText: TextView
-        get() = enrollingView!!.findViewById(R.id.suc_layout_title)!!
-
-    private val subTitleText: TextView
-        get() = enrollingView!!.findViewById(R.id.sud_layout_subtitle)!!
-
-    private val udfpsEnrollView: UdfpsEnrollView
-        get() = enrollingView!!.findViewById(R.id.udfps_animation_view)!!
-
-    private val skipBtn: Button
-        get() = enrollingView!!.findViewById(R.id.skip_btn)!!
-
-    private val icon: ImageView
-        get() = enrollingView!!.findViewById(R.id.sud_layout_icon)!!
-
-    private val shouldShowLottie: Boolean
-        get() {
-            val displayDensity = DisplayDensityUtils(requireContext())
-            val currentDensityIndex: Int = displayDensity.currentIndexForDefaultDisplay
-            val currentDensity: Int =
-                displayDensity.defaultDisplayDensityValues[currentDensityIndex]
-            val defaultDensity: Int = displayDensity.defaultDensityForDefaultDisplay
-            return defaultDensity == currentDensity
-        }
-
-    private val isAccessibilityEnabled
-        get() = enrollingViewModel.isAccessibilityEnabled
-
-    private var rotation = -1
-
-    private var enrollingCancelSignal: Any? = null
-
-    private val onSkipClickListener = View.OnClickListener { _: View? ->
-        enrollingViewModel.setOnSkipPressed()
-        cancelEnrollment(true) // TODO Add test after b/273640000 fixed
-    }
-
-    private val progressObserver = Observer { progress: EnrollmentProgress? ->
-        if (progress != null && progress.steps >= 0) {
-            onEnrollmentProgressChange(progress)
-        }
-    }
-
-    private val helpMessageObserver = Observer { helpMessage: EnrollmentStatusMessage? ->
-        Log.d(TAG, "helpMessageObserver($helpMessage)")
-        helpMessage?.let { onEnrollmentHelp(it) }
-    }
-
-    private val errorMessageObserver = Observer { errorMessage: EnrollmentStatusMessage? ->
-        Log.d(TAG, "errorMessageObserver($errorMessage)")
-        errorMessage?.let { onEnrollmentError(it) }
-    }
-
-    private val canceledSignalObserver = Observer { canceledSignal: Any? ->
-        Log.d(TAG, "canceledSignalObserver($canceledSignal)")
-        canceledSignal?.let { onEnrollmentCanceled(it) }
-    }
-
-    private val acquireObserver =
-        Observer { isAcquiredGood: Boolean? -> isAcquiredGood?.let { onAcquired(it) } }
-
-    private val pointerDownObserver =
-        Observer { sensorId: Int? -> sensorId?.let { onPointerDown(it) } }
-
-    private val pointerUpObserver =
-        Observer { sensorId: Int? -> sensorId?.let { onPointerUp(it) } }
-
-    private val rotationObserver =
-        Observer { rotation: Int? -> rotation?.let { onRotationChanged(it) } }
-
-    private val onBackPressedCallback: OnBackPressedCallback =
-        object : OnBackPressedCallback(true) {
-            override fun handleOnBackPressed() {
-                isEnabled = false
-                enrollingViewModel.setOnBackPressed()
-                cancelEnrollment(true)
-            }
-        }
-
-    // Give the user a chance to see progress completed before jumping to the next stage.
-    private val delayedFinishRunnable = Runnable { enrollingViewModel.onEnrollingDone() }
-
-    override fun onAttach(context: Context) {
-        ViewModelProvider(requireActivity()).let { provider ->
-            _enrollingViewModel = provider[FingerprintEnrollEnrollingViewModel::class.java]
-            _rotationViewModel = provider[DeviceRotationViewModel::class.java]
-            _progressViewModel = provider[FingerprintEnrollProgressViewModel::class.java]
-            _errorDialogViewModel = provider[FingerprintEnrollErrorDialogViewModel::class.java]
-        }
-        super.onAttach(context)
-        requireActivity().onBackPressedDispatcher.addCallback(onBackPressedCallback)
-    }
-
-    override fun onDetach() {
-        onBackPressedCallback.isEnabled = false
-        super.onDetach()
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View = (inflater.inflate(
-        R.layout.udfps_enroll_enrolling_v2, container, false
-    ) as RelativeLayout).also {
-        enrollingView = it
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        rotation = rotationViewModel.liveData.value!!
-        updateIllustrationLottie(rotation)
-
-        requireActivity().bindFingerprintEnrollEnrollingUdfpsView(
-            view = enrollingView!!,
-            sensorProperties = enrollingViewModel.firstFingerprintSensorPropertiesInternal!!,
-            rotation = rotation,
-            onSkipClickListener = onSkipClickListener,
-        )
-
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.triggerRetryFlow.collect { retryEnrollment() }
-            }
-        }
-    }
-
-    private fun retryEnrollment() {
-        reattachUdfpsEnrollView()
-
-        startEnrollment()
-
-        updateProgress(false /* animate */, progressViewModel.progressLiveData.value!!)
-        progressViewModel.helpMessageLiveData.value.let {
-            if (it != null) {
-                onEnrollmentHelp(it)
-            } else {
-                updateTitleAndDescription()
-            }
-        }
-    }
-
-    override fun onStart() {
-        super.onStart()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isErrorDialogShown = errorDialogViewModel.isDialogShown
-        Log.d(TAG, "onStart(), isEnrolling:$isEnrolling, isErrorDialog:$isErrorDialogShown")
-        if (!isErrorDialogShown) {
-            startEnrollment()
-        }
-
-        updateProgress(false /* animate */, progressViewModel.progressLiveData.value!!)
-        progressViewModel.helpMessageLiveData.value.let {
-            if (it != null) {
-                onEnrollmentHelp(it)
-            } else {
-                updateTitleAndDescription()
-            }
-        }
-    }
-
-    private fun reattachUdfpsEnrollView() {
-        enrollingView!!.let {
-            val newUdfpsView = LayoutInflater.from(requireActivity()).inflate(
-                R.layout.udfps_enroll_enrolling_v2_udfps_view,
-                null
-            )
-            val index = it.indexOfChild(udfpsEnrollView)
-            val lp = udfpsEnrollView.layoutParams
-
-            it.removeView(udfpsEnrollView)
-            it.addView(newUdfpsView, index, lp)
-            udfpsEnrollView.setSensorProperties(
-                enrollingViewModel.firstFingerprintSensorPropertiesInternal
-            )
-        }
-
-        // Clear lottie status
-        haveShownTipLottie = false
-        haveShownLeftEdgeLottie = false
-        haveShownRightEdgeLottie = false
-        haveShownCenterLottie = false
-        haveShownGuideLottie = false
-        illustrationLottie?.let {
-            it.contentDescription = ""
-            it.visibility = View.GONE
-        }
-    }
-
-    override fun onResume() {
-        super.onResume()
-        rotationViewModel.liveData.observe(this, rotationObserver)
-    }
-
-    override fun onPause() {
-        rotationViewModel.liveData.removeObserver(rotationObserver)
-        super.onPause()
-    }
-
-    override fun onStop() {
-        removeEnrollmentObservers()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isConfigChange = requireActivity().isChangingConfigurations
-        Log.d(TAG, "onStop(), enrolling:$isEnrolling isConfigChange:$isConfigChange")
-        if (isEnrolling && !isConfigChange) {
-            cancelEnrollment(false)
-        }
-        super.onStop()
-    }
-
-    private fun removeEnrollmentObservers() {
-        progressViewModel.errorMessageLiveData.removeObserver(errorMessageObserver)
-        progressViewModel.progressLiveData.removeObserver(progressObserver)
-        progressViewModel.helpMessageLiveData.removeObserver(helpMessageObserver)
-        progressViewModel.acquireLiveData.removeObserver(acquireObserver)
-        progressViewModel.pointerDownLiveData.removeObserver(pointerDownObserver)
-        progressViewModel.pointerUpLiveData.removeObserver(pointerUpObserver)
-    }
-
-    private fun cancelEnrollment(waitForLastCancelErrMsg: Boolean) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "cancelEnrollment(), failed because isEnrolling is false")
-            return
-        }
-        removeEnrollmentObservers()
-        if (waitForLastCancelErrMsg) {
-            progressViewModel.canceledSignalLiveData.observe(this, canceledSignalObserver)
-        } else {
-            enrollingCancelSignal = null
-        }
-        val cancelResult: Boolean = progressViewModel.cancelEnrollment()
-        if (!cancelResult) {
-            Log.e(TAG, "cancelEnrollment(), failed to cancel enrollment")
-        }
-    }
-
-    private fun startEnrollment() {
-        enrollingCancelSignal = progressViewModel.startEnrollment(ENROLL_ENROLL)
-        if (enrollingCancelSignal == null) {
-            Log.e(TAG, "startEnrollment(), failed")
-        } else {
-            Log.d(TAG, "startEnrollment(), success")
-        }
-        progressViewModel.progressLiveData.observe(this, progressObserver)
-        progressViewModel.helpMessageLiveData.observe(this, helpMessageObserver)
-        progressViewModel.errorMessageLiveData.observe(this, errorMessageObserver)
-        progressViewModel.acquireLiveData.observe(this, acquireObserver)
-        progressViewModel.pointerDownLiveData.observe(this, pointerDownObserver)
-        progressViewModel.pointerUpLiveData.observe(this, pointerUpObserver)
-    }
-
-    private fun updateProgress(animate: Boolean, enrollmentProgress: EnrollmentProgress) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "Enrollment not started yet")
-            return
-        }
-
-        val progress = getProgress(enrollmentProgress)
-        Log.d(TAG, "updateProgress($animate, $enrollmentProgress), progress:$progress")
-
-        if (enrollmentProgress.steps != -1) {
-            udfpsEnrollView.onEnrollmentProgress(
-                enrollmentProgress.remaining,
-                enrollmentProgress.steps
-            )
-        }
-
-        if (progress >= PROGRESS_BAR_MAX) {
-            if (animate) {
-                // Wait animations to finish, then proceed to next page
-                activity!!.mainThreadHandler.postDelayed(delayedFinishRunnable, 400L)
-            } else {
-                delayedFinishRunnable.run()
-            }
-        }
-    }
-
-    private fun getProgress(progress: EnrollmentProgress): Int {
-        if (progress.steps == -1) {
-            return 0
-        }
-        val displayProgress = 0.coerceAtLeast(progress.steps + 1 - progress.remaining)
-        return PROGRESS_BAR_MAX * displayProgress / (progress.steps + 1)
-    }
-
-    private fun updateTitleAndDescription() {
-        Log.d(TAG, "updateTitleAndDescription($currentStage)")
-        when (currentStage) {
-            STAGE_CENTER -> {
-                titleText.setText(R.string.security_settings_fingerprint_enroll_repeat_title)
-                if (isAccessibilityEnabled || illustrationLottie == null) {
-                    subTitleText.setText(R.string.security_settings_udfps_enroll_start_message)
-                } else if (!haveShownCenterLottie) {
-                    haveShownCenterLottie = true
-                    // Note: Update string reference when differentiate in between udfps & sfps
-                    illustrationLottie!!.contentDescription = getString(R.string.security_settings_sfps_enroll_finger_center_title)
-                    configureEnrollmentStage(R.raw.udfps_center_hint_lottie)
-                }
-            }
-
-            STAGE_GUIDED -> {
-                titleText.setText(R.string.security_settings_fingerprint_enroll_repeat_title)
-                if (isAccessibilityEnabled || illustrationLottie == null) {
-                    subTitleText.setText(
-                        R.string.security_settings_udfps_enroll_repeat_a11y_message
-                    )
-                } else if (!haveShownGuideLottie) {
-                    haveShownGuideLottie = true
-                    illustrationLottie!!.contentDescription =
-                        getString(R.string.security_settings_fingerprint_enroll_repeat_message)
-                    // TODO(b/228100413) Could customize guided lottie animation
-                    configureEnrollmentStage(R.raw.udfps_center_hint_lottie)
-                }
-            }
-
-            STAGE_FINGERTIP -> {
-                titleText.setText(R.string.security_settings_udfps_enroll_fingertip_title)
-                if (!haveShownTipLottie && illustrationLottie != null) {
-                    haveShownTipLottie = true
-                    illustrationLottie!!.contentDescription =
-                        getString(R.string.security_settings_udfps_tip_fingerprint_help)
-                    configureEnrollmentStage(R.raw.udfps_tip_hint_lottie)
-                }
-            }
-
-            STAGE_LEFT_EDGE -> {
-                titleText.setText(R.string.security_settings_udfps_enroll_left_edge_title)
-                if (!haveShownLeftEdgeLottie && illustrationLottie != null) {
-                    haveShownLeftEdgeLottie = true
-                    illustrationLottie!!.contentDescription =
-                        getString(R.string.security_settings_udfps_side_fingerprint_help)
-                    configureEnrollmentStage(R.raw.udfps_left_edge_hint_lottie)
-                } else if (illustrationLottie == null) {
-                    if (isStageHalfCompleted) {
-                        subTitleText.setText(
-                            R.string.security_settings_fingerprint_enroll_repeat_message
-                        )
-                    } else {
-                        subTitleText.setText(R.string.security_settings_udfps_enroll_edge_message)
-                    }
-                }
-            }
-
-            STAGE_RIGHT_EDGE -> {
-                titleText.setText(R.string.security_settings_udfps_enroll_right_edge_title)
-                if (!haveShownRightEdgeLottie && illustrationLottie != null) {
-                    haveShownRightEdgeLottie = true
-                    illustrationLottie!!.contentDescription =
-                        getString(R.string.security_settings_udfps_side_fingerprint_help)
-                    configureEnrollmentStage(R.raw.udfps_right_edge_hint_lottie)
-                } else if (illustrationLottie == null) {
-                    if (isStageHalfCompleted) {
-                        subTitleText.setText(
-                            R.string.security_settings_fingerprint_enroll_repeat_message
-                        )
-                    } else {
-                        subTitleText.setText(R.string.security_settings_udfps_enroll_edge_message)
-                    }
-                }
-            }
-
-            STAGE_UNKNOWN -> {
-                titleText.setText(R.string.security_settings_fingerprint_enroll_udfps_title)
-                subTitleText.setText(R.string.security_settings_udfps_enroll_start_message)
-                val description: CharSequence = getString(
-                    R.string.security_settings_udfps_enroll_a11y
-                )
-                requireActivity().title = description
-            }
-
-            else -> {
-                titleText.setText(R.string.security_settings_fingerprint_enroll_udfps_title)
-                subTitleText.setText(R.string.security_settings_udfps_enroll_start_message)
-                val description: CharSequence = getString(
-                    R.string.security_settings_udfps_enroll_a11y
-                )
-                requireActivity().title = description
-            }
-        }
-    }
-
-    private fun updateIllustrationLottie(@Surface.Rotation rotation: Int) {
-        if (rotation == ROTATION_90 || rotation == ROTATION_270) {
-            illustrationLottie = null
-        } else if (shouldShowLottie) {
-            illustrationLottie =
-                enrollingView!!.findViewById(R.id.illustration_lottie)
-        }
-    }
-
-    private val currentStage: Int
-        get() {
-            val progress = progressViewModel.progressLiveData.value!!
-            if (progress.steps == -1) {
-                return STAGE_UNKNOWN
-            }
-            val progressSteps: Int = progress.steps - progress.remaining
-            return if (progressSteps < getStageThresholdSteps(0)) {
-                STAGE_CENTER
-            } else if (progressSteps < getStageThresholdSteps(1)) {
-                STAGE_GUIDED
-            } else if (progressSteps < getStageThresholdSteps(2)) {
-                STAGE_FINGERTIP
-            } else if (progressSteps < getStageThresholdSteps(3)) {
-                STAGE_LEFT_EDGE
-            } else {
-                STAGE_RIGHT_EDGE
-            }
-        }
-
-    private val isStageHalfCompleted: Boolean
-        get() {
-            val progress: EnrollmentProgress = progressViewModel.progressLiveData.value!!
-            if (progress.steps == -1) {
-                return false
-            }
-            val progressSteps: Int = progress.steps - progress.remaining
-            var prevThresholdSteps = 0
-            for (i in 0 until enrollingViewModel.getEnrollStageCount()) {
-                val thresholdSteps = getStageThresholdSteps(i)
-                if (progressSteps in prevThresholdSteps until thresholdSteps) {
-                    val adjustedProgress = progressSteps - prevThresholdSteps
-                    val adjustedThreshold = thresholdSteps - prevThresholdSteps
-                    return adjustedProgress >= adjustedThreshold / 2
-                }
-                prevThresholdSteps = thresholdSteps
-            }
-
-            // After last enrollment step.
-            return true
-        }
-
-    private fun getStageThresholdSteps(index: Int): Int {
-        val progress: EnrollmentProgress = progressViewModel.progressLiveData.value!!
-        if (progress.steps == -1) {
-            Log.w(TAG, "getStageThresholdSteps: Enrollment not started yet")
-            return 1
-        }
-        return (progress.steps * enrollingViewModel.getEnrollStageThreshold(index)).roundToInt()
-    }
-
-    private fun configureEnrollmentStage(@RawRes lottie: Int) {
-        subTitleText.text = ""
-        LottieCompositionFactory.fromRawRes(activity, lottie)
-            .addListener { c: LottieComposition ->
-                illustrationLottie?.let {
-                    it.setComposition(c)
-                    it.visibility = View.VISIBLE
-                    it.playAnimation()
-                }
-            }
-    }
-
-    private fun onEnrollmentProgressChange(progress: EnrollmentProgress) {
-        updateProgress(true /* animate */, progress)
-        updateTitleAndDescription()
-        if (isAccessibilityEnabled) {
-            val steps: Int = progress.steps
-            val remaining: Int = progress.remaining
-            val percent = ((steps - remaining).toFloat() / steps.toFloat() * 100).toInt()
-            val announcement: CharSequence = activity!!.getString(
-                R.string.security_settings_udfps_enroll_progress_a11y_message, percent
-            )
-            enrollingViewModel.sendAccessibilityEvent(announcement)
-        }
-    }
-
-    private fun onEnrollmentHelp(helpMessage: EnrollmentStatusMessage) {
-        Log.d(TAG, "onEnrollmentHelp($helpMessage)")
-        val helpStr: CharSequence = helpMessage.str
-        if (helpStr.isNotEmpty()) {
-            showError(helpStr)
-            udfpsEnrollView.onEnrollmentHelp()
-        }
-    }
-
-    private fun onEnrollmentError(errorMessage: EnrollmentStatusMessage) {
-        cancelEnrollment(true)
-        lifecycleScope.launch {
-            Log.d(TAG, "newDialog $errorMessage")
-            errorDialogViewModel.newDialog(errorMessage.msgId)
-        }
-    }
-
-    private fun onEnrollmentCanceled(canceledSignal: Any) {
-        Log.d(
-            TAG,
-            "onEnrollmentCanceled enrolling:$enrollingCancelSignal, canceled:$canceledSignal"
-        )
-        if (enrollingCancelSignal === canceledSignal) {
-            progressViewModel.canceledSignalLiveData.removeObserver(canceledSignalObserver)
-            progressViewModel.clearProgressLiveData()
-            if (enrollingViewModel.onBackPressed) {
-                enrollingViewModel.onCancelledDueToOnBackPressed()
-            } else if (enrollingViewModel.onSkipPressed) {
-                enrollingViewModel.onCancelledDueToOnSkipPressed()
-            }
-        }
-    }
-
-    private fun onAcquired(isAcquiredGood: Boolean) {
-        udfpsEnrollView.onAcquired(isAcquiredGood)
-    }
-
-    private fun onPointerDown(sensorId: Int) {
-        udfpsEnrollView.onPointerDown(sensorId)
-    }
-
-    private fun onPointerUp(sensorId: Int) {
-        udfpsEnrollView.onPointerUp(sensorId)
-    }
-
-    private fun showError(error: CharSequence) {
-        titleText.text = error
-        titleText.contentDescription = error
-        subTitleText.contentDescription = ""
-    }
-
-    private fun onRotationChanged(newRotation: Int) {
-        if ((newRotation + 2) % 4 == rotation) {
-            rotation = newRotation
-            requireContext().configLayout(newRotation, titleText, subTitleText, icon, skipBtn)
-        }
-    }
-
-    companion object {
-        private val TAG = "FingerprintEnrollEnrollingUdfpsFragment"
-        private const val PROGRESS_BAR_MAX = 10000
-        private const val STAGE_UNKNOWN = -1
-        private const val STAGE_CENTER = 0
-        private const val STAGE_GUIDED = 1
-        private const val STAGE_FINGERTIP = 2
-        private const val STAGE_LEFT_EDGE = 3
-        private const val STAGE_RIGHT_EDGE = 4
-    }
-}
-
-
-fun FragmentActivity.bindFingerprintEnrollEnrollingUdfpsView(
-    view: RelativeLayout,
-    sensorProperties: FingerprintSensorPropertiesInternal,
-    @Surface.Rotation rotation: Int,
-    onSkipClickListener: View.OnClickListener
-) {
-    view.findViewById<UdfpsEnrollView>(R.id.udfps_animation_view)!!.setSensorProperties(
-        sensorProperties
-    )
-
-    val titleText = view.findViewById<TextView>(R.id.suc_layout_title)!!
-    val subTitleText = view.findViewById<TextView>(R.id.sud_layout_subtitle)!!
-    val icon = view.findViewById<ImageView>(R.id.sud_layout_icon)!!
-    val skipBtn = view.findViewById<Button>(R.id.skip_btn)!!.also {
-        it.setOnClickListener(onSkipClickListener)
-    }
-    configLayout(rotation, titleText, subTitleText, icon, skipBtn)
-}
-
-private fun Context.configLayout(
-    @Surface.Rotation newRotation: Int,
-    titleText: TextView,
-    subTitleText: TextView,
-    icon: ImageView,
-    skipBtn: Button
-) {
-    if (newRotation == ROTATION_270) {
-        val iconLP = RelativeLayout.LayoutParams(-2, -2)
-        iconLP.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-        iconLP.addRule(RelativeLayout.END_OF, R.id.udfps_animation_view)
-        iconLP.topMargin = convertDpToPixel(76.64f)
-        iconLP.leftMargin = convertDpToPixel(151.54f)
-        icon.layoutParams = iconLP
-        val titleLP = RelativeLayout.LayoutParams(-1, -2)
-        titleLP.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-        titleLP.addRule(RelativeLayout.END_OF, R.id.udfps_animation_view)
-        titleLP.topMargin = convertDpToPixel(138f)
-        titleLP.leftMargin = convertDpToPixel(144f)
-        titleText.layoutParams = titleLP
-        val subtitleLP = RelativeLayout.LayoutParams(-1, -2)
-        subtitleLP.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-        subtitleLP.addRule(RelativeLayout.END_OF, R.id.udfps_animation_view)
-        subtitleLP.topMargin = convertDpToPixel(198f)
-        subtitleLP.leftMargin = convertDpToPixel(144f)
-        subTitleText.layoutParams = subtitleLP
-    } else if (newRotation == ROTATION_90) {
-        val metrics = resources.displayMetrics
-        val iconLP = RelativeLayout.LayoutParams(-2, -2)
-        iconLP.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-        iconLP.addRule(RelativeLayout.ALIGN_PARENT_START)
-        iconLP.topMargin = convertDpToPixel(76.64f)
-        iconLP.leftMargin = convertDpToPixel(71.99f)
-        icon.layoutParams = iconLP
-        val titleLP = RelativeLayout.LayoutParams(
-            metrics.widthPixels / 2, -2
-        )
-        titleLP.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-        titleLP.addRule(RelativeLayout.ALIGN_PARENT_START, R.id.udfps_animation_view)
-        titleLP.topMargin = convertDpToPixel(138f)
-        titleLP.leftMargin = convertDpToPixel(66f)
-        titleText.layoutParams = titleLP
-        val subtitleLP = RelativeLayout.LayoutParams(
-            metrics.widthPixels / 2, -2
-        )
-        subtitleLP.addRule(RelativeLayout.ALIGN_PARENT_TOP)
-        subtitleLP.addRule(RelativeLayout.ALIGN_PARENT_START)
-        subtitleLP.topMargin = convertDpToPixel(198f)
-        subtitleLP.leftMargin = convertDpToPixel(66f)
-        subTitleText.layoutParams = subtitleLP
-    }
-    if (newRotation == ROTATION_90 || newRotation == ROTATION_270) {
-        val skipBtnLP = skipBtn.layoutParams as RelativeLayout.LayoutParams
-        skipBtnLP.topMargin = convertDpToPixel(26f)
-        skipBtnLP.leftMargin = convertDpToPixel(54f)
-        skipBtn.requestLayout()
-    }
-}
-
-fun Context.convertDpToPixel(dp: Float): Int {
-    return (dp * resources.displayMetrics.density).toInt()
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollErrorDialog.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollErrorDialog.kt
deleted file mode 100644
index 882cbcf..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollErrorDialog.kt
+++ /dev/null
@@ -1,123 +0,0 @@
-/*
- * Copyright 2023 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.biometrics2.ui.view
-
-import android.app.Dialog
-import android.content.Context
-import android.content.DialogInterface
-import android.hardware.biometrics.BiometricConstants
-import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS
-import android.hardware.fingerprint.FingerprintManager.FINGERPRINT_ERROR_HW_UNAVAILABLE
-import android.os.Bundle
-import android.util.Log
-import androidx.appcompat.app.AlertDialog
-import androidx.fragment.app.DialogFragment
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import com.android.settings.R
-import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog.getErrorMessage
-import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog.getErrorTitle
-import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog.getSetupErrorMessage
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT
-import kotlinx.coroutines.launch
-
-/**
- * Fingerprint error dialog, will be shown when an error occurs during fingerprint enrollment.
- */
-class FingerprintEnrollErrorDialog : DialogFragment() {
-
-    private val viewModel: FingerprintEnrollErrorDialogViewModel?
-        get() = activity?.let {
-            ViewModelProvider(it)[FingerprintEnrollErrorDialogViewModel::class.java]
-        }
-
-    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog {
-        val errorMsgId: Int = requireArguments().getInt(KEY_ERROR_MSG_ID)
-        val okButtonSetResultAction =
-            if (errorMsgId == BiometricConstants.BIOMETRIC_ERROR_TIMEOUT)
-                FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT
-            else
-                FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH
-        return requireActivity().bindFingerprintEnrollEnrollingErrorDialog(
-                errorMsgId = errorMsgId,
-                isSuw = viewModel!!.isSuw,
-                tryAgainButtonClickListener = { dialog: DialogInterface?, _: Int ->
-                    activity?.lifecycleScope?.launch {
-                        Log.d(TAG, "tryAgain flow")
-                        viewModel?.triggerRetry()
-                        dialog?.dismiss()
-                    }
-                },
-                okButtonClickListener = { dialog: DialogInterface?, _: Int ->
-                    activity?.lifecycleScope?.launch {
-                        Log.d(TAG, "ok flow as $okButtonSetResultAction")
-                        viewModel?.setResultAndFinish(okButtonSetResultAction)
-                        dialog?.dismiss()
-                    }
-                }
-            )
-    }
-
-    companion object {
-        private const val TAG = "FingerprintEnrollErrorDialog"
-        private const val KEY_ERROR_MSG_ID = "error_msg_id"
-
-        fun newInstance(errorMsgId: Int): FingerprintEnrollErrorDialog {
-            val dialog = FingerprintEnrollErrorDialog()
-            val args = Bundle()
-            args.putInt(KEY_ERROR_MSG_ID, errorMsgId)
-            dialog.arguments = args
-            return dialog
-        }
-    }
-}
-
-fun Context.bindFingerprintEnrollEnrollingErrorDialog(
-    errorMsgId: Int,
-    isSuw: Boolean,
-    tryAgainButtonClickListener: DialogInterface.OnClickListener,
-    okButtonClickListener: DialogInterface.OnClickListener
-): AlertDialog = AlertDialog.Builder(this)
-    .setTitle(getString(getErrorTitle(errorMsgId)))
-    .setMessage(
-        getString(
-            if (isSuw)
-                getSetupErrorMessage(errorMsgId)
-            else
-                getErrorMessage(errorMsgId)
-        )
-    )
-    .setCancelable(false).apply {
-        if (errorMsgId == FINGERPRINT_ERROR_UNABLE_TO_PROCESS) {
-            setPositiveButton(
-                R.string.security_settings_fingerprint_enroll_dialog_try_again,
-                tryAgainButtonClickListener
-            )
-            setNegativeButton(
-                R.string.security_settings_fingerprint_enroll_dialog_ok,
-                okButtonClickListener
-            )
-        } else {
-            setPositiveButton(
-                R.string.security_settings_fingerprint_enroll_dialog_ok,
-                okButtonClickListener
-            )
-        }
-    }
-    .create()
-    .apply { setCanceledOnTouchOutside(false) }
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.kt
deleted file mode 100644
index be24fc6..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindRfpsFragment.kt
+++ /dev/null
@@ -1,295 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.view
-
-import android.content.Context
-import android.hardware.fingerprint.FingerprintManager.ENROLL_FIND_SENSOR
-import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.Surface
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.android.settings.R
-import com.android.settings.biometrics.fingerprint.FingerprintFindSensorAnimation
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage
-import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-import kotlinx.coroutines.launch
-
-/**
- * Fragment explaining the side fingerprint sensor location for fingerprint enrollment.
- * It interacts with ProgressViewModel, and FingerprintFindSensorAnimation.
- * <pre>
- * | Has                 | UDFPS | SFPS | Other (Rear FPS) |
- * |---------------------|-------|------|------------------|
- * | Primary button      | Yes   | No   | No               |
- * | Illustration Lottie | Yes   | Yes  | No               |
- * | Animation           | No    | No   | Depend on layout |
- * | Progress ViewModel  | No    | Yes  | Yes              |
- * | Orientation detect  | No    | Yes  | No               |
- * | Foldable detect     | No    | Yes  | No               |
- * </pre>
- */
-class FingerprintEnrollFindRfpsFragment : Fragment() {
-
-    private var _viewModel: FingerprintEnrollFindSensorViewModel? = null
-    private val viewModel: FingerprintEnrollFindSensorViewModel
-        get() = _viewModel!!
-
-    private var _progressViewModel: FingerprintEnrollProgressViewModel? = null
-    private val progressViewModel: FingerprintEnrollProgressViewModel
-        get() = _progressViewModel!!
-
-    private var _rotationViewModel: DeviceRotationViewModel? = null
-    private val rotationViewModel: DeviceRotationViewModel
-        get() = _rotationViewModel!!
-
-    private var _errorDialogViewModel: FingerprintEnrollErrorDialogViewModel? = null
-    private val errorDialogViewModel: FingerprintEnrollErrorDialogViewModel
-        get() = _errorDialogViewModel!!
-
-    private var findRfpsView: GlifLayout? = null
-
-    private val onSkipClickListener =
-        View.OnClickListener { _: View? -> viewModel.onSkipButtonClick() }
-
-    private var animation: FingerprintFindSensorAnimation? = null
-
-    private var enrollingCancelSignal: Any? = null
-
-    @Surface.Rotation
-    private var lastRotation = -1
-
-    private val progressObserver = Observer { progress: EnrollmentProgress? ->
-        if (progress != null && !progress.isInitialStep) {
-            cancelEnrollment(true)
-        }
-    }
-
-    private val errorMessageObserver = Observer { errorMessage: EnrollmentStatusMessage? ->
-        Log.d(TAG, "errorMessageObserver($errorMessage)")
-        errorMessage?.let { onEnrollmentError(it) }
-    }
-
-    private val canceledSignalObserver = Observer { canceledSignal: Any? ->
-        canceledSignal?.let { onEnrollmentCanceled(it) }
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        findRfpsView = inflater.inflate(
-            R.layout.fingerprint_enroll_find_sensor,
-            container,
-            false
-        ) as GlifLayout
-
-        val animationView = findRfpsView!!.findViewById<View>(
-            R.id.fingerprint_sensor_location_animation
-        )
-        if (animationView is FingerprintFindSensorAnimation) {
-            animation = animationView
-        }
-
-        return findRfpsView!!
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        requireActivity().bindFingerprintEnrollFindRfpsView(
-            view = findRfpsView!!,
-            onSkipClickListener = onSkipClickListener
-        )
-
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.triggerRetryFlow.collect { retryLookingForFingerprint() }
-            }
-        }
-    }
-
-    private fun retryLookingForFingerprint() {
-        startEnrollment()
-        animation?.let {
-            Log.d(TAG, "retry, start animation")
-            it.startAnimation()
-        }
-    }
-
-    override fun onStart() {
-        super.onStart()
-        val isErrorDialogShown = errorDialogViewModel.isDialogShown
-        Log.d(TAG, "onStart(), isEnrolling:${progressViewModel.isEnrolling}"
-                + ", isErrorDialog:$isErrorDialogShown")
-        if (!isErrorDialogShown) {
-            startEnrollment()
-        }
-    }
-
-    override fun onResume() {
-        val rotationLiveData: LiveData<Int> = rotationViewModel.liveData
-        lastRotation = rotationLiveData.value!!
-        if (!errorDialogViewModel.isDialogShown) {
-            animation?.let {
-                Log.d(TAG, "onResume(), start animation")
-                it.startAnimation()
-            }
-        }
-        super.onResume()
-    }
-
-    override fun onPause() {
-        animation?.let {
-            if (DEBUG) {
-                Log.d(TAG, "onPause(), pause animation")
-            }
-            it.pauseAnimation()
-        }
-        super.onPause()
-    }
-
-    override fun onStop() {
-        super.onStop()
-        removeEnrollmentObservers()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isConfigChange = requireActivity().isChangingConfigurations
-        Log.d(TAG, "onStop(), enrolling:$isEnrolling isConfigChange:$isConfigChange")
-        if (isEnrolling && !isConfigChange) {
-            cancelEnrollment(false)
-        }
-    }
-
-    private fun removeEnrollmentObservers() {
-        progressViewModel.progressLiveData.removeObserver(progressObserver)
-        progressViewModel.helpMessageLiveData.removeObserver(errorMessageObserver)
-    }
-
-    private fun startEnrollment() {
-        enrollingCancelSignal = progressViewModel.startEnrollment(ENROLL_FIND_SENSOR)
-        if (enrollingCancelSignal == null) {
-            Log.e(TAG, "startEnrollment(), failed to start enrollment")
-        } else {
-            Log.d(TAG, "startEnrollment(), success")
-        }
-        progressViewModel.progressLiveData.observe(this, progressObserver)
-        progressViewModel.errorMessageLiveData.observe(this, errorMessageObserver)
-    }
-
-    private fun cancelEnrollment(waitForLastCancelErrMsg: Boolean) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "cancelEnrollment(), failed because isEnrolling is false")
-            return
-        }
-        removeEnrollmentObservers()
-        if (waitForLastCancelErrMsg) {
-            progressViewModel.canceledSignalLiveData.observe(this, canceledSignalObserver)
-        } else {
-            enrollingCancelSignal = null
-        }
-        val cancelResult: Boolean = progressViewModel.cancelEnrollment()
-        if (!cancelResult) {
-            Log.e(TAG, "cancelEnrollment(), failed to cancel enrollment")
-        }
-    }
-
-    private fun onEnrollmentError(errorMessage: EnrollmentStatusMessage) {
-        cancelEnrollment(false)
-        lifecycleScope.launch {
-            Log.d(TAG, "newDialogFlow as $errorMessage")
-            errorDialogViewModel.newDialog(errorMessage.msgId)
-        }
-    }
-
-    private fun onEnrollmentCanceled(canceledSignal: Any) {
-        Log.d(
-            TAG,
-            "onEnrollmentCanceled enrolling:$enrollingCancelSignal, canceled:$canceledSignal"
-        )
-        if (enrollingCancelSignal === canceledSignal) {
-            val progress: EnrollmentProgress? = progressViewModel.progressLiveData.value
-            progressViewModel.canceledSignalLiveData.removeObserver(canceledSignalObserver)
-            progressViewModel.clearProgressLiveData()
-            if (progress != null && !progress.isInitialStep) {
-                viewModel.onStartButtonClick()
-            }
-        }
-    }
-
-    override fun onDestroy() {
-        animation?.let {
-            if (DEBUG) {
-                Log.d(TAG, "onDestroy(), stop animation")
-            }
-            it.stopAnimation()
-        }
-        super.onDestroy()
-    }
-
-    override fun onAttach(context: Context) {
-        ViewModelProvider(requireActivity()).let { provider ->
-            _viewModel = provider[FingerprintEnrollFindSensorViewModel::class.java]
-            _progressViewModel = provider[FingerprintEnrollProgressViewModel::class.java]
-            _rotationViewModel = provider[DeviceRotationViewModel::class.java]
-            _errorDialogViewModel = provider[FingerprintEnrollErrorDialogViewModel::class.java]
-        }
-        super.onAttach(context)
-    }
-
-    companion object {
-        private const val DEBUG = false
-        private const val TAG = "FingerprintEnrollFindRfpsFragment"
-    }
-}
-
-fun FragmentActivity.bindFingerprintEnrollFindRfpsView(
-    view: GlifLayout,
-    onSkipClickListener: View.OnClickListener,
-) {
-    GlifLayoutHelper(this, view).let {
-        it.setHeaderText(
-            R.string.security_settings_fingerprint_enroll_find_sensor_title
-        )
-        it.setDescriptionText(
-            getText(R.string.security_settings_fingerprint_enroll_find_sensor_message)
-        )
-    }
-
-    view.getMixin(FooterBarMixin::class.java).secondaryButton =
-        FooterButton.Builder(this)
-            .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-            .setButtonType(FooterButton.ButtonType.SKIP)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
-            .build()
-            .also {
-                it.setOnClickListener(onSkipClickListener)
-            }
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.kt
deleted file mode 100644
index 7455be1..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindSfpsFragment.kt
+++ /dev/null
@@ -1,319 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.view
-
-import android.content.Context
-import android.hardware.fingerprint.FingerprintManager.ENROLL_FIND_SENSOR
-import android.os.Bundle
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.Surface
-import android.view.View
-import android.view.ViewGroup
-import androidx.annotation.RawRes
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.LiveData
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.airbnb.lottie.LottieAnimationView
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage
-import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel
-import com.android.settings.biometrics2.ui.viewmodel.DeviceRotationViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel
-import com.android.settingslib.widget.LottieColorUtils
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-import kotlinx.coroutines.launch
-
-/**
- * Fragment explaining the side fingerprint sensor location for fingerprint enrollment.
- * It interacts with ProgressViewModel, FoldCallback (for different lottie), and
- * LottieAnimationView.
- * <pre>
- * | Has                 | UDFPS | SFPS | Other (Rear FPS) |
- * |---------------------|-------|------|------------------|
- * | Primary button      | Yes   | No   | No               |
- * | Illustration Lottie | Yes   | Yes  | No               |
- * | Animation           | No    | No   | Depend on layout |
- * | Progress ViewModel  | No    | Yes  | Yes              |
- * | Orientation detect  | No    | Yes  | No               |
- * | Foldable detect     | No    | Yes  | No               |
- * </pre>
- */
-class FingerprintEnrollFindSfpsFragment : Fragment() {
-
-    private var _viewModel: FingerprintEnrollFindSensorViewModel? = null
-    private val viewModel: FingerprintEnrollFindSensorViewModel
-        get() = _viewModel!!
-
-    private var _progressViewModel: FingerprintEnrollProgressViewModel? = null
-    private val progressViewModel: FingerprintEnrollProgressViewModel
-        get() = _progressViewModel!!
-
-    private var _rotationViewModel: DeviceRotationViewModel? = null
-    private val rotationViewModel: DeviceRotationViewModel
-        get() = _rotationViewModel!!
-
-    private var _foldedViewModel: DeviceFoldedViewModel? = null
-    private val foldedViewModel: DeviceFoldedViewModel
-        get() = _foldedViewModel!!
-
-    private var _errorDialogViewModel: FingerprintEnrollErrorDialogViewModel? = null
-    private val errorDialogViewModel: FingerprintEnrollErrorDialogViewModel
-        get() = _errorDialogViewModel!!
-
-    private var findSfpsView: GlifLayout? = null
-
-    private val onSkipClickListener =
-        View.OnClickListener { _: View? -> viewModel.onSkipButtonClick() }
-
-    private val illustrationLottie: LottieAnimationView
-        get() = findSfpsView!!.findViewById(R.id.illustration_lottie)!!
-
-    private var enrollingCancelSignal: Any? = null
-
-    @Surface.Rotation
-    private var animationRotation = -1
-
-    private val rotationObserver = Observer { rotation: Int? ->
-        rotation?.let { onRotationChanged(it) }
-    }
-
-    private val progressObserver = Observer { progress: EnrollmentProgress? ->
-        if (progress != null && !progress.isInitialStep) {
-            cancelEnrollment(true)
-        }
-    }
-
-    private val errorMessageObserver = Observer{ errorMessage: EnrollmentStatusMessage? ->
-        Log.d(TAG, "errorMessageObserver($errorMessage)")
-        errorMessage?.let { onEnrollmentError(it) }
-    }
-
-    private val canceledSignalObserver = Observer { canceledSignal: Any? ->
-        canceledSignal?.let { onEnrollmentCanceled(it) }
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View = (inflater.inflate(
-        R.layout.sfps_enroll_find_sensor_layout,
-        container,
-        false
-    ) as GlifLayout).also {
-        findSfpsView = it
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        requireActivity().bindFingerprintEnrollFindSfpsView(
-            view = findSfpsView!!,
-            onSkipClickListener = onSkipClickListener
-        )
-
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.triggerRetryFlow.collect { startEnrollment() }
-            }
-        }
-    }
-
-    override fun onStart() {
-        super.onStart()
-        val isErrorDialogShown = errorDialogViewModel.isDialogShown
-        Log.d(TAG, "onStart(), isEnrolling:${progressViewModel.isEnrolling}"
-                + ", isErrorDialog:$isErrorDialogShown")
-        if (!isErrorDialogShown) {
-            startEnrollment()
-        }
-    }
-
-    override fun onResume() {
-        super.onResume()
-        val rotationLiveData: LiveData<Int> = rotationViewModel.liveData
-        playLottieAnimation(rotationLiveData.value!!)
-        rotationLiveData.observe(this, rotationObserver)
-    }
-
-    override fun onPause() {
-        rotationViewModel.liveData.removeObserver(rotationObserver)
-        super.onPause()
-    }
-
-    override fun onStop() {
-        super.onStop()
-        val isEnrolling = progressViewModel.isEnrolling
-        val isConfigChange = requireActivity().isChangingConfigurations
-        Log.d(TAG, "onStop(), enrolling:$isEnrolling isConfigChange:$isConfigChange")
-        if (isEnrolling && !isConfigChange) {
-            cancelEnrollment(false)
-        }
-    }
-
-    private fun removeEnrollmentObservers() {
-        progressViewModel.errorMessageLiveData.removeObserver(errorMessageObserver)
-        progressViewModel.progressLiveData.removeObserver(progressObserver)
-    }
-
-    private fun startEnrollment() {
-        enrollingCancelSignal = progressViewModel.startEnrollment(ENROLL_FIND_SENSOR)
-        if (enrollingCancelSignal == null) {
-            Log.e(TAG, "startEnrollment(), failed to start enrollment")
-        } else {
-            Log.d(TAG, "startEnrollment(), success")
-        }
-        progressViewModel.progressLiveData.observe(this, progressObserver)
-        progressViewModel.errorMessageLiveData.observe(this, errorMessageObserver)
-    }
-
-    private fun cancelEnrollment(waitForLastCancelErrMsg: Boolean) {
-        if (!progressViewModel.isEnrolling) {
-            Log.d(TAG, "cancelEnrollment(), failed because isEnrolling is false")
-            return
-        }
-        removeEnrollmentObservers()
-        if (waitForLastCancelErrMsg) {
-            progressViewModel.canceledSignalLiveData.observe(this, canceledSignalObserver)
-        } else {
-            enrollingCancelSignal = null
-        }
-        val cancelResult: Boolean = progressViewModel.cancelEnrollment()
-        if (!cancelResult) {
-            Log.e(TAG, "cancelEnrollment(), failed to cancel enrollment")
-        }
-    }
-
-    private fun onRotationChanged(@Surface.Rotation newRotation: Int) {
-        if (DEBUG) {
-            Log.d(TAG, "onRotationChanged() from $animationRotation to $newRotation")
-        }
-        if ((newRotation + 2) % 4 == animationRotation) {
-            // Fragment not changed, we just need to play correct rotation animation
-            playLottieAnimation(newRotation)
-        }
-    }
-
-    private fun onEnrollmentError(errorMessage: EnrollmentStatusMessage) {
-        progressViewModel.cancelEnrollment()
-        lifecycleScope.launch {
-            Log.d(TAG, "newDialogFlow as $errorMessage")
-            errorDialogViewModel.newDialog(errorMessage.msgId)
-        }
-    }
-
-    private fun onEnrollmentCanceled(canceledSignal: Any) {
-        Log.d(
-            TAG,
-            "onEnrollmentCanceled enrolling:$enrollingCancelSignal, canceled:$canceledSignal"
-        )
-        if (enrollingCancelSignal === canceledSignal) {
-            val progress: EnrollmentProgress? = progressViewModel.progressLiveData.value
-            progressViewModel.canceledSignalLiveData.removeObserver(canceledSignalObserver)
-            progressViewModel.clearProgressLiveData()
-            if (progress != null && !progress.isInitialStep) {
-                viewModel.onStartButtonClick()
-            }
-        }
-    }
-
-    private fun playLottieAnimation(@Surface.Rotation rotation: Int) {
-        @RawRes val animationRawRes = getSfpsLottieAnimationRawRes(rotation)
-        Log.d(
-            TAG,
-            "play lottie animation $animationRawRes, previous rotation:$animationRotation"
-                    + ", new rotation:" + rotation
-        )
-        animationRotation = rotation
-        illustrationLottie.setAnimation(animationRawRes)
-        LottieColorUtils.applyDynamicColors(activity, illustrationLottie)
-        illustrationLottie.visibility = View.VISIBLE
-        illustrationLottie.playAnimation()
-    }
-
-    @RawRes
-    private fun getSfpsLottieAnimationRawRes(@Surface.Rotation rotation: Int): Int {
-        val isFolded = java.lang.Boolean.FALSE != foldedViewModel.liveData.value
-        return when (rotation) {
-            Surface.ROTATION_90 ->
-                if (isFolded)
-                    R.raw.fingerprint_edu_lottie_folded_top_left
-                else
-                    R.raw.fingerprint_edu_lottie_portrait_top_left
-            Surface.ROTATION_180 ->
-                if (isFolded)
-                    R.raw.fingerprint_edu_lottie_folded_bottom_left
-                else
-                    R.raw.fingerprint_edu_lottie_landscape_bottom_left
-            Surface.ROTATION_270 ->
-                if (isFolded)
-                    R.raw.fingerprint_edu_lottie_folded_bottom_right
-                else
-                    R.raw.fingerprint_edu_lottie_portrait_bottom_right
-            else ->
-                if (isFolded)
-                    R.raw.fingerprint_edu_lottie_folded_top_right
-                else
-                    R.raw.fingerprint_edu_lottie_landscape_top_right
-        }
-    }
-
-    override fun onAttach(context: Context) {
-        ViewModelProvider(requireActivity()).let { provider ->
-            _viewModel = provider[FingerprintEnrollFindSensorViewModel::class.java]
-            _progressViewModel = provider[FingerprintEnrollProgressViewModel::class.java]
-            _rotationViewModel = provider[DeviceRotationViewModel::class.java]
-            _foldedViewModel = provider[DeviceFoldedViewModel::class.java]
-            _errorDialogViewModel = provider[FingerprintEnrollErrorDialogViewModel::class.java]
-        }
-        super.onAttach(context)
-    }
-
-    companion object {
-        private const val DEBUG = false
-        private const val TAG = "FingerprintEnrollFindSfpsFragment"
-    }
-}
-
-fun FragmentActivity.bindFingerprintEnrollFindSfpsView(
-    view: GlifLayout,
-    onSkipClickListener: View.OnClickListener
-) {
-    view.getMixin(FooterBarMixin::class.java).let {
-        it.secondaryButton = FooterButton.Builder(this)
-            .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-            .setButtonType(FooterButton.ButtonType.SKIP)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
-            .build()
-        it.secondaryButton.setOnClickListener(onSkipClickListener)
-    }
-
-    GlifLayoutHelper(this, view).let {
-        it.setHeaderText(R.string.security_settings_sfps_enroll_find_sensor_title)
-        it.setDescriptionText(
-            getText(R.string.security_settings_sfps_enroll_find_sensor_message)
-        )
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindUdfpsFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindUdfpsFragment.kt
deleted file mode 100644
index 3dce99c..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFindUdfpsFragment.kt
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.content.Context
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.ViewModelProvider
-import com.airbnb.lottie.LottieAnimationView
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-
-/**
- * Fragment explaining the under-display fingerprint sensor location for fingerprint enrollment.
- * It interacts with Primary button, and LottieAnimationView.
- * <pre>
- * | Has                 | UDFPS | SFPS | Other (Rear FPS) |
- * |---------------------|-------|------|------------------|
- * | Primary button      | Yes   | No   | No               |
- * | Illustration Lottie | Yes   | Yes  | No               |
- * | Animation           | No    | No   | Depend on layout |
- * | Progress ViewModel  | No    | Yes  | Yes              |
- * | Orientation detect  | No    | Yes  | No               |
- * | Foldable detect     | No    | Yes  | No               |
- * </pre>
- */
-class FingerprintEnrollFindUdfpsFragment : Fragment() {
-
-    private var _viewModel: FingerprintEnrollFindSensorViewModel? = null
-    private val mViewModel: FingerprintEnrollFindSensorViewModel
-        get() = _viewModel!!
-
-    private var findUdfpsView: GlifLayout? = null
-
-    private val mOnSkipClickListener =
-        View.OnClickListener { _: View? -> mViewModel.onSkipButtonClick() }
-
-    private val mOnStartClickListener =
-        View.OnClickListener { _: View? -> mViewModel.onStartButtonClick() }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View = (inflater.inflate(
-        R.layout.udfps_enroll_find_sensor_layout,
-        container,
-        false
-    ) as GlifLayout).also {
-        findUdfpsView = it
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        requireActivity().bindFingerprintEnrollFindUdfpsView(
-            view = findUdfpsView!!,
-            isAccessibilityEnabled = mViewModel.isAccessibilityEnabled,
-            onSkipClickListener = mOnSkipClickListener,
-            onStartClickListener = mOnStartClickListener
-        )
-    }
-
-    override fun onAttach(context: Context) {
-        _viewModel = ViewModelProvider(requireActivity())[
-            FingerprintEnrollFindSensorViewModel::class.java
-        ]
-        super.onAttach(context)
-    }
-}
-
-fun FragmentActivity.bindFingerprintEnrollFindUdfpsView(
-    view: GlifLayout,
-    isAccessibilityEnabled: Boolean,
-    onSkipClickListener: View.OnClickListener,
-    onStartClickListener: View.OnClickListener,
-) {
-    GlifLayoutHelper(this, view).let { helper ->
-        helper.setHeaderText(R.string.security_settings_udfps_enroll_find_sensor_title)
-        helper.setDescriptionText(
-            getText(R.string.security_settings_udfps_enroll_find_sensor_message)
-        )
-    }
-
-    view.getMixin(FooterBarMixin::class.java)!!.let {
-        it.secondaryButton = FooterButton.Builder(this)
-            .setText(R.string.security_settings_fingerprint_enroll_enrolling_skip)
-            .setButtonType(FooterButton.ButtonType.SKIP)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
-            .build()
-        it.secondaryButton.setOnClickListener(onSkipClickListener)
-
-        it.primaryButton = FooterButton.Builder(this)
-            .setText(R.string.security_settings_udfps_enroll_find_sensor_start_button)
-            .setButtonType(FooterButton.ButtonType.NEXT)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
-            .build()
-        it.primaryButton.setOnClickListener(onStartClickListener)
-    }
-
-    view.findViewById<LottieAnimationView>(R.id.illustration_lottie)!!.let {
-        it.setOnClickListener(onStartClickListener)
-        if (isAccessibilityEnabled) {
-            it.setAnimation(R.raw.udfps_edu_a11y_lottie)
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFinishFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFinishFragment.kt
deleted file mode 100644
index 2af2dee..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollFinishFragment.kt
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.content.Context
-import android.os.Bundle
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.ViewModelProvider
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-
-/**
- * Fragment which concludes fingerprint enrollment.
- */
-class FingerprintEnrollFinishFragment : Fragment() {
-
-    private var _viewModel: FingerprintEnrollFinishViewModel? = null
-    private val viewModel: FingerprintEnrollFinishViewModel
-        get() = _viewModel!!
-
-    private val addButtonClickListener =
-        View.OnClickListener { _: View? -> viewModel.onAddButtonClick() }
-
-    private val nextButtonClickListener =
-        View.OnClickListener { _: View? -> viewModel.onNextButtonClick() }
-    override fun onAttach(context: Context) {
-        super.onAttach(context)
-        _viewModel = ViewModelProvider(requireActivity())[
-            FingerprintEnrollFinishViewModel::class.java
-        ]
-    }
-
-    override fun onCreateView(
-        inflater: LayoutInflater, container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ) : View = (inflater.inflate(
-            if (viewModel.canAssumeSfps())
-                R.layout.sfps_enroll_finish
-            else
-                R.layout.fingerprint_enroll_finish,
-            container,
-            false
-        ) as GlifLayout).also {
-            requireActivity().bindFingerprintEnrollFinishFragment(
-                view = it,
-                isSuw = viewModel.request.isSuw,
-                canAssumeSfps = viewModel.canAssumeSfps(),
-                isAnotherFingerprintEnrollable = viewModel.isAnotherFingerprintEnrollable,
-                nextButtonClickListener = nextButtonClickListener,
-                addButtonClickListener = addButtonClickListener
-            )
-        }
-}
-
-fun FragmentActivity.bindFingerprintEnrollFinishFragment(
-    view: GlifLayout,
-    isSuw: Boolean,
-    canAssumeSfps: Boolean,
-    isAnotherFingerprintEnrollable: Boolean,
-    nextButtonClickListener: View.OnClickListener,
-    addButtonClickListener: View.OnClickListener
-) {
-    GlifLayoutHelper(this, view).apply {
-        setHeaderText(R.string.security_settings_fingerprint_enroll_finish_title)
-        setDescriptionText(
-            getString(
-                if (canAssumeSfps && isAnotherFingerprintEnrollable)
-                    R.string.security_settings_fingerprint_enroll_finish_v2_add_fingerprint_message
-                else
-                    R.string.security_settings_fingerprint_enroll_finish_v2_message
-            )
-        )
-    }
-
-    view.getMixin(FooterBarMixin::class.java).also { footer ->
-        footer.primaryButton = FooterButton.Builder(this)
-            .setText(
-                if (isSuw)
-                    R.string.next_label
-                else
-                    R.string.security_settings_fingerprint_enroll_done
-            )
-            .setListener(nextButtonClickListener)
-            .setButtonType(FooterButton.ButtonType.NEXT)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
-            .build()
-        if (isAnotherFingerprintEnrollable) {
-            footer.secondaryButton = FooterButton.Builder(this)
-                .setText(R.string.fingerprint_enroll_button_add)
-                .setListener(addButtonClickListener)
-                .setButtonType(FooterButton.ButtonType.SKIP)
-                .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Secondary)
-                .build()
-        }
-    }
-
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.kt
deleted file mode 100644
index d1b3799..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollIntroFragment.kt
+++ /dev/null
@@ -1,329 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.app.admin.DevicePolicyManager
-import android.app.admin.DevicePolicyResources.Strings.Settings.FINGERPRINT_UNLOCK_DISABLED
-import android.content.Context
-import android.graphics.PorterDuff
-import android.graphics.PorterDuffColorFilter
-import android.os.Bundle
-import android.text.Html
-import android.text.method.LinkMovementMethod
-import android.util.Log
-import android.view.LayoutInflater
-import android.view.View
-import android.view.ViewGroup
-import android.widget.ImageView
-import android.widget.ScrollView
-import android.widget.TextView
-import androidx.annotation.StringRes
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollable.FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollable.FINGERPRINT_ENROLLABLE_OK
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollable.FINGERPRINT_ENROLLABLE_UNKNOWN
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel
-import com.google.android.setupcompat.template.FooterBarMixin
-import com.google.android.setupcompat.template.FooterButton
-import com.google.android.setupdesign.GlifLayout
-import com.google.android.setupdesign.template.RequireScrollMixin
-import com.google.android.setupdesign.util.DeviceHelper
-import com.google.android.setupdesign.util.DynamicColorPalette
-import com.google.android.setupdesign.util.DynamicColorPalette.ColorType.ACCENT
-import java.util.function.Supplier
-import kotlinx.coroutines.flow.first
-import kotlinx.coroutines.launch
-
-/**
- * Fingerprint intro onboarding page fragment implementation
- */
-class FingerprintEnrollIntroFragment : Fragment() {
-
-    private val viewModelProvider: ViewModelProvider
-        get() = ViewModelProvider(requireActivity())
-
-    private var _viewModel: FingerprintEnrollIntroViewModel? = null
-    private val viewModel: FingerprintEnrollIntroViewModel
-        get() = _viewModel!!
-
-    private var introView: GlifLayout? = null
-
-    private var primaryFooterButton: FooterButton? = null
-
-    private var secondaryFooterButton: FooterButton? = null
-
-    private val onNextClickListener =
-        View.OnClickListener { _: View? ->
-            activity?.lifecycleScope?.let {
-                viewModel.onNextButtonClick(it)
-            }
-        }
-
-    private val onSkipOrCancelClickListener =
-        View.OnClickListener { _: View? ->
-            activity?.lifecycleScope?.let {
-                viewModel.onSkipOrCancelButtonClick(it)
-            }
-        }
-
-    override fun onCreateView(
-        inflater: LayoutInflater,
-        container: ViewGroup?,
-        savedInstanceState: Bundle?
-    ): View {
-        introView = inflater.inflate(
-            R.layout.fingerprint_enroll_introduction,
-            container,
-            false
-        ) as GlifLayout
-        return introView!!
-    }
-
-    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
-        super.onViewCreated(view, savedInstanceState)
-        requireActivity().bindFingerprintEnrollIntroView(
-            view = introView!!,
-            canAssumeUdfps = viewModel.canAssumeUdfps,
-            isBiometricUnlockDisabledByAdmin = viewModel.isBiometricUnlockDisabledByAdmin,
-            isParentalConsentRequired = viewModel.isParentalConsentRequired,
-            descriptionDisabledByAdminSupplier = { getDescriptionDisabledByAdmin(view.context) }
-        )
-    }
-
-    override fun onStart() {
-        val context: Context = requireContext()
-        val footerBarMixin: FooterBarMixin = footerBarMixin
-        viewModel.updateEnrollableStatus(lifecycleScope)
-        initPrimaryFooterButton(context, footerBarMixin)
-        initSecondaryFooterButton(context, footerBarMixin)
-        collectPageStatusFlowIfNeed()
-        super.onStart()
-    }
-
-    private fun initPrimaryFooterButton(
-        context: Context,
-        footerBarMixin: FooterBarMixin
-    ) {
-        if (footerBarMixin.primaryButton != null) {
-            return
-        }
-        primaryFooterButton = FooterButton.Builder(context)
-            .setText(R.string.security_settings_fingerprint_enroll_introduction_agree)
-            .setButtonType(FooterButton.ButtonType.OPT_IN)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
-            .build()
-            .also {
-                it.setOnClickListener(onNextClickListener)
-                footerBarMixin.primaryButton = it
-            }
-    }
-
-    private fun initSecondaryFooterButton(
-        context: Context,
-        footerBarMixin: FooterBarMixin
-    ) {
-        if (footerBarMixin.secondaryButton != null) {
-            return
-        }
-        secondaryFooterButton = FooterButton.Builder(context)
-            .setText(
-                if (viewModel.request.isAfterSuwOrSuwSuggestedAction)
-                    R.string.security_settings_fingerprint_enroll_introduction_cancel
-                else
-                    R.string.security_settings_fingerprint_enroll_introduction_no_thanks
-            )
-            .setButtonType(FooterButton.ButtonType.NEXT)
-            .setTheme(com.google.android.setupdesign.R.style.SudGlifButton_Primary)
-            .build()
-            .also {
-                it.setOnClickListener(onSkipOrCancelClickListener)
-                footerBarMixin.setSecondaryButton(it, true /* usePrimaryStyle */)
-            }
-    }
-
-    private fun collectPageStatusFlowIfNeed() {
-        lifecycleScope.launch {
-            val status = viewModel.pageStatusFlow.first()
-            Log.d(TAG, "collectPageStatusFlowIfNeed status:$status")
-            if (status.hasScrollToBottom()
-                || status.enrollableStatus === FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-            ) {
-                // Update once and do not requireScrollWithButton() again when page has
-                // scrolled to bottom or User has enrolled at least a fingerprint, because if
-                // we requireScrollWithButton() again, primary button will become "More" after
-                // scrolling.
-                updateFooterButtons(status)
-            } else {
-                introView!!.getMixin(RequireScrollMixin::class.java).let {
-                    it.requireScrollWithButton(
-                        requireActivity(),
-                        primaryFooterButton!!,
-                        moreButtonTextRes,
-                        onNextClickListener
-                    )
-                    it.setOnRequireScrollStateChangedListener { scrollNeeded: Boolean ->
-                        viewModel.setHasScrolledToBottom(!scrollNeeded, lifecycleScope)
-                    }
-                }
-                repeatOnLifecycle(Lifecycle.State.STARTED) {
-                    viewModel.pageStatusFlow.collect(
-                        this@FingerprintEnrollIntroFragment::updateFooterButtons
-                    )
-                }
-            }
-        }
-    }
-
-    override fun onAttach(context: Context) {
-        _viewModel = viewModelProvider[FingerprintEnrollIntroViewModel::class.java]
-        super.onAttach(context)
-    }
-
-    private val footerBarMixin: FooterBarMixin
-        get() = introView!!.getMixin(FooterBarMixin::class.java)
-
-    private fun getDescriptionDisabledByAdmin(context: Context): String? {
-        val defaultStrId: Int =
-            R.string.security_settings_fingerprint_enroll_introduction_message_unlock_disabled
-        val devicePolicyManager: DevicePolicyManager =
-            checkNotNull(requireActivity().getSystemService(DevicePolicyManager::class.java))
-
-        return devicePolicyManager.resources.getString(FINGERPRINT_UNLOCK_DISABLED) {
-            context.getString(defaultStrId)
-        }
-    }
-
-    private fun updateFooterButtons(status: FingerprintEnrollIntroStatus) {
-        if (DEBUG) {
-            Log.d(TAG, "updateFooterButtons($status)")
-        }
-        primaryFooterButton!!.setText(
-            context,
-            if (status.enrollableStatus === FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
-                R.string.done
-            else if (status.hasScrollToBottom())
-                R.string.security_settings_fingerprint_enroll_introduction_agree
-            else
-                moreButtonTextRes
-        )
-        secondaryFooterButton!!.visibility =
-            if (status.hasScrollToBottom()
-                && status.enrollableStatus !== FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-                )
-                View.VISIBLE
-            else
-                View.INVISIBLE
-
-        view!!.requireViewById<TextView>(R.id.error_text).let {
-            when (status.enrollableStatus) {
-                FINGERPRINT_ENROLLABLE_OK -> {
-                    it.text = null
-                    it.visibility = View.GONE
-                }
-
-                FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX -> {
-                    it.setText(R.string.fingerprint_intro_error_max)
-                    it.visibility = View.VISIBLE
-                }
-
-                FINGERPRINT_ENROLLABLE_UNKNOWN -> {}
-            }
-        }
-    }
-
-    @get:StringRes
-    private val moreButtonTextRes: Int
-        get() = R.string.security_settings_face_enroll_introduction_more
-
-    companion object {
-        private const val TAG = "FingerprintEnrollIntroFragment"
-        private const val DEBUG = false
-    }
-}
-
-fun FragmentActivity.bindFingerprintEnrollIntroView(
-    view: GlifLayout,
-    canAssumeUdfps: Boolean,
-    isBiometricUnlockDisabledByAdmin: Boolean,
-    isParentalConsentRequired: Boolean,
-    descriptionDisabledByAdminSupplier: Supplier<String?>
-) {
-    val context = view.context
-
-    val iconFingerprint = view.findViewById<ImageView>(R.id.icon_fingerprint)!!
-    val iconDeviceLocked = view.findViewById<ImageView>(R.id.icon_device_locked)!!
-    val iconTrashCan = view.findViewById<ImageView>(R.id.icon_trash_can)!!
-    val iconInfo = view.findViewById<ImageView>(R.id.icon_info)!!
-    val iconShield = view.findViewById<ImageView>(R.id.icon_shield)!!
-    val iconLink = view.findViewById<ImageView>(R.id.icon_link)!!
-    val footerMessage6 = view.findViewById<TextView>(R.id.footer_message_6)!!
-
-    PorterDuffColorFilter(
-        DynamicColorPalette.getColor(context, ACCENT),
-        PorterDuff.Mode.SRC_IN
-    ).let { colorFilter ->
-        iconFingerprint.drawable.colorFilter = colorFilter
-        iconDeviceLocked.drawable.colorFilter = colorFilter
-        iconTrashCan.drawable.colorFilter = colorFilter
-        iconInfo.drawable.colorFilter = colorFilter
-        iconShield.drawable.colorFilter = colorFilter
-        iconLink.drawable.colorFilter = colorFilter
-    }
-
-    view.findViewById<TextView>(R.id.footer_learn_more)!!.let { learnMore ->
-        learnMore.movementMethod = LinkMovementMethod.getInstance()
-        val footerLinkStr: String = context.getString(
-            R.string.security_settings_fingerprint_v2_enroll_introduction_message_learn_more,
-            Html.FROM_HTML_MODE_LEGACY
-        )
-        learnMore.text = Html.fromHtml(footerLinkStr)
-    }
-
-    if (canAssumeUdfps) {
-        footerMessage6.visibility = View.VISIBLE
-        iconShield.visibility = View.VISIBLE
-    } else {
-        footerMessage6.visibility = View.GONE
-        iconShield.visibility = View.GONE
-    }
-    val glifLayoutHelper = GlifLayoutHelper(this, view)
-    if (isBiometricUnlockDisabledByAdmin && !isParentalConsentRequired) {
-        glifLayoutHelper.setHeaderText(
-            R.string.security_settings_fingerprint_enroll_introduction_title_unlock_disabled
-        )
-        glifLayoutHelper.setDescriptionText(descriptionDisabledByAdminSupplier.get())
-    } else {
-        glifLayoutHelper.setHeaderText(
-            R.string.security_settings_fingerprint_enroll_introduction_title
-        )
-        glifLayoutHelper.setDescriptionText(
-            getString(
-                R.string.security_settings_fingerprint_enroll_introduction_v3_message,
-                DeviceHelper.getDeviceName(context)
-            )
-        )
-    }
-
-    view.findViewById<ScrollView>(com.google.android.setupdesign.R.id.sud_scroll_view)
-        ?.importantForAccessibility = View.IMPORTANT_FOR_ACCESSIBILITY_YES
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt b/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
deleted file mode 100644
index ec96597..0000000
--- a/src/com/android/settings/biometrics2/ui/view/FingerprintEnrollmentActivity.kt
+++ /dev/null
@@ -1,633 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.view
-
-import android.annotation.StyleRes
-import android.content.Intent
-import android.content.res.ColorStateList
-import android.content.res.Configuration
-import android.content.res.Resources.Theme
-import android.graphics.Color
-import android.os.Bundle
-import android.os.SystemClock
-import android.util.Log
-import androidx.activity.result.ActivityResult
-import androidx.activity.result.ActivityResultCallback
-import androidx.activity.result.ActivityResultLauncher
-import androidx.activity.result.contract.ActivityResultContracts.StartActivityForResult
-import androidx.annotation.ColorInt
-import androidx.fragment.app.Fragment
-import androidx.fragment.app.FragmentActivity
-import androidx.fragment.app.FragmentManager.POP_BACK_STACK_INCLUSIVE
-import androidx.lifecycle.Lifecycle
-import androidx.lifecycle.Observer
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.lifecycleScope
-import androidx.lifecycle.repeatOnLifecycle
-import androidx.lifecycle.viewmodel.CreationExtras
-import androidx.lifecycle.viewmodel.MutableCreationExtras
-import com.android.settings.R
-import com.android.settings.Utils
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics2.factory.BiometricsViewModelFactory
-import com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CHALLENGE_GENERATOR_KEY
-import com.android.settings.biometrics2.factory.BiometricsViewModelFactory.CREDENTIAL_MODEL_KEY
-import com.android.settings.biometrics2.factory.BiometricsViewModelFactory.ENROLLMENT_REQUEST_KEY
-import com.android.settings.biometrics2.ui.model.CredentialModel
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest
-import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel
-import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.FingerprintChallengeGenerator
-import com.android.settings.biometrics2.ui.viewmodel.CredentialAction
-import com.android.settings.biometrics2.ui.viewmodel.DeviceFoldedViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingAction
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollErrorDialogViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorAction
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FingerprintEnrollFinishAction
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollProgressViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollmentViewModel
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT
-import com.android.settings.overlay.FeatureFactory.Companion.featureFactory
-import com.google.android.setupdesign.util.ThemeHelper
-import kotlinx.coroutines.launch
-
-/**
- * Fingerprint enrollment activity implementation
- */
-open class FingerprintEnrollmentActivity : FragmentActivity() {
-    /** SetupWizard activity*/
-    class SetupActivity : FingerprintEnrollmentActivity()
-
-    /** Internal activity for FingerprintSettings */
-    class InternalActivity : FingerprintEnrollmentActivity()
-
-    private val viewModelProvider: ViewModelProvider by lazy {
-        ViewModelProvider(this)
-    }
-
-    private val viewModel: FingerprintEnrollmentViewModel by lazy {
-        viewModelProvider[FingerprintEnrollmentViewModel::class.java]
-    }
-
-    private val autoCredentialViewModel: AutoCredentialViewModel by lazy {
-        viewModelProvider[AutoCredentialViewModel::class.java]
-    }
-
-    private val introViewModel: FingerprintEnrollIntroViewModel by lazy {
-        viewModelProvider[FingerprintEnrollIntroViewModel::class.java]
-    }
-
-    private val findSensorViewModel: FingerprintEnrollFindSensorViewModel by lazy {
-        viewModelProvider[FingerprintEnrollFindSensorViewModel::class.java]
-    }
-
-    private val progressViewModel: FingerprintEnrollProgressViewModel by lazy {
-        viewModelProvider[FingerprintEnrollProgressViewModel::class.java]
-    }
-
-    private val enrollingViewModel: FingerprintEnrollEnrollingViewModel by lazy {
-        viewModelProvider[FingerprintEnrollEnrollingViewModel::class.java]
-    }
-
-    private val finishViewModel: FingerprintEnrollFinishViewModel by lazy {
-        viewModelProvider[FingerprintEnrollFinishViewModel::class.java]
-    }
-
-    private val errorDialogViewModel: FingerprintEnrollErrorDialogViewModel by lazy {
-        viewModelProvider[FingerprintEnrollErrorDialogViewModel::class.java]
-    }
-
-    private var isFirstFragmentAdded = false
-
-    private val findSensorActionObserver = Observer<Int?> { action ->
-        if (DEBUG) {
-            Log.d(TAG, "findSensorActionObserver($action)")
-        }
-        action?.let { onFindSensorAction(it) }
-    }
-
-    private val enrollingActionObserver = Observer<Int?> { action ->
-        if (DEBUG) {
-            Log.d(TAG, "enrollingActionObserver($action)")
-        }
-        action?.let { onEnrollingAction(it) }
-    }
-
-    private val finishActionObserver = Observer<Int?> { action ->
-        if (DEBUG) {
-            Log.d(TAG, "finishActionObserver($action)")
-        }
-        action?.let { onFinishAction(it) }
-    }
-
-    private val chooseLockResultCallback: ActivityResultCallback<ActivityResult> =
-        ActivityResultCallback { result ->
-            onChooseOrConfirmLockResult(true /* isChooseLock */, result)
-        }
-
-    private val chooseLockLauncher: ActivityResultLauncher<Intent> =
-        registerForActivityResult(StartActivityForResult(), chooseLockResultCallback)
-
-    override fun onCreate(savedInstanceState: Bundle?) {
-        super.onCreate(savedInstanceState)
-
-        // Theme
-        setTheme(viewModel.request.theme)
-        ThemeHelper.trySetDynamicColor(this)
-        window.statusBarColor = Color.TRANSPARENT
-
-        // fragment
-        setContentView(R.layout.biometric_enrollment_container)
-        val fragment: Fragment? = supportFragmentManager.findFragmentById(
-            R.id.fragment_container_view
-        )
-        Log.d(
-            TAG,
-            "onCreate() has savedInstance:$(savedInstanceState != null), fragment:$fragment"
-        )
-
-        isFirstFragmentAdded = (savedInstanceState != null)
-        if (fragment == null) {
-            checkCredential()
-            if (viewModel.request.isSkipFindSensor) {
-                startEnrollingFragment()
-            } else if (viewModel.request.isSkipIntro) {
-                startFindSensorFragment()
-            } else {
-                startIntroFragment()
-            }
-        } else {
-            val tag: String? = fragment.tag
-            if (INTRO_TAG == tag) {
-                attachIntroViewModel()
-            } else if (FIND_SENSOR_TAG == tag) {
-                attachFindSensorViewModel()
-                attachIntroViewModel()
-            } else if (ENROLLING_TAG == tag) {
-                attachEnrollingViewModel()
-                attachFindSensorViewModel()
-                attachIntroViewModel()
-            } else if (FINISH_TAG == tag) {
-                attachFinishViewModel()
-                attachFindSensorViewModel()
-                attachIntroViewModel()
-            } else {
-                Log.e(TAG, "fragment tag $tag not found")
-                finish()
-                return
-            }
-        }
-
-        collectFlows()
-    }
-
-    private fun collectFlows() {
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                viewModel.setResultFlow.collect {
-                    Log.d(TAG, "setResultLiveData($it)")
-                    onSetActivityResult(it)
-                }
-            }
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                autoCredentialViewModel.generateChallengeFailedFlow.collect {
-                    Log.d(TAG, "generateChallengeFailedFlow($it)")
-                    onSetActivityResult(ActivityResult(RESULT_CANCELED, null))
-                }
-            }
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.newDialogFlow.collect {
-                    Log.d(TAG, "newErrorDialogFlow($it)")
-                    FingerprintEnrollErrorDialog.newInstance(it).show(
-                        supportFragmentManager,
-                        ERROR_DIALOG_TAG
-                    )
-                }
-            }
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                errorDialogViewModel.setResultFlow.collect {
-                    Log.d(TAG, "errorDialogSetResultFlow($it)")
-                    when (it) {
-                        FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH -> onSetActivityResult(
-                            ActivityResult(BiometricEnrollBase.RESULT_FINISHED, null)
-                        )
-
-                        FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT -> onSetActivityResult(
-                            ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null)
-                        )
-                    }
-                }
-            }
-        }
-    }
-
-    private fun startFragment(fragmentClass: Class<out Fragment>, tag: String) {
-        if (!isFirstFragmentAdded) {
-            supportFragmentManager.beginTransaction()
-                .setReorderingAllowed(true)
-                .replace(R.id.fragment_container_view, fragmentClass, null, tag)
-                .commit()
-            isFirstFragmentAdded = true
-        } else {
-            supportFragmentManager.beginTransaction()
-                .setReorderingAllowed(true)
-                .setCustomAnimations(
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_open_enter_dynamic_color,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_open_exit,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_close_enter_dynamic_color,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_close_exit
-                )
-                .replace(R.id.fragment_container_view, fragmentClass, null, tag)
-                .addToBackStack(tag)
-                .commit()
-        }
-    }
-
-    private fun startIntroFragment() {
-        attachIntroViewModel()
-        startFragment(FingerprintEnrollIntroFragment::class.java, INTRO_TAG)
-    }
-
-    private fun attachIntroViewModel() {
-        val request: EnrollmentRequest = viewModel.request
-        if (request.isSkipIntro || request.isSkipFindSensor) {
-            return
-        }
-        lifecycleScope.launch {
-            repeatOnLifecycle(Lifecycle.State.STARTED) {
-                introViewModel.actionFlow.collect(this@FingerprintEnrollmentActivity::onIntroAction)
-            }
-        }
-    }
-
-    // We need to make sure token is valid before entering find sensor page
-    private fun startFindSensorFragment() {
-        // Always setToken into progressViewModel even it is not necessary action for UDFPS
-        progressViewModel.setToken(autoCredentialViewModel.token)
-        attachFindSensorViewModel()
-        val fragmentClass: Class<out Fragment> = if (viewModel.canAssumeUdfps) {
-            FingerprintEnrollFindUdfpsFragment::class.java
-        } else if (viewModel.canAssumeSfps) {
-            FingerprintEnrollFindSfpsFragment::class.java
-        } else {
-            FingerprintEnrollFindRfpsFragment::class.java
-        }
-        startFragment(fragmentClass, FIND_SENSOR_TAG)
-    }
-
-    private fun attachFindSensorViewModel() {
-        if (viewModel.request.isSkipFindSensor) {
-            return
-        }
-        findSensorViewModel.let {
-            // Clear ActionLiveData in FragmentViewModel to prevent getting previous action during
-            // recreate, like press 'Start' then press 'back' in FingerprintEnrollEnrolling
-            // activity.
-            it.clearActionLiveData()
-            it.actionLiveData.observe(this, findSensorActionObserver)
-        }
-    }
-
-    private fun startEnrollingFragment() {
-        // Always setToken into progressViewModel even it is not necessary action for SFPS or RFPS
-        progressViewModel.setToken(autoCredentialViewModel.token)
-        attachEnrollingViewModel()
-        val fragmentClass: Class<out Fragment> = if (viewModel.canAssumeUdfps) {
-            FingerprintEnrollEnrollingUdfpsFragment::class.java
-        } else if (viewModel.canAssumeSfps) {
-            FingerprintEnrollEnrollingSfpsFragment::class.java
-        } else {
-            FingerprintEnrollEnrollingRfpsFragment::class.java
-        }
-        startFragment(fragmentClass, ENROLLING_TAG)
-    }
-
-    private fun attachEnrollingViewModel() {
-        enrollingViewModel.let {
-            it.clearActionLiveData()
-            it.actionLiveData.observe(this, enrollingActionObserver)
-        }
-    }
-
-    private fun startFinishFragment() {
-        viewModel.isNewFingerprintAdded = true
-        attachFinishViewModel()
-        if (viewModel.request.isSkipFindSensor) {
-            // Set page to Finish
-            supportFragmentManager.beginTransaction()
-                .setReorderingAllowed(true)
-                .setCustomAnimations(
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_open_enter_dynamic_color,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_open_exit,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_close_enter_dynamic_color,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_close_exit
-                )
-                .replace(
-                    R.id.fragment_container_view,
-                    FingerprintEnrollFinishFragment::class.java,
-                    null,
-                    FINISH_TAG
-                )
-                .commit()
-        } else {
-            // Remove Enrolling page
-            supportFragmentManager.popBackStack()
-
-            // Remove old Finish page if any
-            if (supportFragmentManager.findFragmentByTag(FINISH_TAG) != null) {
-                supportFragmentManager.popBackStack(FINISH_TAG, POP_BACK_STACK_INCLUSIVE)
-            }
-
-            // Remove FindSensor page if maxEnrolled
-            if (viewModel.isMaxEnrolledReached(autoCredentialViewModel.userId)
-                && supportFragmentManager.findFragmentByTag(FIND_SENSOR_TAG) != null
-            ) {
-                supportFragmentManager.popBackStack(FIND_SENSOR_TAG, POP_BACK_STACK_INCLUSIVE)
-            }
-
-            // Add Finish page
-            supportFragmentManager.beginTransaction()
-                .setReorderingAllowed(true)
-                .setCustomAnimations(
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_open_enter_dynamic_color,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_open_exit,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_close_enter_dynamic_color,
-                    com.google.android.setupdesign.R.anim.shared_x_axis_activity_close_exit
-                )
-                .replace(
-                    R.id.fragment_container_view,
-                    FingerprintEnrollFinishFragment::class.java,
-                    null,
-                    FINISH_TAG
-                )
-                .addToBackStack(FINISH_TAG)
-                .commit()
-        }
-    }
-
-    private fun attachFinishViewModel() {
-        finishViewModel.let {
-            it.clearActionLiveData()
-            it.actionLiveData.observe(this, finishActionObserver)
-        }
-    }
-
-    private fun onSetActivityResult(result: ActivityResult) {
-        val challengeExtras: Bundle? = autoCredentialViewModel.createGeneratingChallengeExtras()
-        val overrideResult: ActivityResult = viewModel.getOverrideActivityResult(
-            result, challengeExtras
-        )
-        if (DEBUG) {
-            Log.d(
-                TAG, "onSetActivityResult(" + result + "), override:" + overrideResult
-                        + ") challengeExtras:" + challengeExtras
-            )
-        }
-        setResult(overrideResult.resultCode, overrideResult.data)
-        finish()
-    }
-
-    private fun checkCredential() {
-        when (autoCredentialViewModel.checkCredential(lifecycleScope)) {
-            CredentialAction.FAIL_NEED_TO_CHOOSE_LOCK -> {
-                val intent: Intent = autoCredentialViewModel.createChooseLockIntent(
-                    this,
-                    viewModel.request.isSuw,
-                    viewModel.request.suwExtras
-                )
-                if (!viewModel.isWaitingActivityResult.compareAndSet(false, true)) {
-                    Log.w(TAG, "chooseLock, fail to set isWaiting flag to true")
-                }
-                chooseLockLauncher.launch(intent)
-                return
-            }
-
-            CredentialAction.FAIL_NEED_TO_CONFIRM_LOCK -> {
-                val launched: Boolean = autoCredentialViewModel.createConfirmLockLauncher(
-                    this,
-                    LAUNCH_CONFIRM_LOCK_ACTIVITY,
-                    getString(R.string.security_settings_fingerprint_preference_title)
-                ).launch()
-                if (!launched) {
-                    // This shouldn't happen, as we should only end up at this step if a lock thingy
-                    // is already set.
-                    Log.e(TAG, "confirmLock, launched is true")
-                    finish()
-                } else if (!viewModel.isWaitingActivityResult.compareAndSet(false, true)) {
-                    Log.w(TAG, "confirmLock, fail to set isWaiting flag to true")
-                }
-                return
-            }
-
-            CredentialAction.CREDENTIAL_VALID,
-            CredentialAction.IS_GENERATING_CHALLENGE -> {}
-        }
-    }
-
-    private fun onChooseOrConfirmLockResult(
-        isChooseLock: Boolean,
-        activityResult: ActivityResult
-    ) {
-        if (!viewModel.isWaitingActivityResult.compareAndSet(true, false)) {
-            Log.w(TAG, "isChooseLock:$isChooseLock, fail to unset waiting flag")
-        }
-        if (!autoCredentialViewModel.generateChallengeAsCredentialActivityResult(
-                isChooseLock,
-                activityResult,
-                lifecycleScope
-            )
-        ) {
-            onSetActivityResult(activityResult)
-        }
-    }
-
-    private fun onIntroAction(action: FingerprintEnrollIntroAction) {
-        Log.d(TAG, "onIntroAction($action)")
-        when (action) {
-            FingerprintEnrollIntroAction.DONE_AND_FINISH -> {
-                onSetActivityResult(ActivityResult(BiometricEnrollBase.RESULT_FINISHED, null))
-                return
-            }
-
-            FingerprintEnrollIntroAction.SKIP_OR_CANCEL -> {
-                onSetActivityResult(ActivityResult(BiometricEnrollBase.RESULT_SKIP, null))
-                return
-            }
-
-            FingerprintEnrollIntroAction.CONTINUE_ENROLL -> {
-                startFindSensorFragment()
-            }
-        }
-    }
-
-    private fun onFindSensorAction(@FingerprintEnrollFindSensorAction action: Int) {
-        when (action) {
-            FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP -> {
-                onSetActivityResult(ActivityResult(BiometricEnrollBase.RESULT_SKIP, null))
-                return
-            }
-
-            FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG -> {
-                SkipSetupFindFpsDialog().show(
-                    supportFragmentManager,
-                    SKIP_SETUP_FIND_FPS_DIALOG_TAG
-                )
-                return
-            }
-
-            FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START -> {
-                startEnrollingFragment()
-            }
-        }
-    }
-
-    private fun onEnrollingAction(@FingerprintEnrollEnrollingAction action: Int) {
-        when (action) {
-            FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE -> {
-                startFinishFragment()
-            }
-
-            FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP -> {
-                onSetActivityResult(ActivityResult(BiometricEnrollBase.RESULT_SKIP, null))
-            }
-
-            FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG -> {
-                FingerprintEnrollEnrollingIconTouchDialog().show(
-                    supportFragmentManager,
-                    SKIP_SETUP_FIND_FPS_DIALOG_TAG
-                )
-            }
-
-            FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED -> {
-                if (supportFragmentManager.backStackEntryCount > 0) {
-                    supportFragmentManager.popBackStack()
-                } else {
-                    onSetActivityResult(ActivityResult(RESULT_CANCELED, null))
-                }
-            }
-        }
-    }
-
-    private fun onFinishAction(@FingerprintEnrollFinishAction action: Int) {
-        when (action) {
-            FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK -> {
-                startEnrollingFragment()
-            }
-
-            FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK -> {
-                val data: Intent? = if (viewModel.request.isSuw) {
-                    Intent().also {
-                        it.putExtras(
-                            viewModel.getSuwFingerprintCountExtra(
-                                autoCredentialViewModel.userId
-                            )
-                        )
-                    }
-                } else {
-                    null
-                }
-                onSetActivityResult(ActivityResult(BiometricEnrollBase.RESULT_FINISHED, data))
-            }
-        }
-    }
-
-    override fun onPause() {
-        super.onPause()
-        viewModel.checkFinishActivityDuringOnPause(
-            isFinishing,
-            isChangingConfigurations,
-            lifecycleScope
-        )
-    }
-
-    override fun onDestroy() {
-        viewModel.updateFingerprintSuggestionEnableState(autoCredentialViewModel.userId)
-        super.onDestroy()
-    }
-
-    override fun onApplyThemeResource(theme: Theme, @StyleRes resid: Int, first: Boolean) {
-        theme.applyStyle(R.style.SetupWizardPartnerResource, true)
-        super.onApplyThemeResource(theme, resid, first)
-    }
-
-    @Deprecated("Deprecated in Java")
-    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
-        if (requestCode == LAUNCH_CONFIRM_LOCK_ACTIVITY) {
-            onChooseOrConfirmLockResult(false, ActivityResult(resultCode, data))
-            return
-        }
-        super.onActivityResult(requestCode, resultCode, data)
-    }
-
-    override val defaultViewModelCreationExtras: CreationExtras
-        get() = MutableCreationExtras(super.defaultViewModelCreationExtras).also {
-            it[CHALLENGE_GENERATOR_KEY] = FingerprintChallengeGenerator(
-                featureFactory.biometricsRepositoryProvider.getFingerprintRepository(application)!!
-            )
-            it[ENROLLMENT_REQUEST_KEY] =
-                EnrollmentRequest(intent, applicationContext, this is SetupActivity)
-            it[CREDENTIAL_MODEL_KEY] =
-                CredentialModel(intent.extras, SystemClock.elapsedRealtimeClock())
-        }
-
-    override val defaultViewModelProviderFactory: ViewModelProvider.Factory
-        get() = BiometricsViewModelFactory()
-
-    override fun onAttachedToWindow() {
-        super.onAttachedToWindow()
-        window.statusBarColor = backgroundColor
-    }
-
-    @get:ColorInt
-    private val backgroundColor: Int
-        get() {
-            val stateList: ColorStateList? =
-                Utils.getColorAttr(this, android.R.attr.windowBackground)
-            return stateList?.defaultColor ?: Color.TRANSPARENT
-        }
-
-    override fun onConfigurationChanged(newConfig: Configuration) {
-        viewModelProvider[DeviceFoldedViewModel::class.java].onConfigurationChanged(newConfig)
-        super.onConfigurationChanged(newConfig)
-    }
-
-    companion object {
-        private const val DEBUG = false
-        private const val TAG = "FingerprintEnrollmentActivity"
-        protected const val LAUNCH_CONFIRM_LOCK_ACTIVITY = 1
-
-        private const val INTRO_TAG = "intro"
-        private const val FIND_SENSOR_TAG = "find-sensor"
-        private const val ENROLLING_TAG = "enrolling"
-        private const val FINISH_TAG = "finish"
-        private const val SKIP_SETUP_FIND_FPS_DIALOG_TAG = "skip-setup-dialog"
-        private const val ERROR_DIALOG_TAG = "error-dialog"
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/GlifLayoutHelper.kt b/src/com/android/settings/biometrics2/ui/view/GlifLayoutHelper.kt
deleted file mode 100644
index 756f309..0000000
--- a/src/com/android/settings/biometrics2/ui/view/GlifLayoutHelper.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.view
-
-import android.app.Activity
-import android.text.TextUtils
-import android.view.View
-import androidx.annotation.StringRes
-import com.google.android.setupdesign.GlifLayout
-
-/**
- * Utils class for GlifLayout
- */
-class GlifLayoutHelper(val activity: Activity, val glifLayout: GlifLayout) {
-
-    /**
-     * Sets header text to GlifLayout
-     */
-    fun setHeaderText(@StringRes textResId: Int) {
-        val layoutTitle = glifLayout.headerTextView
-        val previousTitle = layoutTitle.text
-        val title = activity.getText(textResId)
-        if (previousTitle !== title) {
-            if (!TextUtils.isEmpty(previousTitle)) {
-                layoutTitle.accessibilityLiveRegion = View.ACCESSIBILITY_LIVE_REGION_POLITE
-            }
-            glifLayout.headerText = title
-            glifLayout.headerTextView.contentDescription = title
-            activity.title = title
-        }
-    }
-
-    /**
-     * Sets description text to GlifLayout
-     */
-    fun setDescriptionText(description: CharSequence?) {
-        val previousDescription = glifLayout.descriptionText
-        // Prevent a11y for re-reading the same string
-        if (!TextUtils.equals(previousDescription, description)) {
-            glifLayout.descriptionText = description
-        }
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/view/SkipSetupFindFpsDialog.kt b/src/com/android/settings/biometrics2/ui/view/SkipSetupFindFpsDialog.kt
deleted file mode 100644
index bb74e36..0000000
--- a/src/com/android/settings/biometrics2/ui/view/SkipSetupFindFpsDialog.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.view
-
-import android.app.Dialog
-import android.content.Context
-import android.content.DialogInterface
-import android.os.Bundle
-import androidx.appcompat.app.AlertDialog
-import androidx.fragment.app.DialogFragment
-import androidx.lifecycle.ViewModelProvider
-import com.android.settings.R
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel
-
-/**
- * Skip dialog which shows when user clicks "Do it later" button in FingerprintFindSensor page.
- */
-class SkipSetupFindFpsDialog : DialogFragment() {
-
-    private var mViewModel: FingerprintEnrollFindSensorViewModel? = null
-
-    override fun onCreateDialog(savedInstanceState: Bundle?): Dialog =
-        requireActivity().bindSkipSetupFindFpsDialog {
-            _: DialogInterface?, _: Int -> mViewModel?.onSkipDialogButtonClick()
-        }
-
-    override fun onAttach(context: Context) {
-        mViewModel = ViewModelProvider(requireActivity())[
-            FingerprintEnrollFindSensorViewModel::class.java
-        ]
-        super.onAttach(context)
-    }
-}
-
-fun Context.bindSkipSetupFindFpsDialog(
-    positiveButtonClickListener: DialogInterface.OnClickListener
-): AlertDialog =
-    AlertDialog.Builder(this, R.style.Theme_AlertDialog)
-        .setTitle(R.string.setup_fingerprint_enroll_skip_title)
-        .setPositiveButton(R.string.skip_anyway_button_label, positiveButtonClickListener)
-        .setNegativeButton(R.string.go_back_button_label, null)
-        .setMessage(R.string.setup_fingerprint_enroll_skip_after_adding_lock_text)
-        .create()
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt b/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt
deleted file mode 100644
index 95aee4b..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModel.kt
+++ /dev/null
@@ -1,283 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Activity
-import android.app.Application
-import android.app.admin.DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED
-import android.content.Context
-import android.content.Intent
-import android.os.Bundle
-import android.util.Log
-import androidx.activity.result.ActivityResult
-import androidx.lifecycle.AndroidViewModel
-import com.android.internal.widget.LockPatternUtils
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.BiometricUtils
-import com.android.settings.biometrics.BiometricUtils.GatekeeperCredentialNotMatchException
-import com.android.settings.biometrics2.data.repository.FingerprintRepository
-import com.android.settings.biometrics2.ui.model.CredentialModel
-import com.android.settings.password.ChooseLockGeneric
-import com.android.settings.password.ChooseLockPattern
-import com.android.settings.password.ChooseLockSettingsHelper
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.SharedFlow
-import kotlinx.coroutines.flow.asSharedFlow
-import kotlinx.coroutines.launch
-
-/**
- * AutoCredentialViewModel which uses CredentialModel to determine next actions for activity, like
- * start ChooseLockActivity, start ConfirmLockActivity, GenerateCredential, or do nothing.
- */
-class AutoCredentialViewModel(
-    application: Application,
-    private val lockPatternUtils: LockPatternUtils,
-    private val challengeGenerator: ChallengeGenerator,
-    private val credentialModel: CredentialModel
-) : AndroidViewModel(application) {
-
-    /**
-     * Generic callback for FingerprintManager#generateChallenge or FaceManager#generateChallenge
-     */
-    interface GenerateChallengeCallback {
-        /** Generic generateChallenge method for FingerprintManager or FaceManager */
-        fun onChallengeGenerated(sensorId: Int, userId: Int, challenge: Long)
-    }
-
-    /**
-     * A generic interface class for calling different generateChallenge from FingerprintManager or
-     * FaceManager
-     */
-    interface ChallengeGenerator {
-
-        /** Callback that will be called later after challenge generated */
-        var callback: GenerateChallengeCallback?
-
-        /** Method for generating challenge from FingerprintManager or FaceManager */
-        fun generateChallenge(userId: Int)
-    }
-
-    /** Used to generate challenge through FingerprintRepository */
-    class FingerprintChallengeGenerator(
-        private val fingerprintRepository: FingerprintRepository
-    ) : ChallengeGenerator {
-
-        override var callback: GenerateChallengeCallback? = null
-
-        override fun generateChallenge(userId: Int) {
-            callback?.let {
-                fingerprintRepository.generateChallenge(userId) {
-                        sensorId: Int, uid: Int, challenge: Long ->
-                    it.onChallengeGenerated(sensorId, uid, challenge)
-                }
-            } ?:run {
-                Log.e(TAG, "generateChallenge, null callback")
-            }
-        }
-
-        companion object {
-            private const val TAG = "FingerprintChallengeGenerator"
-        }
-    }
-
-    private val _generateChallengeFailedFlow = MutableSharedFlow<Boolean>()
-    val generateChallengeFailedFlow: SharedFlow<Boolean>
-        get() = _generateChallengeFailedFlow.asSharedFlow()
-
-
-    // flag if token is generating through checkCredential()'s generateChallenge()
-    private var isGeneratingChallengeDuringCheckingCredential = false
-
-    /** Get bundle which passing back to FingerprintSettings for late generateChallenge() */
-    fun createGeneratingChallengeExtras(): Bundle? {
-        if (!isGeneratingChallengeDuringCheckingCredential
-            || !credentialModel.isValidToken
-            || !credentialModel.isValidChallenge
-        ) {
-            return null
-        }
-        val bundle = Bundle()
-        bundle.putByteArray(
-            ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN,
-            credentialModel.token
-        )
-        bundle.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, credentialModel.challenge)
-        return bundle
-    }
-
-    /** Check credential status for biometric enrollment. */
-    fun checkCredential(scope: CoroutineScope): CredentialAction {
-        return if (isValidCredential) {
-            CredentialAction.CREDENTIAL_VALID
-        } else if (isUnspecifiedPassword) {
-            CredentialAction.FAIL_NEED_TO_CHOOSE_LOCK
-        } else if (credentialModel.isValidGkPwHandle) {
-            val gkPwHandle = credentialModel.gkPwHandle
-            credentialModel.clearGkPwHandle()
-            // GkPwHandle is got through caller activity, we shall not revoke it after
-            // generateChallenge(). Let caller activity to make decision.
-            generateChallenge(gkPwHandle, false, scope)
-            isGeneratingChallengeDuringCheckingCredential = true
-            CredentialAction.IS_GENERATING_CHALLENGE
-        } else {
-            CredentialAction.FAIL_NEED_TO_CONFIRM_LOCK
-        }
-    }
-
-    private fun generateChallenge(
-        gkPwHandle: Long,
-        revokeGkPwHandle: Boolean,
-        scope: CoroutineScope
-    ) {
-        challengeGenerator.callback = object : GenerateChallengeCallback {
-            override fun onChallengeGenerated(sensorId: Int, userId: Int, challenge: Long) {
-                var illegalStateExceptionCaught = false
-                try {
-                    val newToken = requestGatekeeperHat(gkPwHandle, challenge, userId)
-                    credentialModel.challenge = challenge
-                    credentialModel.token = newToken
-                } catch (e: IllegalStateException) {
-                    Log.e(TAG, "generateChallenge, IllegalStateException", e)
-                    illegalStateExceptionCaught = true
-                } finally {
-                    if (revokeGkPwHandle) {
-                        lockPatternUtils.removeGatekeeperPasswordHandle(gkPwHandle)
-                    }
-                    Log.d(
-                        TAG,
-                        "generateChallenge(), model:$credentialModel"
-                                + ", revokeGkPwHandle:$revokeGkPwHandle"
-                    )
-                    // Check credential again
-                    if (!isValidCredential || illegalStateExceptionCaught) {
-                        Log.w(TAG, "generateChallenge, invalid Credential or IllegalStateException")
-                        scope.launch {
-                            _generateChallengeFailedFlow.emit(true)
-                        }
-                    }
-                }
-            }
-        }
-        challengeGenerator.generateChallenge(userId)
-    }
-
-    private val isValidCredential: Boolean
-        get() = !isUnspecifiedPassword && credentialModel.isValidToken
-
-    private val isUnspecifiedPassword: Boolean
-        get() = lockPatternUtils.getActivePasswordQuality(userId) == PASSWORD_QUALITY_UNSPECIFIED
-
-    /**
-     * Handle activity result from ChooseLockGeneric, ConfirmLockPassword, or ConfirmLockPattern
-     * @param isChooseLock true if result is coming from ChooseLockGeneric. False if result is
-     * coming from ConfirmLockPassword or ConfirmLockPattern
-     * @param result activity result
-     * @return if it is a valid result and viewModel is generating challenge
-     */
-    fun generateChallengeAsCredentialActivityResult(
-        isChooseLock: Boolean,
-        result: ActivityResult,
-        scope: CoroutineScope
-    ): Boolean {
-        if ((isChooseLock && result.resultCode == ChooseLockPattern.RESULT_FINISHED) ||
-            (!isChooseLock && result.resultCode == Activity.RESULT_OK)) {
-            result.data?.let {
-                val gkPwHandle = it.getLongExtra(
-                    ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE,
-                    CredentialModel.INVALID_GK_PW_HANDLE
-                )
-                // Revoke self requested GkPwHandle because it shall only used once inside this
-                // activity lifecycle.
-                generateChallenge(gkPwHandle, true, scope)
-                return true
-            }
-        }
-        return false
-    }
-
-    val userId: Int
-        get() = credentialModel.userId
-
-    val token: ByteArray?
-        get() = credentialModel.token
-
-    @Throws(IllegalStateException::class)
-    private fun requestGatekeeperHat(gkPwHandle: Long, challenge: Long, userId: Int): ByteArray? {
-        val response = lockPatternUtils
-            .verifyGatekeeperPasswordHandle(gkPwHandle, challenge, userId)
-        if (!response.isMatched) {
-            throw GatekeeperCredentialNotMatchException("Unable to request Gatekeeper HAT")
-        }
-        return response.gatekeeperHAT
-    }
-
-    /** Create Intent for choosing lock */
-    fun createChooseLockIntent(
-        context: Context, isSuw: Boolean,
-        suwExtras: Bundle
-    ): Intent {
-        val intent = BiometricUtils.getChooseLockIntent(
-            context, isSuw,
-            suwExtras
-        )
-        intent.putExtra(
-            ChooseLockGeneric.ChooseLockGenericFragment.HIDE_INSECURE_OPTIONS,
-            true
-        )
-        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_REQUEST_GK_PW_HANDLE, true)
-        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOR_FINGERPRINT, true)
-        if (credentialModel.isValidUserId) {
-            intent.putExtra(Intent.EXTRA_USER_ID, credentialModel.userId)
-        }
-        return intent
-    }
-
-    /** Create ConfirmLockLauncher */
-    fun createConfirmLockLauncher(
-        activity: Activity,
-        requestCode: Int, title: String
-    ): ChooseLockSettingsHelper {
-        val builder = ChooseLockSettingsHelper.Builder(activity)
-        builder.setRequestCode(requestCode)
-            .setTitle(title)
-            .setRequestGatekeeperPasswordHandle(true)
-            .setForegroundOnly(true)
-            .setReturnCredentials(true)
-        if (credentialModel.isValidUserId) {
-            builder.setUserId(credentialModel.userId)
-        }
-        return builder.build()
-    }
-
-    companion object {
-        private const val TAG = "AutoCredentialViewModel"
-    }
-}
-
-enum class CredentialAction {
-
-    CREDENTIAL_VALID,
-
-    /** Valid credential, activity does nothing. */
-    IS_GENERATING_CHALLENGE,
-
-    /** This credential looks good, but still need to run generateChallenge(). */
-    FAIL_NEED_TO_CHOOSE_LOCK,
-
-    /** Need activity to run confirm lock */
-    FAIL_NEED_TO_CONFIRM_LOCK
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java
deleted file mode 100644
index 7dc1328..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModel.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import android.content.res.Configuration;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-import androidx.lifecycle.ViewModel;
-
-import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
-import com.android.systemui.unfold.updates.FoldProvider;
-
-import java.util.concurrent.Executor;
-
-/**
- * ViewModel explaining the fingerprint sensor location for fingerprint enrollment.
- */
-public class DeviceFoldedViewModel extends ViewModel {
-
-    private static final String TAG = "DeviceFoldedViewModel";
-
-    @NonNull private final MutableLiveData<Boolean> mLiveData =
-            new MutableLiveData<>(null);
-
-    private final ScreenSizeFoldProvider mScreenSizeFoldProvider;
-    private final FoldProvider.FoldCallback mIsFoldedCallback = isFolded -> {
-        Log.d(TAG, "onFoldUpdated= " + isFolded);
-        mLiveData.postValue(isFolded);
-    };
-
-    public DeviceFoldedViewModel(@NonNull ScreenSizeFoldProvider screenSizeFoldProvider,
-            @NonNull Executor executor) {
-        super();
-        mScreenSizeFoldProvider = screenSizeFoldProvider;
-        mScreenSizeFoldProvider.registerCallback(mIsFoldedCallback, executor);
-    }
-
-    /**
-     * Calls this method when activity gets configuration change
-     */
-    public void onConfigurationChanged(@NonNull Configuration newConfig) {
-        mScreenSizeFoldProvider.onConfigurationChange(newConfig);
-    }
-
-    /**
-     * Returns FoldedLiveData
-     */
-    public LiveData<Boolean> getLiveData() {
-        return mLiveData;
-    }
-
-    @Override
-    protected void onCleared() {
-        mScreenSizeFoldProvider.unregisterCallback(mIsFoldedCallback);
-        super.onCleared();
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java
deleted file mode 100644
index 07fe275..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModel.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.viewmodel;
-
-import static android.hardware.display.DisplayManager.DisplayListener;
-
-import android.app.Application;
-import android.hardware.display.DisplayManager;
-import android.util.Log;
-import android.view.DisplayInfo;
-import android.view.Surface;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import com.android.internal.annotations.VisibleForTesting;
-
-/**
- * ViewModel explaining the fingerprint sensor location for fingerprint enrollment.
- */
-public class DeviceRotationViewModel extends AndroidViewModel {
-
-    private static final boolean DEBUG = false;
-    private static final String TAG = "DeviceRotationViewModel";
-
-    private final DisplayManager mDisplayManager;
-    private final boolean mIsReverseDefaultRotation;
-    @NonNull private final DisplayInfo mDisplayInfo = new DisplayInfo();
-
-    /** {@link android.hardware.display.DisplayManager} is a final class, set this member visibility
-     * to 'protected' for testing
-     */
-    @VisibleForTesting
-    protected final DisplayListener mDisplayListener = new DisplayListener() {
-        @Override
-        public void onDisplayAdded(int displayId) {
-        }
-
-        @Override
-        public void onDisplayRemoved(int displayId) {
-        }
-
-        @Override
-        public void onDisplayChanged(int displayId) {
-            final int rotation = getRotation();
-            Log.d(TAG, "onDisplayChanged(" + displayId + "), rotation:" + rotation);
-            mLiveData.postValue(rotation);
-        }
-    };
-
-    @NonNull private final MutableLiveData<Integer> mLiveData = new MutableLiveData<>();
-
-    public DeviceRotationViewModel(@NonNull Application application) {
-        super(application);
-        mDisplayManager = application.getSystemService(DisplayManager.class);
-        mDisplayManager.registerDisplayListener(mDisplayListener,
-                application.getMainThreadHandler());
-        mIsReverseDefaultRotation = application.getResources().getBoolean(
-                com.android.internal.R.bool.config_reverseDefaultRotation);
-    }
-
-    /**
-     * Returns current rotation.
-     *
-     * {@link android.view.Display} is a final class, set this method visibility to "protected" for
-     * inheriting it in test
-     */
-    @VisibleForTesting
-    @Surface.Rotation
-    protected int getRotation() {
-        getApplication().getDisplay().getDisplayInfo(mDisplayInfo);
-        if (mIsReverseDefaultRotation) {
-            return (mDisplayInfo.rotation + 1) % 4;
-        } else {
-            return mDisplayInfo.rotation;
-        }
-    }
-
-    /**
-     * Returns RotationLiveData
-     */
-    public LiveData<Integer> getLiveData() {
-        final Integer lastRotation = mLiveData.getValue();
-        @Surface.Rotation int newRotation = getRotation();
-        if (lastRotation == null || lastRotation != newRotation) {
-            Log.d(TAG, "getLiveData, update rotation from " + lastRotation + " to " + newRotation);
-            mLiveData.setValue(newRotation);
-        }
-        return mLiveData;
-    }
-
-    @Override
-    protected void onCleared() {
-        mDisplayManager.unregisterDisplayListener(mDisplayListener);
-        super.onCleared();
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java
deleted file mode 100644
index eba6a15..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModel.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import android.annotation.IntDef;
-import android.app.Application;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.os.VibrationAttributes;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
-import android.util.Log;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * ViewModel explaining the fingerprint enrolling page
- */
-public class FingerprintEnrollEnrollingViewModel extends AndroidViewModel {
-
-    private static final String TAG = FingerprintEnrollEnrollingViewModel.class.getSimpleName();
-    private static final boolean DEBUG = false;
-
-    private static final VibrationEffect VIBRATE_EFFECT_ERROR =
-            VibrationEffect.createWaveform(new long[]{0, 5, 55, 60}, -1);
-    private static final VibrationAttributes FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES =
-            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ACCESSIBILITY);
-
-    /**
-     * Enrolling finished
-     */
-    public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE = 0;
-
-    /**
-     * Icon touch dialog show
-     */
-    public static final int FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG = 1;
-
-    /**
-     * Has got latest cancelled event due to user skip
-     */
-    public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP = 2;
-
-    /**
-     * Has got latest cancelled event due to back key
-     */
-    public static final int FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED = 3;
-
-    @IntDef(prefix = { "FINGERPRINT_ENROLL_ENROLLING_ACTION_" }, value = {
-            FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE,
-            FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG,
-            FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FingerprintEnrollEnrollingAction {}
-
-    private final int mUserId;
-    private boolean mOnBackPressed;
-    private boolean mOnSkipPressed;
-    @NonNull private final FingerprintRepository mFingerprintRepository;
-    private final AccessibilityManager mAccessibilityManager;
-    private final Vibrator mVibrator;
-
-    private final MutableLiveData<Integer> mActionLiveData = new MutableLiveData<>();
-
-    public FingerprintEnrollEnrollingViewModel(
-            @NonNull Application application,
-            int userId,
-            @NonNull FingerprintRepository fingerprintRepository
-    ) {
-        super(application);
-        mUserId = userId;
-        mFingerprintRepository = fingerprintRepository;
-        mAccessibilityManager = application.getSystemService(AccessibilityManager.class);
-        mVibrator = application.getSystemService(Vibrator.class);
-    }
-
-    public LiveData<Integer> getActionLiveData() {
-        return mActionLiveData;
-    }
-
-    /**
-     * Clears action live data
-     */
-    public void clearActionLiveData() {
-        mActionLiveData.setValue(null);
-    }
-
-    public boolean getOnSkipPressed() {
-        return mOnSkipPressed;
-    }
-
-    /**
-     * User clicks skip button
-     */
-    public void setOnSkipPressed() {
-        mOnSkipPressed = true;
-    }
-
-    /**
-     * Enrolling is cancelled because user clicks skip
-     */
-    public void onCancelledDueToOnSkipPressed() {
-        final int action = FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP;
-        if (DEBUG) {
-            Log.d(TAG, "onSkipButtonClick, post action " + action);
-        }
-        mOnSkipPressed = false;
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * Is enrolling finished
-     */
-    public void onEnrollingDone() {
-        final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_DONE;
-        if (DEBUG) {
-            Log.d(TAG, "onEnrollingDone, post action " + action);
-        }
-        mActionLiveData.postValue(action);
-    }
-
-    public boolean getOnBackPressed() {
-        return mOnBackPressed;
-    }
-
-    /**
-     * Back key is pressed.
-     */
-    public void setOnBackPressed() {
-        mOnBackPressed = true;
-    }
-
-    /**
-     * Enrollment is cancelled because back key is pressed.
-     */
-    public void onCancelledDueToOnBackPressed() {
-        final int action = FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED;
-        if (DEBUG) {
-            Log.d(TAG, "onCancelledEventReceivedAfterOnBackPressed, post action " + action);
-        }
-        mOnBackPressed = false;
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * Icon touch dialog show
-     */
-    public void showIconTouchDialog() {
-        final int action = FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG;
-        if (DEBUG) {
-            Log.d(TAG, "onIconTouchDialogShow, post action " + action);
-        }
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * get enroll stage threshold
-     */
-    public float getEnrollStageThreshold(int index) {
-        return mFingerprintRepository.getEnrollStageThreshold(index);
-    }
-
-    /**
-     * Get enroll stage count
-     */
-    public int getEnrollStageCount() {
-        return mFingerprintRepository.getEnrollStageCount();
-    }
-
-    /**
-     * Requests interruption of the accessibility feedback from all accessibility services.
-     */
-    public void clearTalkback() {
-        mAccessibilityManager.interrupt();
-    }
-
-    /**
-     * Returns if the {@link AccessibilityManager} is enabled.
-     *
-     * @return True if this {@link AccessibilityManager} is enabled, false otherwise.
-     */
-    public boolean isAccessibilityEnabled() {
-        return mAccessibilityManager.isEnabled();
-    }
-
-    /**
-     * Sends an {@link AccessibilityEvent}.
-     */
-    public void sendAccessibilityEvent(CharSequence announcement) {
-        AccessibilityEvent e = AccessibilityEvent.obtain();
-        e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
-        e.setClassName(getClass().getName());
-        e.setPackageName(getApplication().getPackageName());
-        e.getText().add(announcement);
-        mAccessibilityManager.sendAccessibilityEvent(e);
-    }
-
-     /**
-     * Returns if the touch exploration in the system is enabled.
-     *
-     * @return True if touch exploration is enabled, false otherwise.
-     */
-    public boolean isTouchExplorationEnabled() {
-        return mAccessibilityManager.isTouchExplorationEnabled();
-    }
-
-    /**
-     * Like {@link #vibrate(VibrationEffect, VibrationAttributes)}, but allows the
-     * caller to specify the vibration is owned by someone else and set a reason for vibration.
-     */
-    public void vibrateError(String reason) {
-        mVibrator.vibrate(mUserId, getApplication().getOpPackageName(),
-                VIBRATE_EFFECT_ERROR, reason, FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES);
-    }
-
-    /**
-     * Gets the first FingerprintSensorPropertiesInternal from FingerprintManager
-     */
-    @Nullable
-    public FingerprintSensorPropertiesInternal getFirstFingerprintSensorPropertiesInternal() {
-        return mFingerprintRepository.getFirstFingerprintSensorPropertiesInternal();
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModel.kt b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModel.kt
deleted file mode 100644
index b154fe7..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModel.kt
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.android.settings.biometrics2.ui.viewmodel
-
-import android.app.Application
-import androidx.lifecycle.AndroidViewModel
-import kotlinx.atomicfu.AtomicBoolean
-import kotlinx.atomicfu.atomic
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.SharedFlow
-import kotlinx.coroutines.flow.asSharedFlow
-
-class FingerprintEnrollErrorDialogViewModel(
-    application: Application,
-    val isSuw: Boolean
-): AndroidViewModel(application) {
-
-    private val _isDialogShown: AtomicBoolean = atomic(false)
-    val isDialogShown: Boolean
-        get() = _isDialogShown.value
-
-    private val _newDialogFlow = MutableSharedFlow<Int>()
-    val newDialogFlow: SharedFlow<Int>
-        get() = _newDialogFlow.asSharedFlow()
-
-    private val _triggerRetryFlow = MutableSharedFlow<Any>()
-    val triggerRetryFlow: SharedFlow<Any>
-        get() = _triggerRetryFlow.asSharedFlow()
-
-    private val _setResultFlow = MutableSharedFlow<FingerprintErrorDialogSetResultAction>()
-    val setResultFlow: SharedFlow<FingerprintErrorDialogSetResultAction>
-        get() = _setResultFlow.asSharedFlow()
-
-    suspend fun newDialog(errorMsgId: Int) {
-        _isDialogShown.compareAndSet(expect = false, update = true)
-        _newDialogFlow.emit(errorMsgId)
-    }
-
-    suspend fun triggerRetry() {
-        _isDialogShown.compareAndSet(expect = true, update = false)
-        _triggerRetryFlow.emit(Any())
-    }
-
-    suspend fun setResultAndFinish(action: FingerprintErrorDialogSetResultAction) {
-        _isDialogShown.compareAndSet(expect = true, update = false)
-        _setResultFlow.emit(action)
-    }
-}
-
-enum class FingerprintErrorDialogSetResultAction {
-    FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH,
-    FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_TIMEOUT
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java
deleted file mode 100644
index 00c67c4..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModel.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.viewmodel;
-
-import android.annotation.IntDef;
-import android.app.Application;
-import android.util.Log;
-import android.view.accessibility.AccessibilityManager;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * ViewModel explaining the fingerprint sensor location for fingerprint enrollment.
- */
-public class FingerprintEnrollFindSensorViewModel extends AndroidViewModel {
-
-    private static final boolean DEBUG = false;
-    private static final String TAG = "FingerprintEnrollFindSensorViewModel";
-
-    /**
-     * User clicks 'Skip' button on this page in Settings
-     */
-    public static final int FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP = 0;
-
-    /**
-     * User clicks 'Skip' button on this page in SetupWizard flow
-     */
-    public static final int FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG = 1;
-
-    /**
-     * User clicks 'Start' button on this page
-     */
-    public static final int FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START = 2;
-
-    @IntDef(prefix = { "FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_" }, value = {
-            FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP,
-            FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG,
-            FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FingerprintEnrollFindSensorAction {}
-
-    private final AccessibilityManager mAccessibilityManager;
-
-    private final boolean mIsSuw;
-    @NonNull private final MutableLiveData<Integer> mActionLiveData = new MutableLiveData<>();
-
-    public FingerprintEnrollFindSensorViewModel(@NonNull Application application, boolean isSuw) {
-        super(application);
-        mAccessibilityManager = application.getSystemService(AccessibilityManager.class);
-        mIsSuw = isSuw;
-    }
-
-    /**
-     * Returns action live data that user chooses
-     */
-    public LiveData<Integer> getActionLiveData() {
-        return mActionLiveData;
-    }
-
-    /**
-     * Clear ActionLiveData to prevent get obsolete data
-     */
-    public void clearActionLiveData() {
-        mActionLiveData.setValue(null);
-    }
-
-    /**
-     * User clicks skip button on dialog
-     */
-    public void onSkipDialogButtonClick() {
-        final int action = FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP;
-        if (DEBUG) {
-            Log.d(TAG, "onSkipDialogButtonClick, post " + action);
-        }
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * User clicks skip button
-     */
-    public void onSkipButtonClick() {
-        final int action = mIsSuw
-                ? FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG
-                : FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP;
-        if (DEBUG) {
-            Log.d(TAG, "onSkipButtonClick, post action " + action);
-        }
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * User clicks start button
-     */
-    public void onStartButtonClick() {
-        final int action = FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START;
-        if (DEBUG) {
-            Log.d(TAG, "onStartButtonClick, post action " + action);
-        }
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * Returns the info about accessibility is enabled or not
-     */
-    public boolean isAccessibilityEnabled() {
-        return mAccessibilityManager.isEnabled();
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFinishViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFinishViewModel.java
deleted file mode 100644
index ae67f74..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFinishViewModel.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import android.annotation.IntDef;
-import android.app.Application;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * Finish ViewModel handles the state of the fingerprint renroll final stage
- */
-public class FingerprintEnrollFinishViewModel extends AndroidViewModel {
-
-    private static final String TAG = FingerprintEnrollFinishViewModel.class.getSimpleName();
-    private static final boolean DEBUG = false;
-
-    /**
-     * User clicks "Add" button
-     */
-    public static final int FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK = 0;
-
-    /**
-     * User clicks "Next" button
-     */
-    public static final int FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK = 1;
-
-    @IntDef(prefix = { "FINGERPRINT_ENROLL_FINISH_ACTION_" }, value = {
-            FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK,
-            FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK
-    })
-    @Retention(RetentionPolicy.SOURCE)
-    public @interface FingerprintEnrollFinishAction {}
-
-    @NonNull private final FingerprintRepository mFingerprintRepository;
-    @NonNull private final EnrollmentRequest mRequest;
-    private final int mUserId;
-
-    private final MutableLiveData<Integer> mActionLiveData = new MutableLiveData<>();
-
-    public FingerprintEnrollFinishViewModel(@NonNull Application application, int userId,
-            @NonNull EnrollmentRequest request,
-            @NonNull FingerprintRepository fingerprintRepository) {
-        super(application);
-        mUserId = userId;
-        mRequest = request;
-        mFingerprintRepository = fingerprintRepository;
-    }
-
-    @NonNull
-    public EnrollmentRequest getRequest() {
-        return mRequest;
-    }
-
-    /**
-     * The first sensor type is Side fps sensor or not
-     */
-    public boolean canAssumeSfps() {
-        return mFingerprintRepository.canAssumeSfps();
-    }
-
-    /**
-     * Device allows user to enroll another fingerprint or not.
-     */
-    public boolean isAnotherFingerprintEnrollable() {
-        return mFingerprintRepository.getNumOfEnrolledFingerprintsSize(mUserId)
-                < mFingerprintRepository.getMaxFingerprints();
-    }
-
-    /**
-     * Clear action LiveData
-     */
-    public void clearActionLiveData() {
-        mActionLiveData.setValue(null);
-    }
-
-    /**
-     * Get action LiveData
-     */
-    public LiveData<Integer> getActionLiveData() {
-        return mActionLiveData;
-    }
-
-    /**
-     * Handle add button Click
-     */
-    public void onAddButtonClick() {
-        final int action = FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK;
-        if (DEBUG) {
-            Log.d(TAG, "onAddButtonClick post(" + action + ")");
-        }
-        mActionLiveData.postValue(action);
-    }
-
-    /**
-     * Handle next button Click
-     */
-    public void onNextButtonClick() {
-        final int action = FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK;
-        if (DEBUG) {
-            Log.d(TAG, "onNextButtonClick post(" + action + ")");
-        }
-        mActionLiveData.postValue(action);
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.kt b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.kt
deleted file mode 100644
index 98137b4..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModel.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Application
-import android.util.Log
-import androidx.lifecycle.AndroidViewModel
-import com.android.settings.biometrics2.data.repository.FingerprintRepository
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollable
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction.CONTINUE_ENROLL
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction.DONE_AND_FINISH
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction.SKIP_OR_CANCEL
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharedFlow
-import kotlinx.coroutines.flow.asSharedFlow
-import kotlinx.coroutines.flow.combine
-import kotlinx.coroutines.launch
-
-/** Fingerprint intro onboarding page view model implementation */
-class FingerprintEnrollIntroViewModel(
-    application: Application,
-    private val fingerprintRepository: FingerprintRepository,
-    val request: EnrollmentRequest,
-    private val userId: Int
-) : AndroidViewModel(application) {
-
-    /** User's action flow (like clicking Agree, Skip, or Done) */
-    private val _actionFlow = MutableSharedFlow<FingerprintEnrollIntroAction>()
-    val actionFlow: SharedFlow<FingerprintEnrollIntroAction>
-        get() = _actionFlow.asSharedFlow()
-
-    private fun getEnrollableStatus(): FingerprintEnrollable {
-        val num = fingerprintRepository.getNumOfEnrolledFingerprintsSize(userId)
-        val max =
-            if (request.isSuw && !request.isAfterSuwOrSuwSuggestedAction)
-                fingerprintRepository.getMaxFingerprintsInSuw(
-                    getApplication<Application>().resources
-                )
-            else
-                fingerprintRepository.maxFingerprints
-        return if (num >= max)
-            FingerprintEnrollable.FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-        else
-            FingerprintEnrollable.FINGERPRINT_ENROLLABLE_OK
-    }
-
-    private val hasScrolledToBottomFlow = MutableStateFlow(HAS_SCROLLED_TO_BOTTOM_DEFAULT)
-    private val enrollableStatusFlow = MutableStateFlow(getEnrollableStatus())
-
-    /** Enrollable status and hasScrollToBottom live data */
-    val pageStatusFlow: Flow<FingerprintEnrollIntroStatus> =
-        hasScrolledToBottomFlow.combine(enrollableStatusFlow) {
-            hasScrolledToBottom: Boolean, enrollableStatus: FingerprintEnrollable ->
-            FingerprintEnrollIntroStatus(hasScrolledToBottom, enrollableStatus)
-        }
-
-    fun updateEnrollableStatus(scope: CoroutineScope) {
-        scope.launch {
-            enrollableStatusFlow.emit(getEnrollableStatus())
-        }
-    }
-
-    /** The first sensor type is UDFPS sensor or not */
-    val canAssumeUdfps: Boolean
-        get() = fingerprintRepository.canAssumeUdfps()
-
-    /** Update onboarding intro page has scrolled to bottom */
-    fun setHasScrolledToBottom(value: Boolean, scope: CoroutineScope) {
-        scope.launch {
-            hasScrolledToBottomFlow.emit(value)
-        }
-    }
-
-    /** Get parental consent required or not during enrollment process */
-    val isParentalConsentRequired: Boolean
-        get() = fingerprintRepository.isParentalConsentRequired(getApplication())
-
-    /** Get fingerprint is disable by admin or not */
-    val isBiometricUnlockDisabledByAdmin: Boolean
-        get() = fingerprintRepository.isDisabledByAdmin(getApplication(), userId)
-
-    /**
-     * User clicks next button
-     */
-    fun onNextButtonClick(scope: CoroutineScope) {
-        scope.launch {
-            when (val status = enrollableStatusFlow.value) {
-                FingerprintEnrollable.FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX ->
-                    _actionFlow.emit(DONE_AND_FINISH)
-
-                FingerprintEnrollable.FINGERPRINT_ENROLLABLE_OK ->
-                    _actionFlow.emit(CONTINUE_ENROLL)
-
-                else -> Log.w(TAG, "fail to click next, enrolled:$status")
-            }
-        }
-    }
-
-    /** User clicks skip/cancel button */
-    fun onSkipOrCancelButtonClick(scope: CoroutineScope) {
-        scope.launch {
-            _actionFlow.emit(SKIP_OR_CANCEL)
-        }
-    }
-
-    companion object {
-        private const val TAG = "FingerprintEnrollIntroViewModel"
-        private const val HAS_SCROLLED_TO_BOTTOM_DEFAULT = false
-        private val ENROLLABLE_STATUS_DEFAULT = FingerprintEnrollable.FINGERPRINT_ENROLLABLE_UNKNOWN
-    }
-}
-
-enum class FingerprintEnrollIntroAction {
-    /** User clicks 'Done' button on this page */
-    DONE_AND_FINISH,
-    /** User clicks 'Agree' button on this page */
-    CONTINUE_ENROLL,
-    /** User clicks 'Skip' button on this page */
-    SKIP_OR_CANCEL
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
deleted file mode 100644
index 1cfec52..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModel.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.viewmodel;
-
-import static android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_CANCELED;
-import static android.hardware.fingerprint.FingerprintManager.ENROLL_ENROLL;
-
-import static com.android.settings.biometrics2.ui.model.EnrollmentProgress.INITIAL_REMAINING;
-import static com.android.settings.biometrics2.ui.model.EnrollmentProgress.INITIAL_STEPS;
-
-import android.app.Application;
-import android.content.Intent;
-import android.content.res.Resources;
-import android.hardware.fingerprint.FingerprintManager.EnrollReason;
-import android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
-import android.os.CancellationSignal;
-import android.os.SystemClock;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.lifecycle.AndroidViewModel;
-import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
-
-import com.android.settings.R;
-import com.android.settings.biometrics.fingerprint.FingerprintUpdater;
-import com.android.settings.biometrics.fingerprint.MessageDisplayController;
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress;
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage;
-
-import java.util.LinkedList;
-
-/**
- * Progress ViewModel handles the state around biometric enrollment. It manages the state of
- * enrollment throughout the activity lifecycle so the app can continue after an event like
- * rotation.
- */
-public class FingerprintEnrollProgressViewModel extends AndroidViewModel {
-
-    private static final boolean DEBUG = false;
-    private static final String TAG = "FingerprintEnrollProgressViewModel";
-
-    private final MutableLiveData<EnrollmentProgress> mProgressLiveData = new MutableLiveData<>(
-            new EnrollmentProgress(INITIAL_STEPS, INITIAL_REMAINING));
-    private final MutableLiveData<EnrollmentStatusMessage> mHelpMessageLiveData =
-            new MutableLiveData<>();
-    private final MutableLiveData<EnrollmentStatusMessage> mErrorMessageLiveData =
-            new MutableLiveData<>();
-    private final MutableLiveData<Object> mCanceledSignalLiveData = new MutableLiveData<>();
-    private final MutableLiveData<Boolean> mAcquireLiveData = new MutableLiveData<>();
-    private final MutableLiveData<Integer> mPointerDownLiveData = new MutableLiveData<>();
-    private final MutableLiveData<Integer> mPointerUpLiveData = new MutableLiveData<>();
-
-    private byte[] mToken = null;
-    private final int mUserId;
-
-    private final FingerprintUpdater mFingerprintUpdater;
-    @Nullable private CancellationSignal mCancellationSignal = null;
-    @NonNull private final LinkedList<CancellationSignal> mCancelingSignalQueue =
-            new LinkedList<>();
-    private final EnrollmentCallback mEnrollmentCallback = new EnrollmentCallback() {
-
-        @Override
-        public void onEnrollmentProgress(int remaining) {
-            final int currentSteps = getSteps();
-            final EnrollmentProgress progress = new EnrollmentProgress(
-                    currentSteps == INITIAL_STEPS ? remaining : getSteps(), remaining);
-            if (DEBUG) {
-                Log.d(TAG, "onEnrollmentProgress(" + remaining + "), steps: " + currentSteps
-                        + ", post progress as " + progress);
-            }
-            mHelpMessageLiveData.setValue(null);
-            mProgressLiveData.postValue(progress);
-        }
-
-        @Override
-        public void onEnrollmentHelp(int helpMsgId, CharSequence helpString) {
-            if (DEBUG) {
-                Log.d(TAG, "onEnrollmentHelp(" + helpMsgId + ", " + helpString + ")");
-            }
-            mHelpMessageLiveData.postValue(new EnrollmentStatusMessage(helpMsgId, helpString));
-        }
-
-        @Override
-        public void onEnrollmentError(int errMsgId, CharSequence errString) {
-            Log.d(TAG, "onEnrollmentError(" + errMsgId + ", " + errString
-                    + "), cancelingQueueSize:" + mCancelingSignalQueue.size());
-            if (FINGERPRINT_ERROR_CANCELED == errMsgId && mCancelingSignalQueue.size() > 0) {
-                mCanceledSignalLiveData.postValue(mCancelingSignalQueue.poll());
-            } else {
-                mErrorMessageLiveData.postValue(new EnrollmentStatusMessage(errMsgId, errString));
-            }
-        }
-
-        @Override
-        public void onAcquired(boolean isAcquiredGood) {
-            mAcquireLiveData.postValue(isAcquiredGood);
-        }
-
-        @Override
-        public void onUdfpsPointerDown(int sensorId) {
-            mPointerDownLiveData.postValue(sensorId);
-        }
-
-        @Override
-        public void onUdfpsPointerUp(int sensorId) {
-            mPointerUpLiveData.postValue(sensorId);
-        }
-    };
-
-    public FingerprintEnrollProgressViewModel(@NonNull Application application,
-            @NonNull FingerprintUpdater fingerprintUpdater, int userId) {
-        super(application);
-        mFingerprintUpdater = fingerprintUpdater;
-        mUserId = userId;
-    }
-
-    public void setToken(byte[] token) {
-        mToken = token;
-    }
-
-    /**
-     * clear progress
-     */
-    public void clearProgressLiveData() {
-        mProgressLiveData.setValue(new EnrollmentProgress(INITIAL_STEPS, INITIAL_REMAINING));
-        mHelpMessageLiveData.setValue(null);
-        mErrorMessageLiveData.setValue(null);
-    }
-
-    /**
-     * clear error message
-     */
-    public void clearErrorMessageLiveData() {
-        mErrorMessageLiveData.setValue(null);
-    }
-
-    public LiveData<EnrollmentProgress> getProgressLiveData() {
-        return mProgressLiveData;
-    }
-
-    public LiveData<EnrollmentStatusMessage> getHelpMessageLiveData() {
-        return mHelpMessageLiveData;
-    }
-
-    public LiveData<EnrollmentStatusMessage> getErrorMessageLiveData() {
-        return mErrorMessageLiveData;
-    }
-
-    public LiveData<Object> getCanceledSignalLiveData() {
-        return mCanceledSignalLiveData;
-    }
-
-    public LiveData<Boolean> getAcquireLiveData() {
-        return mAcquireLiveData;
-    }
-
-    public LiveData<Integer> getPointerDownLiveData() {
-        return mPointerDownLiveData;
-    }
-
-    public LiveData<Integer> getPointerUpLiveData() {
-        return mPointerUpLiveData;
-    }
-
-    /**
-     * Starts enrollment and return latest isEnrolling() result
-     */
-    public Object startEnrollment(@EnrollReason int reason) {
-        if (mToken == null) {
-            Log.e(TAG, "Null hardware auth token for enroll");
-            return null;
-        }
-        if (mCancellationSignal != null) {
-            Log.w(TAG, "Enrolling is running, shall not start again");
-            return mCancellationSignal;
-        }
-        if (DEBUG) {
-            Log.e(TAG, "startEnrollment(" + reason + ")");
-        }
-
-        // Clear data
-        mProgressLiveData.setValue(new EnrollmentProgress(INITIAL_STEPS, INITIAL_REMAINING));
-        mHelpMessageLiveData.setValue(null);
-        mErrorMessageLiveData.setValue(null);
-
-        mCancellationSignal = new CancellationSignal();
-
-        final Resources res = getApplication().getResources();
-        if (reason == ENROLL_ENROLL
-                && res.getBoolean(R.bool.enrollment_message_display_controller_flag)) {
-            final EnrollmentCallback callback = new MessageDisplayController(
-                    getApplication().getMainThreadHandler(),
-                    mEnrollmentCallback,
-                    SystemClock.elapsedRealtimeClock(),
-                    res.getInteger(R.integer.enrollment_help_minimum_time_display),
-                    res.getInteger(R.integer.enrollment_progress_minimum_time_display),
-                    res.getBoolean(R.bool.enrollment_progress_priority_over_help),
-                    res.getBoolean(R.bool.enrollment_prioritize_acquire_messages),
-                    res.getInteger(R.integer.enrollment_collect_time));
-            mFingerprintUpdater.enroll(mToken, mCancellationSignal, mUserId, callback, reason,
-                    new Intent());
-        } else {
-            mFingerprintUpdater.enroll(mToken, mCancellationSignal, mUserId, mEnrollmentCallback,
-                    reason, new Intent());
-        }
-        return mCancellationSignal;
-    }
-
-    /**
-     * Cancels enrollment and return latest isEnrolling result
-     */
-    public boolean cancelEnrollment() {
-        final CancellationSignal cancellationSignal = mCancellationSignal;
-        mCancellationSignal = null;
-
-        if (cancellationSignal == null) {
-            Log.e(TAG, "Fail to cancel enrollment, has cancelled or not start");
-            return false;
-        } else {
-            Log.d(TAG, "enrollment cancelled");
-        }
-        mCancelingSignalQueue.add(cancellationSignal);
-        cancellationSignal.cancel();
-
-        return true;
-    }
-
-    public boolean isEnrolling() {
-        return (mCancellationSignal != null);
-    }
-
-    private int getSteps() {
-        return mProgressLiveData.getValue().getSteps();
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.kt b/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.kt
deleted file mode 100644
index 37b0052..0000000
--- a/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModel.kt
+++ /dev/null
@@ -1,162 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Application
-import android.content.ComponentName
-import android.content.Intent
-import android.content.pm.PackageManager
-import android.os.Bundle
-import android.util.Log
-import androidx.activity.result.ActivityResult
-import androidx.lifecycle.AndroidViewModel
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics.fingerprint.FingerprintEnrollFinish.FINGERPRINT_SUGGESTION_ACTIVITY
-import com.android.settings.biometrics.fingerprint.SetupFingerprintEnrollIntroduction
-import com.android.settings.biometrics2.data.repository.FingerprintRepository
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest
-import kotlinx.atomicfu.AtomicBoolean
-import kotlinx.atomicfu.atomic
-import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.MutableSharedFlow
-import kotlinx.coroutines.flow.SharedFlow
-import kotlinx.coroutines.flow.asSharedFlow
-import kotlinx.coroutines.launch
-
-/**
- * Fingerprint enrollment view model implementation
- */
-class FingerprintEnrollmentViewModel(
-    application: Application,
-    private val fingerprintRepository: FingerprintRepository,
-    val request: EnrollmentRequest
-) : AndroidViewModel(application) {
-
-    val isWaitingActivityResult: AtomicBoolean = atomic(false)
-
-    private val _setResultFlow = MutableSharedFlow<ActivityResult>()
-    val setResultFlow: SharedFlow<ActivityResult>
-        get() = _setResultFlow.asSharedFlow()
-
-    var isNewFingerprintAdded = false
-        set(value) {
-            // Only allow changing this value from false to true
-            if (!field) {
-                field = value
-            }
-        }
-
-    /**
-     * Get override activity result as current ViewModel status.
-     *
-     * FingerprintEnrollmentActivity supports user enrolls 2nd fingerprint or starts a new flow
-     * through Deferred-SUW, Portal-SUW, or SUW Suggestion. Use a method to get override activity
-     * result instead of putting these if-else on every setResult(), .
-     */
-    fun getOverrideActivityResult(
-        result: ActivityResult,
-        generatingChallengeExtras: Bundle?
-    ): ActivityResult {
-        val newResultCode = if (isNewFingerprintAdded)
-            BiometricEnrollBase.RESULT_FINISHED
-        else if (request.isAfterSuwOrSuwSuggestedAction)
-            BiometricEnrollBase.RESULT_CANCELED
-        else
-            result.resultCode
-
-        var newData = result.data
-        if (newResultCode == BiometricEnrollBase.RESULT_FINISHED
-            && generatingChallengeExtras != null
-        ) {
-            if (newData == null) {
-                newData = Intent()
-            }
-            newData.putExtras(generatingChallengeExtras)
-        }
-        return ActivityResult(newResultCode, newData)
-    }
-
-    /**
-     * Activity calls this method during onPause() to finish itself when back to background.
-     *
-     * @param isActivityFinishing Activity has called finish() or not
-     * @param isChangingConfigurations Activity is finished because of configuration changed or not.
-     */
-    fun checkFinishActivityDuringOnPause(
-        isActivityFinishing: Boolean,
-        isChangingConfigurations: Boolean,
-        scope: CoroutineScope
-    ) {
-        if (isChangingConfigurations || isActivityFinishing || request.isSuw
-            || isWaitingActivityResult.value
-        ) {
-            return
-        }
-        scope.launch {
-            _setResultFlow.emit(ActivityResult(BiometricEnrollBase.RESULT_TIMEOUT, null))
-        }
-    }
-
-    /**
-     * Get Suw fingerprint count extra for statistics
-     */
-    fun getSuwFingerprintCountExtra(userId: Int) = Bundle().also {
-        it.putInt(
-            SetupFingerprintEnrollIntroduction.EXTRA_FINGERPRINT_ENROLLED_COUNT,
-            fingerprintRepository.getNumOfEnrolledFingerprintsSize(userId)
-        )
-    }
-
-    /**
-     * Gets the result about fingerprint enrollable
-     */
-    fun isMaxEnrolledReached(userId: Int): Boolean = with(fingerprintRepository) {
-        maxFingerprints <= getNumOfEnrolledFingerprintsSize(userId)
-    }
-
-    val canAssumeUdfps: Boolean
-        get() = fingerprintRepository.canAssumeUdfps()
-
-    val canAssumeSfps: Boolean
-        get() = fingerprintRepository.canAssumeSfps()
-
-    /**
-     * Update FINGERPRINT_SUGGESTION_ACTIVITY into package manager
-     */
-    fun updateFingerprintSuggestionEnableState(userId: Int) {
-        // Only show "Add another fingerprint" if the user already enrolled one.
-        // "Add fingerprint" will be shown in the main flow if the user hasn't enrolled any
-        // fingerprints. If the user already added more than one fingerprint, they already know
-        // to add multiple fingerprints so we don't show the suggestion.
-        val state = if (fingerprintRepository.getNumOfEnrolledFingerprintsSize(userId) == 1)
-            PackageManager.COMPONENT_ENABLED_STATE_ENABLED
-        else
-            PackageManager.COMPONENT_ENABLED_STATE_DISABLED
-        getApplication<Application>().packageManager.setComponentEnabledSetting(
-            ComponentName(
-                getApplication(),
-                FINGERPRINT_SUGGESTION_ACTIVITY
-            ),
-            state,
-            PackageManager.DONT_KILL_APP
-        )
-        Log.d(TAG, "$FINGERPRINT_SUGGESTION_ACTIVITY enabled state: $state")
-    }
-
-    companion object {
-        private const val TAG = "FingerprintEnrollmentViewModel"
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollDrawable.java b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollDrawable.java
deleted file mode 100644
index 4b0b624..0000000
--- a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollDrawable.java
+++ /dev/null
@@ -1,436 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.widget;
-
-import android.animation.Animator;
-import android.animation.AnimatorSet;
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.PointF;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.ShapeDrawable;
-import android.graphics.drawable.shapes.PathShape;
-import android.hardware.fingerprint.FingerprintManager;
-import android.os.Build;
-import android.os.UserHandle;
-import android.provider.Settings;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.PathParser;
-import android.util.TypedValue;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.AccelerateDecelerateInterpolator;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.settings.R;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * UDFPS fingerprint drawable that is shown when enrolling
- */
-public class UdfpsEnrollDrawable extends Drawable {
-    private static final String TAG = "UdfpsAnimationEnroll";
-
-    private static final long TARGET_ANIM_DURATION_LONG = 800L;
-    private static final long TARGET_ANIM_DURATION_SHORT = 600L;
-    // 1 + SCALE_MAX is the maximum that the moving target will animate to
-    private static final float SCALE_MAX = 0.25f;
-    private static final float DEFAULT_STROKE_WIDTH = 3f;
-    private static final float SCALE = 0.5f;
-    private static final String SCALE_OVERRIDE =
-            "com.android.systemui.biometrics.UdfpsEnrollHelper.scale";
-    private static final String NEW_COORDS_OVERRIDE =
-            "com.android.systemui.biometrics.UdfpsNewCoords";
-
-    @NonNull
-    private final Drawable mMovingTargetFpIcon;
-    @NonNull
-    private final Paint mSensorOutlinePaint;
-    @NonNull
-    private final Paint mBlueFill;
-    @NonNull
-    private final ShapeDrawable mFingerprintDrawable;
-    private int mAlpha;
-    private boolean mSkipDraw = false;
-
-    @Nullable
-    private RectF mSensorRect;
-
-    // Moving target animator set
-    @Nullable
-    AnimatorSet mTargetAnimatorSet;
-    // Moving target location
-    float mCurrentX;
-    float mCurrentY;
-    // Moving target size
-    float mCurrentScale = 1.f;
-
-    @NonNull
-    private final Animator.AnimatorListener mTargetAnimListener;
-
-    private boolean mShouldShowTipHint = false;
-    private boolean mShouldShowEdgeHint = false;
-
-    private int mEnrollIcon;
-    private int mMovingTargetFill;
-
-    private int mTotalSteps = -1;
-    private int mRemainingSteps = -1;
-    private int mLocationsEnrolled = 0;
-    private int mCenterTouchCount = 0;
-
-    private FingerprintManager mFingerprintManager;
-
-    private boolean mAccessibilityEnabled;
-    private Context mContext;
-    private final List<PointF> mGuidedEnrollmentPoints;
-
-    UdfpsEnrollDrawable(@NonNull Context context, @Nullable AttributeSet attrs) {
-        mFingerprintDrawable = defaultFactory(context);
-
-        loadResources(context, attrs);
-        mSensorOutlinePaint = new Paint(0 /* flags */);
-        mSensorOutlinePaint.setAntiAlias(true);
-        mSensorOutlinePaint.setColor(mMovingTargetFill);
-        mSensorOutlinePaint.setStyle(Paint.Style.FILL);
-
-        mBlueFill = new Paint(0 /* flags */);
-        mBlueFill.setAntiAlias(true);
-        mBlueFill.setColor(mMovingTargetFill);
-        mBlueFill.setStyle(Paint.Style.FILL);
-
-        mMovingTargetFpIcon = context.getResources()
-                .getDrawable(R.drawable.ic_enrollment_fingerprint, null);
-        mMovingTargetFpIcon.setTint(mEnrollIcon);
-        mMovingTargetFpIcon.mutate();
-
-        mFingerprintDrawable.setTint(mEnrollIcon);
-
-        setAlpha(255);
-        mTargetAnimListener = new Animator.AnimatorListener() {
-            @Override
-            public void onAnimationStart(Animator animation) {
-            }
-
-            @Override
-            public void onAnimationEnd(Animator animation) {
-                updateTipHintVisibility();
-            }
-
-            @Override
-            public void onAnimationCancel(Animator animation) {
-            }
-
-            @Override
-            public void onAnimationRepeat(Animator animation) {
-            }
-        };
-        mContext = context;
-        mFingerprintManager = context.getSystemService(FingerprintManager.class);
-        final AccessibilityManager am = context.getSystemService(AccessibilityManager.class);
-        mAccessibilityEnabled = am.isEnabled();
-        mGuidedEnrollmentPoints = new ArrayList<>();
-        initEnrollPoint(context);
-    }
-
-    /** The [sensorRect] coordinates for the sensor area. */
-    void onSensorRectUpdated(@NonNull RectF sensorRect) {
-        int margin = ((int) sensorRect.height()) / 8;
-        Rect bounds = new Rect((int) (sensorRect.left) + margin, (int) (sensorRect.top) + margin,
-                (int) (sensorRect.right) - margin, (int) (sensorRect.bottom) - margin);
-        updateFingerprintIconBounds(bounds);
-        mSensorRect = sensorRect;
-    }
-
-    void setShouldSkipDraw(boolean skipDraw) {
-        if (mSkipDraw == skipDraw) {
-            return;
-        }
-        mSkipDraw = skipDraw;
-        invalidateSelf();
-    }
-
-    void updateFingerprintIconBounds(@NonNull Rect bounds) {
-        mFingerprintDrawable.setBounds(bounds);
-        invalidateSelf();
-        mMovingTargetFpIcon.setBounds(bounds);
-        invalidateSelf();
-    }
-
-    void onEnrollmentProgress(final int remaining, final int totalSteps) {
-        if (mTotalSteps == -1) {
-            mTotalSteps = totalSteps;
-        }
-
-        if (remaining != mRemainingSteps) {
-            mLocationsEnrolled++;
-            if (isCenterEnrollmentStage()) {
-                mCenterTouchCount++;
-            }
-        }
-        mRemainingSteps = remaining;
-
-        if (!isCenterEnrollmentStage()) {
-            if (mTargetAnimatorSet != null && mTargetAnimatorSet.isRunning()) {
-                mTargetAnimatorSet.end();
-            }
-
-            final PointF point = getNextGuidedEnrollmentPoint();
-            if (mCurrentX != point.x || mCurrentY != point.y) {
-                final ValueAnimator x = ValueAnimator.ofFloat(mCurrentX, point.x);
-                x.addUpdateListener(animation -> {
-                    mCurrentX = (float) animation.getAnimatedValue();
-                    invalidateSelf();
-                });
-
-                final ValueAnimator y = ValueAnimator.ofFloat(mCurrentY, point.y);
-                y.addUpdateListener(animation -> {
-                    mCurrentY = (float) animation.getAnimatedValue();
-                    invalidateSelf();
-                });
-
-                final boolean isMovingToCenter = point.x == 0f && point.y == 0f;
-                final long duration = isMovingToCenter
-                        ? TARGET_ANIM_DURATION_SHORT
-                        : TARGET_ANIM_DURATION_LONG;
-
-                final ValueAnimator scale = ValueAnimator.ofFloat(0, (float) Math.PI);
-                scale.setDuration(duration);
-                scale.addUpdateListener(animation -> {
-                    // Grow then shrink
-                    mCurrentScale = 1
-                            + SCALE_MAX * (float) Math.sin((float) animation.getAnimatedValue());
-                    invalidateSelf();
-                });
-
-                mTargetAnimatorSet = new AnimatorSet();
-
-                mTargetAnimatorSet.setInterpolator(new AccelerateDecelerateInterpolator());
-                mTargetAnimatorSet.setDuration(duration);
-                mTargetAnimatorSet.addListener(mTargetAnimListener);
-                mTargetAnimatorSet.playTogether(x, y, scale);
-                mTargetAnimatorSet.start();
-            } else {
-                updateTipHintVisibility();
-            }
-        } else {
-            updateTipHintVisibility();
-        }
-
-        updateEdgeHintVisibility();
-    }
-
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        if (mSkipDraw) {
-            return;
-        }
-
-        // Draw moving target
-        if (!isCenterEnrollmentStage()) {
-            canvas.save();
-            canvas.translate(mCurrentX, mCurrentY);
-
-            if (mSensorRect != null) {
-                canvas.scale(mCurrentScale, mCurrentScale,
-                        mSensorRect.centerX(), mSensorRect.centerY());
-                canvas.drawOval(mSensorRect, mBlueFill);
-            }
-
-            mMovingTargetFpIcon.draw(canvas);
-            canvas.restore();
-        } else {
-            if (mSensorRect != null) {
-                canvas.drawOval(mSensorRect, mSensorOutlinePaint);
-            }
-            mFingerprintDrawable.draw(canvas);
-            mFingerprintDrawable.setAlpha(getAlpha());
-            mSensorOutlinePaint.setAlpha(getAlpha());
-        }
-
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-        mAlpha = alpha;
-        mFingerprintDrawable.setAlpha(alpha);
-        mSensorOutlinePaint.setAlpha(alpha);
-        mBlueFill.setAlpha(alpha);
-        mMovingTargetFpIcon.setAlpha(alpha);
-        invalidateSelf();
-    }
-
-    @Override
-    public int getAlpha() {
-        return mAlpha;
-    }
-
-    @Override
-    public void setColorFilter(@Nullable ColorFilter colorFilter) {
-    }
-
-    @Override
-    public int getOpacity() {
-        return 0;
-    }
-
-    private void updateTipHintVisibility() {
-        final boolean shouldShow = isTipEnrollmentStage();
-        // With the new update, we will git rid of most of this code, and instead
-        // we will change the fingerprint icon.
-        if (mShouldShowTipHint == shouldShow) {
-            return;
-        }
-        mShouldShowTipHint = shouldShow;
-    }
-
-    private void updateEdgeHintVisibility() {
-        final boolean shouldShow = isEdgeEnrollmentStage();
-        if (mShouldShowEdgeHint == shouldShow) {
-            return;
-        }
-        mShouldShowEdgeHint = shouldShow;
-    }
-
-    private ShapeDrawable defaultFactory(Context context) {
-        String fpPath = context.getResources().getString(R.string.config_udfpsIcon);
-        ShapeDrawable drawable = new ShapeDrawable(
-                new PathShape(PathParser.createPathFromPathData(fpPath), 72f, 72f)
-        );
-        drawable.mutate();
-        drawable.getPaint().setStyle(Paint.Style.STROKE);
-        drawable.getPaint().setStrokeCap(Paint.Cap.ROUND);
-        drawable.getPaint().setStrokeWidth(DEFAULT_STROKE_WIDTH);
-        return drawable;
-    }
-
-    private void loadResources(Context context, @Nullable AttributeSet attrs) {
-        final TypedArray ta = context.obtainStyledAttributes(attrs,
-                R.styleable.BiometricsEnrollView, R.attr.biometricsEnrollStyle,
-                R.style.BiometricsEnrollStyle);
-        mEnrollIcon = ta.getColor(R.styleable.BiometricsEnrollView_biometricsEnrollIcon, 0);
-        mMovingTargetFill = ta.getColor(
-                R.styleable.BiometricsEnrollView_biometricsMovingTargetFill, 0);
-        ta.recycle();
-    }
-
-    private boolean isCenterEnrollmentStage() {
-        if (mTotalSteps == -1 || mRemainingSteps == -1) {
-            return true;
-        }
-        return mTotalSteps - mRemainingSteps < getStageThresholdSteps(mTotalSteps, 0);
-    }
-
-    private int getStageThresholdSteps(int totalSteps, int stageIndex) {
-        return Math.round(totalSteps * mFingerprintManager.getEnrollStageThreshold(stageIndex));
-    }
-
-    private PointF getNextGuidedEnrollmentPoint() {
-        if (mAccessibilityEnabled || !isGuidedEnrollmentStage()) {
-            return new PointF(0f, 0f);
-        }
-
-        float scale = SCALE;
-        if (Build.IS_ENG || Build.IS_USERDEBUG) {
-            scale = Settings.Secure.getFloatForUser(mContext.getContentResolver(),
-                    SCALE_OVERRIDE, SCALE,
-                    UserHandle.USER_CURRENT);
-        }
-        final int index = mLocationsEnrolled - mCenterTouchCount;
-        final PointF originalPoint = mGuidedEnrollmentPoints
-                .get(index % mGuidedEnrollmentPoints.size());
-        return new PointF(originalPoint.x * scale, originalPoint.y * scale);
-    }
-
-    private boolean isGuidedEnrollmentStage() {
-        if (mAccessibilityEnabled || mTotalSteps == -1 || mRemainingSteps == -1) {
-            return false;
-        }
-        final int progressSteps = mTotalSteps - mRemainingSteps;
-        return progressSteps >= getStageThresholdSteps(mTotalSteps, 0)
-                && progressSteps < getStageThresholdSteps(mTotalSteps, 1);
-    }
-
-    private boolean isTipEnrollmentStage() {
-        if (mTotalSteps == -1 || mRemainingSteps == -1) {
-            return false;
-        }
-        final int progressSteps = mTotalSteps - mRemainingSteps;
-        return progressSteps >= getStageThresholdSteps(mTotalSteps, 1)
-                && progressSteps < getStageThresholdSteps(mTotalSteps, 2);
-    }
-
-    private boolean isEdgeEnrollmentStage() {
-        if (mTotalSteps == -1 || mRemainingSteps == -1) {
-            return false;
-        }
-        return mTotalSteps - mRemainingSteps >= getStageThresholdSteps(mTotalSteps, 2);
-    }
-
-    private void initEnrollPoint(Context context) {
-        // Number of pixels per mm
-        float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_MM, 1,
-                context.getResources().getDisplayMetrics());
-        boolean useNewCoords = Settings.Secure.getIntForUser(mContext.getContentResolver(),
-                NEW_COORDS_OVERRIDE, 0,
-                UserHandle.USER_CURRENT) != 0;
-        if (useNewCoords && (Build.IS_ENG || Build.IS_USERDEBUG)) {
-            Log.v(TAG, "Using new coordinates");
-            mGuidedEnrollmentPoints.add(new PointF(-0.15f * px, -1.02f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-0.15f * px, 1.02f * px));
-            mGuidedEnrollmentPoints.add(new PointF(0.29f * px, 0.00f * px));
-            mGuidedEnrollmentPoints.add(new PointF(2.17f * px, -2.35f * px));
-            mGuidedEnrollmentPoints.add(new PointF(1.07f * px, -3.96f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-0.37f * px, -4.31f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-1.69f * px, -3.29f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-2.48f * px, -1.23f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-2.48f * px, 1.23f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-1.69f * px, 3.29f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-0.37f * px, 4.31f * px));
-            mGuidedEnrollmentPoints.add(new PointF(1.07f * px, 3.96f * px));
-            mGuidedEnrollmentPoints.add(new PointF(2.17f * px, 2.35f * px));
-            mGuidedEnrollmentPoints.add(new PointF(2.58f * px, 0.00f * px));
-        } else {
-            Log.v(TAG, "Using old coordinates");
-            mGuidedEnrollmentPoints.add(new PointF(2.00f * px, 0.00f * px));
-            mGuidedEnrollmentPoints.add(new PointF(0.87f * px, -2.70f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-1.80f * px, -1.31f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-1.80f * px, 1.31f * px));
-            mGuidedEnrollmentPoints.add(new PointF(0.88f * px, 2.70f * px));
-            mGuidedEnrollmentPoints.add(new PointF(3.94f * px, -1.06f * px));
-            mGuidedEnrollmentPoints.add(new PointF(2.90f * px, -4.14f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-0.52f * px, -5.95f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-3.33f * px, -3.33f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-3.99f * px, -0.35f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-3.62f * px, 2.54f * px));
-            mGuidedEnrollmentPoints.add(new PointF(-1.49f * px, 5.57f * px));
-            mGuidedEnrollmentPoints.add(new PointF(2.29f * px, 4.92f * px));
-            mGuidedEnrollmentPoints.add(new PointF(3.82f * px, 1.78f * px));
-        }
-    }
-
-}
diff --git a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollProgressBarDrawable.java b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollProgressBarDrawable.java
deleted file mode 100644
index 8cb4bb2..0000000
--- a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollProgressBarDrawable.java
+++ /dev/null
@@ -1,422 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.widget;
-
-import android.animation.ValueAnimator;
-import android.content.Context;
-import android.content.res.TypedArray;
-import android.graphics.Canvas;
-import android.graphics.ColorFilter;
-import android.graphics.Paint;
-import android.graphics.drawable.Drawable;
-import android.os.Process;
-import android.os.VibrationAttributes;
-import android.os.VibrationEffect;
-import android.os.Vibrator;
-import android.util.AttributeSet;
-import android.util.DisplayMetrics;
-import android.view.accessibility.AccessibilityManager;
-import android.view.animation.DecelerateInterpolator;
-import android.view.animation.Interpolator;
-import android.view.animation.OvershootInterpolator;
-
-import androidx.annotation.ColorInt;
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.internal.annotations.VisibleForTesting;
-import com.android.settings.R;
-
-/**
- * UDFPS enrollment progress bar.
- */
-public class UdfpsEnrollProgressBarDrawable extends Drawable {
-    private static final String TAG = "UdfpsProgressBar";
-
-    private static final long CHECKMARK_ANIMATION_DELAY_MS = 200L;
-    private static final long CHECKMARK_ANIMATION_DURATION_MS = 300L;
-    private static final long FILL_COLOR_ANIMATION_DURATION_MS = 350L;
-    private static final long PROGRESS_ANIMATION_DURATION_MS = 400L;
-    private static final float STROKE_WIDTH_DP = 12f;
-    private static final Interpolator DEACCEL = new DecelerateInterpolator();
-
-    private static final VibrationEffect VIBRATE_EFFECT_ERROR =
-            VibrationEffect.createWaveform(new long[]{0, 5, 55, 60}, -1);
-    private static final VibrationAttributes FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES =
-            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_ACCESSIBILITY);
-
-    private static final VibrationAttributes HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES =
-            VibrationAttributes.createForUsage(VibrationAttributes.USAGE_HARDWARE_FEEDBACK);
-
-    private static final VibrationEffect SUCCESS_VIBRATION_EFFECT =
-            VibrationEffect.get(VibrationEffect.EFFECT_CLICK);
-
-    private final float mStrokeWidthPx;
-    @ColorInt
-    private final int mProgressColor;
-    @ColorInt
-    private final int mHelpColor;
-    @ColorInt
-    private final int mOnFirstBucketFailedColor;
-    @NonNull
-    private final Drawable mCheckmarkDrawable;
-    @NonNull
-    private final Interpolator mCheckmarkInterpolator;
-    @NonNull
-    private final Paint mBackgroundPaint;
-    @VisibleForTesting
-    @NonNull
-    final Paint mFillPaint;
-    @NonNull
-    private final Vibrator mVibrator;
-    @NonNull
-    private final boolean mIsAccessibilityEnabled;
-    @NonNull
-    private final Context mContext;
-
-    private boolean mAfterFirstTouch;
-
-    private int mRemainingSteps = 0;
-    private int mTotalSteps = 0;
-    private float mProgress = 0f;
-    @Nullable
-    private ValueAnimator mProgressAnimator;
-    @NonNull
-    private final ValueAnimator.AnimatorUpdateListener mProgressUpdateListener;
-
-    private boolean mShowingHelp = false;
-    @Nullable
-    private ValueAnimator mFillColorAnimator;
-    @NonNull
-    private final ValueAnimator.AnimatorUpdateListener mFillColorUpdateListener;
-
-    @Nullable
-    private ValueAnimator mBackgroundColorAnimator;
-    @NonNull
-    private final ValueAnimator.AnimatorUpdateListener mBackgroundColorUpdateListener;
-
-    private boolean mComplete = false;
-    private float mCheckmarkScale = 0f;
-    @Nullable
-    private ValueAnimator mCheckmarkAnimator;
-    @NonNull
-    private final ValueAnimator.AnimatorUpdateListener mCheckmarkUpdateListener;
-
-    private int mMovingTargetFill;
-    private int mMovingTargetFillError;
-    private int mEnrollProgress;
-    private int mEnrollProgressHelp;
-    private int mEnrollProgressHelpWithTalkback;
-
-    public UdfpsEnrollProgressBarDrawable(@NonNull Context context, @Nullable AttributeSet attrs) {
-        mContext = context;
-
-        loadResources(context, attrs);
-        float density = context.getResources().getDisplayMetrics().densityDpi;
-        mStrokeWidthPx = STROKE_WIDTH_DP * (density / DisplayMetrics.DENSITY_DEFAULT);
-        mProgressColor = mEnrollProgress;
-        final AccessibilityManager am = context.getSystemService(AccessibilityManager.class);
-        mIsAccessibilityEnabled = am.isTouchExplorationEnabled();
-        mOnFirstBucketFailedColor = mMovingTargetFillError;
-        if (!mIsAccessibilityEnabled) {
-            mHelpColor = mEnrollProgressHelp;
-        } else {
-            mHelpColor = mEnrollProgressHelpWithTalkback;
-        }
-        mCheckmarkDrawable = context.getDrawable(R.drawable.udfps_enroll_checkmark);
-        mCheckmarkDrawable.mutate();
-        mCheckmarkInterpolator = new OvershootInterpolator();
-
-        mBackgroundPaint = new Paint();
-        mBackgroundPaint.setStrokeWidth(mStrokeWidthPx);
-        mBackgroundPaint.setColor(mMovingTargetFill);
-        mBackgroundPaint.setAntiAlias(true);
-        mBackgroundPaint.setStyle(Paint.Style.STROKE);
-        mBackgroundPaint.setStrokeCap(Paint.Cap.ROUND);
-
-        // Progress fill should *not* use the extracted system color.
-        mFillPaint = new Paint();
-        mFillPaint.setStrokeWidth(mStrokeWidthPx);
-        mFillPaint.setColor(mProgressColor);
-        mFillPaint.setAntiAlias(true);
-        mFillPaint.setStyle(Paint.Style.STROKE);
-        mFillPaint.setStrokeCap(Paint.Cap.ROUND);
-
-        mVibrator = mContext.getSystemService(Vibrator.class);
-
-        mProgressUpdateListener = animation -> {
-            mProgress = (float) animation.getAnimatedValue();
-            invalidateSelf();
-        };
-
-        mFillColorUpdateListener = animation -> {
-            mFillPaint.setColor((int) animation.getAnimatedValue());
-            invalidateSelf();
-        };
-
-        mCheckmarkUpdateListener = animation -> {
-            mCheckmarkScale = (float) animation.getAnimatedValue();
-            invalidateSelf();
-        };
-
-        mBackgroundColorUpdateListener = animation -> {
-            mBackgroundPaint.setColor((int) animation.getAnimatedValue());
-            invalidateSelf();
-        };
-    }
-
-    void onEnrollmentProgress(final int remaining, final int totalSteps) {
-        mAfterFirstTouch = true;
-        updateState(remaining, totalSteps, false /* showingHelp */);
-    }
-
-    void onEnrollmentHelp(int remaining, int totalSteps) {
-        updateState(remaining, totalSteps, true /* showingHelp */);
-    }
-
-    void onLastStepAcquired() {
-        updateState(0, mTotalSteps, false /* showingHelp */);
-    }
-
-    private void updateState(int remainingSteps, int totalSteps, boolean showingHelp) {
-        updateProgress(remainingSteps, totalSteps, showingHelp);
-        updateFillColor(showingHelp);
-    }
-
-    private void updateProgress(int remainingSteps, int totalSteps, boolean showingHelp) {
-        if (mRemainingSteps == remainingSteps && mTotalSteps == totalSteps) {
-            return;
-        }
-
-        if (mShowingHelp) {
-            if (mVibrator != null && mIsAccessibilityEnabled) {
-                mVibrator.vibrate(Process.myUid(), mContext.getOpPackageName(),
-                        VIBRATE_EFFECT_ERROR, getClass().getSimpleName() + "::onEnrollmentHelp",
-                        FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES);
-            }
-        } else {
-            // If the first touch is an error, remainingSteps will be -1 and the callback
-            // doesn't come from onEnrollmentHelp. If we are in the accessibility flow,
-            // we still would like to vibrate.
-            if (mVibrator != null) {
-                if (remainingSteps == -1 && mIsAccessibilityEnabled) {
-                    mVibrator.vibrate(Process.myUid(), mContext.getOpPackageName(),
-                            VIBRATE_EFFECT_ERROR,
-                            getClass().getSimpleName() + "::onFirstTouchError",
-                            FINGERPRINT_ENROLLING_SONFICATION_ATTRIBUTES);
-                } else if (remainingSteps != -1 && !mIsAccessibilityEnabled) {
-                    mVibrator.vibrate(Process.myUid(),
-                            mContext.getOpPackageName(),
-                            SUCCESS_VIBRATION_EFFECT,
-                            getClass().getSimpleName() + "::OnEnrollmentProgress",
-                            HARDWARE_FEEDBACK_VIBRATION_ATTRIBUTES);
-                }
-            }
-        }
-
-        mShowingHelp = showingHelp;
-        mRemainingSteps = remainingSteps;
-        mTotalSteps = totalSteps;
-
-        final int progressSteps = Math.max(0, totalSteps - remainingSteps);
-
-        // If needed, add 1 to progress and total steps to account for initial touch.
-        final int adjustedSteps = mAfterFirstTouch ? progressSteps + 1 : progressSteps;
-        final int adjustedTotal = mAfterFirstTouch ? mTotalSteps + 1 : mTotalSteps;
-
-        final float targetProgress = Math.min(1f, (float) adjustedSteps / (float) adjustedTotal);
-
-        if (mProgressAnimator != null && mProgressAnimator.isRunning()) {
-            mProgressAnimator.cancel();
-        }
-
-        mProgressAnimator = ValueAnimator.ofFloat(mProgress, targetProgress);
-        mProgressAnimator.setDuration(PROGRESS_ANIMATION_DURATION_MS);
-        mProgressAnimator.addUpdateListener(mProgressUpdateListener);
-        mProgressAnimator.start();
-
-        if (remainingSteps == 0) {
-            startCompletionAnimation();
-        } else if (remainingSteps > 0) {
-            rollBackCompletionAnimation();
-        }
-    }
-
-    private void animateBackgroundColor() {
-        if (mBackgroundColorAnimator != null && mBackgroundColorAnimator.isRunning()) {
-            mBackgroundColorAnimator.end();
-        }
-        mBackgroundColorAnimator = ValueAnimator.ofArgb(mBackgroundPaint.getColor(),
-                mOnFirstBucketFailedColor);
-        mBackgroundColorAnimator.setDuration(FILL_COLOR_ANIMATION_DURATION_MS);
-        mBackgroundColorAnimator.setRepeatCount(1);
-        mBackgroundColorAnimator.setRepeatMode(ValueAnimator.REVERSE);
-        mBackgroundColorAnimator.setInterpolator(DEACCEL);
-        mBackgroundColorAnimator.addUpdateListener(mBackgroundColorUpdateListener);
-        mBackgroundColorAnimator.start();
-    }
-
-    private void updateFillColor(boolean showingHelp) {
-        if (!mAfterFirstTouch && showingHelp) {
-            // If we are on the first touch, animate the background color
-            // instead of the progress color.
-            animateBackgroundColor();
-            return;
-        }
-
-        if (mFillColorAnimator != null && mFillColorAnimator.isRunning()) {
-            mFillColorAnimator.end();
-        }
-
-        @ColorInt final int targetColor = showingHelp ? mHelpColor : mProgressColor;
-        mFillColorAnimator = ValueAnimator.ofArgb(mFillPaint.getColor(), targetColor);
-        mFillColorAnimator.setDuration(FILL_COLOR_ANIMATION_DURATION_MS);
-        mFillColorAnimator.setRepeatCount(1);
-        mFillColorAnimator.setRepeatMode(ValueAnimator.REVERSE);
-        mFillColorAnimator.setInterpolator(DEACCEL);
-        mFillColorAnimator.addUpdateListener(mFillColorUpdateListener);
-        mFillColorAnimator.start();
-    }
-
-    private void startCompletionAnimation() {
-        if (mComplete) {
-            return;
-        }
-        mComplete = true;
-
-        if (mCheckmarkAnimator != null && mCheckmarkAnimator.isRunning()) {
-            mCheckmarkAnimator.cancel();
-        }
-
-        mCheckmarkAnimator = ValueAnimator.ofFloat(mCheckmarkScale, 1f);
-        mCheckmarkAnimator.setStartDelay(CHECKMARK_ANIMATION_DELAY_MS);
-        mCheckmarkAnimator.setDuration(CHECKMARK_ANIMATION_DURATION_MS);
-        mCheckmarkAnimator.setInterpolator(mCheckmarkInterpolator);
-        mCheckmarkAnimator.addUpdateListener(mCheckmarkUpdateListener);
-        mCheckmarkAnimator.start();
-    }
-
-    private void rollBackCompletionAnimation() {
-        if (!mComplete) {
-            return;
-        }
-        mComplete = false;
-
-        // Adjust duration based on how much of the completion animation has played.
-        final float animatedFraction = mCheckmarkAnimator != null
-                ? mCheckmarkAnimator.getAnimatedFraction()
-                : 0f;
-        final long durationMs = Math.round(CHECKMARK_ANIMATION_DELAY_MS * animatedFraction);
-
-        if (mCheckmarkAnimator != null && mCheckmarkAnimator.isRunning()) {
-            mCheckmarkAnimator.cancel();
-        }
-
-        mCheckmarkAnimator = ValueAnimator.ofFloat(mCheckmarkScale, 0f);
-        mCheckmarkAnimator.setDuration(durationMs);
-        mCheckmarkAnimator.addUpdateListener(mCheckmarkUpdateListener);
-        mCheckmarkAnimator.start();
-    }
-
-    private void loadResources(Context context, @Nullable AttributeSet attrs) {
-        final TypedArray ta = context.obtainStyledAttributes(attrs,
-                R.styleable.BiometricsEnrollView, R.attr.biometricsEnrollStyle,
-                R.style.BiometricsEnrollStyle);
-        mMovingTargetFill = ta.getColor(
-                R.styleable.BiometricsEnrollView_biometricsMovingTargetFill, 0);
-        mMovingTargetFillError = ta.getColor(
-                R.styleable.BiometricsEnrollView_biometricsMovingTargetFillError, 0);
-        mEnrollProgress = ta.getColor(
-                R.styleable.BiometricsEnrollView_biometricsEnrollProgress, 0);
-        mEnrollProgressHelp = ta.getColor(
-                R.styleable.BiometricsEnrollView_biometricsEnrollProgressHelp, 0);
-        mEnrollProgressHelpWithTalkback = ta.getColor(
-                R.styleable.BiometricsEnrollView_biometricsEnrollProgressHelpWithTalkback, 0);
-        ta.recycle();
-    }
-
-    @Override
-    public void draw(@NonNull Canvas canvas) {
-        canvas.save();
-
-        // Progress starts from the top, instead of the right
-        canvas.rotate(-90f, getBounds().centerX(), getBounds().centerY());
-
-        final float halfPaddingPx = mStrokeWidthPx / 2f;
-
-        if (mProgress < 1f) {
-            // Draw the background color of the progress circle.
-            canvas.drawArc(
-                    halfPaddingPx,
-                    halfPaddingPx,
-                    getBounds().right - halfPaddingPx,
-                    getBounds().bottom - halfPaddingPx,
-                    0f /* startAngle */,
-                    360f /* sweepAngle */,
-                    false /* useCenter */,
-                    mBackgroundPaint);
-        }
-
-        if (mProgress > 0f) {
-            // Draw the filled portion of the progress circle.
-            canvas.drawArc(
-                    halfPaddingPx,
-                    halfPaddingPx,
-                    getBounds().right - halfPaddingPx,
-                    getBounds().bottom - halfPaddingPx,
-                    0f /* startAngle */,
-                    360f * mProgress /* sweepAngle */,
-                    false /* useCenter */,
-                    mFillPaint);
-        }
-
-        canvas.restore();
-
-        if (mCheckmarkScale > 0f) {
-            final float offsetScale = (float) Math.sqrt(2) / 2f;
-            final float centerXOffset = (getBounds().width() - mStrokeWidthPx) / 2f * offsetScale;
-            final float centerYOffset = (getBounds().height() - mStrokeWidthPx) / 2f * offsetScale;
-            final float centerX = getBounds().centerX() + centerXOffset;
-            final float centerY = getBounds().centerY() + centerYOffset;
-
-            final float boundsXOffset =
-                    mCheckmarkDrawable.getIntrinsicWidth() / 2f * mCheckmarkScale;
-            final float boundsYOffset =
-                    mCheckmarkDrawable.getIntrinsicHeight() / 2f * mCheckmarkScale;
-
-            final int left = Math.round(centerX - boundsXOffset);
-            final int top = Math.round(centerY - boundsYOffset);
-            final int right = Math.round(centerX + boundsXOffset);
-            final int bottom = Math.round(centerY + boundsYOffset);
-            mCheckmarkDrawable.setBounds(left, top, right, bottom);
-            mCheckmarkDrawable.draw(canvas);
-        }
-    }
-
-    @Override
-    public void setAlpha(int alpha) {
-    }
-
-    @Override
-    public void setColorFilter(@Nullable ColorFilter colorFilter) {
-    }
-
-    @Override
-    public int getOpacity() {
-        return 0;
-    }
-}
diff --git a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java b/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
deleted file mode 100644
index c99cb2d..0000000
--- a/src/com/android/settings/biometrics2/ui/widget/UdfpsEnrollView.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.widget;
-
-import android.content.Context;
-import android.graphics.Rect;
-import android.graphics.RectF;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.os.Handler;
-import android.os.Looper;
-import android.util.AttributeSet;
-import android.util.Log;
-import android.util.RotationUtils;
-import android.view.DisplayInfo;
-import android.view.Surface;
-import android.view.ViewGroup;
-import android.view.ViewTreeObserver;
-import android.widget.FrameLayout;
-import android.widget.ImageView;
-import android.widget.RelativeLayout;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-
-import com.android.settings.R;
-import com.android.systemui.biometrics.UdfpsUtils;
-import com.android.systemui.biometrics.shared.model.UdfpsOverlayParams;
-
-/**
- * View corresponding with udfps_enroll_view.xml
- */
-public class UdfpsEnrollView extends FrameLayout {
-    private static final String TAG = "UdfpsEnrollView";
-    @NonNull
-    private final UdfpsEnrollDrawable mFingerprintDrawable;
-    @NonNull
-    private final UdfpsEnrollProgressBarDrawable mFingerprintProgressDrawable;
-    @NonNull
-    private final Handler mHandler;
-
-    @NonNull
-    private ImageView mFingerprintProgressView;
-    private UdfpsUtils mUdfpsUtils;
-
-    private int mProgressBarRadius;
-
-    private Rect mSensorRect;
-    private UdfpsOverlayParams mOverlayParams;
-    private FingerprintSensorPropertiesInternal mSensorProperties;
-
-    private int mTotalSteps = -1;
-    private int mRemainingSteps = -1;
-    private int mLocationsEnrolled = 0;
-    private int mCenterTouchCount = 0;
-
-    public UdfpsEnrollView(Context context, @Nullable AttributeSet attrs) {
-        super(context, attrs);
-        mFingerprintDrawable = new UdfpsEnrollDrawable(mContext, attrs);
-        mFingerprintProgressDrawable = new UdfpsEnrollProgressBarDrawable(context, attrs);
-        mHandler = new Handler(Looper.getMainLooper());
-        mUdfpsUtils = new UdfpsUtils();
-    }
-
-    @Override
-    protected void onFinishInflate() {
-        ImageView fingerprintView = findViewById(R.id.udfps_enroll_animation_fp_view);
-        fingerprintView.setImageDrawable(mFingerprintDrawable);
-        mFingerprintProgressView = findViewById(R.id.udfps_enroll_animation_fp_progress_view);
-        mFingerprintProgressView.setImageDrawable(mFingerprintProgressDrawable);
-    }
-
-    /**
-     * Receive enroll progress information from FingerprintEnrollEnrollingUdfpsFragment
-     */
-    public void onEnrollmentProgress(int remaining, int totalSteps) {
-        if (mTotalSteps == -1) {
-            mTotalSteps = totalSteps;
-        }
-        mRemainingSteps = remaining;
-        mHandler.post(() -> {
-            mFingerprintProgressDrawable.onEnrollmentProgress(remaining, totalSteps);
-            mFingerprintDrawable.onEnrollmentProgress(remaining, totalSteps);
-        });
-    }
-
-    /**
-     * Receive enroll help information from FingerprintEnrollEnrollingUdfpsFragment
-     */
-    public void onEnrollmentHelp() {
-        mHandler.post(
-                () -> mFingerprintProgressDrawable.onEnrollmentHelp(mRemainingSteps, mTotalSteps));
-    }
-
-    /**
-     * Receive onAcquired from FingerprintEnrollEnrollingUdfpsFragment
-     */
-    public void onAcquired(boolean isAcquiredGood) {
-        final boolean animateIfLastStepGood =
-                isAcquiredGood && (mRemainingSteps <= 2 && mRemainingSteps >= 0);
-        mHandler.post(() -> {
-            onFingerUp();
-            if (animateIfLastStepGood) mFingerprintProgressDrawable.onLastStepAcquired();
-        });
-    }
-
-    /**
-     * Receive onPointerDown from FingerprintEnrollEnrollingUdfpsFragment
-     */
-    public void onPointerDown(int sensorId) {
-        onFingerDown();
-    }
-
-    /**
-     * Receive onPointerUp from FingerprintEnrollEnrollingUdfpsFragment
-     */
-    public void onPointerUp(int sensorId) {
-        onFingerUp();
-    }
-
-    private final ViewTreeObserver.OnDrawListener mOnDrawListener = this::updateOverlayParams;
-
-    /**
-     * setup SensorProperties
-     */
-    public void setSensorProperties(FingerprintSensorPropertiesInternal properties) {
-        mSensorProperties = properties;
-        ((ViewGroup) getParent()).getViewTreeObserver().addOnDrawListener(mOnDrawListener);
-    }
-
-    @Override
-    protected void onDetachedFromWindow() {
-        final ViewGroup parent = (ViewGroup) getParent();
-        if (parent != null) {
-            final ViewTreeObserver observer = parent.getViewTreeObserver();
-            if (observer != null) {
-                observer.removeOnDrawListener(mOnDrawListener);
-            }
-        }
-        super.onDetachedFromWindow();
-    }
-
-    private void onSensorRectUpdated() {
-        updateDimensions();
-
-        // Updates sensor rect in relation to the overlay view
-        mSensorRect.set(getPaddingX(), getPaddingY(),
-                (mOverlayParams.getSensorBounds().width() + getPaddingX()),
-                (mOverlayParams.getSensorBounds().height() + getPaddingY()));
-        mFingerprintDrawable.onSensorRectUpdated(new RectF(mSensorRect));
-    }
-
-    private void updateDimensions() {
-        // Original sensorBounds assume portrait mode.
-        final Rect rotatedBounds = new Rect(mOverlayParams.getSensorBounds());
-        int rotation = mOverlayParams.getRotation();
-        if (rotation == Surface.ROTATION_90 || rotation == Surface.ROTATION_270) {
-            RotationUtils.rotateBounds(
-                    rotatedBounds,
-                    mOverlayParams.getNaturalDisplayWidth(),
-                    mOverlayParams.getNaturalDisplayHeight(),
-                    rotation
-            );
-        }
-
-        RelativeLayout parent = ((RelativeLayout) getParent());
-        if (parent == null) {
-            Log.e(TAG, "Fail to updateDimensions for " + this + ", parent null");
-            return;
-        }
-        final int[] coords = parent.getLocationOnScreen();
-        final int parentLeft = coords[0];
-        final int parentTop = coords[1];
-        final int parentRight = parentLeft + parent.getWidth();
-        final int parentBottom = parentTop + parent.getHeight();
-
-
-        RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(getWidth(),
-                getHeight());
-        if (rotation == Surface.ROTATION_0 || rotation == Surface.ROTATION_180) {
-            params.addRule(RelativeLayout.ALIGN_PARENT_TOP);
-            params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
-            params.rightMargin = parentRight - rotatedBounds.right - getPaddingX();
-            params.topMargin = rotatedBounds.top - parentTop - getPaddingY();
-        } else {
-            if (rotation == Surface.ROTATION_90) {
-                params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
-                params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
-                params.rightMargin = parentRight - rotatedBounds.right - getPaddingX();
-                params.bottomMargin = parentBottom - rotatedBounds.bottom - getPaddingY();
-            } else {
-                params.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
-                params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
-                params.bottomMargin = parentBottom - rotatedBounds.bottom - getPaddingY();
-                params.leftMargin = rotatedBounds.left - parentLeft - getPaddingX();
-            }
-        }
-        params.height = rotatedBounds.height() + 2 * getPaddingX();
-        params.width = rotatedBounds.width() + 2 * getPaddingY();
-        setLayoutParams(params);
-    }
-
-    private void onFingerDown() {
-        mFingerprintDrawable.setShouldSkipDraw(true);
-        mFingerprintDrawable.invalidateSelf();
-    }
-
-    private void onFingerUp() {
-        mFingerprintDrawable.setShouldSkipDraw(false);
-        mFingerprintDrawable.invalidateSelf();
-    }
-
-    private int getPaddingX() {
-        return mProgressBarRadius;
-    }
-
-    private int getPaddingY() {
-        return mProgressBarRadius;
-    }
-
-    private void updateOverlayParams() {
-
-        if (mSensorProperties == null) {
-            android.util.Log.e(TAG, "There is no sensor info!");
-            return;
-        }
-
-        DisplayInfo displayInfo = new DisplayInfo();
-        if (getDisplay() == null) {
-            android.util.Log.e(TAG, "Can not get display");
-            return;
-        }
-        getDisplay().getDisplayInfo(displayInfo);
-        Rect udfpsBounds = mSensorProperties.getLocation().getRect();
-        float scaleFactor = mUdfpsUtils.getScaleFactor(displayInfo);
-        udfpsBounds.scale(scaleFactor);
-
-        final Rect overlayBounds = new Rect(
-                0, /* left */
-                displayInfo.getNaturalHeight() / 2, /* top */
-                displayInfo.getNaturalWidth(), /* right */
-                displayInfo.getNaturalHeight() /* botom */);
-
-        mOverlayParams = new UdfpsOverlayParams(
-                udfpsBounds,
-                overlayBounds,
-                displayInfo.getNaturalWidth(),
-                displayInfo.getNaturalHeight(),
-                scaleFactor,
-                displayInfo.rotation,
-                mSensorProperties.sensorType);
-
-        post(() -> {
-            mProgressBarRadius =
-                    (int) (mOverlayParams.getScaleFactor() * getContext().getResources().getInteger(
-                            R.integer.config_udfpsEnrollProgressBar));
-            mSensorRect = new Rect(mOverlayParams.getSensorBounds());
-
-            onSensorRectUpdated();
-        });
-
-    }
-}
-
diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 3fa811a..2e5daeb 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -43,7 +43,6 @@
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.HeadsetProfile;
-import com.android.settingslib.bluetooth.HearingAidProfile;
 import com.android.settingslib.bluetooth.LeAudioProfile;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.bluetooth.LocalBluetoothProfile;
@@ -95,6 +94,7 @@
             new HashMap<String, List<CachedBluetoothDevice>>();
     private boolean mIsLeContactSharingEnabled = false;
     private boolean mIsLeAudioToggleEnabled = false;
+    private boolean mIsLeAudioOnlyDevice = false;
 
     @VisibleForTesting
     PreferenceCategory mProfilesContainer;
@@ -345,6 +345,11 @@
             result.remove(mManager.getProfileManager().getA2dpProfile());
             result.remove(mManager.getProfileManager().getHeadsetProfile());
         }
+        boolean hearingAidSupported = result.contains(
+                mManager.getProfileManager().getHearingAidProfile());
+        if (leAudioSupported && !classicAudioSupported && !hearingAidSupported) {
+            mIsLeAudioOnlyDevice = true;
+        }
         Log.d(TAG, "getProfiles:Map:" + mProfileDeviceMap);
         return result;
     }
@@ -513,19 +518,6 @@
         refresh();
     }
 
-    private boolean isLeAudioOnlyDevice() {
-        if (mCachedDevice.getProfiles().stream()
-                .noneMatch(profile -> profile instanceof LeAudioProfile)) {
-            return false;
-        }
-        return mCachedDevice.getProfiles().stream()
-                .noneMatch(
-                        profile ->
-                                profile instanceof HearingAidProfile
-                                        || profile instanceof A2dpProfile
-                                        || profile instanceof HeadsetProfile);
-    }
-
     private void updateLeAudioConfig() {
         mIsLeContactSharingEnabled = DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_SETTINGS_UI,
                 SettingsUIDeviceConfig.BT_LE_AUDIO_CONTACT_SHARING_ENABLED, true);
@@ -534,7 +526,7 @@
         boolean isLeEnabledByDefault =
                 SystemProperties.getBoolean(LE_AUDIO_CONNECTION_BY_DEFAULT_PROPERTY, true);
         mIsLeAudioToggleEnabled = isLeAudioToggleVisible || isLeEnabledByDefault;
-        if (Flags.hideLeAudioToggleForLeAudioOnlyDevice() && isLeAudioOnlyDevice()) {
+        if (Flags.hideLeAudioToggleForLeAudioOnlyDevice() && mIsLeAudioOnlyDevice) {
             mIsLeAudioToggleEnabled = false;
             Log.d(
                     TAG,
diff --git a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
index ffc97dc..791b629 100644
--- a/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
+++ b/src/com/android/settings/dashboard/DashboardFeatureProviderImpl.java
@@ -52,6 +52,7 @@
 import android.util.Pair;
 import android.widget.Toast;
 
+import androidx.annotation.Nullable;
 import androidx.annotation.VisibleForTesting;
 import androidx.fragment.app.FragmentActivity;
 import androidx.preference.Preference;
@@ -63,6 +64,7 @@
 import com.android.settings.activityembedding.ActivityEmbeddingRulesController;
 import com.android.settings.activityembedding.ActivityEmbeddingUtils;
 import com.android.settings.dashboard.profileselector.ProfileSelectDialog;
+import com.android.settings.flags.Flags;
 import com.android.settings.homepage.TopLevelHighlightMixin;
 import com.android.settings.homepage.TopLevelSettings;
 import com.android.settings.overlay.FeatureFactory;
@@ -413,13 +415,23 @@
                         METHOD_GET_PROVIDER_ICON);
                 final Pair<String, Integer> iconInfo = TileUtils.getIconFromUri(
                         mContext, packageName, uri, providerMap);
-                if (iconInfo == null) {
+                final Icon icon;
+                if (iconInfo != null) {
+                    icon = Icon.createWithResource(iconInfo.first, iconInfo.second);
+                } else if (Flags.supportRawDynamicIcons()) {
+                    icon = TileUtils.getRawIconFromUri(mContext, uri, providerMap);
+                } else {
+                    icon = null;
+                }
+                if (icon == null) {
                     Log.w(TAG, "Failed to get icon from uri " + uri);
                     return;
                 }
-                final Icon icon = Icon.createWithResource(iconInfo.first, iconInfo.second);
+
+                final String iconPackage = (iconInfo != null) ? iconInfo.first : null;
+
                 ThreadUtils.postOnMainThread(() -> {
-                    setPreferenceIcon(preference, tile, forceRoundedIcon, iconInfo.first, icon);
+                    setPreferenceIcon(preference, tile, forceRoundedIcon, iconPackage, icon);
                 });
             });
             return;
@@ -435,14 +447,21 @@
     }
 
     private void setPreferenceIcon(Preference preference, Tile tile, boolean forceRoundedIcon,
-            String iconPackage, Icon icon) {
+            @Nullable String iconPackage, Icon icon) {
         Drawable iconDrawable = icon.loadDrawable(preference.getContext());
         if (iconDrawable == null) {
             Log.w(TAG, "Set null preference icon for: " + iconPackage);
             preference.setIcon(null);
             return;
         }
+        // Tint homepage icons
         if (TextUtils.equals(tile.getCategory(), CategoryKey.CATEGORY_HOMEPAGE)) {
+            // Skip tinting and Adaptive Icon transformation for homepage account type raw icons
+            if (TextUtils.equals(tile.getGroupKey(), "top_level_account_category")
+                    && iconPackage == null) {
+                preference.setIcon(iconDrawable);
+                return;
+            }
             iconDrawable.setTint(Utils.getHomepageIconColor(preference.getContext()));
         }
 
diff --git a/src/com/android/settings/overlay/FeatureFactory.kt b/src/com/android/settings/overlay/FeatureFactory.kt
index 675d789..84b82cb 100644
--- a/src/com/android/settings/overlay/FeatureFactory.kt
+++ b/src/com/android/settings/overlay/FeatureFactory.kt
@@ -22,7 +22,6 @@
 import com.android.settings.applications.ApplicationFeatureProvider
 import com.android.settings.biometrics.face.FaceFeatureProvider
 import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
-import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider
 import com.android.settings.bluetooth.BluetoothFeatureProvider
 import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider
 import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
@@ -119,11 +118,6 @@
     abstract val fingerprintFeatureProvider: FingerprintFeatureProvider
 
     /**
-     * Gets implementation for Biometrics repository provider.
-     */
-    abstract val biometricsRepositoryProvider: BiometricsRepositoryProvider
-
-    /**
      * Gets implementation for the WifiTrackerLib.
      */
     abstract val wifiTrackerLibProvider: WifiTrackerLibProvider
diff --git a/src/com/android/settings/overlay/FeatureFactoryImpl.kt b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
index 2142ea5..a21d7e3 100644
--- a/src/com/android/settings/overlay/FeatureFactoryImpl.kt
+++ b/src/com/android/settings/overlay/FeatureFactoryImpl.kt
@@ -31,7 +31,6 @@
 import com.android.settings.biometrics.face.FaceFeatureProviderImpl
 import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
 import com.android.settings.biometrics.fingerprint.FingerprintFeatureProviderImpl
-import com.android.settings.biometrics2.factory.BiometricsRepositoryProviderImpl
 import com.android.settings.bluetooth.BluetoothFeatureProvider
 import com.android.settings.bluetooth.BluetoothFeatureProviderImpl
 import com.android.settings.connecteddevice.dock.DockUpdaterFeatureProviderImpl
@@ -152,8 +151,6 @@
         FingerprintFeatureProviderImpl()
     }
 
-    override val biometricsRepositoryProvider by lazy { BiometricsRepositoryProviderImpl() }
-
     override val wifiTrackerLibProvider: WifiTrackerLibProvider by lazy {
         WifiTrackerLibProviderImpl()
     }
diff --git a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
index 1213b0d..42a74dd 100644
--- a/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
+++ b/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragment.java
@@ -44,6 +44,7 @@
 import com.android.internal.app.chooser.DisplayResolveInfo;
 import com.android.internal.app.chooser.TargetInfo;
 import com.android.settings.R;
+import com.android.settings.flags.Flags;
 import com.android.settingslib.qrcode.QrCodeGenerator;
 
 import com.google.zxing.WriterException;
@@ -69,6 +70,10 @@
 
     @Override
     public int getMetricsCategory() {
+        if (Flags.enableWifiSharingRuntimeFragment()) {
+            return SettingsEnums.SETTINGS_WIFI_DPP_QR_SHARING;
+        }
+
         return SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR;
     }
 
diff --git a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java
index 9b92234..2d1f4c0 100644
--- a/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java
+++ b/tests/robotests/src/com/android/settings/bluetooth/BluetoothDetailsProfilesControllerTest.java
@@ -90,6 +90,9 @@
     @Mock
     private CachedBluetoothDeviceManager mCachedBluetoothDeviceManager;
 
+    private @Mock A2dpProfile mA2dpProfile;
+    private @Mock LeAudioProfile mLeAudioProfile;
+
     @Override
     public void setUp() {
         super.setUp();
@@ -103,11 +106,13 @@
         mConnectableProfiles = new ArrayList<>();
         when(mLocalManager.getProfileManager()).thenReturn(mProfileManager);
         when(mLocalManager.getCachedDeviceManager()).thenReturn(mCachedBluetoothDeviceManager);
+        setUpMockProfiles();
         when(mCachedBluetoothDeviceManager.getCachedDevicesCopy())
                 .thenReturn(ImmutableList.of(mCachedDevice));
-        when(mCachedDevice.getConnectableProfiles()).thenAnswer(invocation ->
-            new ArrayList<>(mConnectableProfiles)
-        );
+        when(mCachedDevice.getConnectableProfiles())
+                .thenAnswer(invocation -> new ArrayList<>(mConnectableProfiles));
+        when(mCachedDevice.getProfiles())
+                .thenAnswer(invocation -> ImmutableList.of(mConnectableProfiles));
 
         setupDevice(mDeviceConfig);
         mController = new BluetoothDetailsProfilesController(mContext, mFragment, mLocalManager,
@@ -389,21 +394,36 @@
         assertThat(mDevice.getMessageAccessPermission()).isEqualTo(BluetoothDevice.ACCESS_ALLOWED);
     }
 
-    private A2dpProfile addMockA2dpProfile(boolean preferred, boolean supportsHighQualityAudio,
-            boolean highQualityAudioEnabled) {
-        A2dpProfile profile = mock(A2dpProfile.class);
-        when(mProfileManager.getProfileByName(eq(profile.toString()))).thenReturn(profile);
-        when(profile.getNameResource(mDevice))
+    private void setUpMockProfiles() {
+        when(mA2dpProfile.toString()).thenReturn("A2DP");
+        when(mProfileManager.getProfileByName(eq(mA2dpProfile.toString())))
+                .thenReturn(mA2dpProfile);
+        when(mA2dpProfile.getNameResource(any()))
                 .thenReturn(com.android.settingslib.R.string.bluetooth_profile_a2dp);
-        when(profile.getHighQualityAudioOptionLabel(mDevice)).thenReturn(
+        when(mA2dpProfile.getHighQualityAudioOptionLabel(any())).thenReturn(
                 mContext.getString(com.android.settingslib.R
                         .string.bluetooth_profile_a2dp_high_quality_unknown_codec));
-        when(profile.supportsHighQualityAudio(mDevice)).thenReturn(supportsHighQualityAudio);
-        when(profile.isHighQualityAudioEnabled(mDevice)).thenReturn(highQualityAudioEnabled);
-        when(profile.isEnabled(mDevice)).thenReturn(preferred);
-        when(profile.isProfileReady()).thenReturn(true);
-        mConnectableProfiles.add(profile);
-        return profile;
+        when(mA2dpProfile.isProfileReady()).thenReturn(true);
+        when(mProfileManager.getA2dpProfile()).thenReturn(mA2dpProfile);
+
+        when(mLeAudioProfile.toString()).thenReturn("LE_AUDIO");
+        when(mLeAudioProfile.getNameResource(any()))
+                .thenReturn(com.android.settingslib.R.string.bluetooth_profile_le_audio);
+        when(mLeAudioProfile.isProfileReady()).thenReturn(true);
+        when(mProfileManager.getLeAudioProfile()).thenReturn(mLeAudioProfile);
+    }
+
+    private void addA2dpProfileToDevice(boolean preferred, boolean supportsHighQualityAudio,
+            boolean highQualityAudioEnabled) {
+        when(mA2dpProfile.supportsHighQualityAudio(any())).thenReturn(supportsHighQualityAudio);
+        when(mA2dpProfile.isHighQualityAudioEnabled(any())).thenReturn(highQualityAudioEnabled);
+        when(mA2dpProfile.isEnabled(any())).thenReturn(preferred);
+        mConnectableProfiles.add(mA2dpProfile);
+    }
+
+    private void addLeAudioProfileToDevice(boolean enabled) {
+        when(mLeAudioProfile.isEnabled(any())).thenReturn(enabled);
+        mConnectableProfiles.add(mLeAudioProfile);
     }
 
     private SwitchPreferenceCompat getHighQualityAudioPref() {
@@ -414,7 +434,7 @@
     @Test
     public void highQualityAudio_prefIsPresentWhenSupported() {
         setupDevice(makeDefaultDeviceConfig());
-        addMockA2dpProfile(true, true, true);
+        addA2dpProfileToDevice(true, true, true);
         showScreen(mController);
         SwitchPreferenceCompat pref = getHighQualityAudioPref();
         assertThat(pref.getKey()).isEqualTo(
@@ -431,7 +451,7 @@
     @Test
     public void highQualityAudio_prefIsAbsentWhenNotSupported() {
         setupDevice(makeDefaultDeviceConfig());
-        addMockA2dpProfile(true, false, false);
+        addA2dpProfileToDevice(true, false, false);
         showScreen(mController);
         assertThat(mProfiles.getPreferenceCount()).isEqualTo(2);
         SwitchPreferenceCompat pref = (SwitchPreferenceCompat) mProfiles.getPreference(0);
@@ -444,7 +464,7 @@
     @Test
     public void highQualityAudio_busyDeviceDisablesSwitch() {
         setupDevice(makeDefaultDeviceConfig());
-        addMockA2dpProfile(true, true, true);
+        addA2dpProfileToDevice(true, true, true);
         when(mCachedDevice.isBusy()).thenReturn(true);
         showScreen(mController);
         SwitchPreferenceCompat pref = getHighQualityAudioPref();
@@ -454,17 +474,17 @@
     @Test
     public void highQualityAudio_mediaAudioDisabledAndReEnabled() {
         setupDevice(makeDefaultDeviceConfig());
-        A2dpProfile audioProfile = addMockA2dpProfile(true, true, true);
+        addA2dpProfileToDevice(true, true, true);
         showScreen(mController);
         assertThat(mProfiles.getPreferenceCount()).isEqualTo(3);
 
         // Disabling media audio should cause the high quality audio switch to disappear, but not
         // the regular audio one.
         SwitchPreferenceCompat audioPref =
-                (SwitchPreferenceCompat) mScreen.findPreference(audioProfile.toString());
+                (SwitchPreferenceCompat) mScreen.findPreference(mA2dpProfile.toString());
         audioPref.performClick();
-        verify(audioProfile).setEnabled(mDevice, false);
-        when(audioProfile.isEnabled(mDevice)).thenReturn(false);
+        verify(mA2dpProfile).setEnabled(mDevice, false);
+        when(mA2dpProfile.isEnabled(mDevice)).thenReturn(false);
         mController.onDeviceAttributesChanged();
         assertThat(audioPref.isVisible()).isTrue();
         SwitchPreferenceCompat highQualityAudioPref = getHighQualityAudioPref();
@@ -472,8 +492,8 @@
 
         // And re-enabling media audio should make high quality switch to reappear.
         audioPref.performClick();
-        verify(audioProfile).setEnabled(mDevice, true);
-        when(audioProfile.isEnabled(mDevice)).thenReturn(true);
+        verify(mA2dpProfile).setEnabled(mDevice, true);
+        when(mA2dpProfile.isEnabled(mDevice)).thenReturn(true);
         mController.onDeviceAttributesChanged();
         highQualityAudioPref = getHighQualityAudioPref();
         assertThat(highQualityAudioPref.isVisible()).isTrue();
@@ -482,9 +502,9 @@
     @Test
     public void highQualityAudio_mediaAudioStartsDisabled() {
         setupDevice(makeDefaultDeviceConfig());
-        A2dpProfile audioProfile = addMockA2dpProfile(false, true, true);
+        addA2dpProfileToDevice(false, true, true);
         showScreen(mController);
-        SwitchPreferenceCompat audioPref = mScreen.findPreference(audioProfile.toString());
+        SwitchPreferenceCompat audioPref = mScreen.findPreference(mA2dpProfile.toString());
         SwitchPreferenceCompat highQualityAudioPref = getHighQualityAudioPref();
         assertThat(audioPref).isNotNull();
         assertThat(audioPref.isChecked()).isFalse();
@@ -522,15 +542,9 @@
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_BLUETOOTH_PROFILE_TOGGLE_VISIBILITY_CHECKER);
         setupDevice(makeDefaultDeviceConfig());
 
-        LeAudioProfile leAudioProfile = mock(LeAudioProfile.class);
-        when(leAudioProfile.getNameResource(mDevice))
-                .thenReturn(com.android.settingslib.R.string.bluetooth_profile_le_audio);
-        when(leAudioProfile.isProfileReady()).thenReturn(true);
-        when(leAudioProfile.toString()).thenReturn("LE_AUDIO");
-        when(mProfileManager.getLeAudioProfile()).thenReturn(leAudioProfile);
+        addA2dpProfileToDevice(true, true, true);
         when(mFeatureProvider.getInvisibleProfilePreferenceKeys(any(), any()))
-                .thenReturn(ImmutableSet.of("LE_AUDIO"));
-        mConnectableProfiles.add(leAudioProfile);
+                .thenReturn(ImmutableSet.of("A2DP"));
 
         showScreen(mController);
 
@@ -543,15 +557,9 @@
         mSetFlagsRule.enableFlags(Flags.FLAG_ENABLE_BLUETOOTH_PROFILE_TOGGLE_VISIBILITY_CHECKER);
         setupDevice(makeDefaultDeviceConfig());
 
-        LeAudioProfile leAudioProfile = mock(LeAudioProfile.class);
-        when(leAudioProfile.getNameResource(mDevice))
-                .thenReturn(com.android.settingslib.R.string.bluetooth_profile_le_audio);
-        when(leAudioProfile.isProfileReady()).thenReturn(true);
-        when(leAudioProfile.toString()).thenReturn("LE_AUDIO");
-        when(mProfileManager.getLeAudioProfile()).thenReturn(leAudioProfile);
+        addA2dpProfileToDevice(true, true, true);
         when(mFeatureProvider.getInvisibleProfilePreferenceKeys(any(), any()))
-                .thenReturn(ImmutableSet.of("A2DP"));
-        mConnectableProfiles.add(leAudioProfile);
+                .thenReturn(ImmutableSet.of("LE_AUDIO"));
 
         showScreen(mController);
 
@@ -563,19 +571,8 @@
     public void classicAudioDeviceWithLeAudio_showLeAudioToggle() {
         mSetFlagsRule.enableFlags(Flags.FLAG_HIDE_LE_AUDIO_TOGGLE_FOR_LE_AUDIO_ONLY_DEVICE);
         setupDevice(makeDefaultDeviceConfig());
-
-        LeAudioProfile leAudioProfile = mock(LeAudioProfile.class);
-        when(leAudioProfile.getNameResource(mDevice))
-                .thenReturn(com.android.settingslib.R.string.bluetooth_profile_le_audio);
-        when(leAudioProfile.isProfileReady()).thenReturn(true);
-        when(leAudioProfile.toString()).thenReturn("LE_AUDIO");
-        when(mProfileManager.getLeAudioProfile()).thenReturn(leAudioProfile);
-        mConnectableProfiles.add(leAudioProfile);
-        when(mCachedDevice.getProfiles())
-                .thenAnswer(
-                        invocation ->
-                                ImmutableList.of(
-                                        leAudioProfile, addMockA2dpProfile(false, false, false)));
+        addLeAudioProfileToDevice(false);
+        addA2dpProfileToDevice(false, false, false);
 
         showScreen(mController);
 
@@ -587,16 +584,7 @@
     public void leAudioOnlyDevice_hideLeAudioToggle() {
         mSetFlagsRule.enableFlags(Flags.FLAG_HIDE_LE_AUDIO_TOGGLE_FOR_LE_AUDIO_ONLY_DEVICE);
         setupDevice(makeDefaultDeviceConfig());
-
-        LeAudioProfile leAudioProfile = mock(LeAudioProfile.class);
-        when(leAudioProfile.getNameResource(mDevice))
-                .thenReturn(com.android.settingslib.R.string.bluetooth_profile_le_audio);
-        when(leAudioProfile.isProfileReady()).thenReturn(true);
-        when(leAudioProfile.toString()).thenReturn("LE_AUDIO");
-        when(mProfileManager.getLeAudioProfile()).thenReturn(leAudioProfile);
-        mConnectableProfiles.add(leAudioProfile);
-        when(mCachedDevice.getProfiles())
-                .thenAnswer(invocation -> ImmutableList.of(leAudioProfile));
+        addLeAudioProfileToDevice(false);
 
         showScreen(mController);
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ConfigurationActivityHelperTest.java b/tests/robotests/src/com/android/settings/notification/modes/ConfigurationActivityHelperTest.java
index 1c72e87..47291a0 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ConfigurationActivityHelperTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ConfigurationActivityHelperTest.java
@@ -34,6 +34,7 @@
 import android.os.Bundle;
 import android.service.notification.ConditionProviderService;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 
 import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java
index ff25322..61d3192 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/InterruptionFilterPreferenceControllerTest.java
@@ -33,6 +33,7 @@
 
 import androidx.preference.TwoStatePreference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java
index 0a600c0..29fdfdd 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ManualDurationPreferenceControllerTest.java
@@ -30,6 +30,7 @@
 import androidx.fragment.app.Fragment;
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/TestModeBuilder.java b/tests/robotests/src/com/android/settings/notification/modes/TestModeBuilder.java
deleted file mode 100644
index 0b6a732..0000000
--- a/tests/robotests/src/com/android/settings/notification/modes/TestModeBuilder.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/*
- * Copyright (C) 2024 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.notification.modes;
-
-import android.app.AutomaticZenRule;
-import android.app.NotificationManager;
-import android.content.ComponentName;
-import android.net.Uri;
-import android.service.notification.Condition;
-import android.service.notification.ZenDeviceEffects;
-import android.service.notification.ZenModeConfig;
-import android.service.notification.ZenPolicy;
-
-import androidx.annotation.DrawableRes;
-import androidx.annotation.Nullable;
-
-import com.android.settingslib.notification.modes.ZenMode;
-
-import java.util.Random;
-
-class TestModeBuilder {
-
-    private String mId;
-    private AutomaticZenRule mRule;
-    private ZenModeConfig.ZenRule mConfigZenRule;
-
-    public static final ZenMode EXAMPLE = new TestModeBuilder().build();
-
-    TestModeBuilder() {
-        // Reasonable defaults
-        int id = new Random().nextInt(1000);
-        mId = "rule_" + id;
-        mRule = new AutomaticZenRule.Builder("Test Rule #" + id, Uri.parse("rule://" + id))
-                .setPackage("some_package")
-                .setInterruptionFilter(NotificationManager.INTERRUPTION_FILTER_PRIORITY)
-                .setZenPolicy(new ZenPolicy.Builder().disallowAllSounds().build())
-                .build();
-        mConfigZenRule = new ZenModeConfig.ZenRule();
-        mConfigZenRule.enabled = true;
-        mConfigZenRule.pkg = "some_package";
-    }
-
-    TestModeBuilder(ZenMode previous) {
-        mId = previous.getId();
-        mRule = previous.getRule();
-
-        mConfigZenRule = new ZenModeConfig.ZenRule();
-        mConfigZenRule.enabled = previous.getRule().isEnabled();
-        mConfigZenRule.pkg = previous.getRule().getPackageName();
-        setActive(previous.isActive());
-    }
-
-    TestModeBuilder setId(String id) {
-        mId = id;
-        return this;
-    }
-
-    TestModeBuilder setAzr(AutomaticZenRule rule) {
-        mRule = rule;
-        mConfigZenRule.pkg = rule.getPackageName();
-        mConfigZenRule.conditionId = rule.getConditionId();
-        mConfigZenRule.enabled = rule.isEnabled();
-        return this;
-    }
-
-    TestModeBuilder setConfigZenRule(ZenModeConfig.ZenRule configZenRule) {
-        mConfigZenRule = configZenRule;
-        return this;
-    }
-
-    TestModeBuilder setName(String name) {
-        mRule.setName(name);
-        mConfigZenRule.name = name;
-        return this;
-    }
-
-    TestModeBuilder setPackage(String pkg) {
-        mRule.setPackageName(pkg);
-        mConfigZenRule.pkg = pkg;
-        return this;
-    }
-
-    TestModeBuilder setOwner(ComponentName owner) {
-        mRule.setOwner(owner);
-        mConfigZenRule.component = owner;
-        return this;
-    }
-
-    TestModeBuilder setConfigurationActivity(ComponentName configActivity) {
-        mRule.setConfigurationActivity(configActivity);
-        mConfigZenRule.configurationActivity = configActivity;
-        return this;
-    }
-
-    TestModeBuilder setConditionId(Uri conditionId) {
-        mRule.setConditionId(conditionId);
-        mConfigZenRule.conditionId = conditionId;
-        return this;
-    }
-
-    TestModeBuilder setType(@AutomaticZenRule.Type int type) {
-        mRule.setType(type);
-        mConfigZenRule.type = type;
-        return this;
-    }
-
-    TestModeBuilder setInterruptionFilter(
-            @NotificationManager.InterruptionFilter int interruptionFilter) {
-        mRule.setInterruptionFilter(interruptionFilter);
-        mConfigZenRule.zenMode = NotificationManager.zenModeFromInterruptionFilter(
-                interruptionFilter, NotificationManager.INTERRUPTION_FILTER_PRIORITY);
-        return this;
-    }
-
-    TestModeBuilder setZenPolicy(@Nullable ZenPolicy policy) {
-        mRule.setZenPolicy(policy);
-        mConfigZenRule.zenPolicy = policy;
-        return this;
-    }
-
-    TestModeBuilder setDeviceEffects(@Nullable ZenDeviceEffects deviceEffects) {
-        mRule.setDeviceEffects(deviceEffects);
-        mConfigZenRule.zenDeviceEffects = deviceEffects;
-        return this;
-    }
-
-    TestModeBuilder setEnabled(boolean enabled) {
-        mRule.setEnabled(enabled);
-        mConfigZenRule.enabled = enabled;
-        return this;
-    }
-
-    TestModeBuilder setManualInvocationAllowed(boolean allowed) {
-        mRule.setManualInvocationAllowed(allowed);
-        mConfigZenRule.allowManualInvocation = allowed;
-        return this;
-    }
-
-    TestModeBuilder setTriggerDescription(@Nullable String triggerDescription) {
-        mRule.setTriggerDescription(triggerDescription);
-        mConfigZenRule.triggerDescription = triggerDescription;
-        return this;
-    }
-
-    TestModeBuilder setIconResId(@DrawableRes int iconResId) {
-        mRule.setIconResId(iconResId);
-        return this;
-    }
-
-    TestModeBuilder setActive(boolean active) {
-        if (active) {
-            mConfigZenRule.enabled = true;
-            mConfigZenRule.condition = new Condition(mRule.getConditionId(), "...",
-                    Condition.STATE_TRUE);
-        } else {
-            mConfigZenRule.condition = null;
-        }
-        return this;
-    }
-
-    ZenMode build() {
-        return new ZenMode(mId, mRule, mConfigZenRule);
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
index f850b1e..1faba30 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsLinkPreferenceControllerTest.java
@@ -42,6 +42,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settingslib.applications.ApplicationsState;
 import com.android.settingslib.core.instrumentation.MetricsFeatureProvider;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsPreferenceControllerTest.java
index c96dbb6..1140238 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeAppsPreferenceControllerTest.java
@@ -37,6 +37,7 @@
 import androidx.preference.PreferenceScreen;
 import androidx.preference.TwoStatePreference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java
index 5869c6b..368b923 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeButtonPreferenceControllerTest.java
@@ -35,6 +35,7 @@
 
 import androidx.fragment.app.Fragment;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.widget.LayoutPreference;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeCallsLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeCallsLinkPreferenceControllerTest.java
index e50d294..862cf77 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeCallsLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeCallsLinkPreferenceControllerTest.java
@@ -27,6 +27,8 @@
 
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayEffectPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayEffectPreferenceControllerTest.java
index a735cd9..f2c6006 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayEffectPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayEffectPreferenceControllerTest.java
@@ -29,6 +29,7 @@
 
 import androidx.preference.TwoStatePreference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayLinkPreferenceControllerTest.java
index 3ccfb9f..6c3d74f 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeDisplayLinkPreferenceControllerTest.java
@@ -27,6 +27,7 @@
 
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
 import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditDonePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditDonePreferenceControllerTest.java
index a7163fe..b15d4d6 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditDonePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditDonePreferenceControllerTest.java
@@ -28,6 +28,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.widget.LayoutPreference;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentTest.java
index b476b00..2441803 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNameIconFragmentTest.java
@@ -34,6 +34,7 @@
 import androidx.lifecycle.Lifecycle;
 
 import com.android.internal.R;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNamePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNamePreferenceControllerTest.java
index 0c3f4e0..b54727c 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNamePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeEditNamePreferenceControllerTest.java
@@ -28,6 +28,7 @@
 import androidx.preference.PreferenceScreen;
 
 import com.android.settings.R;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.widget.LayoutPreference;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeExitAtAlarmPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeExitAtAlarmPreferenceControllerTest.java
index 03c75fb..4c8db07 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeExitAtAlarmPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeExitAtAlarmPreferenceControllerTest.java
@@ -27,6 +27,7 @@
 import androidx.preference.TwoStatePreference;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeIconPickerListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeIconPickerListPreferenceControllerTest.java
index 4d30ce9..1904734 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeIconPickerListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeIconPickerListPreferenceControllerTest.java
@@ -32,6 +32,7 @@
 import androidx.recyclerview.widget.RecyclerView;
 
 import com.android.settings.R;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.widget.LayoutPreference;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeMessagesLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeMessagesLinkPreferenceControllerTest.java
index dda58ae..100ff43 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeMessagesLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeMessagesLinkPreferenceControllerTest.java
@@ -27,6 +27,8 @@
 
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeNewCustomFragmentTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeNewCustomFragmentTest.java
index b18ce21..dd2b49b 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeNewCustomFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeNewCustomFragmentTest.java
@@ -39,6 +39,7 @@
 import androidx.test.ext.junit.rules.ActivityScenarioRule;
 
 import com.android.internal.R;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisLinkPreferenceControllerTest.java
index bfa99a0..554fc6e 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisLinkPreferenceControllerTest.java
@@ -27,6 +27,8 @@
 
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisPreferenceControllerTest.java
index b23d946..0820846 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeNotifVisPreferenceControllerTest.java
@@ -40,6 +40,7 @@
 
 import androidx.preference.TwoStatePreference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherLinkPreferenceControllerTest.java
index 39ba9e8..772bd1d 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherLinkPreferenceControllerTest.java
@@ -27,6 +27,8 @@
 
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherPreferenceControllerTest.java
index c69a8a0..8272773 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeOtherPreferenceControllerTest.java
@@ -32,6 +32,7 @@
 
 import androidx.preference.TwoStatePreference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceControllerTest.java
index 9d9dd98..dd97d6e 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModePeopleLinkPreferenceControllerTest.java
@@ -27,6 +27,8 @@
 
 import androidx.preference.Preference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
+
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java
index 04df27e..944d432 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModePrioritySendersPreferenceControllerTest.java
@@ -51,6 +51,7 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.widget.SelectorWithWidgetPreference;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeRepeatCallersPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeRepeatCallersPreferenceControllerTest.java
index c1b99e5..c453403 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeRepeatCallersPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeRepeatCallersPreferenceControllerTest.java
@@ -34,6 +34,7 @@
 
 import androidx.preference.TwoStatePreference;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetCalendarPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetCalendarPreferenceControllerTest.java
index cc6a497..42aa498 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetCalendarPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetCalendarPreferenceControllerTest.java
@@ -39,6 +39,7 @@
 import androidx.preference.PreferenceCategory;
 import androidx.test.core.app.ApplicationProvider;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java
index 7dbc802..d5c7f61 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetSchedulePreferenceControllerTest.java
@@ -36,6 +36,7 @@
 import androidx.test.core.app.ApplicationProvider;
 
 import com.android.settings.R;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java
index ffd239b..fc3cef1 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModeSetTriggerLinkPreferenceControllerTest.java
@@ -49,6 +49,7 @@
 import com.android.settings.SettingsActivity;
 import com.android.settings.dashboard.DashboardFragment;
 import com.android.settingslib.PrimarySwitchPreference;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListFragmentTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListFragmentTest.java
index 4703b8e..e105641 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListFragmentTest.java
@@ -37,6 +37,7 @@
 import androidx.test.ext.junit.rules.ActivityScenarioRule;
 
 import com.android.settings.notification.modes.ZenModesListAddModePreferenceController.ModeType;
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java
index aaf7059..dafcee7 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListItemPreferenceTest.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.service.notification.ZenModeConfig;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 
 import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
index c0f96be..4c16f26 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesListPreferenceControllerTest.java
@@ -37,6 +37,7 @@
 import androidx.preference.PreferenceManager;
 import androidx.preference.PreferenceScreen;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 import com.android.settingslib.notification.modes.ZenModesBackend;
 import com.android.settingslib.search.SearchIndexableRaw;
diff --git a/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java b/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
index 308650f..e847fb7 100644
--- a/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
+++ b/tests/robotests/src/com/android/settings/notification/modes/ZenModesSummaryHelperTest.java
@@ -39,6 +39,7 @@
 import android.service.notification.ZenModeConfig;
 import android.service.notification.ZenPolicy;
 
+import com.android.settingslib.notification.modes.TestModeBuilder;
 import com.android.settingslib.notification.modes.ZenMode;
 
 import org.junit.Before;
diff --git a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java
index 13f575f..38b4b71 100644
--- a/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/dpp/WifiDppQrCodeGeneratorFragmentTest.java
@@ -26,6 +26,7 @@
 import static org.mockito.Mockito.spy;
 import static org.mockito.Mockito.when;
 
+import android.app.settings.SettingsEnums;
 import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
@@ -36,13 +37,19 @@
 import android.content.res.Resources;
 import android.graphics.drawable.Drawable;
 import android.os.Bundle;
+import android.platform.test.annotations.DisableFlags;
+import android.platform.test.annotations.EnableFlags;
+import android.platform.test.flag.junit.SetFlagsRule;
 
 import androidx.fragment.app.FragmentTransaction;
 import androidx.test.InstrumentationRegistry;
 import androidx.test.runner.AndroidJUnit4;
 
+import com.android.settings.flags.Flags;
+
 import org.junit.Before;
 import org.junit.Ignore;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.mockito.MockitoAnnotations;
@@ -55,6 +62,7 @@
     private WifiDppQrCodeGeneratorFragment mFragment;
     private Context mContext;
 
+    @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule();
 
     @Before
     public void setUp() {
@@ -163,4 +171,18 @@
         assertThat(mFragment.createNearbyButton(new Intent(), v -> {
         })).isNotNull();
     }
+
+    @Test
+    @EnableFlags(Flags.FLAG_ENABLE_WIFI_SHARING_RUNTIME_FRAGMENT)
+    public void getMetricsCatetory_shouldReturnDppQrSharing() {
+        assertThat(mFragment.getMetricsCategory())
+                .isEqualTo(SettingsEnums.SETTINGS_WIFI_DPP_QR_SHARING);
+    }
+
+    @Test
+    @DisableFlags(Flags.FLAG_ENABLE_WIFI_SHARING_RUNTIME_FRAGMENT)
+    public void getMetricsCatetory_shouldReturnDppConfigurator() {
+        assertThat(mFragment.getMetricsCategory())
+                .isEqualTo(SettingsEnums.SETTINGS_WIFI_DPP_CONFIGURATOR);
+    }
 }
diff --git a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
index e0f4b9e..2cb41bc 100644
--- a/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/robotests/testutils/com/android/settings/testutils/FakeFeatureFactory.java
@@ -25,7 +25,6 @@
 import com.android.settings.applications.ApplicationFeatureProvider;
 import com.android.settings.biometrics.face.FaceFeatureProvider;
 import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider;
-import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
 import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider;
 import com.android.settings.connecteddevice.stylus.StylusFeatureProvider;
@@ -83,7 +82,6 @@
     public final BluetoothFeatureProvider mBluetoothFeatureProvider;
     public final FaceFeatureProvider mFaceFeatureProvider;
     public final FingerprintFeatureProvider mFingerprintFeatureProvider;
-    public final BiometricsRepositoryProvider mBiometricsRepositoryProvider;
 
     public PanelFeatureProvider panelFeatureProvider;
     public SlicesFeatureProvider slicesFeatureProvider;
@@ -139,7 +137,6 @@
         mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
         mFaceFeatureProvider = mock(FaceFeatureProvider.class);
         mFingerprintFeatureProvider = mock(FingerprintFeatureProvider.class);
-        mBiometricsRepositoryProvider = mock(BiometricsRepositoryProvider.class);
         wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
         securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
         mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
@@ -272,11 +269,6 @@
     }
 
     @Override
-    public BiometricsRepositoryProvider getBiometricsRepositoryProvider() {
-        return mBiometricsRepositoryProvider;
-    }
-
-    @Override
     public WifiTrackerLibProvider getWifiTrackerLibProvider() {
         return wifiTrackerLibProvider;
     }
diff --git a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
index 5ca24a3..dc15f0b 100644
--- a/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
+++ b/tests/spa_unit/src/com/android/settings/testutils/FakeFeatureFactory.kt
@@ -23,7 +23,6 @@
 import com.android.settings.applications.ApplicationFeatureProvider
 import com.android.settings.biometrics.face.FaceFeatureProvider
 import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider
-import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider
 import com.android.settings.bluetooth.BluetoothFeatureProvider
 import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider
 import com.android.settings.connecteddevice.stylus.StylusFeatureProvider
@@ -126,8 +125,6 @@
         get() = TODO("Not yet implemented")
     override val fingerprintFeatureProvider: FingerprintFeatureProvider
         get() = TODO("Not yet implemented")
-    override val biometricsRepositoryProvider: BiometricsRepositoryProvider
-        get() = TODO("Not yet implemented")
     override val wifiTrackerLibProvider: WifiTrackerLibProvider
         get() = TODO("Not yet implemented")
     override val securitySettingsFeatureProvider: SecuritySettingsFeatureProvider
diff --git a/tests/unit/src/com/android/settings/biometrics2/OWNERS b/tests/unit/src/com/android/settings/biometrics2/OWNERS
deleted file mode 100644
index a257ed8..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/OWNERS
+++ /dev/null
@@ -1 +0,0 @@
-include /src/com/android/settings/biometrics/OWNERS
diff --git a/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java b/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java
deleted file mode 100644
index 8989595..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/repository/FingerprintRepositoryTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.repository;
-
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_HOME_BUTTON;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_REAR;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UNKNOWN;
-
-import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository;
-import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;
-import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupSuwMaxFingerprintsEnrollable;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.hardware.biometrics.SensorProperties;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-import java.util.ArrayList;
-
-@RunWith(AndroidJUnit4.class)
-public class FingerprintRepositoryTest {
-
-    @Rule public final MockitoRule mockito = MockitoJUnit.rule();
-
-    @Mock private Resources mResources;
-    @Mock private FingerprintManager mFingerprintManager;
-
-    private Context mContext;
-
-    @Before
-    public void setUp() {
-        mContext = ApplicationProvider.getApplicationContext();
-    }
-
-    @Test
-    public void testCanAssumeSensorType_forUnknownSensor() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UNKNOWN, 1);
-        assertThat(repository.canAssumeUdfps()).isFalse();
-        assertThat(repository.canAssumeSfps()).isFalse();
-    }
-
-    @Test
-    public void testCanAssumeSensorType_forRearSensor() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_REAR, 1);
-        assertThat(repository.canAssumeUdfps()).isFalse();
-        assertThat(repository.canAssumeSfps()).isFalse();
-    }
-
-    @Test
-    public void testCanAssumeSensorType_forUdfpsUltrasonicSensor() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UDFPS_ULTRASONIC, 1);
-        assertThat(repository.canAssumeUdfps()).isTrue();
-        assertThat(repository.canAssumeSfps()).isFalse();
-    }
-
-    @Test
-    public void testCanAssumeSensorType_forUdfpsOpticalSensor() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UDFPS_OPTICAL, 1);
-        assertThat(repository.canAssumeUdfps()).isTrue();
-        assertThat(repository.canAssumeSfps()).isFalse();
-    }
-
-    @Test
-    public void testCanAssumeSensorType_forPowerButtonSensor() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_POWER_BUTTON, 1);
-        assertThat(repository.canAssumeUdfps()).isFalse();
-        assertThat(repository.canAssumeSfps()).isTrue();
-    }
-
-    @Test
-    public void testCanAssumeSensorType_forHomeButtonSensor() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_HOME_BUTTON, 1);
-        assertThat(repository.canAssumeUdfps()).isFalse();
-        assertThat(repository.canAssumeSfps()).isFalse();
-    }
-
-    @Test
-    public void testGetMaxFingerprints() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UNKNOWN, 999);
-        assertThat(repository.getMaxFingerprints()).isEqualTo(999);
-    }
-
-    @Test
-    public void testGetNumOfEnrolledFingerprintsSize() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UNKNOWN, 999);
-        setupFingerprintEnrolledFingerprints(mFingerprintManager, 10, 3);
-        setupFingerprintEnrolledFingerprints(mFingerprintManager, 22, 99);
-
-        assertThat(repository.getNumOfEnrolledFingerprintsSize(10)).isEqualTo(3);
-        assertThat(repository.getNumOfEnrolledFingerprintsSize(22)).isEqualTo(99);
-    }
-
-    @Test
-    public void testGetMaxFingerprintsInSuw() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UNKNOWN, 999);
-        setupSuwMaxFingerprintsEnrollable(mContext, mResources, 333);
-        assertThat(repository.getMaxFingerprintsInSuw(mResources))
-                .isEqualTo(333);
-
-        setupSuwMaxFingerprintsEnrollable(mContext, mResources, 20);
-        assertThat(repository.getMaxFingerprintsInSuw(mResources)).isEqualTo(20);
-    }
-
-    @Test
-    public void testGetFirstFingerprintSensorPropertiesInternal() {
-        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
-        final FingerprintSensorPropertiesInternal prop = new FingerprintSensorPropertiesInternal(
-                0 /* sensorId */,
-                SensorProperties.STRENGTH_STRONG,
-                5,
-                new ArrayList<>() /* componentInfo */,
-                TYPE_UDFPS_OPTICAL,
-                true /* resetLockoutRequiresHardwareAuthToken */);
-        props.add(prop);
-        doAnswer(invocation -> {
-            final IFingerprintAuthenticatorsRegisteredCallback callback =
-                    invocation.getArgument(0);
-            callback.onAllAuthenticatorsRegistered(props);
-            return null;
-        }).when(mFingerprintManager).addAuthenticatorsRegisteredCallback(any());
-
-        final FingerprintRepository repository = new FingerprintRepository(mFingerprintManager);
-        assertThat(repository.getFirstFingerprintSensorPropertiesInternal()).isEqualTo(prop);
-    }
-
-    @Test
-    public void testGetEnrollStageCount() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UNKNOWN, 999);
-
-        final int expectedValue = 24;
-        doReturn(expectedValue).when(mFingerprintManager).getEnrollStageCount();
-
-        assertThat(repository.getEnrollStageCount()).isEqualTo(expectedValue);
-    }
-
-    @Test
-    public void testGetEnrollStageThreshold() {
-        final FingerprintRepository repository = newFingerprintRepository(mFingerprintManager,
-                TYPE_UNKNOWN, 999);
-
-        final float expectedValue0 = 0.42f;
-        final float expectedValue1 = 0.24f;
-        final float expectedValue2 = 0.33f;
-        final float expectedValue3 = 0.90f;
-        doReturn(expectedValue0).when(mFingerprintManager).getEnrollStageThreshold(0);
-        doReturn(expectedValue1).when(mFingerprintManager).getEnrollStageThreshold(1);
-        doReturn(expectedValue2).when(mFingerprintManager).getEnrollStageThreshold(2);
-        doReturn(expectedValue3).when(mFingerprintManager).getEnrollStageThreshold(3);
-
-        assertThat(repository.getEnrollStageThreshold(2)).isEqualTo(expectedValue2);
-        assertThat(repository.getEnrollStageThreshold(1)).isEqualTo(expectedValue1);
-        assertThat(repository.getEnrollStageThreshold(3)).isEqualTo(expectedValue3);
-        assertThat(repository.getEnrollStageThreshold(0)).isEqualTo(expectedValue0);
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.kt
deleted file mode 100644
index ac62232..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/model/CredentialModelTest.kt
+++ /dev/null
@@ -1,136 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-import android.content.Intent
-import android.os.Bundle
-import android.os.SystemClock
-import android.os.UserHandle
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.password.ChooseLockSettingsHelper
-import com.google.common.truth.Truth
-import org.junit.Test
-import org.junit.runner.RunWith
-import java.util.Arrays
-
-@RunWith(AndroidJUnit4::class)
-class CredentialModelTest {
-
-    private val clock = SystemClock.elapsedRealtimeClock()
-
-    @Test
-    fun testNullBundle() {
-        val credentialModel = CredentialModel(null, clock)
-        Truth.assertThat(credentialModel.userId).isEqualTo(UserHandle.myUserId())
-    }
-
-    companion object {
-        @JvmStatic
-        fun newCredentialModelIntentExtras(
-            userId: Int, challenge: Long,
-            token: ByteArray?, gkPwHandle: Long
-        ): Bundle {
-            val bundle = Bundle()
-            bundle.putInt(Intent.EXTRA_USER_ID, userId)
-            bundle.putLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE, challenge)
-            bundle.putByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN, token)
-            bundle.putLong(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle)
-            return bundle
-        }
-
-        @JvmStatic
-        fun newValidTokenCredentialIntentExtras(userId: Int): Bundle {
-            return newCredentialModelIntentExtras(
-                userId, 1L, byteArrayOf(0, 1, 2),
-                CredentialModel.INVALID_GK_PW_HANDLE
-            )
-        }
-
-        @JvmStatic
-        fun newOnlySensorValidCredentialIntentExtras(userId: Int): Bundle {
-            return newCredentialModelIntentExtras(
-                userId, CredentialModel.INVALID_CHALLENGE, null,
-                CredentialModel.INVALID_GK_PW_HANDLE
-            )
-        }
-
-        @JvmStatic
-        fun newGkPwHandleCredentialIntentExtras(userId: Int, gkPwHandle: Long): Bundle {
-            return newCredentialModelIntentExtras(
-                userId,
-                CredentialModel.INVALID_CHALLENGE,
-                null,
-                gkPwHandle
-            )
-        }
-
-        private fun checkBundleLongValue(
-            bundle1: Bundle, bundle2: Bundle,
-            key: String
-        ) {
-            if (!bundle1.containsKey(key)) {
-                return
-            }
-            val value1 = bundle1.getInt(key)
-            val value2 = bundle2.getInt(key)
-            Truth.assertWithMessage(
-                "bundle not match, key:" + key + ", value1:" + value1 + ", value2:"
-                        + value2
-            ).that(value1).isEqualTo(value2)
-        }
-
-        private fun checkBundleIntValue(
-            bundle1: Bundle, bundle2: Bundle,
-            key: String
-        ) {
-            if (!bundle1.containsKey(key)) {
-                return
-            }
-            val value1 = bundle1.getLong(key)
-            val value2 = bundle2.getLong(key)
-            Truth.assertWithMessage(
-                "bundle not match, key:" + key + ", value1:" + value1 + ", value2:"
-                        + value2
-            ).that(value1).isEqualTo(value2)
-        }
-
-        private fun checkBundleByteArrayValue(
-            bundle1: Bundle, bundle2: Bundle,
-            key: String
-        ) {
-            if (!bundle1.containsKey(key)) {
-                return
-            }
-            val value1 = bundle1.getByteArray(key)
-            val value2 = bundle2.getByteArray(key)
-            val errMsg = ("bundle not match, key:" + key + ", value1:" + Arrays.toString(value1)
-                    + ", value2:" + Arrays.toString(value2))
-            if (value1 == null) {
-                Truth.assertWithMessage(errMsg).that(value2).isNull()
-            } else {
-                Truth.assertWithMessage(errMsg).that(value1.size).isEqualTo(
-                    value2!!.size
-                )
-                for (i in value1.indices) {
-                    Truth.assertWithMessage(errMsg).that(value1[i]).isEqualTo(
-                        value2[i]
-                    )
-                }
-            }
-        }
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/model/EnrollmentRequestTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/model/EnrollmentRequestTest.kt
deleted file mode 100644
index b301433..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/model/EnrollmentRequestTest.kt
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.model
-
-import android.content.Context
-import android.content.Intent
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.biometrics.BiometricEnrollActivity
-import com.google.android.setupcompat.util.WizardManagerHelper
-import com.google.common.truth.Truth
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-class EnrollmentRequestTest {
-
-    private val context = ApplicationProvider.getApplicationContext<Context>()
-
-    @Test
-    fun testIsSuw() {
-        // Default false
-        Truth.assertThat(EnrollmentRequest(Intent(), context, true).isSuw).isFalse()
-        Truth.assertThat(EnrollmentRequest(Intent(), context, false).isSuw).isFalse()
-        val trueIntent = Intent()
-        trueIntent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)
-        Truth.assertThat(EnrollmentRequest(trueIntent, context, true).isSuw).isTrue()
-        Truth.assertThat(EnrollmentRequest(trueIntent, context, false).isSuw).isFalse()
-        val falseIntent = Intent()
-        trueIntent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, false)
-        Truth.assertThat(EnrollmentRequest(falseIntent, context, true).isSuw).isFalse()
-        Truth.assertThat(EnrollmentRequest(falseIntent, context, false).isSuw).isFalse()
-    }
-
-    @Test
-    fun testIsAfterSuwOrSuwSuggestedAction() {
-        // Default false
-        Truth.assertThat(
-            EnrollmentRequest(Intent(), context, true)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        Truth.assertThat(
-            EnrollmentRequest(Intent(), context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        val deferredTrueIntent = Intent()
-        deferredTrueIntent.putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, true)
-        Truth.assertThat(
-            EnrollmentRequest(deferredTrueIntent, context, true)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isTrue()
-        Truth.assertThat(
-            EnrollmentRequest(deferredTrueIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        val deferredFalseIntent = Intent()
-        deferredFalseIntent.putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, false)
-        Truth.assertThat(
-            EnrollmentRequest(deferredFalseIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        Truth.assertThat(
-            EnrollmentRequest(deferredFalseIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        val portalTrueIntent = Intent()
-        portalTrueIntent.putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, true)
-        Truth.assertThat(
-            EnrollmentRequest(portalTrueIntent, context, true)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isTrue()
-        Truth.assertThat(
-            EnrollmentRequest(portalTrueIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        val portalFalseIntent = Intent()
-        portalFalseIntent.putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, false)
-        Truth.assertThat(
-            EnrollmentRequest(portalFalseIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        Truth.assertThat(
-            EnrollmentRequest(portalFalseIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        val suggestedTrueIntent = Intent()
-        suggestedTrueIntent.putExtra(WizardManagerHelper.EXTRA_IS_SUW_SUGGESTED_ACTION_FLOW, true)
-        Truth.assertThat(
-            EnrollmentRequest(suggestedTrueIntent, context, true)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isTrue()
-        Truth.assertThat(
-            EnrollmentRequest(suggestedTrueIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        val suggestedFalseIntent = Intent()
-        suggestedFalseIntent.putExtra(WizardManagerHelper.EXTRA_IS_SUW_SUGGESTED_ACTION_FLOW, false)
-        Truth.assertThat(
-            EnrollmentRequest(suggestedFalseIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-        Truth.assertThat(
-            EnrollmentRequest(suggestedFalseIntent, context, false)
-                .isAfterSuwOrSuwSuggestedAction
-        ).isFalse()
-    }
-
-    @Test
-    fun testGetSuwExtras_inSuw() {
-        val suwIntent = Intent()
-        suwIntent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)
-        val setupRequest = EnrollmentRequest(suwIntent, context, true)
-        val bundle = setupRequest.suwExtras
-        Truth.assertThat(bundle).isNotNull()
-        Truth.assertThat(bundle.size()).isAtLeast(1)
-        Truth.assertThat(bundle.getBoolean(WizardManagerHelper.EXTRA_IS_SETUP_FLOW)).isTrue()
-    }
-
-    @Test
-    fun testGetSuwExtras_notInSuw() {
-        val suwIntent = Intent()
-        suwIntent.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, true)
-        val setupRequest = EnrollmentRequest(suwIntent, context, false)
-        val bundle = setupRequest.suwExtras
-        Truth.assertThat(bundle).isNotNull()
-        Truth.assertThat(bundle.size()).isEqualTo(0)
-    }
-
-    @Test
-    fun testIsSkipIntro() {
-        // Default false
-        Truth.assertThat(EnrollmentRequest(Intent(), context, true).isSkipIntro).isFalse()
-        Truth.assertThat(EnrollmentRequest(Intent(), context, false).isSkipIntro).isFalse()
-        val trueIntent = Intent()
-        trueIntent.putExtra(BiometricEnrollActivity.EXTRA_SKIP_INTRO, true)
-        Truth.assertThat(EnrollmentRequest(trueIntent, context, true).isSkipIntro).isTrue()
-        Truth.assertThat(EnrollmentRequest(trueIntent, context, false).isSkipIntro).isTrue()
-        val falseIntent = Intent()
-        falseIntent.putExtra(BiometricEnrollActivity.EXTRA_SKIP_INTRO, false)
-        Truth.assertThat(EnrollmentRequest(falseIntent, context, false).isSkipIntro).isFalse()
-        Truth.assertThat(EnrollmentRequest(falseIntent, context, false).isSkipIntro).isFalse()
-    }
-
-    @Test
-    fun testIsSkipFindSensor() {
-        // Default false
-        Truth.assertThat(EnrollmentRequest(Intent(), context, true).isSkipFindSensor)
-            .isFalse()
-        Truth.assertThat(EnrollmentRequest(Intent(), context, false).isSkipFindSensor)
-            .isFalse()
-        val trueIntent = Intent()
-        trueIntent.putExtra(EnrollmentRequest.EXTRA_SKIP_FIND_SENSOR, true)
-        Truth.assertThat(EnrollmentRequest(trueIntent, context, true).isSkipFindSensor).isTrue()
-        Truth.assertThat(EnrollmentRequest(trueIntent, context, false).isSkipFindSensor).isTrue()
-        val falseIntent = Intent()
-        falseIntent.putExtra(EnrollmentRequest.EXTRA_SKIP_FIND_SENSOR, false)
-        Truth.assertThat(EnrollmentRequest(falseIntent, context, false).isSkipFindSensor)
-            .isFalse()
-        Truth.assertThat(EnrollmentRequest(falseIntent, context, false).isSkipFindSensor)
-            .isFalse()
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt
deleted file mode 100644
index e708f3b..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/AutoCredentialViewModelTest.kt
+++ /dev/null
@@ -1,519 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Activity
-import android.app.admin.DevicePolicyManager
-import android.content.Intent
-import android.os.Bundle
-import android.os.SystemClock
-import android.os.UserHandle
-import androidx.activity.result.ActivityResult
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.internal.widget.LockPatternUtils
-import com.android.internal.widget.VerifyCredentialResponse
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics2.ui.model.CredentialModel
-import com.android.settings.biometrics2.ui.model.CredentialModelTest.Companion.newGkPwHandleCredentialIntentExtras
-import com.android.settings.biometrics2.ui.model.CredentialModelTest.Companion.newOnlySensorValidCredentialIntentExtras
-import com.android.settings.biometrics2.ui.model.CredentialModelTest.Companion.newValidTokenCredentialIntentExtras
-import com.android.settings.biometrics2.ui.viewmodel.AutoCredentialViewModel.ChallengeGenerator
-import com.android.settings.password.ChooseLockPattern
-import com.android.settings.password.ChooseLockSettingsHelper
-import com.google.common.truth.Truth.assertThat
-import java.util.concurrent.atomic.AtomicBoolean
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-import org.mockito.Mockito.`when` as whenever
-
-@RunWith(AndroidJUnit4::class)
-class AutoCredentialViewModelTest {
-
-    @get:Rule val mockito: MockitoRule = MockitoJUnit.rule()
-
-    @Mock private lateinit var lockPatternUtils: LockPatternUtils
-
-    private var challengeGenerator: TestChallengeGenerator = TestChallengeGenerator()
-
-    private lateinit var viewModel: AutoCredentialViewModel
-    private fun newAutoCredentialViewModel(bundle: Bundle?): AutoCredentialViewModel {
-        return AutoCredentialViewModel(
-            ApplicationProvider.getApplicationContext(),
-            lockPatternUtils,
-            challengeGenerator,
-            CredentialModel(bundle, SystemClock.elapsedRealtimeClock())
-        )
-    }
-
-    @Before
-    fun setUp() {
-        challengeGenerator = TestChallengeGenerator()
-    }
-
-    private fun setupGenerateChallenge(userId: Int, newSensorId: Int, newChallenge: Long) {
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-        )
-        challengeGenerator.userId = userId
-        challengeGenerator.sensorId = newSensorId
-        challengeGenerator.challenge = newChallenge
-    }
-
-    @Test
-    fun testCheckCredential_validCredentialCase() = runTest {
-        val userId = 99
-        viewModel = newAutoCredentialViewModel(newValidTokenCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-        )
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run credential check
-        val action = viewModel.checkCredential(backgroundScope)
-        runCurrent()
-
-        // Check viewModel behavior
-        assertThat(action).isEqualTo(CredentialAction.CREDENTIAL_VALID)
-        assertThat(generateFails.size).isEqualTo(0)
-
-        // Check createGeneratingChallengeExtras()
-        assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
-    }
-
-    @Test
-    fun testCheckCredential_needToChooseLock() = runTest {
-        val userId = 100
-        viewModel = newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED
-        )
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run credential check
-        val action = viewModel.checkCredential(backgroundScope)
-        runCurrent()
-
-        // Check viewModel behavior
-        assertThat(action).isEqualTo(CredentialAction.FAIL_NEED_TO_CHOOSE_LOCK)
-        assertThat(generateFails.size).isEqualTo(0)
-
-        // Check createGeneratingChallengeExtras()
-        assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
-    }
-
-    @Test
-    fun testCheckCredential_needToConfirmLockForSomething() = runTest {
-        val userId = 101
-        viewModel =
-            newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-        )
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run credential check
-        val action = viewModel.checkCredential(backgroundScope)
-        runCurrent()
-
-        // Check viewModel behavior
-        assertThat(action).isEqualTo(CredentialAction.FAIL_NEED_TO_CONFIRM_LOCK)
-        assertThat(generateFails.size).isEqualTo(0)
-
-        // Check createGeneratingChallengeExtras()
-        assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
-    }
-
-    @Test
-    fun testCheckCredential_needToConfirmLockForNumeric() = runTest {
-        val userId = 102
-        viewModel =
-            newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_NUMERIC
-        )
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run credential check
-        val action = viewModel.checkCredential(backgroundScope)
-        runCurrent()
-
-        // Check viewModel behavior
-        assertThat(action).isEqualTo(CredentialAction.FAIL_NEED_TO_CONFIRM_LOCK)
-        assertThat(generateFails.size).isEqualTo(0)
-
-        // Check createGeneratingChallengeExtras()
-        assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
-    }
-
-    @Test
-    fun testCheckCredential_needToConfirmLockForAlphabetic() = runTest {
-        val userId = 103
-        viewModel =
-            newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_ALPHABETIC
-        )
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run credential check
-        val action = viewModel.checkCredential(this)
-        runCurrent()
-
-        // Check viewModel behavior
-        assertThat(action).isEqualTo(CredentialAction.FAIL_NEED_TO_CONFIRM_LOCK)
-        assertThat(generateFails.size).isEqualTo(0)
-
-        // Check createGeneratingChallengeExtras()
-        assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
-    }
-
-    @Test
-    fun testCheckCredential_generateChallenge() = runTest {
-        val userId = 104
-        val gkPwHandle = 1111L
-        viewModel =
-            newAutoCredentialViewModel(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-        )
-        val newSensorId = 10
-        val newChallenge = 20L
-        setupGenerateChallenge(userId, newSensorId, newChallenge)
-        whenever(
-            lockPatternUtils.verifyGatekeeperPasswordHandle(
-                gkPwHandle,
-                newChallenge,
-                userId
-            )
-        )
-            .thenReturn(newGoodCredential(gkPwHandle, byteArrayOf(1)))
-        val hasCalledRemoveGkPwHandle = AtomicBoolean()
-        Mockito.doAnswer {
-            hasCalledRemoveGkPwHandle.set(true)
-            null
-        }.`when`(lockPatternUtils).removeGatekeeperPasswordHandle(gkPwHandle)
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run credential check
-        val action = viewModel.checkCredential(backgroundScope)
-        runCurrent()
-
-        // Check viewModel behavior
-        assertThat(action).isEqualTo(CredentialAction.IS_GENERATING_CHALLENGE)
-        assertThat(generateFails.size).isEqualTo(0)
-
-        // Check data inside CredentialModel
-        assertThat(viewModel.token).isNotNull()
-        assertThat(challengeGenerator.callbackRunCount).isEqualTo(1)
-        assertThat(hasCalledRemoveGkPwHandle.get()).isFalse()
-
-        // Check createGeneratingChallengeExtras()
-        val generatingChallengeExtras = viewModel.createGeneratingChallengeExtras()
-        assertThat(generatingChallengeExtras).isNotNull()
-        assertThat(generatingChallengeExtras!!.getLong(BiometricEnrollBase.EXTRA_KEY_CHALLENGE))
-            .isEqualTo(newChallenge)
-        val tokens =
-            generatingChallengeExtras.getByteArray(ChooseLockSettingsHelper.EXTRA_KEY_CHALLENGE_TOKEN)
-        assertThat(tokens).isNotNull()
-        assertThat(tokens!!.size).isEqualTo(1)
-        assertThat(tokens[0]).isEqualTo(1)
-    }
-
-    @Test
-    fun testCheckCredential_generateChallengeFail() = runTest {
-        backgroundScope.launch {
-            val userId = 104
-            val gkPwHandle = 1111L
-            viewModel =
-                newAutoCredentialViewModel(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))
-            whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-                DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-            )
-            val newSensorId = 10
-            val newChallenge = 20L
-            setupGenerateChallenge(userId, newSensorId, newChallenge)
-            whenever(
-                lockPatternUtils.verifyGatekeeperPasswordHandle(
-                    gkPwHandle,
-                    newChallenge,
-                    userId
-                )
-            )
-                .thenReturn(newBadCredential(0))
-
-            val generateFails = listOfGenerateChallengeFailedFlow()
-
-            // Run credential check
-            val action = viewModel.checkCredential(this)
-            runCurrent()
-
-            assertThat(action).isEqualTo(CredentialAction.IS_GENERATING_CHALLENGE)
-            assertThat(generateFails.size).isEqualTo(1)
-            assertThat(generateFails[0]).isEqualTo(true)
-            assertThat(challengeGenerator.callbackRunCount).isEqualTo(1)
-
-            // Check createGeneratingChallengeExtras()
-            assertThat(viewModel.createGeneratingChallengeExtras()).isNull()
-        }
-    }
-
-    @Test
-    fun testGetUserId_fromIntent() {
-        val userId = 106
-        viewModel = newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-
-        // Get userId
-        assertThat(viewModel.userId).isEqualTo(userId)
-    }
-
-    @Test
-    fun testGenerateChallengeAsCredentialActivityResult_invalidChooseLock() = runTest {
-        backgroundScope.launch {
-            val userId = 107
-            val gkPwHandle = 3333L
-            viewModel =
-                newAutoCredentialViewModel(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))
-            val intent = Intent()
-            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle)
-
-            val generateFails = listOfGenerateChallengeFailedFlow()
-
-            // Run generateChallengeAsCredentialActivityResult()
-            val ret = viewModel.generateChallengeAsCredentialActivityResult(
-                true,
-                ActivityResult(ChooseLockPattern.RESULT_FINISHED + 1, intent),
-                backgroundScope
-            )
-            runCurrent()
-
-            assertThat(ret).isFalse()
-            assertThat(generateFails.size).isEqualTo(0)
-        }
-    }
-
-    @Test
-    fun testGenerateChallengeAsCredentialActivityResult_invalidConfirmLock() = runTest {
-        backgroundScope.launch {
-            val userId = 107
-            val gkPwHandle = 3333L
-            viewModel =
-                newAutoCredentialViewModel(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))
-            val intent = Intent()
-            intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle)
-
-            val generateFails = listOfGenerateChallengeFailedFlow()
-
-            // Run generateChallengeAsCredentialActivityResult()
-            val ret = viewModel.generateChallengeAsCredentialActivityResult(
-                false,
-                ActivityResult(Activity.RESULT_OK + 1, intent),
-                backgroundScope
-            )
-            runCurrent()
-
-            assertThat(ret).isFalse()
-            assertThat(generateFails.size).isEqualTo(0)
-        }
-    }
-
-    @Test
-    fun testGenerateChallengeAsCredentialActivityResult_nullDataChooseLock() = runTest {
-        val userId = 108
-        val gkPwHandle = 4444L
-        viewModel =
-            newAutoCredentialViewModel(newGkPwHandleCredentialIntentExtras(userId, gkPwHandle))
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run generateChallengeAsCredentialActivityResult()
-        val ret = viewModel.generateChallengeAsCredentialActivityResult(
-            true,
-            ActivityResult(ChooseLockPattern.RESULT_FINISHED, null),
-            backgroundScope
-        )
-        runCurrent()
-
-        assertThat(ret).isFalse()
-        assertThat(generateFails.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testGenerateChallengeAsCredentialActivityResult_nullDataConfirmLock() = runTest {
-        val userId = 109
-        viewModel =
-            newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run generateChallengeAsCredentialActivityResult()
-        val ret = viewModel.generateChallengeAsCredentialActivityResult(
-            false,
-            ActivityResult(Activity.RESULT_OK, null),
-            backgroundScope
-        )
-        runCurrent()
-
-        assertThat(ret).isFalse()
-        assertThat(generateFails.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testGenerateChallengeAsCredentialActivityResult_validChooseLock() = runTest {
-        val userId = 108
-        viewModel =
-            newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-        )
-        val gkPwHandle = 6666L
-        val newSensorId = 50
-        val newChallenge = 60L
-        setupGenerateChallenge(userId, newSensorId, newChallenge)
-        whenever(
-            lockPatternUtils.verifyGatekeeperPasswordHandle(
-                gkPwHandle,
-                newChallenge,
-                userId
-            )
-        )
-            .thenReturn(newGoodCredential(gkPwHandle, byteArrayOf(1)))
-        val hasCalledRemoveGkPwHandle = AtomicBoolean()
-        Mockito.doAnswer {
-            hasCalledRemoveGkPwHandle.set(true)
-            null
-        }.`when`(lockPatternUtils).removeGatekeeperPasswordHandle(gkPwHandle)
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run generateChallengeAsCredentialActivityResult()
-        val intent =
-            Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle)
-        val ret = viewModel.generateChallengeAsCredentialActivityResult(
-            true,
-            ActivityResult(ChooseLockPattern.RESULT_FINISHED, intent),
-            backgroundScope
-        )
-        runCurrent()
-
-        assertThat(ret).isTrue()
-        assertThat(generateFails.size).isEqualTo(0)
-        assertThat(viewModel.token).isNotNull()
-        assertThat(challengeGenerator.callbackRunCount).isEqualTo(1)
-        assertThat(hasCalledRemoveGkPwHandle.get()).isTrue()
-    }
-
-    @Test
-    fun testGenerateChallengeAsCredentialActivityResult_validConfirmLock() = runTest {
-        val userId = 109
-        viewModel =
-            newAutoCredentialViewModel(newOnlySensorValidCredentialIntentExtras(userId))
-        whenever(lockPatternUtils.getActivePasswordQuality(userId)).thenReturn(
-            DevicePolicyManager.PASSWORD_QUALITY_SOMETHING
-        )
-        val gkPwHandle = 5555L
-        val newSensorId = 80
-        val newChallenge = 90L
-        setupGenerateChallenge(userId, newSensorId, newChallenge)
-        whenever(
-            lockPatternUtils.verifyGatekeeperPasswordHandle(
-                gkPwHandle,
-                newChallenge,
-                userId
-            )
-        )
-            .thenReturn(newGoodCredential(gkPwHandle, byteArrayOf(1)))
-        val hasCalledRemoveGkPwHandle = AtomicBoolean()
-        Mockito.doAnswer {
-            hasCalledRemoveGkPwHandle.set(true)
-            null
-        }.`when`(lockPatternUtils).removeGatekeeperPasswordHandle(gkPwHandle)
-
-        val generateFails = listOfGenerateChallengeFailedFlow()
-
-        // Run generateChallengeAsCredentialActivityResult()
-        val intent =
-            Intent().putExtra(ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE, gkPwHandle)
-        val ret = viewModel.generateChallengeAsCredentialActivityResult(
-            false,
-            ActivityResult(Activity.RESULT_OK, intent),
-            backgroundScope
-        )
-        runCurrent()
-
-        assertThat(ret).isTrue()
-        assertThat(generateFails.size).isEqualTo(0)
-        assertThat(viewModel.token).isNotNull()
-        assertThat(challengeGenerator.callbackRunCount).isEqualTo(1)
-        assertThat(hasCalledRemoveGkPwHandle.get()).isTrue()
-    }
-
-    private fun TestScope.listOfGenerateChallengeFailedFlow(): List<Boolean> =
-        mutableListOf<Boolean>().also {
-            backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                viewModel.generateChallengeFailedFlow.toList(it)
-            }
-        }
-
-    class TestChallengeGenerator : ChallengeGenerator {
-        var sensorId = -1
-        var userId = UserHandle.myUserId()
-        var challenge = CredentialModel.INVALID_CHALLENGE
-        var callbackRunCount = 0
-
-        override var callback: AutoCredentialViewModel.GenerateChallengeCallback? = null
-
-        override fun generateChallenge(userId: Int) {
-            callback?.let {
-                it.onChallengeGenerated(sensorId, this.userId, challenge)
-                ++callbackRunCount
-            }
-        }
-    }
-
-    private fun newGoodCredential(gkPwHandle: Long, hat: ByteArray): VerifyCredentialResponse {
-        return VerifyCredentialResponse.Builder()
-            .setGatekeeperPasswordHandle(gkPwHandle)
-            .setGatekeeperHAT(hat)
-            .build()
-    }
-
-    private fun newBadCredential(timeout: Int): VerifyCredentialResponse {
-        return if (timeout > 0) {
-            VerifyCredentialResponse.fromTimeout(timeout)
-        } else {
-            VerifyCredentialResponse.fromError()
-        }
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModelTest.java
deleted file mode 100644
index c4ee18e..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceFoldedViewModelTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.viewmodel;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Application;
-import android.content.res.Configuration;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.testutils.InstantTaskExecutorRule;
-import com.android.systemui.unfold.compat.ScreenSizeFoldProvider;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class DeviceFoldedViewModelTest {
-
-    @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
-
-    private DeviceFoldedViewModel mViewModel;
-
-    @Before
-    public void setUp() {
-        final Application application = ApplicationProvider.getApplicationContext();
-        mViewModel = new DeviceFoldedViewModel(new ScreenSizeFoldProvider(application),
-                application.getMainExecutor());
-    }
-
-    @Test
-    public void testLiveData() {
-        final Configuration config1 = new Configuration();
-        config1.smallestScreenWidthDp = 601;
-        mViewModel.onConfigurationChanged(config1);
-        assertThat(mViewModel.getLiveData().getValue()).isFalse();
-
-        final Configuration config2 = new Configuration();
-        config2.smallestScreenWidthDp = 599;
-        mViewModel.onConfigurationChanged(config2);
-        assertThat(mViewModel.getLiveData().getValue()).isTrue();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModelTest.java
deleted file mode 100644
index 0b7c53c..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/DeviceRotationViewModelTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2022 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.biometrics2.ui.viewmodel;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Application;
-import android.view.Surface;
-
-import androidx.annotation.NonNull;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.testutils.InstantTaskExecutorRule;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-@RunWith(AndroidJUnit4.class)
-public class DeviceRotationViewModelTest {
-
-    @Rule public final MockitoRule mockito = MockitoJUnit.rule();
-    @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
-
-    private TestDeviceRotationViewModel mViewModel;
-
-    @Before
-    public void setUp() {
-        TestDeviceRotationViewModel.sTestRotation = 3;
-        mViewModel = new TestDeviceRotationViewModel(ApplicationProvider.getApplicationContext());
-    }
-
-    @Test
-    public void testDefaultLiveDataNotNull() {
-        assertThat(mViewModel.getLiveData().getValue()).isEqualTo(mViewModel.sTestRotation);
-    }
-
-    @Test
-    public void testOnDisplayChange() {
-        mViewModel.sTestRotation = 3;
-        mViewModel.triggerOnDisplayChanged();
-        assertThat(mViewModel.getLiveData().getValue()).isEqualTo(mViewModel.sTestRotation);
-    }
-
-    public static class TestDeviceRotationViewModel extends DeviceRotationViewModel {
-
-        @Surface.Rotation static int sTestRotation = 0;
-
-        public TestDeviceRotationViewModel(@NonNull Application application) {
-            super(application);
-        }
-
-        void triggerOnDisplayChanged() {
-            mDisplayListener.onDisplayChanged(0);
-        }
-
-        @Override
-        protected int getRotation() {
-            return sTestRotation;
-        }
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java
deleted file mode 100644
index d4fae60..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollEnrollingViewModelTest.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
-
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG;
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED;
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollEnrollingViewModel.FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP;
-import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-
-import android.app.Application;
-import android.hardware.biometrics.SensorProperties;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
-
-import androidx.lifecycle.LiveData;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-import com.android.settings.testutils.InstantTaskExecutorRule;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-import java.util.ArrayList;
-
-@RunWith(AndroidJUnit4.class)
-public class FingerprintEnrollEnrollingViewModelTest {
-
-    private static final int TEST_USER_ID = 33;
-
-    @Rule
-    public final MockitoRule mockito = MockitoJUnit.rule();
-    @Rule
-    public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
-
-    @Mock
-    private FingerprintManager mFingerprintManager;
-
-    private Application mApplication;
-    private FingerprintEnrollEnrollingViewModel mViewModel;
-
-    @Before
-    public void setUp() {
-        mApplication = ApplicationProvider.getApplicationContext();
-        mViewModel = new FingerprintEnrollEnrollingViewModel(
-                mApplication,
-                TEST_USER_ID,
-                newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL,  5)
-            );
-    }
-
-    @Test
-    public void testIconTouchDialog() {
-        final LiveData<Integer> actionLiveData = mViewModel.getActionLiveData();
-        assertThat(actionLiveData.getValue()).isEqualTo(null);
-
-        mViewModel.showIconTouchDialog();
-        assertThat(actionLiveData.getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_ENROLLING_ACTION_SHOW_ICON_TOUCH_DIALOG);
-    }
-
-    @Test
-    public void tesBackPressedScenario() {
-        final LiveData<Integer> actionLiveData = mViewModel.getActionLiveData();
-        assertThat(actionLiveData.getValue()).isEqualTo(null);
-        assertThat(mViewModel.getOnBackPressed()).isEqualTo(false);
-
-        mViewModel.setOnBackPressed();
-        assertThat(mViewModel.getOnBackPressed()).isEqualTo(true);
-
-        mViewModel.onCancelledDueToOnBackPressed();
-        assertThat(mViewModel.getOnBackPressed()).isEqualTo(false);
-        assertThat(actionLiveData.getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_BACK_PRESSED);
-    }
-
-    @Test
-    public void testSkipPressedScenario() {
-        final LiveData<Integer> actionLiveData = mViewModel.getActionLiveData();
-        assertThat(actionLiveData.getValue()).isEqualTo(null);
-        assertThat(mViewModel.getOnSkipPressed()).isEqualTo(false);
-
-        mViewModel.setOnSkipPressed();
-        assertThat(mViewModel.getOnSkipPressed()).isEqualTo(true);
-
-        mViewModel.onCancelledDueToOnSkipPressed();
-        assertThat(mViewModel.getOnSkipPressed()).isEqualTo(false);
-        assertThat(actionLiveData.getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_ENROLLING_CANCELED_BECAUSE_USER_SKIP);
-    }
-
-    @Test
-    public void testGetFirstFingerprintSensorPropertiesInternal() {
-        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
-        final FingerprintSensorPropertiesInternal prop = new FingerprintSensorPropertiesInternal(
-                0 /* sensorId */,
-                SensorProperties.STRENGTH_STRONG,
-                5,
-                new ArrayList<>() /* componentInfo */,
-                TYPE_UDFPS_OPTICAL,
-                true /* resetLockoutRequiresHardwareAuthToken */);
-        props.add(prop);
-        doAnswer(invocation -> {
-            final IFingerprintAuthenticatorsRegisteredCallback callback =
-                    invocation.getArgument(0);
-            callback.onAllAuthenticatorsRegistered(props);
-            return null;
-        }).when(mFingerprintManager).addAuthenticatorsRegisteredCallback(any());
-
-        mViewModel = new FingerprintEnrollEnrollingViewModel(
-                mApplication,
-                TEST_USER_ID,
-                new FingerprintRepository(mFingerprintManager)
-        );
-
-        assertThat(mViewModel.getFirstFingerprintSensorPropertiesInternal()).isEqualTo(prop);
-    }
-
-    @Test
-    public void testGetEnrollStageCount() {
-        final int expectedValue = 24;
-        doReturn(expectedValue).when(mFingerprintManager).getEnrollStageCount();
-
-        assertThat(mViewModel.getEnrollStageCount()).isEqualTo(expectedValue);
-    }
-
-    @Test
-    public void testGetEnrollStageThreshold() {
-        final float expectedValue0 = 0.42f;
-        final float expectedValue1 = 0.24f;
-        final float expectedValue2 = 0.33f;
-        final float expectedValue3 = 0.90f;
-
-        doReturn(expectedValue0).when(mFingerprintManager).getEnrollStageThreshold(0);
-        doReturn(expectedValue1).when(mFingerprintManager).getEnrollStageThreshold(1);
-        doReturn(expectedValue2).when(mFingerprintManager).getEnrollStageThreshold(2);
-        doReturn(expectedValue3).when(mFingerprintManager).getEnrollStageThreshold(3);
-
-        assertThat(mViewModel.getEnrollStageThreshold(2)).isEqualTo(expectedValue2);
-        assertThat(mViewModel.getEnrollStageThreshold(1)).isEqualTo(expectedValue1);
-        assertThat(mViewModel.getEnrollStageThreshold(3)).isEqualTo(expectedValue3);
-        assertThat(mViewModel.getEnrollStageThreshold(0)).isEqualTo(expectedValue0);
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt
deleted file mode 100644
index 379a5c1..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollErrorDialogViewModelTest.kt
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Application
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintErrorDialogSetResultAction.FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Test
-import org.junit.runner.RunWith
-
-@RunWith(AndroidJUnit4::class)
-class FingerprintEnrollErrorDialogViewModelTest {
-
-    private val application = ApplicationProvider.getApplicationContext<Application>()
-    private var viewModel: FingerprintEnrollErrorDialogViewModel =
-        FingerprintEnrollErrorDialogViewModel(application, false)
-
-    @Before
-    fun setUp() {
-        // Make sure viewModel is new for each test
-        viewModel = FingerprintEnrollErrorDialogViewModel(application, false)
-    }
-
-    @Test
-    fun testIsDialogNotShownDefaultFalse() {
-        assertThat(viewModel.isDialogShown).isFalse()
-    }
-
-    @Test
-    fun testIsSuw() {
-        assertThat(FingerprintEnrollErrorDialogViewModel(application, false).isSuw).isFalse()
-        assertThat(FingerprintEnrollErrorDialogViewModel(application, true).isSuw).isTrue()
-    }
-
-    @Test
-    fun testNewDialog() = runTest {
-        val newDialogs: List<Int> = mutableListOf<Int>().also {
-            backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                viewModel.newDialogFlow.toList(it)
-            }
-        }
-
-        runCurrent()
-
-        // Default values
-        assertThat(viewModel.isDialogShown).isFalse()
-        assertThat(newDialogs.size).isEqualTo(0)
-
-        val testErrorMsgId = 3456
-        viewModel.newDialog(testErrorMsgId)
-        runCurrent()
-
-        // verify after emit
-        assertThat(viewModel.isDialogShown).isTrue()
-        assertThat(newDialogs.size).isEqualTo(1)
-        assertThat(newDialogs[0]).isEqualTo(testErrorMsgId)
-    }
-
-    @Test
-    fun testTriggerRetry() = runTest {
-        val triggerRetries: List<Any> = mutableListOf<Any>().also {
-            backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                viewModel.triggerRetryFlow.toList(it)
-            }
-        }
-
-        runCurrent()
-
-        // Default values
-        assertThat(triggerRetries.size).isEqualTo(0)
-
-        viewModel.triggerRetry()
-        runCurrent()
-
-        // verify after emit
-        assertThat(triggerRetries.size).isEqualTo(1)
-    }
-
-    @Test
-    fun testSetResultFinish() = runTest {
-        val setResults: List<FingerprintErrorDialogSetResultAction> =
-            mutableListOf<FingerprintErrorDialogSetResultAction>().also {
-                backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                    viewModel.setResultFlow.toList(it)
-                }
-            }
-
-        runCurrent()
-
-        // Default values
-        assertThat(setResults.size).isEqualTo(0)
-
-        viewModel.setResultAndFinish(FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH)
-        runCurrent()
-
-        // verify after emit
-        assertThat(setResults.size).isEqualTo(1)
-        assertThat(setResults[0]).isEqualTo(FINGERPRINT_ERROR_DIALOG_ACTION_SET_RESULT_FINISH)
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java
deleted file mode 100644
index 18bd61a..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFindSensorViewModelTest.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG;
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP;
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFindSensorViewModel.FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Application;
-
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.testutils.InstantTaskExecutorRule;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(AndroidJUnit4.class)
-public class FingerprintEnrollFindSensorViewModelTest {
-
-    @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
-
-    private Application mApplication;
-    private FingerprintEnrollFindSensorViewModel mViewModel;
-
-    @Before
-    public void setUp() {
-        mApplication = ApplicationProvider.getApplicationContext();
-        mViewModel = new FingerprintEnrollFindSensorViewModel(mApplication, false);
-    }
-
-    @Test
-    public void testClickSkipButtonNotInSuw() {
-        mViewModel = new FingerprintEnrollFindSensorViewModel(mApplication, false);
-        mViewModel.onSkipButtonClick();
-        assertThat(mViewModel.getActionLiveData().getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP);
-    }
-
-    @Test
-    public void testClickSkipButtonInSuw() {
-        mViewModel = new FingerprintEnrollFindSensorViewModel(mApplication, true);
-        mViewModel.onSkipButtonClick();
-        assertThat(mViewModel.getActionLiveData().getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_DIALOG);
-    }
-
-    @Test
-    public void testClickSkipDialogButton() {
-        mViewModel.onSkipDialogButtonClick();
-        assertThat(mViewModel.getActionLiveData().getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_SKIP);
-    }
-
-    @Test
-    public void testClickStartDialogButton() {
-        mViewModel.onStartButtonClick();
-        assertThat(mViewModel.getActionLiveData().getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_FIND_SENSOR_ACTION_START);
-    }
-
-    @Test
-    public void testClearActionLiveData() {
-        assertThat(mViewModel.getActionLiveData().getValue()).isNull();
-
-        mViewModel.onStartButtonClick();
-        assertThat(mViewModel.getActionLiveData().getValue()).isNotNull();
-
-        mViewModel.clearActionLiveData();
-        assertThat(mViewModel.getActionLiveData().getValue()).isNull();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFinishViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFinishViewModelTest.java
deleted file mode 100644
index ac97e72..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollFinishViewModelTest.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_POWER_BUTTON;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_REAR;
-import static android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL;
-
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK;
-import static com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollFinishViewModel.FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK;
-import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository;
-import static com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import android.app.Application;
-import android.content.Intent;
-import android.hardware.fingerprint.FingerprintManager;
-
-import androidx.lifecycle.LiveData;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest;
-import com.android.settings.testutils.InstantTaskExecutorRule;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-@RunWith(AndroidJUnit4.class)
-public class FingerprintEnrollFinishViewModelTest {
-
-    private static final int USER_ID = 334;
-    private static final int MAX_ENROLLABLE = 5;
-
-    @Rule public final MockitoRule mockito = MockitoJUnit.rule();
-    @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
-
-    @Mock private FingerprintManager mFingerprintManager;
-
-    private Application mApplication;
-    private EnrollmentRequest mRequest;
-    private FingerprintEnrollFinishViewModel mViewModel;
-
-    @Before
-    public void setUp() {
-        mApplication = ApplicationProvider.getApplicationContext();
-        mRequest = new EnrollmentRequest(new Intent(), mApplication, true);
-        mViewModel = new FingerprintEnrollFinishViewModel(mApplication, USER_ID, mRequest,
-                newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, MAX_ENROLLABLE));
-    }
-
-    @Test
-    public void testCanAssumeSfps() {
-        mViewModel = new FingerprintEnrollFinishViewModel(mApplication, USER_ID, mRequest,
-                newFingerprintRepository(mFingerprintManager, TYPE_UDFPS_OPTICAL, MAX_ENROLLABLE));
-        assertThat(mViewModel.canAssumeSfps()).isFalse();
-
-        mViewModel = new FingerprintEnrollFinishViewModel(mApplication, USER_ID, mRequest,
-                newFingerprintRepository(mFingerprintManager, TYPE_REAR, MAX_ENROLLABLE));
-        assertThat(mViewModel.canAssumeSfps()).isFalse();
-
-        mViewModel = new FingerprintEnrollFinishViewModel(mApplication, USER_ID, mRequest,
-                newFingerprintRepository(mFingerprintManager, TYPE_POWER_BUTTON, MAX_ENROLLABLE));
-        assertThat(mViewModel.canAssumeSfps()).isTrue();
-    }
-
-    @Test
-    public void testIsAnotherFingerprintEnrollable() {
-        setupFingerprintEnrolledFingerprints(mFingerprintManager, USER_ID, MAX_ENROLLABLE);
-        assertThat(mViewModel.isAnotherFingerprintEnrollable()).isFalse();
-
-        setupFingerprintEnrolledFingerprints(mFingerprintManager, USER_ID, MAX_ENROLLABLE - 1);
-        assertThat(mViewModel.isAnotherFingerprintEnrollable()).isTrue();
-    }
-
-    @Test
-    public void testGetRequest() {
-        assertThat(mViewModel.getRequest()).isEqualTo(mRequest);
-    }
-
-    @Test
-    public void testOnAddButtonClick() {
-        final LiveData<Integer> actionLiveData = mViewModel.getActionLiveData();
-
-        // Test init value
-        assertThat(actionLiveData.getValue()).isNull();
-
-        // Test onAddButtonClick()
-        mViewModel.onAddButtonClick();
-        assertThat(actionLiveData.getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_FINISH_ACTION_ADD_BUTTON_CLICK);
-
-        // Clear
-        mViewModel.clearActionLiveData();
-        assertThat(actionLiveData.getValue()).isNull();
-    }
-
-    @Test
-    public void testOnNextButtonClick() {
-        final LiveData<Integer> actionLiveData = mViewModel.getActionLiveData();
-
-        // Test init value
-        assertThat(actionLiveData.getValue()).isNull();
-
-        // Test onNextButtonClick()
-        mViewModel.onNextButtonClick();
-        assertThat(actionLiveData.getValue()).isEqualTo(
-                FINGERPRINT_ENROLL_FINISH_ACTION_NEXT_BUTTON_CLICK);
-
-        // Clear
-        mViewModel.clearActionLiveData();
-        assertThat(actionLiveData.getValue()).isNull();
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt
deleted file mode 100644
index 7494aef..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollIntroViewModelTest.kt
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Application
-import android.content.res.Resources
-import android.hardware.fingerprint.FingerprintManager
-import android.hardware.fingerprint.FingerprintSensorProperties.TYPE_UDFPS_OPTICAL
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.biometrics2.data.repository.FingerprintRepository
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollIntroStatus
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollable.FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-import com.android.settings.biometrics2.ui.model.FingerprintEnrollable.FINGERPRINT_ENROLLABLE_OK
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction.CONTINUE_ENROLL
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction.DONE_AND_FINISH
-import com.android.settings.biometrics2.ui.viewmodel.FingerprintEnrollIntroAction.SKIP_OR_CANCEL
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newAllFalseRequest
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwDeferredRequest
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwPortalRequest
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwRequest
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwSuggestedActionFlowRequest
-import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository
-import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints
-import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupSuwMaxFingerprintsEnrollable
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.Mockito
-import org.mockito.junit.MockitoJUnit
-
-@RunWith(AndroidJUnit4::class)
-class FingerprintEnrollIntroViewModelTest {
-
-    @get:Rule val mockito = MockitoJUnit.rule()
-
-    @Mock private lateinit var resources: Resources
-    @Mock private lateinit var fingerprintManager: FingerprintManager
-
-    private var application: Application = ApplicationProvider.getApplicationContext()
-
-    private fun newFingerprintEnrollIntroViewModel(
-        fingerprintRepository: FingerprintRepository,
-        enrollmentRequest: EnrollmentRequest
-    ) = FingerprintEnrollIntroViewModel(
-        application,
-        fingerprintRepository,
-        enrollmentRequest,
-        TEST_USER_ID
-    )
-
-    @Before
-    fun setUp() {
-        application = ApplicationProvider.getApplicationContext()
-    }
-
-    @Test
-    fun testPageStatusFlowDefaultAndUpdate() = runTest {
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 1),
-            newAllFalseRequest(application)
-        )
-
-        val statusList = listOfPageStatusFlow(viewModel)
-
-        runCurrent()
-
-        // assert default values
-        assertThat(statusList.size).isEqualTo(1)
-        assertThat(statusList[0].hasScrollToBottom()).isFalse()
-        assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_OK)
-
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 1)
-        viewModel.updateEnrollableStatus(backgroundScope)
-        runCurrent()
-
-        // assert new updated value
-        assertThat(statusList.size).isEqualTo(2)
-        assertThat(statusList[1].hasScrollToBottom()).isFalse()
-        assertThat(statusList[1].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
-    }
-
-    fun testOnStartToUpdateEnrollableStatusOk_isSuw() = runTest {
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 0)
-        setupSuwMaxFingerprintsEnrollable(application, resources, 1)
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            newIsSuwRequest(application)
-        )
-
-        val statusList = listOfPageStatusFlow(viewModel)
-
-        runCurrent()
-
-        assertThat(statusList.size).isEqualTo(1)
-        assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_OK)
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusReachMax_isSuw() = runTest {
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 1)
-        setupSuwMaxFingerprintsEnrollable(application, resources, 1)
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            newIsSuwRequest(application)
-        )
-
-        val statusList = listOfPageStatusFlow(viewModel)
-
-        runCurrent()
-
-        assertThat(statusList.size).isEqualTo(1)
-        assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusOk_isNotSuw() = runTest {
-        testOnStartToUpdateEnrollableStatusOk(newAllFalseRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusReachMax_isNotSuw() = runTest {
-        testOnStartToUpdateEnrollableStatusReachMax(newAllFalseRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusOk_isSuwDeferred() = runTest {
-        testOnStartToUpdateEnrollableStatusOk(newIsSuwDeferredRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusReachMax_isSuwDeferred() = runTest {
-        testOnStartToUpdateEnrollableStatusReachMax(newIsSuwDeferredRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusOk_isSuwPortal() = runTest {
-        testOnStartToUpdateEnrollableStatusOk(newIsSuwPortalRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusReachMax_isSuwPortal() = runTest {
-        testOnStartToUpdateEnrollableStatusReachMax(newIsSuwPortalRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusOk_isSuwSuggestedActionFlow() = runTest {
-        testOnStartToUpdateEnrollableStatusOk(newIsSuwSuggestedActionFlowRequest(application))
-    }
-
-    @Test
-    fun testOnStartToUpdateEnrollableStatusReachMax_isSuwSuggestedActionFlow() = runTest {
-        testOnStartToUpdateEnrollableStatusReachMax(
-            newIsSuwSuggestedActionFlowRequest(application)
-        )
-    }
-
-    private fun TestScope.testOnStartToUpdateEnrollableStatusOk(request: EnrollmentRequest) {
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 0)
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            request
-        )
-
-        val statusList = listOfPageStatusFlow(viewModel)
-
-        runCurrent()
-
-        assertThat(statusList.size).isEqualTo(1)
-        assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_OK)
-    }
-
-    private fun TestScope.testOnStartToUpdateEnrollableStatusReachMax(request: EnrollmentRequest) {
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 5)
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            request
-        )
-
-        val statusList = listOfPageStatusFlow(viewModel)
-
-        runCurrent()
-
-        assertThat(statusList.size).isEqualTo(1)
-        assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
-    }
-
-    @Test
-    fun testIsParentalConsentRequired() {
-        // We shall not mock FingerprintRepository, but
-        // FingerprintRepository.isParentalConsentRequired() calls static method inside, we can't
-        // mock static method
-        val fingerprintRepository = Mockito.mock(
-            FingerprintRepository::class.java
-        )
-        val viewModel = FingerprintEnrollIntroViewModel(
-            application,
-            fingerprintRepository,
-            newAllFalseRequest(application),
-            TEST_USER_ID
-        )
-        Mockito.`when`(
-            fingerprintRepository.isParentalConsentRequired(application)
-        ).thenReturn(true)
-        assertThat(viewModel.isParentalConsentRequired).isEqualTo(true)
-        Mockito.`when`(
-            fingerprintRepository.isParentalConsentRequired(application)
-        ).thenReturn(false)
-        assertThat(viewModel.isParentalConsentRequired).isEqualTo(false)
-    }
-
-    @Test
-    fun testIsBiometricUnlockDisabledByAdmin() {
-        // We shall not mock FingerprintRepository, but
-        // FingerprintRepository.isDisabledByAdmin() calls static method inside, we can't mock
-        // static method
-        val fingerprintRepository = Mockito.mock(FingerprintRepository::class.java)
-        val viewModel = FingerprintEnrollIntroViewModel(
-            application,
-            fingerprintRepository,
-            newAllFalseRequest(application),
-            TEST_USER_ID
-        )
-        Mockito.`when`(
-            fingerprintRepository.isDisabledByAdmin(application, TEST_USER_ID)
-        ).thenReturn(true)
-        assertThat(viewModel.isBiometricUnlockDisabledByAdmin).isEqualTo(true)
-        Mockito.`when`(
-            fingerprintRepository.isDisabledByAdmin(application, TEST_USER_ID)
-        ).thenReturn(false)
-        assertThat(viewModel.isBiometricUnlockDisabledByAdmin).isEqualTo(false)
-    }
-
-    @Test
-    fun testSetHasScrolledToBottom() = runTest {
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            newAllFalseRequest(application)
-        )
-
-        val pageStatusList = listOfPageStatusFlow(viewModel)
-
-        viewModel.setHasScrolledToBottom(true, backgroundScope)
-        runCurrent()
-
-        assertThat(pageStatusList[pageStatusList.size-1].hasScrollToBottom()).isEqualTo(true)
-    }
-
-    @Test
-    fun testOnNextButtonClick_enrollNext() = runTest {
-        // Set latest status to FINGERPRINT_ENROLLABLE_OK
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 0)
-        setupSuwMaxFingerprintsEnrollable(application, resources, 1)
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            newIsSuwRequest(application)
-        )
-
-        val actions = listOfActionFlow(viewModel)
-
-        // Perform click on `next`
-        viewModel.onNextButtonClick(backgroundScope)
-        runCurrent()
-
-        assertThat(actions.size).isEqualTo(1)
-        assertThat(actions[0]).isEqualTo(CONTINUE_ENROLL)
-    }
-
-    @Test
-    fun testOnNextButtonClick_doneAndFinish() = runTest {
-        // Set latest status to FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX
-        setupFingerprintEnrolledFingerprints(fingerprintManager, TEST_USER_ID, 1)
-        setupSuwMaxFingerprintsEnrollable(application, resources, 1)
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            newIsSuwRequest(application)
-        )
-
-        val statusList = listOfPageStatusFlow(viewModel)
-        val actionList = listOfActionFlow(viewModel)
-
-        runCurrent()
-
-        assertThat(statusList.size).isEqualTo(1)
-        assertThat(statusList[0].enrollableStatus).isEqualTo(FINGERPRINT_ENROLLABLE_ERROR_REACH_MAX)
-
-        val actions = listOfActionFlow(viewModel)
-
-        // Perform click on `next`
-        viewModel.onNextButtonClick(backgroundScope)
-        runCurrent()
-
-        assertThat(actionList.size).isEqualTo(1)
-        assertThat(actionList[0]).isEqualTo(DONE_AND_FINISH)
-    }
-
-    @Test
-    fun testOnSkipOrCancelButtonClick() = runTest {
-        val viewModel = newFingerprintEnrollIntroViewModel(
-            newFingerprintRepository(fingerprintManager, TYPE_UDFPS_OPTICAL, 5),
-            newAllFalseRequest(application)
-        )
-
-        val actions = listOfActionFlow(viewModel)
-
-        viewModel.onSkipOrCancelButtonClick(backgroundScope)
-        runCurrent()
-
-        assertThat(actions.size).isEqualTo(1)
-        assertThat(actions[0]).isEqualTo(SKIP_OR_CANCEL)
-    }
-
-    private fun TestScope.listOfActionFlow(
-        viewModel: FingerprintEnrollIntroViewModel
-    ): List<FingerprintEnrollIntroAction> =
-        mutableListOf<FingerprintEnrollIntroAction>().also {
-            backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                viewModel.actionFlow.toList(it)
-            }
-        }
-
-    private fun TestScope.listOfPageStatusFlow(
-        viewModel: FingerprintEnrollIntroViewModel
-    ): List<FingerprintEnrollIntroStatus> =
-        mutableListOf<FingerprintEnrollIntroStatus>().also {
-            backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                viewModel.pageStatusFlow.toList(it)
-            }
-        }
-
-    companion object {
-        private const val TEST_USER_ID = 33
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java
deleted file mode 100644
index 2c7afa6..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollProgressViewModelTest.java
+++ /dev/null
@@ -1,421 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel;
-
-import static android.hardware.fingerprint.FingerprintManager.ENROLL_ENROLL;
-import static android.hardware.fingerprint.FingerprintManager.ENROLL_FIND_SENSOR;
-import static android.hardware.fingerprint.FingerprintManager.EnrollReason;
-import static android.hardware.fingerprint.FingerprintManager.EnrollmentCallback;
-
-import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.mockito.ArgumentMatchers.anyInt;
-import static org.mockito.Mockito.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.never;
-import static org.mockito.Mockito.only;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.app.Application;
-import android.content.res.Resources;
-import android.os.CancellationSignal;
-import android.os.Handler;
-import android.os.Looper;
-import android.os.Message;
-
-import androidx.annotation.NonNull;
-import androidx.lifecycle.LiveData;
-import androidx.test.core.app.ApplicationProvider;
-import androidx.test.ext.junit.runners.AndroidJUnit4;
-
-import com.android.settings.biometrics.fingerprint.FingerprintUpdater;
-import com.android.settings.biometrics.fingerprint.MessageDisplayController;
-import com.android.settings.biometrics2.ui.model.EnrollmentProgress;
-import com.android.settings.biometrics2.ui.model.EnrollmentStatusMessage;
-import com.android.settings.testutils.InstantTaskExecutorRule;
-
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnit;
-import org.mockito.junit.MockitoRule;
-
-@RunWith(AndroidJUnit4.class)
-public class FingerprintEnrollProgressViewModelTest {
-
-    private static final int TEST_USER_ID = 334;
-
-    @Rule public final MockitoRule mockito = MockitoJUnit.rule();
-    @Rule public final InstantTaskExecutorRule mTaskExecutorRule = new InstantTaskExecutorRule();
-
-    @Mock private Application mApplication;
-    @Mock private Resources mResources;
-    @Mock private FingerprintUpdater mFingerprintUpdater;
-
-    private FingerprintEnrollProgressViewModel mViewModel;
-    private final TestWrapper<CancellationSignal> mCancellationSignalWrapper = new TestWrapper<>();
-    private final TestWrapper<EnrollmentCallback> mCallbackWrapper = new TestWrapper<>();
-    private int mEnrollmentMessageDisplayControllerFlagResId;
-
-    @Before
-    public void setUp() {
-        mEnrollmentMessageDisplayControllerFlagResId = ApplicationProvider.getApplicationContext()
-                .getResources().getIdentifier("enrollment_message_display_controller_flag", "bool",
-                        SETTINGS_PACKAGE_NAME);
-
-        when(mApplication.getResources()).thenReturn(mResources);
-
-        // Not use MessageDisplayController by default
-        when(mResources.getBoolean(mEnrollmentMessageDisplayControllerFlagResId)).thenReturn(false);
-        mViewModel = new FingerprintEnrollProgressViewModel(mApplication, mFingerprintUpdater,
-                TEST_USER_ID);
-
-        mCancellationSignalWrapper.mValue = null;
-        mCallbackWrapper.mValue = null;
-        doAnswer(invocation -> {
-            mCancellationSignalWrapper.mValue = invocation.getArgument(1);
-            mCallbackWrapper.mValue = invocation.getArgument(3);
-            return null;
-        }).when(mFingerprintUpdater).enroll(any(byte[].class), any(CancellationSignal.class),
-                eq(TEST_USER_ID), any(EnrollmentCallback.class), anyInt(), any());
-    }
-
-    @Test
-    public void testStartFindSensor() {
-        @EnrollReason final int enrollReason = ENROLL_FIND_SENSOR;
-        final byte[] token = new byte[] { 1, 2, 3 };
-        mViewModel.setToken(token);
-
-        // Start enrollment
-        final Object ret = mViewModel.startEnrollment(enrollReason);
-
-        assertThat(ret).isNotNull();
-        verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class),
-                eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason), any());
-        assertThat(mCallbackWrapper.mValue instanceof MessageDisplayController).isFalse();
-    }
-
-    @Test
-    public void testStartEnrolling() {
-        @EnrollReason final int enrollReason = ENROLL_ENROLL;
-        final byte[] token = new byte[] { 1, 2, 3 };
-        mViewModel.setToken(token);
-
-        // Start enrollment
-        final Object ret = mViewModel.startEnrollment(enrollReason);
-
-        assertThat(ret).isNotNull();
-        verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class),
-                eq(TEST_USER_ID), any(EnrollmentCallback.class), eq(enrollReason), any());
-        assertThat(mCallbackWrapper.mValue instanceof MessageDisplayController).isFalse();
-    }
-
-    @Test
-    public void testStartEnrollingWithMessageDisplayController() {
-        // Enable MessageDisplayController and mock handler for it
-        when(mResources.getBoolean(mEnrollmentMessageDisplayControllerFlagResId)).thenReturn(true);
-        when(mApplication.getMainThreadHandler()).thenReturn(new TestHandler());
-
-        @EnrollReason final int enrollReason = ENROLL_ENROLL;
-        final byte[] token = new byte[] { 1, 2, 3 };
-        mViewModel.setToken(token);
-
-        // Start enrollment
-        final Object ret = mViewModel.startEnrollment(enrollReason);
-
-        assertThat(ret).isNotNull();
-        verify(mFingerprintUpdater, only()).enroll(eq(token), any(CancellationSignal.class),
-                eq(TEST_USER_ID), any(MessageDisplayController.class), eq(enrollReason), any());
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        assertThat(mCallbackWrapper.mValue instanceof MessageDisplayController).isTrue();
-        final EnrollmentCallback callback1 = mCallbackWrapper.mValue;
-
-        // Cancel and start again
-        mViewModel.cancelEnrollment();
-        mViewModel.startEnrollment(enrollReason);
-
-        // Shall not use the same MessageDisplayController
-        verify(mFingerprintUpdater, times(2)).enroll(eq(token), any(CancellationSignal.class),
-                eq(TEST_USER_ID), any(MessageDisplayController.class), eq(enrollReason), any());
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-        assertThat(callback1).isNotEqualTo(mCallbackWrapper.mValue);
-    }
-
-    @Test
-    public void testStartEnrollmentFailBecauseOfNoToken() {
-        // Start enrollment
-        final Object ret = mViewModel.startEnrollment(ENROLL_FIND_SENSOR);
-
-        assertThat(ret).isNull();
-        verify(mFingerprintUpdater, never()).enroll(any(byte[].class),
-                any(CancellationSignal.class), anyInt(), any(EnrollmentCallback.class), anyInt(),
-                any());
-    }
-
-    @Test
-    public void testCancelEnrollment() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCancellationSignalWrapper.mValue).isNotNull();
-
-        // Cancel enrollment
-        mViewModel.cancelEnrollment();
-
-        assertThat(mCancellationSignalWrapper.mValue.isCanceled()).isTrue();
-    }
-
-    @Test
-    public void testProgressUpdate() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Test default value
-        final LiveData<EnrollmentProgress> progressLiveData = mViewModel.getProgressLiveData();
-        EnrollmentProgress progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(-1);
-        assertThat(progress.getRemaining()).isEqualTo(0);
-
-        // Update first progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(25);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(25);
-
-        // Update second progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(20);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(20);
-
-        // Update latest progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(0);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(0);
-    }
-
-    @Test
-    public void testProgressUpdateClearHelpMessage() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-        final LiveData<EnrollmentProgress> progressLiveData = mViewModel.getProgressLiveData();
-        final LiveData<EnrollmentStatusMessage> helpMsgLiveData =
-                mViewModel.getHelpMessageLiveData();
-
-        // Update first progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(25);
-        EnrollmentProgress progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(25);
-
-        // Update help message
-        final int testHelpMsgId = 3;
-        final String testHelpString = "Test Help String";
-        mCallbackWrapper.mValue.onEnrollmentHelp(testHelpMsgId, testHelpString);
-        final EnrollmentStatusMessage helpMsg = helpMsgLiveData.getValue();
-        assertThat(helpMsg).isNotNull();
-        assertThat(helpMsg.getMsgId()).isEqualTo(testHelpMsgId);
-        assertThat(helpMsg.getStr().toString()).isEqualTo(testHelpString);
-
-        // Update second progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(20);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(20);
-
-        // Help message shall be set to null
-        assertThat(helpMsgLiveData.getValue()).isNull();
-    }
-
-    @Test
-    public void testProgressUpdateWithMessageDisplayController() {
-        // Enable MessageDisplayController and mock handler for it
-        when(mResources.getBoolean(mEnrollmentMessageDisplayControllerFlagResId)).thenReturn(true);
-        when(mApplication.getMainThreadHandler()).thenReturn(new TestHandler());
-
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-
-        // Start enrollment
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Test default value
-        final LiveData<EnrollmentProgress> progressLiveData = mViewModel.getProgressLiveData();
-        EnrollmentProgress progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(-1);
-        assertThat(progress.getRemaining()).isEqualTo(0);
-
-        // Update first progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(25);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(25);
-
-        // Update second progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(20);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(20);
-
-        // Update latest progress
-        mCallbackWrapper.mValue.onEnrollmentProgress(0);
-        progress = progressLiveData.getValue();
-        assertThat(progress).isNotNull();
-        assertThat(progress.getSteps()).isEqualTo(25);
-        assertThat(progress.getRemaining()).isEqualTo(0);
-    }
-
-    @Test
-    public void testGetErrorMessageLiveData() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Check default value
-        final LiveData<EnrollmentStatusMessage> liveData = mViewModel.getErrorMessageLiveData();
-        assertThat(liveData.getValue()).isNull();
-
-        // Notify error message
-        final int errMsgId = 3;
-        final String errMsg = "test error message";
-        mCallbackWrapper.mValue.onEnrollmentError(errMsgId, errMsg);
-        final EnrollmentStatusMessage value = liveData.getValue();
-        assertThat(value).isNotNull();
-        assertThat(value.getMsgId()).isEqualTo(errMsgId);
-        assertThat(value.getStr().toString()).isEqualTo(errMsg);
-    }
-
-    @Test
-    public void testGetHelpMessageLiveData() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Check default value
-        final LiveData<EnrollmentStatusMessage> liveData = mViewModel.getHelpMessageLiveData();
-        assertThat(liveData.getValue()).isNull();
-
-        // Notify help message
-        final int errMsgId = 3;
-        final String errMsg = "test error message";
-        mCallbackWrapper.mValue.onEnrollmentHelp(errMsgId, errMsg);
-        final EnrollmentStatusMessage value = liveData.getValue();
-        assertThat(value).isNotNull();
-        assertThat(value.getMsgId()).isEqualTo(errMsgId);
-        assertThat(value.getStr().toString()).isEqualTo(errMsg);
-    }
-
-    @Test
-    public void testGetAcquireLiveData() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Check default value
-        final LiveData<Boolean> liveData = mViewModel.getAcquireLiveData();
-        assertThat(liveData.getValue()).isNull();
-
-        // Notify acquire message
-        mCallbackWrapper.mValue.onAcquired(true);
-        assertThat(liveData.getValue()).isTrue();
-    }
-
-    @Test
-    public void testGetPointerDownLiveData() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Check default value
-        final LiveData<Integer> liveData = mViewModel.getPointerDownLiveData();
-        assertThat(liveData.getValue()).isNull();
-
-        // Notify acquire message
-        final int value = 33;
-        mCallbackWrapper.mValue.onUdfpsPointerDown(value);
-        assertThat(liveData.getValue()).isEqualTo(value);
-    }
-
-    @Test
-    public void testGetPointerUpLiveData() {
-        // Start enrollment
-        mViewModel.setToken(new byte[] { 1, 2, 3 });
-        final Object ret = mViewModel.startEnrollment(ENROLL_ENROLL);
-        assertThat(ret).isNotNull();
-        assertThat(mCallbackWrapper.mValue).isNotNull();
-
-        // Check default value
-        final LiveData<Integer> liveData = mViewModel.getPointerUpLiveData();
-        assertThat(liveData.getValue()).isNull();
-
-        // Notify acquire message
-        final int value = 44;
-        mCallbackWrapper.mValue.onUdfpsPointerUp(value);
-        assertThat(liveData.getValue()).isEqualTo(value);
-    }
-
-    private static class TestWrapper<T> {
-        T mValue;
-    }
-
-    private static class TestHandler extends Handler {
-
-        TestHandler() {
-            super(Looper.getMainLooper());
-        }
-
-        @Override
-        public boolean sendMessageAtTime(@NonNull Message msg, long uptimeMillis) {
-            msg.getCallback().run();
-            return true;
-        }
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt b/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt
deleted file mode 100644
index 6d04f35..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/ui/viewmodel/FingerprintEnrollmentViewModelTest.kt
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.ui.viewmodel
-
-import android.app.Application
-import android.content.Intent
-import android.hardware.fingerprint.FingerprintManager
-import android.hardware.fingerprint.FingerprintSensorProperties
-import android.os.Bundle
-import androidx.activity.result.ActivityResult
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics2.data.repository.FingerprintRepository
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newAllFalseRequest
-import com.android.settings.biometrics2.utils.EnrollmentRequestUtils.newIsSuwRequest
-import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.newFingerprintRepository
-import com.android.settings.biometrics2.utils.FingerprintRepositoryUtils.setupFingerprintEnrolledFingerprints
-import com.google.common.truth.Truth.assertThat
-import kotlinx.coroutines.flow.toList
-import kotlinx.coroutines.launch
-import kotlinx.coroutines.test.TestScope
-import kotlinx.coroutines.test.UnconfinedTestDispatcher
-import kotlinx.coroutines.test.runCurrent
-import kotlinx.coroutines.test.runTest
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import org.mockito.Mock
-import org.mockito.junit.MockitoJUnit
-import org.mockito.junit.MockitoRule
-
-@RunWith(AndroidJUnit4::class)
-class FingerprintEnrollmentViewModelTest {
-
-    @get:Rule val mockito: MockitoRule = MockitoJUnit.rule()
-
-    private val application: Application
-        get() = ApplicationProvider.getApplicationContext()
-
-    @Mock
-    private lateinit var fingerprintManager: FingerprintManager
-
-    private lateinit var fingerprintRepository: FingerprintRepository
-    private lateinit var viewModel: FingerprintEnrollmentViewModel
-
-    @Before
-    fun setUp() {
-        fingerprintRepository = newFingerprintRepository(
-            fingerprintManager,
-            FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
-            5
-        )
-        viewModel = FingerprintEnrollmentViewModel(
-            application,
-            fingerprintRepository,
-            newAllFalseRequest(application)
-        )
-    }
-
-    @Test
-    fun testGetRequest() {
-        assertThat(viewModel.request).isNotNull()
-    }
-
-    @Test
-    fun testIsWaitingActivityResultDefaultFalse() {
-        assertThat(viewModel.isWaitingActivityResult.value).isFalse()
-    }
-
-
-    @Test
-    fun testOverrideActivityResult_shallKeepNullIntent_woChallengeExtra() {
-        val retResult = viewModel.getOverrideActivityResult(
-            ActivityResult(22, null), null
-        )
-        assertThat(retResult).isNotNull()
-        assertThat(retResult.data).isNull()
-    }
-
-    @Test
-    fun testOverrideActivityResult_shallKeepNullIntent_noIntent_woChallengeExtra() {
-        val intent = Intent()
-        val retResult = viewModel.getOverrideActivityResult(
-            ActivityResult(33, intent), null
-        )
-        assertThat(retResult).isNotNull()
-        assertThat(retResult.data).isEqualTo(intent)
-    }
-
-    @Test
-    fun testOverrideActivityResult_shallKeepNull_woAdded_woIntent_withChallenge() {
-        val extra = Bundle()
-        extra.putString("test1", "test123")
-
-        val retResult = viewModel.getOverrideActivityResult(
-            ActivityResult(33, null), extra
-        )
-
-        assertThat(retResult).isNotNull()
-        assertThat(retResult.data).isNull()
-    }
-
-    @Test
-    fun testOverrideActivityResult_shallCreateNew_woIntent_withChallenge() {
-        val key1 = "test1"
-        val key2 = "test2"
-        val extra = Bundle().apply {
-            putString(key1, "test123")
-            putInt(key2, 9999)
-        }
-
-        viewModel.isNewFingerprintAdded = true
-
-        val retResult = viewModel.getOverrideActivityResult(
-            ActivityResult(33, null), extra
-        )
-        assertThat(retResult).isNotNull()
-
-        val retIntent = retResult.data
-        assertThat(retIntent).isNotNull()
-
-        val retExtra = retIntent!!.extras
-        assertThat(retExtra).isNotNull()
-        assertThat(retExtra!!.size).isEqualTo(extra.size)
-        assertThat(retExtra.getString(key1)).isEqualTo(extra.getString(key1))
-        assertThat(retExtra.getInt(key2)).isEqualTo(extra.getInt(key2))
-    }
-
-    @Test
-    fun testOverrideActivityResult_shallNotMerge_nonAdded_woIntent_withChallenge() {
-        val extra = Bundle().apply {
-            putString("test2", "test123")
-        }
-
-        val key2 = "test2"
-        val intent = Intent().apply {
-            putExtra(key2, 3456L)
-        }
-
-        val retResult = viewModel.getOverrideActivityResult(ActivityResult(33, intent), extra)
-
-        assertThat(retResult).isNotNull()
-
-        val retIntent = retResult.data
-        assertThat(retIntent).isNotNull()
-
-        val retExtra = retIntent!!.extras
-        assertThat(retExtra).isNotNull()
-        assertThat(retExtra!!.size).isEqualTo(intent.extras!!.size)
-        assertThat(retExtra.getString(key2)).isEqualTo(intent.extras!!.getString(key2))
-    }
-
-    @Test
-    fun testOverrideActivityResult_shallMerge_added_woIntent_withChallenge() {
-        val key1 = "test1"
-        val key2 = "test2"
-        val extra = Bundle().apply {
-            putString(key1, "test123")
-            putInt(key2, 9999)
-        }
-
-        val key3 = "test3"
-        val intent = Intent().apply {
-            putExtra(key3, 3456L)
-        }
-
-        viewModel.isNewFingerprintAdded = true
-
-        val retResult = viewModel.getOverrideActivityResult(ActivityResult(33, intent), extra)
-        assertThat(retResult).isNotNull()
-
-        val retIntent = retResult.data
-        assertThat(retIntent).isNotNull()
-
-        val retExtra = retIntent!!.extras
-        assertThat(retExtra).isNotNull()
-        assertThat(retExtra!!.size).isEqualTo(extra.size + intent.extras!!.size)
-        assertThat(retExtra.getString(key1)).isEqualTo(extra.getString(key1))
-        assertThat(retExtra.getInt(key2)).isEqualTo(extra.getInt(key2))
-        assertThat(retExtra.getLong(key3)).isEqualTo(intent.extras!!.getLong(key3))
-    }
-
-    @Test
-    fun testIsMaxEnrolledReached() {
-        val uid = 100
-        fingerprintRepository = newFingerprintRepository(
-            fingerprintManager,
-            FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
-            3
-        )
-        viewModel = FingerprintEnrollmentViewModel(
-            application,
-            fingerprintRepository,
-            newAllFalseRequest(application)
-        )
-
-        setupFingerprintEnrolledFingerprints(fingerprintManager, uid, 0)
-        assertThat(viewModel.isMaxEnrolledReached(uid)).isFalse()
-
-        setupFingerprintEnrolledFingerprints(fingerprintManager, uid, 1)
-        assertThat(viewModel.isMaxEnrolledReached(uid)).isFalse()
-
-        setupFingerprintEnrolledFingerprints(fingerprintManager, uid, 2)
-        assertThat(viewModel.isMaxEnrolledReached(uid)).isFalse()
-
-        setupFingerprintEnrolledFingerprints(fingerprintManager, uid, 3)
-        assertThat(viewModel.isMaxEnrolledReached(uid)).isTrue()
-
-        setupFingerprintEnrolledFingerprints(fingerprintManager, uid, 4)
-        assertThat(viewModel.isMaxEnrolledReached(uid)).isTrue()
-    }
-
-    @Test
-    fun testSetResultFlow_defaultEmpty() = runTest {
-        val activityResults = listOfSetResultFlow()
-
-        runCurrent()
-
-        assertThat(activityResults.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testCheckFinishActivityDuringOnPause_doNothingIfIsSuw() = runTest {
-        viewModel = FingerprintEnrollmentViewModel(
-            application,
-            fingerprintRepository,
-            newIsSuwRequest(application)
-        )
-
-        val activityResults = listOfSetResultFlow()
-
-        viewModel.checkFinishActivityDuringOnPause(
-            isActivityFinishing = false,
-            isChangingConfigurations = false,
-            scope = this
-        )
-        runCurrent()
-
-        assertThat(activityResults.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testCheckFinishActivityDuringOnPause_doNothingIfIsWaitingActivity() = runTest {
-        val activityResults = listOfSetResultFlow()
-
-        viewModel.isWaitingActivityResult.value = true
-        viewModel.checkFinishActivityDuringOnPause(
-            isActivityFinishing = false,
-            isChangingConfigurations = false,
-            scope = this
-        )
-        runCurrent()
-
-        assertThat(activityResults.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testCheckFinishActivityDuringOnPause_doNothingIfIsActivityFinishing() = runTest {
-        val activityResults = listOfSetResultFlow()
-
-        viewModel.checkFinishActivityDuringOnPause(
-            isActivityFinishing = true,
-            isChangingConfigurations = false,
-            scope = this
-        )
-        runCurrent()
-
-        assertThat(activityResults.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testCheckFinishActivityDuringOnPause_doNothingIfIsChangingConfigurations() = runTest {
-        val activityResults = listOfSetResultFlow()
-
-        viewModel.checkFinishActivityDuringOnPause(
-            isActivityFinishing = false,
-            isChangingConfigurations = true,
-            scope = this
-        )
-        runCurrent()
-
-        assertThat(activityResults.size).isEqualTo(0)
-    }
-
-    @Test
-    fun testCheckFinishActivityDuringOnPause_defaultFinishSelf() = runTest {
-        val activityResults = listOfSetResultFlow()
-
-        viewModel.checkFinishActivityDuringOnPause(
-            isActivityFinishing = false,
-            isChangingConfigurations = false,
-            scope = backgroundScope
-        )
-        runCurrent()
-
-        assertThat(activityResults.size).isEqualTo(1)
-        assertThat(activityResults[0].resultCode).isEqualTo(BiometricEnrollBase.RESULT_TIMEOUT)
-        assertThat(activityResults[0].data).isEqualTo(null)
-    }
-
-    private fun TestScope.listOfSetResultFlow(): List<ActivityResult> =
-        mutableListOf<ActivityResult>().also {
-            backgroundScope.launch(UnconfinedTestDispatcher(testScheduler)) {
-                viewModel.setResultFlow.toList(it)
-            }
-        }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/utils/EnrollmentRequestUtils.kt b/tests/unit/src/com/android/settings/biometrics2/utils/EnrollmentRequestUtils.kt
deleted file mode 100644
index 755f6d0..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/utils/EnrollmentRequestUtils.kt
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.utils
-
-import android.content.Context
-import android.content.Intent
-import android.text.TextUtils
-import com.android.settings.biometrics.BiometricEnrollBase
-import com.android.settings.biometrics2.ui.model.EnrollmentRequest
-import com.google.android.setupcompat.util.WizardManagerHelper
-
-object EnrollmentRequestUtils {
-    @JvmStatic
-    fun newAllFalseRequest(context: Context): EnrollmentRequest {
-        return newRequest(
-            context = context,
-            isSuw = false,
-            isSuwDeferred = false,
-            isSuwPortal = false,
-            isSuwSuggestedActionFlow = false,
-            isSuwFirstRun = false,
-            isFromSettingsSummery = false)
-    }
-
-    @JvmStatic
-    fun newIsSuwRequest(context: Context): EnrollmentRequest {
-        return newRequest(
-            context = context,
-            isSuw = true,
-            isSuwDeferred = false,
-            isSuwPortal = false,
-            isSuwSuggestedActionFlow = false,
-            isSuwFirstRun = false,
-            isFromSettingsSummery = false)
-    }
-
-    @JvmStatic
-    fun newIsSuwDeferredRequest(context: Context): EnrollmentRequest {
-        return newRequest(
-            context = context,
-            isSuw = true,
-            isSuwDeferred = true,
-            isSuwPortal = false,
-            isSuwSuggestedActionFlow = false,
-            isSuwFirstRun = false,
-            isFromSettingsSummery = false, null)
-    }
-
-    @JvmStatic
-    fun newIsSuwPortalRequest(context: Context): EnrollmentRequest {
-        return newRequest(
-            context = context,
-            isSuw = true,
-            isSuwDeferred = false,
-            isSuwPortal = true,
-            isSuwSuggestedActionFlow = false,
-            isSuwFirstRun = false,
-            isFromSettingsSummery = false)
-    }
-
-    @JvmStatic
-    fun newIsSuwSuggestedActionFlowRequest(
-        context: Context
-    ): EnrollmentRequest {
-        return newRequest(
-            context = context,
-            isSuw = true,
-            isSuwDeferred = false,
-            isSuwPortal = false,
-            isSuwSuggestedActionFlow = true,
-            isSuwFirstRun = false,
-            isFromSettingsSummery = false)
-    }
-
-    fun newRequest(
-        context: Context,
-        isSuw: Boolean,
-        isSuwDeferred: Boolean,
-        isSuwPortal: Boolean,
-        isSuwSuggestedActionFlow: Boolean,
-        isSuwFirstRun: Boolean,
-        isFromSettingsSummery: Boolean,
-        theme: String? = null
-    ): EnrollmentRequest {
-        val i = Intent()
-        i.putExtra(WizardManagerHelper.EXTRA_IS_SETUP_FLOW, isSuw)
-        i.putExtra(WizardManagerHelper.EXTRA_IS_DEFERRED_SETUP, isSuwDeferred)
-        i.putExtra(WizardManagerHelper.EXTRA_IS_PORTAL_SETUP, isSuwPortal)
-        i.putExtra(WizardManagerHelper.EXTRA_IS_SUW_SUGGESTED_ACTION_FLOW, isSuwSuggestedActionFlow)
-        i.putExtra(WizardManagerHelper.EXTRA_IS_FIRST_RUN, isSuwFirstRun)
-        i.putExtra(BiometricEnrollBase.EXTRA_FROM_SETTINGS_SUMMARY, isFromSettingsSummery)
-        if (!TextUtils.isEmpty(theme)) {
-            i.putExtra(WizardManagerHelper.EXTRA_THEME, theme)
-        }
-        return EnrollmentRequest(i, context, true)
-    }
-}
diff --git a/tests/unit/src/com/android/settings/biometrics2/utils/FingerprintRepositoryUtils.java b/tests/unit/src/com/android/settings/biometrics2/utils/FingerprintRepositoryUtils.java
deleted file mode 100644
index fcf926e..0000000
--- a/tests/unit/src/com/android/settings/biometrics2/utils/FingerprintRepositoryUtils.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright (C) 2023 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.biometrics2.utils;
-
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.when;
-
-import android.content.Context;
-import android.content.res.Resources;
-import android.hardware.biometrics.SensorProperties;
-import android.hardware.fingerprint.Fingerprint;
-import android.hardware.fingerprint.FingerprintManager;
-import android.hardware.fingerprint.FingerprintSensorProperties;
-import android.hardware.fingerprint.FingerprintSensorPropertiesInternal;
-import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback;
-
-import androidx.annotation.NonNull;
-
-import com.android.settings.biometrics2.data.repository.FingerprintRepository;
-
-import java.util.ArrayList;
-
-public class FingerprintRepositoryUtils {
-
-    public static void setupSuwMaxFingerprintsEnrollable(
-            @NonNull Context context,
-            @NonNull Resources mockedResources,
-            int numOfFp) {
-        final int resId = context.getResources().getIdentifier("suw_max_fingerprints_enrollable",
-                "integer", context.getPackageName());
-        when(mockedResources.getInteger(resId)).thenReturn(numOfFp);
-    }
-
-    public static FingerprintRepository newFingerprintRepository(
-            @NonNull FingerprintManager mockedFingerprintManager,
-            @FingerprintSensorProperties.SensorType int sensorType,
-            int maxEnrollmentsPerUser) {
-
-        final ArrayList<FingerprintSensorPropertiesInternal> props = new ArrayList<>();
-        props.add(new FingerprintSensorPropertiesInternal(
-                0 /* sensorId */,
-                SensorProperties.STRENGTH_STRONG,
-                maxEnrollmentsPerUser,
-                new ArrayList<>() /* componentInfo */,
-                sensorType,
-                true /* resetLockoutRequiresHardwareAuthToken */));
-        doAnswer(invocation -> {
-            final IFingerprintAuthenticatorsRegisteredCallback callback =
-                    invocation.getArgument(0);
-            callback.onAllAuthenticatorsRegistered(props);
-            return null;
-        }).when(mockedFingerprintManager).addAuthenticatorsRegisteredCallback(any());
-        return new FingerprintRepository(mockedFingerprintManager);
-    }
-
-    public static void setupFingerprintEnrolledFingerprints(
-            @NonNull FingerprintManager mockedFingerprintManager,
-            int userId,
-            int enrolledFingerprints) {
-        final ArrayList<Fingerprint> ret = new ArrayList<>();
-        for (int i = 0; i < enrolledFingerprints; ++i) {
-            ret.add(new Fingerprint("name", 0, 0, 0L));
-        }
-        when(mockedFingerprintManager.getEnrolledFingerprints(userId)).thenReturn(ret);
-    }
-}
diff --git a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
index b8dd5ac..6a50ffc 100644
--- a/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
+++ b/tests/unit/src/com/android/settings/testutils/FakeFeatureFactory.java
@@ -25,7 +25,6 @@
 import com.android.settings.applications.ApplicationFeatureProvider;
 import com.android.settings.biometrics.face.FaceFeatureProvider;
 import com.android.settings.biometrics.fingerprint.FingerprintFeatureProvider;
-import com.android.settings.biometrics2.factory.BiometricsRepositoryProvider;
 import com.android.settings.bluetooth.BluetoothFeatureProvider;
 import com.android.settings.connecteddevice.fastpair.FastPairFeatureProvider;
 import com.android.settings.connecteddevice.stylus.StylusFeatureProvider;
@@ -82,7 +81,6 @@
     public final BluetoothFeatureProvider mBluetoothFeatureProvider;
     public final FaceFeatureProvider mFaceFeatureProvider;
     public final FingerprintFeatureProvider mFingerprintFeatureProvider;
-    public final BiometricsRepositoryProvider mBiometricsRepositoryProvider;
 
     public PanelFeatureProvider panelFeatureProvider;
     public SlicesFeatureProvider slicesFeatureProvider;
@@ -140,7 +138,6 @@
         mBluetoothFeatureProvider = mock(BluetoothFeatureProvider.class);
         mFaceFeatureProvider = mock(FaceFeatureProvider.class);
         mFingerprintFeatureProvider = mock(FingerprintFeatureProvider.class);
-        mBiometricsRepositoryProvider = mock(BiometricsRepositoryProvider.class);
         wifiTrackerLibProvider = mock(WifiTrackerLibProvider.class);
         securitySettingsFeatureProvider = mock(SecuritySettingsFeatureProvider.class);
         mAccessibilitySearchFeatureProvider = mock(AccessibilitySearchFeatureProvider.class);
@@ -273,11 +270,6 @@
     }
 
     @Override
-    public BiometricsRepositoryProvider getBiometricsRepositoryProvider() {
-        return mBiometricsRepositoryProvider;
-    }
-
-    @Override
     public WifiTrackerLibProvider getWifiTrackerLibProvider() {
         return wifiTrackerLibProvider;
     }
