Merge "Adding more biometric screenshot tests" into main
diff --git a/res/layout/fingerprint_enroll_find_sensor_graphic.xml b/res/layout/fingerprint_enroll_find_sensor_graphic.xml
index 0690457..d818d48 100644
--- a/res/layout/fingerprint_enroll_find_sensor_graphic.xml
+++ b/res/layout/fingerprint_enroll_find_sensor_graphic.xml
@@ -25,12 +25,12 @@
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:contentDescription="@string/security_settings_fingerprint_enroll_find_sensor_content_description"
-        android:src="@drawable/fingerprint_sensor_location"
-        android:scaleType="centerInside"/>
+        android:scaleType="centerInside"
+        android:src="@drawable/fingerprint_sensor_location" />
 
     <com.android.settings.biometrics.fingerprint.FingerprintLocationAnimationView
         android:id="@+id/fingerprint_sensor_location_animation"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
+        android:layout_height="match_parent" />
 
-</FrameLayout>
+</FrameLayout>
\ No newline at end of file
diff --git a/res/layout/fingerprint_v2_enroll_find_sensor.xml b/res/layout/fingerprint_v2_enroll_find_sensor.xml
index d2a495d..bff0cfb 100644
--- a/res/layout/fingerprint_v2_enroll_find_sensor.xml
+++ b/res/layout/fingerprint_v2_enroll_find_sensor.xml
@@ -16,29 +16,30 @@
   -->
 
 <com.google.android.setupdesign.GlifLayout
-xmlns:android="http://schemas.android.com/apk/res/android"
-android:id="@+id/setup_wizard_layout"
-style="?attr/fingerprint_layout_theme"
-android:layout_width="match_parent"
-android:layout_height="match_parent">
-
-<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/setup_wizard_layout"
+    style="?attr/fingerprint_layout_theme"
     android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:orientation="vertical"
-    android:clipToPadding="false"
-    android:clipChildren="false">
+    android:layout_height="match_parent">
 
-    <Space
-        android:layout_width="wrap_content"
-        android:layout_height="0dp"
-        android:layout_weight="1" />
-
-    <include
-        layout="@layout/fingerprint_enroll_find_sensor_graphic"
+    <LinearLayout
+        android:id="@+id/content_view"
         android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_horizontal"/>
+        android:layout_height="match_parent"
+        android:clipChildren="false"
+        android:clipToPadding="false"
+        android:orientation="vertical">
 
-</LinearLayout>
+        <Space
+            android:layout_width="wrap_content"
+            android:layout_height="0dp"
+            android:layout_weight="1" />
+
+        <include
+            layout="@layout/fingerprint_enroll_find_sensor_graphic"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal" />
+
+    </LinearLayout>
 </com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml b/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
index 0b087d2..710f3fb 100644
--- a/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
+++ b/res/layout/fingerprint_v2_rfps_enroll_enrolling.xml
@@ -18,35 +18,35 @@
 <com.google.android.setupdesign.GlifLayout
     xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto"
-    style="?attr/fingerprint_layout_theme"
     android:id="@+id/setup_wizard_layout"
+    style="?attr/fingerprint_layout_theme"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
     >
 
-<LinearLayout
-    xmlns:android="http://schemas.android.com/apk/res/android"
-    style="@style/SudContentFrame"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:clipChildren="false"
-    android:clipToPadding="false"
-    android:orientation="vertical">
-
     <LinearLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:id="@+id/content_view"
+        style="@style/SudContentFrame"
         android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1"
-        android:gravity="center"
+        android:layout_height="match_parent"
+        android:clipChildren="false"
+        android:clipToPadding="false"
         android:orientation="vertical">
 
-        <com.google.android.setupdesign.view.FillContentLayout
-            android:layout_width="@dimen/fingerprint_progress_bar_max_size"
-            android:layout_height="@dimen/fingerprint_progress_bar_max_size"
-            android:layout_marginVertical="24dp"
-            android:paddingTop="0dp"
-            android:paddingBottom="0dp">
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="0dp"
+            android:layout_weight="1"
+            android:gravity="center"
+            android:orientation="vertical">
 
+            <com.google.android.setupdesign.view.FillContentLayout
+                android:layout_width="@dimen/fingerprint_progress_bar_max_size"
+                android:layout_height="@dimen/fingerprint_progress_bar_max_size"
+                android:layout_marginVertical="24dp"
+                android:paddingTop="0dp"
+                android:paddingBottom="0dp">
             <com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.widget.RFPSProgressBar
                 xmlns:android="http://schemas.android.com/apk/res/android"
                 android:id="@+id/fingerprint_progress_bar"
@@ -54,22 +54,23 @@
                 android:layout_height="match_parent"
                 android:background="@drawable/fp_illustration"
                 android:minHeight="@dimen/fingerprint_progress_bar_min_size"
-                android:progress="0" />
+                android:progress="0"
+                    />
 
-        </com.google.android.setupdesign.view.FillContentLayout>
+            </com.google.android.setupdesign.view.FillContentLayout>
 
-        <TextView
-            android:id="@+id/text"
-            style="@style/TextAppearance.ErrorText"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal|bottom"
-            android:accessibilityLiveRegion="polite"
-            android:gravity="center"
-            android:visibility="invisible" />
+            <TextView
+                android:id="@+id/text"
+                style="@style/TextAppearance.ErrorText"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal|bottom"
+                android:accessibilityLiveRegion="polite"
+                android:gravity="center"
+                android:visibility="invisible" />
+
+        </LinearLayout>
 
     </LinearLayout>
 
-</LinearLayout>
-
 </com.google.android.setupdesign.GlifLayout>
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/OWNERS b/src/com/android/settings/biometrics/fingerprint2/OWNERS
index c58a06d..f5fd453 100644
--- a/src/com/android/settings/biometrics/fingerprint2/OWNERS
+++ b/src/com/android/settings/biometrics/fingerprint2/OWNERS
@@ -1,3 +1,4 @@
 # Owners for Biometric Fingerprint
 joshmccloskey@google.com
-jbolinger@google.com
\ No newline at end of file
+jbolinger@google.com
+spdonghao@google.com
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
similarity index 96%
rename from src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
rename to src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
index c045b0e..000a477 100644
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepository.kt
@@ -39,16 +39,16 @@
  *
  * TODO(b/313493336): Move this to systemui
  */
-interface FingerprintSensorRepo {
+interface FingerprintSensorRepository {
   /** Get the [FingerprintSensor] */
   val fingerprintSensor: Flow<FingerprintSensor>
 }
 
-class FingerprintSensorRepoImpl(
+class FingerprintSensorRepositoryImpl(
     fingerprintManager: FingerprintManager,
     backgroundDispatcher: CoroutineDispatcher,
     activityScope: CoroutineScope,
-) : FingerprintSensorRepo {
+) : FingerprintSensorRepository {
 
   override val fingerprintSensor: Flow<FingerprintSensor> =
     callbackFlow {
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
deleted file mode 100644
index 5909825..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt
+++ /dev/null
@@ -1,62 +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.biometrics.fingerprint2.data.repository
-
-import android.content.Context
-import android.provider.Settings
-
-/** Interface that indicates if press to auth is on or off. */
-interface PressToAuthRepo {
-  /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
-  val isEnabled: Boolean
-}
-
-/** Indicates whether or not the press to auth feature is enabled. */
-class PressToAuthRepoImpl(private val context: Context) : PressToAuthRepo {
-  /**
-   * Gets the status of the press to auth feature.
-   *
-   * Returns whether or not the press to auth feature is enabled.
-   */
-  override val isEnabled: Boolean
-    get() {
-      var toReturn: Int =
-        Settings.Secure.getIntForUser(
-          context.contentResolver,
-          Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
-          -1,
-          context.userId,
-        )
-      if (toReturn == -1) {
-        toReturn =
-          if (
-            context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
-          ) {
-            1
-          } else {
-            0
-          }
-        Settings.Secure.putIntForUser(
-          context.contentResolver,
-          Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
-          toReturn,
-          context.userId,
-        )
-      }
-      return (toReturn == 1)
-    }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
new file mode 100644
index 0000000..e769237
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/AccessibilityInteractor.kt
@@ -0,0 +1,52 @@
+/*
+ * 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.biometrics.fingerprint2.domain.interactor
+
+import android.view.accessibility.AccessibilityManager
+import androidx.lifecycle.LifecycleCoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.stateIn
+
+/** Represents all of the information on accessibility state. */
+interface AccessibilityInteractor {
+    /** A flow that contains whether or not accessibility is enabled */
+    val isAccessibilityEnabled: Flow<Boolean>
+}
+
+class AccessibilityInteractorImpl(
+    accessibilityManager: AccessibilityManager,
+    activityScope: LifecycleCoroutineScope
+) : AccessibilityInteractor {
+  /** A flow that contains whether or not accessibility is enabled */
+  override val isAccessibilityEnabled: Flow<Boolean> =
+    callbackFlow {
+        val listener =
+            AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
+        accessibilityManager.addAccessibilityStateChangeListener(listener)
+
+        // This clause will be called when no one is listening to the flow
+        awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
+    }
+      .stateIn(
+        activityScope, // This is going to tied to the activity scope
+          SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
+        false
+      )
+}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
index 1fbeb44..135a36c 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt
@@ -26,8 +26,7 @@
 import com.android.settings.biometrics.GatekeeperPasswordProvider
 import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError
 import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
@@ -57,9 +56,9 @@
   applicationContext: Context,
   private val backgroundDispatcher: CoroutineDispatcher,
   private val fingerprintManager: FingerprintManager,
-  fingerprintSensorRepo: FingerprintSensorRepo,
+  fingerprintSensorRepository: FingerprintSensorRepository,
   private val gatekeeperPasswordProvider: GatekeeperPasswordProvider,
-  private val pressToAuthRepo: PressToAuthRepo,
+  private val pressToAuthInteractor: PressToAuthInteractor,
   private val fingerprintFlow: FingerprintFlow,
 ) : FingerprintManagerInteractor {
 
@@ -101,7 +100,7 @@
     )
   }
 
-  override val sensorPropertiesInternal = fingerprintSensorRepo.fingerprintSensor
+  override val sensorPropertiesInternal = fingerprintSensorRepository.fingerprintSensor
 
   override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }
 
@@ -211,10 +210,6 @@
     it.resume(fingerprintManager.isPowerbuttonFps)
   }
 
-  override suspend fun pressToAuthEnabled(): Boolean = suspendCancellableCoroutine {
-    it.resume(pressToAuthRepo.isEnabled)
-  }
-
   override suspend fun authenticate(): FingerprintAuthAttemptModel =
     suspendCancellableCoroutine { c: CancellableContinuation<FingerprintAuthAttemptModel> ->
       val authenticationCallback =
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FoldStateInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FoldStateInteractor.kt
new file mode 100644
index 0000000..0224aa2
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/FoldStateInteractor.kt
@@ -0,0 +1,58 @@
+/*
+ * 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.biometrics.fingerprint2.domain.interactor
+
+import android.content.Context
+import android.content.res.Configuration
+import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
+import com.android.systemui.unfold.updates.FoldProvider
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+
+interface FoldStateInteractor {
+    /** A flow that contains the fold state info */
+    val isFolded: Flow<Boolean>
+
+    /**
+     * Indicates a configuration change has occurred, and the repo
+     * should update the [isFolded] flow.
+     */
+    fun onConfigurationChange(newConfig: Configuration)
+}
+
+/**
+ * Interactor which handles fold state
+ */
+class FoldStateInteractorImpl(context: Context) : FoldStateInteractor {
+    private val screenSizeFoldProvider = ScreenSizeFoldProvider(context)
+    override val isFolded: Flow<Boolean> = callbackFlow {
+        val foldStateListener = FoldProvider.FoldCallback { isFolded -> trySend(isFolded) }
+        screenSizeFoldProvider.registerCallback(foldStateListener, context.mainExecutor)
+        awaitClose { screenSizeFoldProvider.unregisterCallback(foldStateListener) }
+    }
+
+    /**
+     * This function is called by the root activity, indicating an orientation event has occurred.
+     * When this happens, the [ScreenSizeFoldProvider] is notified and it will re-compute if the
+     * device is folded or not, and notify the [FoldProvider.FoldCallback]
+     */
+    override fun onConfigurationChange(newConfig: Configuration) {
+        screenSizeFoldProvider.onConfigurationChange(newConfig)
+    }
+
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
new file mode 100644
index 0000000..968203f
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/OrientationInteractor.kt
@@ -0,0 +1,84 @@
+/*
+ * 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.biometrics.fingerprint2.domain.interactor
+
+import android.content.Context
+import android.view.OrientationEventListener
+import com.android.internal.R
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.stateIn
+
+/**
+ * Interactor which provides information about orientation
+ */
+interface OrientationInteractor {
+  /** A flow that contains the information about the orientation changing */
+  val orientation: Flow<Int>
+  /** A flow that contains the rotation info */
+  val rotation: Flow<Int>
+  /**
+   * A Helper function that computes rotation if device is in
+   * [R.bool.config_reverseDefaultConfigRotation]
+   */
+  fun getRotationFromDefault(rotation: Int): Int
+}
+
+class OrientationInteractorImpl(private val context: Context, activityScope: CoroutineScope) :
+  OrientationInteractor {
+
+  override val orientation: Flow<Int> = callbackFlow {
+    val orientationEventListener =
+      object : OrientationEventListener(context) {
+        override fun onOrientationChanged(orientation: Int) {
+          trySend(orientation)
+        }
+      }
+    orientationEventListener.enable()
+    awaitClose { orientationEventListener.disable() }
+  }
+
+  override val rotation: Flow<Int> =
+    callbackFlow {
+      val orientationEventListener =
+        object : OrientationEventListener(context) {
+          override fun onOrientationChanged(orientation: Int) {
+            trySend(getRotationFromDefault(context.display!!.rotation))
+          }
+        }
+      orientationEventListener.enable()
+      awaitClose { orientationEventListener.disable() }
+    }
+      .stateIn(
+        activityScope, // This is tied to the activity scope
+        SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
+        context.display!!.rotation,
+      )
+
+  override fun getRotationFromDefault(rotation: Int): Int {
+    val isReverseDefaultRotation =
+      context.resources.getBoolean(R.bool.config_reverseDefaultRotation)
+    return if (isReverseDefaultRotation) {
+      (rotation + 1) % 4
+    } else {
+      rotation
+    }
+  }
+}
\ No newline at end of file
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/PressToAuthInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/PressToAuthInteractor.kt
new file mode 100644
index 0000000..ab7b5de
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/PressToAuthInteractor.kt
@@ -0,0 +1,104 @@
+/*
+ * 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.biometrics.fingerprint2.domain.interactor
+
+import android.content.Context
+import android.database.ContentObserver
+import android.provider.Settings
+import android.util.Log
+import kotlinx.coroutines.CoroutineDispatcher
+import kotlinx.coroutines.channels.awaitClose
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.flowOn
+
+/** Interface that indicates if press to auth is on or off. */
+interface PressToAuthInteractor {
+    /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
+    val isEnabled: Flow<Boolean>
+}
+
+/** Indicates whether or not the press to auth feature is enabled. */
+class PressToAuthInteractorImpl(
+    private val context: Context,
+    private val backgroundDispatcher: CoroutineDispatcher,
+) : PressToAuthInteractor {
+
+    /**
+     * A flow that contains the status of the press to auth feature.
+     */
+    override val isEnabled: Flow<Boolean> =
+
+        callbackFlow {
+            val callback =
+                object : ContentObserver(null) {
+                    override fun onChange(selfChange: Boolean) {
+                        Log.d(TAG, "SFPS_PERFORMANT_AUTH_ENABLED#onchange")
+                        trySend(
+                            getPressToAuth(),
+                        )
+                    }
+                }
+
+            context.contentResolver.registerContentObserver(
+                Settings.Secure.getUriFor(Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED),
+                false,
+                callback,
+                context.userId
+            )
+            trySend(getPressToAuth())
+            awaitClose {
+                context.contentResolver.unregisterContentObserver(callback)
+            }
+        }.flowOn(backgroundDispatcher)
+
+
+    /**
+     * Returns true if press to auth is enabled
+     */
+    private fun getPressToAuth(): Boolean {
+        var toReturn: Int =
+            Settings.Secure.getIntForUser(
+                context.contentResolver,
+                Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+                -1,
+                context.userId,
+            )
+        if (toReturn == -1) {
+            toReturn =
+                if (
+                    context.resources.getBoolean(com.android.internal.R.bool.config_performantAuthDefault)
+                ) {
+                    1
+                } else {
+                    0
+                }
+            Settings.Secure.putIntForUser(
+                context.contentResolver,
+                Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
+                toReturn,
+                context.userId,
+            )
+        }
+        return toReturn == 1
+
+    }
+
+    companion object {
+        const val TAG = "PressToAuthInteractor"
+    }
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
index 6e6df23..c0e1b4a 100644
--- a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/FingerprintManagerInteractor.kt
@@ -75,7 +75,4 @@
 
   /** Indicates if the device has side fingerprint */
   suspend fun hasSideFps(): Boolean
-
-  /** Indicates if the press to auth feature has been enabled */
-  suspend fun pressToAuthEnabled(): Boolean
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
index f7e6135..9f3935b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt
@@ -30,16 +30,20 @@
 import androidx.lifecycle.lifecycleScope
 import com.android.internal.widget.LockPatternUtils
 import com.android.settings.R
-import com.android.settings.SettingsApplication
 import com.android.settings.SetupWizardUtils
 import com.android.settings.Utils.SETTINGS_PACKAGE_NAME
 import com.android.settings.biometrics.BiometricEnrollBase
 import com.android.settings.biometrics.BiometricEnrollBase.CONFIRM_REQUEST
 import com.android.settings.biometrics.BiometricEnrollBase.RESULT_FINISHED
 import com.android.settings.biometrics.GatekeeperPasswordProvider
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractorImpl
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractorImpl
 import com.android.settings.biometrics.fingerprint2.lib.model.Default
 import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment
@@ -48,7 +52,6 @@
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment.RFPSEnrollFragment
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
@@ -66,9 +69,7 @@
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.TransitionStep
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
 import com.android.settings.password.ChooseLockGeneric
 import com.android.settings.password.ChooseLockSettingsHelper
 import com.android.settings.password.ChooseLockSettingsHelper.EXTRA_KEY_GK_PW_HANDLE
@@ -90,9 +91,8 @@
   private lateinit var navigationViewModel: FingerprintNavigationViewModel
   private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
   private lateinit var fingerprintEnrollViewModel: FingerprintEnrollViewModel
-  private lateinit var accessibilityViewModel: AccessibilityViewModel
-  private lateinit var foldStateViewModel: FoldStateViewModel
-  private lateinit var orientationStateViewModel: OrientationStateViewModel
+  private lateinit var foldStateInteractor: FoldStateInteractor
+  private lateinit var orientationInteractor: OrientationInteractor
   private lateinit var fingerprintScrollViewModel: FingerprintScrollViewModel
   private lateinit var backgroundViewModel: BackgroundViewModel
   private lateinit var fingerprintFlowViewModel: FingerprintFlowViewModel
@@ -127,7 +127,7 @@
 
   override fun onConfigurationChanged(newConfig: Configuration) {
     super.onConfigurationChanged(newConfig)
-    foldStateViewModel.onConfigurationChange(newConfig)
+    foldStateInteractor.onConfigurationChange(newConfig)
   }
 
   private fun onConfirmDevice(resultCode: Int, data: Intent?) {
@@ -179,7 +179,8 @@
         FingerprintFlowViewModel::class.java]
 
     val fingerprintSensorRepo =
-      FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+      FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+    val pressToAuthInteractor = PressToAuthInteractorImpl(context, backgroundDispatcher)
 
     val fingerprintManagerInteractor =
       FingerprintManagerInteractorImpl(
@@ -188,7 +189,7 @@
         fingerprintManager,
         fingerprintSensorRepo,
         GatekeeperPasswordProvider(LockPatternUtils(context)),
-        PressToAuthRepoImpl(context),
+        pressToAuthInteractor,
         enrollType,
       )
 
@@ -198,6 +199,12 @@
 
     val hasConfirmedDeviceCredential = gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo
 
+    val accessibilityInteractor =
+      AccessibilityInteractorImpl(
+        getSystemService(AccessibilityManager::class.java)!!,
+        lifecycleScope,
+      )
+
     navigationViewModel =
       ViewModelProvider(
         this,
@@ -228,10 +235,10 @@
       )[FingerprintGatekeeperViewModel::class.java]
 
     // Initialize FoldStateViewModel
-    foldStateViewModel =
-      ViewModelProvider(this, FoldStateViewModel.FoldStateViewModelFactory(context))[
-        FoldStateViewModel::class.java]
-    foldStateViewModel.onConfigurationChange(resources.configuration)
+    foldStateInteractor = FoldStateInteractorImpl(context)
+    foldStateInteractor.onConfigurationChange(resources.configuration)
+
+    orientationInteractor = OrientationInteractorImpl(context, lifecycleScope)
 
     // Initialize FingerprintViewModel
     fingerprintEnrollViewModel =
@@ -249,20 +256,6 @@
       ViewModelProvider(this, FingerprintScrollViewModel.FingerprintScrollViewModelFactory())[
         FingerprintScrollViewModel::class.java]
 
-    // Initialize AccessibilityViewModel
-    accessibilityViewModel =
-      ViewModelProvider(
-        this,
-        AccessibilityViewModel.AccessibilityViewModelFactory(
-          getSystemService(AccessibilityManager::class.java)!!
-        ),
-      )[AccessibilityViewModel::class.java]
-
-    // Initialize OrientationViewModel
-    orientationStateViewModel =
-      ViewModelProvider(this, OrientationStateViewModel.OrientationViewModelFactory(context))[
-        OrientationStateViewModel::class.java]
-
     // Initialize FingerprintEnrollEnrollingViewModel
     fingerprintEnrollEnrollingViewModel =
       ViewModelProvider(
@@ -281,18 +274,24 @@
         fingerprintEnrollViewModel,
         gatekeeperViewModel,
         backgroundViewModel,
-        accessibilityViewModel,
-        foldStateViewModel,
-        orientationStateViewModel,
+        accessibilityInteractor,
+        foldStateInteractor,
+        orientationInteractor,
         fingerprintFlowViewModel,
+        fingerprintManagerInteractor,
       ),
     )[FingerprintEnrollFindSensorViewModel::class.java]
 
     // Initialize RFPS View Model
     ViewModelProvider(
       this,
-      RFPSViewModel.RFPSViewModelFactory(fingerprintEnrollEnrollingViewModel, navigationViewModel),
+      RFPSViewModel.RFPSViewModelFactory(
+        fingerprintEnrollEnrollingViewModel,
+        navigationViewModel,
+        orientationInteractor,
+      ),
     )[RFPSViewModel::class.java]
+
     lifecycleScope.launch {
       navigationViewModel.currentStep.collect { step ->
         if (step is Init) {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
index 9603e6b..2b1ff9b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt
@@ -22,6 +22,7 @@
 import android.view.Surface
 import android.view.View
 import android.view.ViewGroup
+import androidx.annotation.VisibleForTesting
 import androidx.fragment.app.Fragment
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.lifecycleScope
@@ -30,7 +31,6 @@
 import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog
 import com.android.settings.biometrics.fingerprint.FingerprintFindSensorAnimation
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.google.android.setupcompat.template.FooterBarMixin
 import com.google.android.setupcompat.template.FooterButton
@@ -51,12 +51,31 @@
  *    will work.
  */
 class FingerprintEnrollFindSensorV2Fragment(val sensorType: FingerprintSensorType) : Fragment() {
+  /** Used for testing purposes */
+  private var factory: ViewModelProvider.Factory? = null
+
+  @VisibleForTesting
+  constructor(
+    sensorType: FingerprintSensorType,
+    theFactory: ViewModelProvider.Factory,
+  ) : this(sensorType) {
+    factory = theFactory
+  }
+
+  private val viewModelProvider: ViewModelProvider by lazy {
+    if (factory != null) {
+      ViewModelProvider(requireActivity(), factory!!)
+    } else {
+      ViewModelProvider(requireActivity())
+    }
+  }
+
   // This is only for non-udfps or non-sfps sensor. For udfps and sfps, we show lottie.
   private var animation: FingerprintFindSensorAnimation? = null
 
   private var contentLayoutId: Int = -1
   private val viewModel: FingerprintEnrollFindSensorViewModel by lazy {
-    ViewModelProvider(requireActivity())[FingerprintEnrollFindSensorViewModel::class.java]
+    viewModelProvider[FingerprintEnrollFindSensorViewModel::class.java]
   }
 
   override fun onCreateView(
@@ -65,9 +84,6 @@
     savedInstanceState: Bundle?,
   ): View? {
 
-    val sensorType =
-      ViewModelProvider(requireActivity())[FingerprintEnrollViewModel::class.java].sensorTypeCached
-
     contentLayoutId =
       when (sensorType) {
         FingerprintSensorType.UDFPS_OPTICAL,
@@ -76,46 +92,43 @@
         else -> R.layout.fingerprint_v2_enroll_find_sensor
       }
 
-    return inflater.inflate(contentLayoutId, container, false).also { it ->
-      val view = it!! as GlifLayout
+    val view = inflater.inflate(contentLayoutId, container, false)!! as GlifLayout
+    setTexts(sensorType, view)
 
-      // Set up header and description
-      lifecycleScope.launch { viewModel.sensorType.collect { setTexts(it, view) } }
+    // Set up footer bar
+    val footerBarMixin = view.getMixin(FooterBarMixin::class.java)
+    setupSecondaryButton(footerBarMixin)
+    lifecycleScope.launch {
+      viewModel.showPrimaryButton.collect { setupPrimaryButton(footerBarMixin) }
+    }
 
-      // Set up footer bar
-      val footerBarMixin = view.getMixin(FooterBarMixin::class.java)
-      setupSecondaryButton(footerBarMixin)
-      lifecycleScope.launch {
-        viewModel.showPrimaryButton.collect { setupPrimaryButton(footerBarMixin) }
-      }
-
-      // Set up lottie or animation
-      lifecycleScope.launch {
-        viewModel.sfpsLottieInfo.collect { (isFolded, rotation) ->
-          setupLottie(view, getSfpsIllustrationLottieAnimation(isFolded, rotation))
-        }
-      }
-      lifecycleScope.launch {
-        viewModel.udfpsLottieInfo.collect { isAccessibilityEnabled ->
-          val lottieAnimation =
-            if (isAccessibilityEnabled) R.raw.udfps_edu_a11y_lottie else R.raw.udfps_edu_lottie
-          setupLottie(view, lottieAnimation) { viewModel.proceedToEnrolling() }
-        }
-      }
-      lifecycleScope.launch {
-        viewModel.showRfpsAnimation.collect {
-          animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
-          animation!!.startAnimation()
-        }
-      }
-
-      lifecycleScope.launch {
-        viewModel.showErrorDialog.collect { (errMsgId, isSetup) ->
-          // TODO: Covert error dialog kotlin as well
-          FingerprintErrorDialog.showErrorDialog(requireActivity(), errMsgId, isSetup)
-        }
+    // Set up lottie or animation
+    lifecycleScope.launch {
+      viewModel.sfpsLottieInfo.collect { (isFolded, rotation) ->
+        setupLottie(view, getSfpsIllustrationLottieAnimation(isFolded, rotation))
       }
     }
+    lifecycleScope.launch {
+      viewModel.udfpsLottieInfo.collect { isAccessibilityEnabled ->
+        val lottieAnimation =
+          if (isAccessibilityEnabled) R.raw.udfps_edu_a11y_lottie else R.raw.udfps_edu_lottie
+        setupLottie(view, lottieAnimation) { viewModel.proceedToEnrolling() }
+      }
+    }
+    lifecycleScope.launch {
+      viewModel.showRfpsAnimation.collect {
+        animation = view.findViewById(R.id.fingerprint_sensor_location_animation)
+        animation!!.startAnimation()
+      }
+    }
+
+    lifecycleScope.launch {
+      viewModel.showErrorDialog.collect { (errMsgId, isSetup) ->
+        // TODO: Covert error dialog kotlin as well
+        FingerprintErrorDialog.showErrorDialog(requireActivity(), errMsgId, isSetup)
+      }
+    }
+    return view
   }
 
   override fun onDestroy() {
@@ -158,7 +171,7 @@
     illustrationLottie?.visibility = View.VISIBLE
   }
 
-  private fun setTexts(sensorType: FingerprintSensorType, view: GlifLayout) {
+  private fun setTexts(sensorType: FingerprintSensorType?, view: GlifLayout) {
     when (sensorType) {
       FingerprintSensorType.UDFPS_OPTICAL,
       FingerprintSensorType.UDFPS_ULTRASONIC -> {
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
index c6e284a..a9cd16f 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/fragment/RFPSEnrollFragment.kt
@@ -26,12 +26,14 @@
 import android.view.animation.AnimationUtils
 import android.view.animation.Interpolator
 import android.widget.TextView
+import androidx.annotation.VisibleForTesting
 import androidx.fragment.app.Fragment
 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.biometrics.fingerprint2.domain.interactor.OrientationInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
@@ -41,18 +43,34 @@
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
 import com.android.settings.core.instrumentation.InstrumentedDialogFragment
 import com.google.android.setupcompat.template.FooterBarMixin
 import com.google.android.setupcompat.template.FooterButton
 import com.google.android.setupdesign.GlifLayout
+import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.collectLatest
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.launch
 
 /** This fragment is responsible for taking care of rear fingerprint enrollment. */
-class RFPSEnrollFragment : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
+class RFPSEnrollFragment() : Fragment(R.layout.fingerprint_v2_rfps_enroll_enrolling) {
+
+  /** Used for testing purposes */
+  private var factory: ViewModelProvider.Factory? = null
+
+  @VisibleForTesting
+  constructor(theFactory: ViewModelProvider.Factory) : this() {
+    factory = theFactory
+  }
+
+  private val viewModelProvider: ViewModelProvider by lazy {
+    if (factory != null) {
+      ViewModelProvider(requireActivity(), factory!!)
+    } else {
+      ViewModelProvider(requireActivity())
+    }
+  }
 
   private lateinit var linearOutSlowInInterpolator: Interpolator
   private lateinit var fastOutLinearInInterpolator: Interpolator
@@ -60,24 +78,14 @@
   private lateinit var progressBar: RFPSProgressBar
 
   private val iconTouchViewModel: RFPSIconTouchViewModel by lazy {
-    ViewModelProvider(requireActivity())[RFPSIconTouchViewModel::class.java]
+    viewModelProvider[RFPSIconTouchViewModel::class.java]
   }
 
-  private val orientationViewModel: OrientationStateViewModel by lazy {
-    ViewModelProvider(requireActivity())[OrientationStateViewModel::class.java]
-  }
-
-  private val rfpsViewModel: RFPSViewModel by lazy {
-    ViewModelProvider(requireActivity())[RFPSViewModel::class.java]
-  }
+  private val rfpsViewModel: RFPSViewModel by lazy { viewModelProvider[RFPSViewModel::class.java] }
 
   private val backgroundViewModel: BackgroundViewModel by lazy {
-    ViewModelProvider(requireActivity())[BackgroundViewModel::class.java]
+    viewModelProvider[BackgroundViewModel::class.java]
   }
-  private val navigationViewModel: FingerprintNavigationViewModel by lazy {
-    ViewModelProvider(requireActivity())[FingerprintNavigationViewModel::class.java]
-  }
-
   override fun onCreateView(
     inflater: LayoutInflater,
     container: ViewGroup?,
@@ -115,9 +123,8 @@
       true
     }
 
-    // On any orientation event, dismiss dialogs.
     viewLifecycleOwner.lifecycleScope.launch {
-      orientationViewModel.orientation.collect { dismissDialogs() }
+      rfpsViewModel.shouldDismissDialog.collect { dismissDialogs() }
     }
 
     // Signal we are ready for enrollment.
@@ -127,6 +134,8 @@
       repeatOnLifecycle(Lifecycle.State.RESUMED) {
         // Icon animation  update
         viewLifecycleOwner.lifecycleScope.launch {
+          // TODO(b/324427704): Fix this delay
+          delay(100)
           rfpsViewModel.shouldAnimateIcon.collect { animate ->
             progressBar.updateIconAnimation(animate)
           }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
index 99250e6..2408a88 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/viewmodel/RFPSViewModel.kt
@@ -19,6 +19,7 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
@@ -39,10 +40,11 @@
 class RFPSViewModel(
   private val fingerprintEnrollViewModel: FingerprintEnrollEnrollingViewModel,
   private val navigationViewModel: FingerprintNavigationViewModel,
+  orientationInteractor: OrientationInteractor,
 ) : ViewModel() {
 
-  /** Value to indicate if the text view is visible or not */
   private val _textViewIsVisible = MutableStateFlow<Boolean>(false)
+  /** Value to indicate if the text view is visible or not */
   val textViewIsVisible: Flow<Boolean> = _textViewIsVisible.asStateFlow()
 
   /** Indicates if the icon should be animating or not */
@@ -78,8 +80,12 @@
       .filterIsInstance<FingerEnrollState.EnrollError>()
       .shareIn(viewModelScope, SharingStarted.Eagerly, 0)
 
+  /** Indicates that enrollment was completed. */
   val didCompleteEnrollment: Flow<Boolean> = progress.filterNotNull().map { it.remainingSteps == 0 }
 
+  /** Indicates if the fragment should dismiss a dialog if one was shown. */
+  val shouldDismissDialog = orientationInteractor.orientation.map { true }
+
   /** Indicates if the consumer is ready for enrollment */
   fun readyForEnrollment() {
     fingerprintEnrollViewModel.canEnroll()
@@ -90,6 +96,7 @@
     fingerprintEnrollViewModel.stopEnroll()
   }
 
+  /** Set the visibility of the text view */
   fun setVisibility(isVisible: Boolean) {
     _textViewIsVisible.update { isVisible }
   }
@@ -122,6 +129,7 @@
     )
   }
 
+  /** Indicates that enrollment has been finished and we can proceed to the next step. */
   fun finishedSuccessfully() {
     navigationViewModel.update(FingerprintAction.NEXT, navStep, "${TAG}#progressFinished")
   }
@@ -129,11 +137,17 @@
   class RFPSViewModelFactory(
     private val fingerprintEnrollEnrollingViewModel: FingerprintEnrollEnrollingViewModel,
     private val navigationViewModel: FingerprintNavigationViewModel,
+    private val orientationInteractor: OrientationInteractor,
   ) : ViewModelProvider.Factory {
 
     @Suppress("UNCHECKED_CAST")
     override fun <T : ViewModel> create(modelClass: Class<T>): T {
-      return RFPSViewModel(fingerprintEnrollEnrollingViewModel, navigationViewModel) as T
+      return RFPSViewModel(
+        fingerprintEnrollEnrollingViewModel,
+        navigationViewModel,
+        orientationInteractor,
+      )
+        as T
     }
   }
 
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
index fe62681..5a6fc14 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/modules/enrolling/rfps/ui/widget/RFPSProgressBar.kt
@@ -24,14 +24,14 @@
 import android.graphics.drawable.Drawable
 import android.graphics.drawable.LayerDrawable
 import android.util.AttributeSet
+import android.util.Log
 import android.view.animation.AnimationUtils
 import android.view.animation.Interpolator
 import com.android.settings.R
 import com.android.settings.widget.RingProgressBar
 
 /** Progress bar for rear fingerprint enrollment. */
-class RFPSProgressBar(context: Context, attributeSet: AttributeSet) :
-  RingProgressBar(context, attributeSet) {
+class RFPSProgressBar : RingProgressBar {
 
   private val fastOutSlowInInterpolator: Interpolator
 
@@ -42,9 +42,9 @@
 
   private var progressAnimation: ObjectAnimator? = null
 
-  private var shouldAnimateInternal: Boolean = true
+  private var shouldAnimateInternal: Boolean = false
 
-  init {
+  constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) {
     val fingerprintDrawable = background as LayerDrawable
     iconAnimationDrawable =
       fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_animation)
@@ -52,10 +52,8 @@
     iconBackgroundBlinksDrawable =
       fingerprintDrawable.findDrawableByLayerId(R.id.fingerprint_background)
         as AnimatedVectorDrawable
-
     fastOutSlowInInterpolator =
       AnimationUtils.loadInterpolator(context, android.R.interpolator.fast_out_slow_in)
-
     iconAnimationDrawable.registerAnimationCallback(
       object : Animatable2.AnimationCallback() {
         override fun onAnimationEnd(drawable: Drawable?) {
@@ -66,7 +64,6 @@
         }
       }
     )
-    animateIconAnimationInternal()
 
     progressBackgroundTintMode = PorterDuff.Mode.SRC
 
@@ -85,8 +82,8 @@
     }
 
     shouldAnimateInternal = shouldAnimate
-  }
 
+  }
   /** This function should only be called when actual progress has been made. */
   fun updateProgress(percentComplete: Float) {
     val progress = maxProgress - (percentComplete.coerceIn(0.0f, 100.0f) * maxProgress).toInt()
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
deleted file mode 100644
index 608b370..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/AccessibilityViewModel.kt
+++ /dev/null
@@ -1,54 +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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.view.accessibility.AccessibilityManager
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.stateIn
-
-/** Represents all of the information on accessibility state. */
-class AccessibilityViewModel(accessibilityManager: AccessibilityManager) : ViewModel() {
-  /** A flow that contains whether or not accessibility is enabled */
-  val isAccessibilityEnabled: Flow<Boolean> =
-    callbackFlow {
-        val listener =
-          AccessibilityManager.AccessibilityStateChangeListener { enabled -> trySend(enabled) }
-        accessibilityManager.addAccessibilityStateChangeListener(listener)
-
-        // This clause will be called when no one is listening to the flow
-        awaitClose { accessibilityManager.removeAccessibilityStateChangeListener(listener) }
-      }
-      .stateIn(
-        viewModelScope, // This is going to tied to the view model scope
-        SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
-        false,
-      )
-
-  class AccessibilityViewModelFactory(private val accessibilityManager: AccessibilityManager) :
-    ViewModelProvider.Factory {
-    @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(modelClass: Class<T>): T {
-      return AccessibilityViewModel(accessibilityManager) as T
-    }
-  }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
index 92261b1..3bf806b 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollFindSensorViewModel.kt
@@ -19,6 +19,10 @@
 import androidx.lifecycle.ViewModel
 import androidx.lifecycle.ViewModelProvider
 import androidx.lifecycle.viewModelScope
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
 import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
@@ -26,13 +30,11 @@
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
-import kotlinx.coroutines.flow.SharingStarted
 import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.combineTransform
 import kotlinx.coroutines.flow.filter
 import kotlinx.coroutines.flow.filterNotNull
 import kotlinx.coroutines.flow.map
-import kotlinx.coroutines.flow.shareIn
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
 
@@ -42,19 +44,16 @@
   private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
   private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
   backgroundViewModel: BackgroundViewModel,
-  accessibilityViewModel: AccessibilityViewModel,
-  foldStateViewModel: FoldStateViewModel,
-  orientationStateViewModel: OrientationStateViewModel,
+  accessibilityInteractor: AccessibilityInteractor,
+  foldStateInteractor: FoldStateInteractor,
+  orientationInteractor: OrientationInteractor,
   fingerprintFlowViewModel: FingerprintFlowViewModel,
+  fingerprintManagerInteractor: FingerprintManagerInteractor,
 ) : ViewModel() {
 
   /** Represents the stream of sensor type. */
   val sensorType: Flow<FingerprintSensorType> =
-    fingerprintEnrollViewModel.sensorType.shareIn(
-      viewModelScope,
-      SharingStarted.WhileSubscribed(),
-      1,
-    )
+    fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map { it.sensorType }
   private val _isUdfps: Flow<Boolean> =
     sensorType.map {
       it == FingerprintSensorType.UDFPS_OPTICAL || it == FingerprintSensorType.UDFPS_ULTRASONIC
@@ -70,8 +69,8 @@
   val sfpsLottieInfo: Flow<Pair<Boolean, Int>> =
     combineTransform(
       _showSfpsLottie,
-      foldStateViewModel.isFolded,
-      orientationStateViewModel.rotation,
+      foldStateInteractor.isFolded,
+      orientationInteractor.rotation,
     ) { _, isFolded, rotation ->
       emit(Pair(isFolded, rotation))
     }
@@ -79,7 +78,7 @@
   private val _showUdfpsLottie = _isUdfps.filter { it }
   /** Represents the stream of showing udfps lottie and whether accessibility is enabled. */
   val udfpsLottieInfo: Flow<Boolean> =
-    _showUdfpsLottie.combine(accessibilityViewModel.isAccessibilityEnabled) {
+    _showUdfpsLottie.combine(accessibilityInteractor.isAccessibilityEnabled) {
       _,
       isAccessibilityEnabled ->
       isAccessibilityEnabled
@@ -104,7 +103,7 @@
     // Start or end enroll flow
     viewModelScope.launch {
       combine(
-          fingerprintEnrollViewModel.sensorType,
+          sensorType,
           gatekeeperViewModel.hasValidGatekeeperInfo,
           gatekeeperViewModel.gatekeeperInfo,
           navigationViewModel.currentScreen,
@@ -188,10 +187,11 @@
     private val fingerprintEnrollViewModel: FingerprintEnrollViewModel,
     private val gatekeeperViewModel: FingerprintGatekeeperViewModel,
     private val backgroundViewModel: BackgroundViewModel,
-    private val accessibilityViewModel: AccessibilityViewModel,
-    private val foldStateViewModel: FoldStateViewModel,
-    private val orientationStateViewModel: OrientationStateViewModel,
+    private val accessibilityInteractor: AccessibilityInteractor,
+    private val foldStateInteractor: FoldStateInteractor,
+    private val orientationInteractor: OrientationInteractor,
     private val fingerprintFlowViewModel: FingerprintFlowViewModel,
+    private val fingerprintManagerInteractor: FingerprintManagerInteractor,
   ) : ViewModelProvider.Factory {
     @Suppress("UNCHECKED_CAST")
     override fun <T : ViewModel> create(modelClass: Class<T>): T {
@@ -200,10 +200,11 @@
         fingerprintEnrollViewModel,
         gatekeeperViewModel,
         backgroundViewModel,
-        accessibilityViewModel,
-        foldStateViewModel,
-        orientationStateViewModel,
+        accessibilityInteractor,
+        foldStateInteractor,
+        orientationInteractor,
         fingerprintFlowViewModel,
+        fingerprintManagerInteractor,
       )
         as T
     }
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
index c2cff5e..c27808d 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollViewModel.kt
@@ -56,7 +56,7 @@
     }
 
   /** Represents the stream of [FingerprintSensorType] */
-  val sensorType: Flow<FingerprintSensorType> =
+  val sensorType: Flow<FingerprintSensorType?> =
     fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map { it.sensorType }
 
   /**
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
deleted file mode 100644
index 94a70b0..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/FoldStateViewModel.kt
+++ /dev/null
@@ -1,56 +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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.content.Context
-import android.content.res.Configuration
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import com.android.systemui.unfold.compat.ScreenSizeFoldProvider
-import com.android.systemui.unfold.updates.FoldProvider
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.callbackFlow
-
-/** Represents all of the information on fold state. */
-class FoldStateViewModel(context: Context) : ViewModel() {
-
-  private val screenSizeFoldProvider = ScreenSizeFoldProvider(context)
-
-  /** A flow that contains the fold state info */
-  val isFolded: Flow<Boolean> = callbackFlow {
-    val foldStateListener =
-      object : FoldProvider.FoldCallback {
-        override fun onFoldUpdated(isFolded: Boolean) {
-          trySend(isFolded)
-        }
-      }
-    screenSizeFoldProvider.registerCallback(foldStateListener, context.mainExecutor)
-    awaitClose { screenSizeFoldProvider.unregisterCallback(foldStateListener) }
-  }
-
-  fun onConfigurationChange(newConfig: Configuration) {
-    screenSizeFoldProvider.onConfigurationChange(newConfig)
-  }
-
-  class FoldStateViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
-    @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(modelClass: Class<T>): T {
-      return FoldStateViewModel(context) as T
-    }
-  }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
deleted file mode 100644
index dd266e1..0000000
--- a/src/com/android/settings/biometrics/fingerprint2/ui/enrollment/viewmodel/OrientationStateViewModel.kt
+++ /dev/null
@@ -1,80 +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.biometrics.fingerprint2.ui.enrollment.viewmodel
-
-import android.content.Context
-import android.view.OrientationEventListener
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.lifecycle.viewModelScope
-import com.android.internal.R
-import kotlinx.coroutines.channels.awaitClose
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.SharingStarted
-import kotlinx.coroutines.flow.callbackFlow
-import kotlinx.coroutines.flow.stateIn
-
-/** Represents all of the information on orientation state and rotation state. */
-class OrientationStateViewModel(private val context: Context) : ViewModel() {
-
-  /** A flow that contains the orientation info */
-  val orientation: Flow<Int> = callbackFlow {
-    val orientationEventListener =
-      object : OrientationEventListener(context) {
-        override fun onOrientationChanged(orientation: Int) {
-          trySend(orientation)
-        }
-      }
-    orientationEventListener.enable()
-    awaitClose { orientationEventListener.disable() }
-  }
-
-  /** A flow that contains the rotation info */
-  val rotation: Flow<Int> =
-    callbackFlow {
-        val orientationEventListener =
-          object : OrientationEventListener(context) {
-            override fun onOrientationChanged(orientation: Int) {
-              trySend(getRotationFromDefault(context.display!!.rotation))
-            }
-          }
-        orientationEventListener.enable()
-        awaitClose { orientationEventListener.disable() }
-      }
-      .stateIn(
-        viewModelScope, // This is going to tied to the view model scope
-        SharingStarted.WhileSubscribed(), // When no longer subscribed, we removeTheListener
-        context.display!!.rotation,
-      )
-
-  fun getRotationFromDefault(rotation: Int): Int {
-    val isReverseDefaultRotation =
-      context.resources.getBoolean(R.bool.config_reverseDefaultRotation)
-    return if (isReverseDefaultRotation) {
-      (rotation + 1) % 4
-    } else {
-      rotation
-    }
-  }
-
-  class OrientationViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
-    @Suppress("UNCHECKED_CAST")
-    override fun <T : ViewModel> create(modelClass: Class<T>): T {
-      return OrientationStateViewModel(context) as T
-    }
-  }
-}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
index 05bb329..a5f2021 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/fragment/FingerprintSettingsV2Fragment.kt
@@ -45,8 +45,8 @@
 import com.android.settings.biometrics.GatekeeperPasswordProvider
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollEnrolling
 import com.android.settings.biometrics.fingerprint.FingerprintEnrollIntroductionInternal
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepoImpl
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepoImpl
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepositoryImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractorImpl
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
@@ -220,7 +220,8 @@
       toReturn == 1
     }
     val fingerprintSensorProvider =
-      FingerprintSensorRepoImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+      FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, lifecycleScope)
+    val pressToAuthInteractor = PressToAuthInteractorImpl(context, backgroundDispatcher)
 
     val interactor =
       FingerprintManagerInteractorImpl(
@@ -229,7 +230,7 @@
         fingerprintManager,
         fingerprintSensorProvider,
         GatekeeperPasswordProvider(LockPatternUtils(context.applicationContext)),
-        PressToAuthRepoImpl(context),
+        pressToAuthInteractor,
         Settings,
       )
 
diff --git a/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/OWNERS b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/OWNERS
new file mode 100644
index 0000000..9f0a21a
--- /dev/null
+++ b/tests/robotests/src/com/android/settings/biometrics/fingerprint2/fragment/OWNERS
@@ -0,0 +1 @@
+include /src/com/android/settings/biometrics/fingerprint2/OWNERS
\ No newline at end of file
diff --git a/tests/screenshot/AndroidManifest.xml b/tests/screenshot/AndroidManifest.xml
index 6c8bb88..9273270 100644
--- a/tests/screenshot/AndroidManifest.xml
+++ b/tests/screenshot/AndroidManifest.xml
@@ -23,6 +23,8 @@
 
     <application>
         <activity android:name="com.android.settings.test.screenshot.ContainerActivity" android:exported="true" />
+        <activity android:name="platform.test.screenshot.FragmentScreenshotActivity" android:exported="true"
+            android:theme="@style/GlifTheme.Light" />
     </application>
 
-</manifest>
\ No newline at end of file
+</manifest>
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_enrolling.png b/tests/screenshot/assets/robolectric/fp_enroll_enrolling.png
new file mode 100644
index 0000000..1299f2a
--- /dev/null
+++ b/tests/screenshot/assets/robolectric/fp_enroll_enrolling.png
Binary files differ
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_find_sensor.png b/tests/screenshot/assets/robolectric/fp_enroll_find_sensor.png
new file mode 100644
index 0000000..a252e5e
--- /dev/null
+++ b/tests/screenshot/assets/robolectric/fp_enroll_find_sensor.png
Binary files differ
diff --git a/tests/screenshot/assets/robolectric/fp_enroll_intro.png b/tests/screenshot/assets/robolectric/fp_enroll_intro.png
index 308ab55..3cd9f4a 100644
--- a/tests/screenshot/assets/robolectric/fp_enroll_intro.png
+++ b/tests/screenshot/assets/robolectric/fp_enroll_intro.png
Binary files differ
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
deleted file mode 100644
index 493a669..0000000
--- a/tests/screenshot/src/com/android/settings/tests/screenshot/BasicScreenshotTest.kt
+++ /dev/null
@@ -1,142 +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.tests.screenshot
-
-import android.content.Context
-import android.graphics.Bitmap
-import android.graphics.Canvas
-import android.graphics.Color
-import android.os.Bundle
-import android.view.View
-import androidx.fragment.app.testing.FragmentScenario
-import androidx.fragment.app.testing.launchFragmentInContainer
-import androidx.lifecycle.ViewModel
-import androidx.lifecycle.ViewModelProvider
-import androidx.test.core.app.ApplicationProvider
-import androidx.test.ext.junit.runners.AndroidJUnit4
-import androidx.test.platform.app.InstrumentationRegistry
-import com.android.settings.R
-import com.android.settings.biometrics.fingerprint2.lib.model.Default
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
-import com.android.settings.testutils2.FakeFingerprintManagerInteractor
-import com.android.systemui.biometrics.shared.model.FingerprintSensor
-import com.android.systemui.biometrics.shared.model.FingerprintSensorType
-import com.android.systemui.biometrics.shared.model.SensorStrength
-import kotlinx.coroutines.test.StandardTestDispatcher
-import org.junit.Before
-import org.junit.Rule
-import org.junit.Test
-import org.junit.runner.RunWith
-import platform.test.screenshot.GoldenImagePathManager
-import platform.test.screenshot.ScreenshotTestRule
-import platform.test.screenshot.matchers.MSSIMMatcher
-
-@RunWith(AndroidJUnit4::class)
-class BasicScreenshotTest {
-  @Rule
-  @JvmField
-  var rule: ScreenshotTestRule =
-    ScreenshotTestRule(
-      GoldenImagePathManager(
-        InstrumentationRegistry.getInstrumentation().getContext(),
-        InstrumentationRegistry.getInstrumentation()
-          .getTargetContext()
-          .getFilesDir()
-          .getAbsolutePath() + "/settings_screenshots",
-      )
-    )
-
-  private var context: Context = ApplicationProvider.getApplicationContext()
-  private var interactor = FakeFingerprintManagerInteractor()
-
-  private val gatekeeperViewModel =
-    FingerprintGatekeeperViewModel(
-      GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 2, 3), 100L),
-      interactor,
-    )
-
-  private val backgroundDispatcher = StandardTestDispatcher()
-  private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
-  private val fingerprintSensor =
-    FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
-
-  var enrollFlow = Default
-  val flowViewModel = FingerprintFlowViewModel(enrollFlow)
-
-  private val navigationViewModel =
-    FingerprintNavigationViewModel(
-      FingerprintNavigationStep.Introduction,
-      false,
-      flowViewModel,
-      interactor,
-    )
-
-  private var fingerprintViewModel =
-    FingerprintEnrollIntroViewModel(navigationViewModel, flowViewModel, interactor)
-  private var fingerprintScrollViewModel = FingerprintScrollViewModel()
-
-  @Before
-  fun setup() {
-    val factory =
-      object : ViewModelProvider.Factory {
-        @Suppress("UNCHECKED_CAST")
-        override fun <T : ViewModel> create(modelClass: Class<T>): T {
-          return when (modelClass) {
-            FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
-            FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
-            FingerprintNavigationViewModel::class.java -> navigationViewModel
-            FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
-            else -> null
-          }
-            as T
-        }
-      }
-
-    fragmentScenario =
-      launchFragmentInContainer(Bundle(), R.style.SudThemeGlif) {
-        FingerprintEnrollIntroV2Fragment(factory)
-      }
-  }
-
-  /** Renders a [view] into a [Bitmap]. */
-  private fun viewToBitmap(view: View): Bitmap {
-    val bitmap =
-      Bitmap.createBitmap(view.measuredWidth, view.measuredHeight, Bitmap.Config.ARGB_8888)
-    val canvas = Canvas(bitmap)
-    view.draw(canvas)
-    return bitmap
-  }
-
-  @Test
-  fun testEnrollIntro() {
-    fragmentScenario.onFragment { fragment ->
-      val view = fragment.requireView().findViewById<View>(R.id.enroll_intro_content_view)!!
-      view.setBackgroundColor(Color.BLACK)
-    }
-    fragmentScenario.onFragment { fragment ->
-      val view = fragment.requireView().findViewById<View>(R.id.enroll_intro_content_view)!!
-      rule.assertBitmapAgainstGolden(viewToBitmap(view), "fp_enroll_intro", MSSIMMatcher())
-    }
-  }
-}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/README.md b/tests/screenshot/src/com/android/settings/tests/screenshot/README.md
new file mode 100644
index 0000000..299265a
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/README.md
@@ -0,0 +1,12 @@
+# Background info about tests
+1. This test is ran in postsubmits at andoid-settings/robo_tests.gcl
+2. It is important that this module stays somewhat small, if the test size grows
+   too large, it will be likely that this suite breaks due to flakiness(which
+   tends to happen with screenshot tests). In this case investigate splitting
+   the module.
+
+#  Running and updating screenshots.
+1. For FingerprintEnrollIntroScreenshotTest.kt#testEnrollIntro
+2. atest SettingsScreenshotRNGTests
+3. There should be a file like com.android.settings.tests.screenshot.biometrics.fingerprint.fragment.FingerprintEnrollIntroScreenshotTest_testEnrollIntro_actual_robolectric_fp_enroll_intro.png_6245562387930305138.png
+4. Place this screenshot in packages/apps/Settings/tests/screenshot/assets/robolectric/fp_enroll_intro.png
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
new file mode 100644
index 0000000..84d76ff
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/Injector.kt
@@ -0,0 +1,161 @@
+/*
+ * 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.tests.screenshot.biometrics.fingerprint
+
+import android.content.res.Configuration
+import android.view.Surface
+import androidx.lifecycle.ViewModel
+import androidx.lifecycle.ViewModelProvider
+import androidx.test.platform.app.InstrumentationRegistry
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
+import com.android.settings.biometrics.fingerprint2.lib.model.Default
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSIconTouchViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.viewmodel.RFPSViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollEnrollingViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollIntroViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
+import com.android.settings.testutils2.FakeFingerprintManagerInteractor
+import com.android.systemui.biometrics.shared.model.FingerprintSensor
+import com.android.systemui.biometrics.shared.model.FingerprintSensorType
+import com.android.systemui.biometrics.shared.model.SensorStrength
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.update
+import platform.test.screenshot.DeviceEmulationSpec
+import platform.test.screenshot.DisplaySpec
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.GoldenImagePathManager
+import platform.test.screenshot.matchers.PixelPerfectMatcher
+
+class Injector(step: FingerprintNavigationStep.UiStep) {
+
+  var enrollFlow = Default
+  var fingerprintSensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.REAR)
+  var accessibilityInteractor =
+    object : AccessibilityInteractor {
+      override val isAccessibilityEnabled: Flow<Boolean> = flowOf(true)
+    }
+
+  var foldStateInteractor =
+    object : FoldStateInteractor {
+      private val _foldState = MutableStateFlow(false)
+      override val isFolded: Flow<Boolean> = _foldState.asStateFlow()
+
+      override fun onConfigurationChange(newConfig: Configuration) {
+        _foldState.update { false }
+      }
+    }
+
+  var orientationInteractor =
+    object : OrientationInteractor {
+      override val orientation: Flow<Int> = flowOf(Configuration.ORIENTATION_LANDSCAPE)
+      override val rotation: Flow<Int> = flowOf(Surface.ROTATION_0)
+
+      override fun getRotationFromDefault(rotation: Int): Int = rotation
+    }
+  var gatekeeperViewModel =
+    FingerprintGatekeeperViewModel(
+      GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 2, 3), 100L),
+      interactor,
+    )
+
+  val flowViewModel = FingerprintFlowViewModel(enrollFlow)
+
+  var navigationViewModel = FingerprintNavigationViewModel(step, true, flowViewModel, interactor)
+  var fingerprintViewModel =
+    FingerprintEnrollIntroViewModel(navigationViewModel, flowViewModel, interactor)
+
+  var fingerprintScrollViewModel = FingerprintScrollViewModel()
+  var backgroundViewModel = BackgroundViewModel()
+
+  var fingerprintEnrollViewModel =
+    FingerprintEnrollViewModel(interactor, gatekeeperViewModel, navigationViewModel)
+
+  var fingerprintEnrollEnrollingViewModel =
+    FingerprintEnrollEnrollingViewModel(fingerprintEnrollViewModel, backgroundViewModel)
+
+  var rfpsIconTouchViewModel = RFPSIconTouchViewModel()
+  var rfpsViewModel =
+    RFPSViewModel(fingerprintEnrollEnrollingViewModel, navigationViewModel, orientationInteractor)
+
+  var fingerprintFindSensorViewModel =
+    FingerprintEnrollFindSensorViewModel(
+      navigationViewModel,
+      fingerprintEnrollViewModel,
+      gatekeeperViewModel,
+      backgroundViewModel,
+      accessibilityInteractor,
+      foldStateInteractor,
+      orientationInteractor,
+      flowViewModel,
+      interactor,
+    )
+
+  val factory =
+    object : ViewModelProvider.Factory {
+      @Suppress("UNCHECKED_CAST")
+      override fun <T : ViewModel> create(modelClass: Class<T>): T {
+        return when (modelClass) {
+          FingerprintEnrollIntroViewModel::class.java -> fingerprintViewModel
+          FingerprintScrollViewModel::class.java -> fingerprintScrollViewModel
+          FingerprintNavigationViewModel::class.java -> navigationViewModel
+          FingerprintGatekeeperViewModel::class.java -> gatekeeperViewModel
+          FingerprintEnrollFindSensorViewModel::class.java -> fingerprintFindSensorViewModel
+          FingerprintEnrollViewModel::class.java -> fingerprintEnrollViewModel
+          RFPSViewModel::class.java -> rfpsViewModel
+          BackgroundViewModel::class.java -> backgroundViewModel
+          RFPSIconTouchViewModel::class.java -> rfpsIconTouchViewModel
+          FingerprintEnrollEnrollingViewModel::class.java -> fingerprintEnrollEnrollingViewModel
+          else -> null
+        }
+          as T
+      }
+    }
+
+  init {
+    fingerprintEnrollViewModel.sensorTypeCached = fingerprintSensor.sensorType
+  }
+
+  companion object {
+    private val Phone = DisplaySpec("phone", width = 1080, height = 2340, densityDpi = 420)
+    private const val screenshotPath = "/settings_screenshots"
+    val interactor = FakeFingerprintManagerInteractor()
+
+    fun BiometricFragmentScreenShotRule() =
+      FragmentScreenshotTestRule(
+        DeviceEmulationSpec.forDisplays(Phone).first(),
+        GoldenImagePathManager(
+          InstrumentationRegistry.getInstrumentation().context,
+          InstrumentationRegistry.getInstrumentation().targetContext.filesDir.absolutePath +
+            screenshotPath,
+        ),
+        PixelPerfectMatcher(),
+        true,
+      )
+  }
+}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollEnrollingScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollEnrollingScreenshotTest.kt
new file mode 100644
index 0000000..215e76f
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollEnrollingScreenshotTest.kt
@@ -0,0 +1,40 @@
+/*
+ * 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.tests.screenshot.biometrics.fingerprint.fragment
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.modules.enrolling.rfps.ui.fragment.RFPSEnrollFragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector.Companion.BiometricFragmentScreenShotRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.ViewScreenshotTestRule.Mode
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollEnrollingScreenshotTest {
+  private val injector: Injector =
+    Injector(FingerprintNavigationStep.Enrollment(Injector.interactor.sensorProp))
+
+  @Rule @JvmField var rule: FragmentScreenshotTestRule = BiometricFragmentScreenShotRule()
+
+  @Test
+  fun testEnrollEnrolling() {
+    rule.screenshotTest("fp_enroll_enrolling", Mode.MatchSize, RFPSEnrollFragment(injector.factory))
+  }
+}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollFindSensorScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollFindSensorScreenshotTest.kt
new file mode 100644
index 0000000..18257c2
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollFindSensorScreenshotTest.kt
@@ -0,0 +1,45 @@
+package com.android.settings.tests.screenshot.biometrics.fingerprint.fragment
+
+/*
+ * 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.
+ */
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector.Companion.BiometricFragmentScreenShotRule
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.ViewScreenshotTestRule.Mode
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollFindSensorScreenshotTest {
+  private val injector: Injector =
+    Injector(FingerprintNavigationStep.Education(Injector.interactor.sensorProp))
+
+  @Rule @JvmField var rule: FragmentScreenshotTestRule = BiometricFragmentScreenShotRule()
+
+  @Test
+  fun testEnrollFindSensor() {
+    rule.screenshotTest(
+      "fp_enroll_find_sensor",
+      Mode.MatchSize,
+      FingerprintEnrollFindSensorV2Fragment(injector.fingerprintSensor.sensorType, injector.factory),
+    )
+  }
+}
diff --git a/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollIntroScreenshotTest.kt b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollIntroScreenshotTest.kt
new file mode 100644
index 0000000..40a23d7
--- /dev/null
+++ b/tests/screenshot/src/com/android/settings/tests/screenshot/biometrics/fingerprint/fragment/FingerprintEnrollIntroScreenshotTest.kt
@@ -0,0 +1,45 @@
+/*
+ * 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.tests.screenshot.biometrics.fingerprint.fragment
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
+import com.android.settings.tests.screenshot.biometrics.fingerprint.Injector
+import org.junit.Rule
+import org.junit.Test
+import org.junit.runner.RunWith
+import platform.test.screenshot.FragmentScreenshotTestRule
+import platform.test.screenshot.ViewScreenshotTestRule.Mode
+
+@RunWith(AndroidJUnit4::class)
+class FingerprintEnrollIntroScreenshotTest {
+  private val injector: Injector = Injector(FingerprintNavigationStep.Introduction)
+
+  @Rule
+  @JvmField
+  var rule: FragmentScreenshotTestRule = Injector.BiometricFragmentScreenShotRule()
+
+  @Test
+  fun testEnrollIntro() {
+    rule.screenshotTest(
+      "fp_enroll_intro",
+      Mode.MatchSize,
+      FingerprintEnrollIntroV2Fragment(injector.factory),
+    )
+  }
+}
diff --git a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
index 7991ff1..f571dad 100644
--- a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
+++ b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
@@ -37,7 +37,6 @@
   var authenticateAttempt = FingerprintAuthAttemptModel.Success(1)
   var enrollStateViewModel: List<FingerEnrollState> =
     listOf(FingerEnrollState.EnrollProgress(5, 5))
-  var pressToAuthEnabled = true
 
   var sensorProp =
     FingerprintSensor(
@@ -86,7 +85,4 @@
     return sensorProp.sensorType == FingerprintSensorType.POWER_BUTTON
   }
 
-  override suspend fun pressToAuthEnabled(): Boolean {
-    return pressToAuthEnabled
-  }
 }
diff --git a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
index f1808e3..c284a6f 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/domain/interactor/FingerprintManagerInteractorTest.kt
@@ -26,9 +26,9 @@
 import android.os.Handler
 import androidx.test.core.app.ApplicationProvider
 import com.android.settings.biometrics.GatekeeperPasswordProvider
-import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository
+import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractor
 import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
-import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.Default
 import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
@@ -77,17 +77,16 @@
   @Mock private lateinit var gateKeeperPasswordProvider: GatekeeperPasswordProvider
 
   private var testScope = TestScope(backgroundDispatcher)
-  private var pressToAuthRepo =
-    object : PressToAuthRepo {
-      override val isEnabled: Boolean
-        get() = false
+  private var pressToAuthInteractor =
+    object : PressToAuthInteractor {
+      override val isEnabled = flowOf(false)
     }
 
   @Before
   fun setup() {
     val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON)
-    val fingerprintSensorRepo =
-      object : FingerprintSensorRepo {
+    val fingerprintSensorRepository =
+      object : FingerprintSensorRepository {
         override val fingerprintSensor: Flow<FingerprintSensor> = flowOf(sensor)
       }
 
@@ -96,9 +95,9 @@
         context,
         backgroundDispatcher,
         fingerprintManager,
-        fingerprintSensorRepo,
+        fingerprintSensorRepository,
         gateKeeperPasswordProvider,
-        pressToAuthRepo,
+        pressToAuthInteractor,
         Default,
       )
   }
diff --git a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
index 3b02d49..f202c4f 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/enrollment/viewmodel/FingerprintEnrollFindSensorViewModelV2Test.kt
@@ -18,27 +18,30 @@
 
 import android.content.Context
 import android.content.res.Configuration
-import android.view.accessibility.AccessibilityManager
+import android.view.Surface
 import androidx.arch.core.executor.testing.InstantTaskExecutorRule
 import androidx.test.core.app.ApplicationProvider
+import com.android.settings.biometrics.fingerprint2.domain.interactor.AccessibilityInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.FoldStateInteractor
+import com.android.settings.biometrics.fingerprint2.domain.interactor.OrientationInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.Default
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.AccessibilityViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Education
+import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
 import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FoldStateViewModel
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
-import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.OrientationStateViewModel
 import com.android.settings.testutils2.FakeFingerprintManagerInteractor
 import com.android.systemui.biometrics.shared.model.FingerprintSensor
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.android.systemui.biometrics.shared.model.SensorStrength
 import com.google.common.truth.Truth.assertThat
 import kotlinx.coroutines.Dispatchers
+import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.StandardTestDispatcher
 import kotlinx.coroutines.test.TestScope
@@ -68,14 +71,13 @@
   private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel
   private lateinit var enrollViewModel: FingerprintEnrollViewModel
   private lateinit var navigationViewModel: FingerprintNavigationViewModel
-  private lateinit var accessibilityViewModel: AccessibilityViewModel
-  private lateinit var foldStateViewModel: FoldStateViewModel
-  private lateinit var orientationStateViewModel: OrientationStateViewModel
+  private lateinit var accessibilityInteractor: AccessibilityInteractor
+  private lateinit var foldStateInteractor: FoldStateInteractor
+  private lateinit var orientationInteractor: OrientationInteractor
   private lateinit var underTest: FingerprintEnrollFindSensorViewModel
   private lateinit var backgroundViewModel: BackgroundViewModel
   private val context: Context = ApplicationProvider.getApplicationContext()
-  private val accessibilityManager: AccessibilityManager =
-    context.getSystemService(AccessibilityManager::class.java)!!
+  private val foldState = MutableStateFlow(false)
 
   @Before
   fun setup() {
@@ -95,7 +97,7 @@
     val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
     navigationViewModel =
       FingerprintNavigationViewModel(
-        Education(sensor),
+        FingerprintNavigationStep.Education(sensor),
         false,
         fingerprintFlowViewModel,
         fakeFingerprintManagerInteractor,
@@ -111,24 +113,39 @@
           navigationViewModel,
         )
         .create(FingerprintEnrollViewModel::class.java)
-    accessibilityViewModel =
-      AccessibilityViewModel.AccessibilityViewModelFactory(accessibilityManager)
-        .create(AccessibilityViewModel::class.java)
-    foldStateViewModel =
-      FoldStateViewModel.FoldStateViewModelFactory(context).create(FoldStateViewModel::class.java)
-    orientationStateViewModel =
-      OrientationStateViewModel.OrientationViewModelFactory(context)
-        .create(OrientationStateViewModel::class.java)
+    accessibilityInteractor =
+      object : AccessibilityInteractor {
+        override val isAccessibilityEnabled: Flow<Boolean> = flowOf(false)
+      }
+    foldStateInteractor =
+      object : FoldStateInteractor {
+        override val isFolded: Flow<Boolean> = foldState
+        override fun onConfigurationChange(newConfig: Configuration) {
+          TODO("Not yet implemented")
+        }
+      }
+    orientationInteractor =
+      object: OrientationInteractor {
+        override val orientation: Flow<Int>
+          get() = TODO("Not yet implemented")
+        override val rotation: Flow<Int> = flowOf(Surface.ROTATION_0)
+
+        override fun getRotationFromDefault(rotation: Int): Int {
+          TODO("Not yet implemented")
+        }
+
+      }
     underTest =
       FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorViewModelFactory(
           navigationViewModel,
           enrollViewModel,
           gatekeeperViewModel,
           backgroundViewModel,
-          accessibilityViewModel,
-          foldStateViewModel,
-          orientationStateViewModel,
+          accessibilityInteractor,
+          foldStateInteractor,
+          orientationInteractor,
           fingerprintFlowViewModel,
+          fakeFingerprintManagerInteractor,
         )
         .create(FingerprintEnrollFindSensorViewModel::class.java)
   }
@@ -171,8 +188,8 @@
         }
       }
 
-      val config = createConfiguration(isFolded = true)
-      foldStateViewModel.onConfigurationChange(config)
+      foldState.update { true }
+
       advanceUntilIdle()
       assertThat(isFolded).isTrue()
       assertThat(rotation).isEqualTo(context.display!!.rotation)
@@ -191,8 +208,8 @@
         }
       }
 
-      val config = createConfiguration(isFolded = false)
-      foldStateViewModel.onConfigurationChange(config)
+      foldState.update { false }
+
       advanceUntilIdle()
       assertThat(isFolded).isFalse()
       assertThat(rotation).isEqualTo(context.display!!.rotation)