Spit up FingerprintManagerInteractor 2/N

Test: atest, screenshot tests passed
Flag: com.android.settings.flags.fingerprint_v2_enrollment
Change-Id: I1a2cf61290906e112a5a0129ef7ed3587d14de7e
diff --git a/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt b/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt
index e3233ed..761a9c3 100644
--- a/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/BiometricsEnvironment.kt
@@ -58,6 +58,7 @@
 import com.android.settings.biometrics.fingerprint2.domain.interactor.TouchEventInteractor
 import com.android.settings.biometrics.fingerprint2.domain.interactor.UdfpsEnrollInteractor
 import com.android.settings.biometrics.fingerprint2.domain.interactor.UdfpsEnrollInteractorImpl
+import com.android.settings.biometrics.fingerprint2.domain.interactor.UserInteractorImpl
 import com.android.settings.biometrics.fingerprint2.domain.interactor.VibrationInteractor
 import com.android.settings.biometrics.fingerprint2.domain.interactor.VibrationInteractorImpl
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.AuthenitcateInteractor
@@ -67,6 +68,7 @@
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.RemoveFingerprintInteractor
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.RenameFingerprintInteractor
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.SensorInteractor
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.UserInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.Settings
 import java.util.concurrent.Executors
 import kotlinx.coroutines.MainScope
@@ -97,11 +99,11 @@
         com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser
       )
     )
-  private val fingerprintEnrollmentRepository =
-    FingerprintEnrollmentRepositoryImpl(fingerprintManager, userRepo, fingerprintSettingsRepository,
-      backgroundDispatcher, applicationScope)
   private val fingerprintSensorRepository: FingerprintSensorRepository =
     FingerprintSensorRepositoryImpl(fingerprintManager, backgroundDispatcher, applicationScope)
+  private val fingerprintEnrollmentRepository =
+    FingerprintEnrollmentRepositoryImpl(fingerprintManager, userRepo, fingerprintSettingsRepository,
+      backgroundDispatcher, applicationScope, fingerprintSensorRepository)
   private val debuggingRepository: DebuggingRepository = DebuggingRepositoryImpl()
   private val udfpsDebugRepo = UdfpsEnrollDebugRepositoryImpl()
 
@@ -118,11 +120,13 @@
     EnrollFingerprintInteractorImpl(context.userId, fingerprintManager, Settings)
 
   fun createFingerprintsEnrolledInteractor(): EnrolledFingerprintsInteractorImpl =
-    EnrolledFingerprintsInteractorImpl(fingerprintManager, context.userId)
+    EnrolledFingerprintsInteractorImpl(fingerprintEnrollmentRepository)
 
   fun createAuthenticateInteractor(): AuthenitcateInteractor =
     AuthenticateInteractorImpl(fingerprintManager, context.userId)
 
+  fun createUserInteractor(): UserInteractor = UserInteractorImpl(userRepo)
+
   fun createRemoveFingerprintInteractor(): RemoveFingerprintInteractor =
     RemoveFingerprintsInteractorImpl(fingerprintManager, context.userId)
 
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintEnrollmentRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintEnrollmentRepo.kt
index 22904e9..0bb4eea 100644
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintEnrollmentRepo.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintEnrollmentRepo.kt
@@ -23,14 +23,16 @@
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.channels.awaitClose
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.SharingStarted
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.callbackFlow
+import kotlinx.coroutines.flow.combine
 import kotlinx.coroutines.flow.distinctUntilChanged
 import kotlinx.coroutines.flow.filterNotNull
-import kotlinx.coroutines.flow.flatMapLatest
 import kotlinx.coroutines.flow.flowOn
-import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.stateIn
+import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.withContext
 
 /** Repository that contains information about fingerprint enrollments. */
@@ -38,20 +40,31 @@
   /** The current enrollments of the user */
   val currentEnrollments: Flow<List<FingerprintData>?>
 
+  /** Indicates the maximum fingerprints that are enrollable * */
+  val maxFingerprintsEnrollable: Flow<Int>
+
   /** Indicates if a user can enroll another fingerprint */
   val canEnrollUser: Flow<Boolean>
 
-  fun maxFingerprintsEnrollable(): Int
+  /**
+   * Indicates if we should use the default settings for maximum enrollments or the sensor props
+   * from the fingerprint sensor
+   */
+  fun setShouldUseSettingsMaxFingerprints(useSettings: Boolean)
 }
 
 class FingerprintEnrollmentRepositoryImpl(
-  fingerprintManager: FingerprintManager,
+  private val fingerprintManager: FingerprintManager,
   userRepo: UserRepo,
-  private val settingsRepository: FingerprintSettingsRepository,
+  settingsRepository: FingerprintSettingsRepository,
   backgroundDispatcher: CoroutineDispatcher,
   applicationScope: CoroutineScope,
+  sensorRepo: FingerprintSensorRepository,
 ) : FingerprintEnrollmentRepository {
 
+  private val _shouldUseSettingsMaxFingerprints = MutableStateFlow(false)
+  val shouldUseSettingsMaxFingerprints = _shouldUseSettingsMaxFingerprints.asStateFlow()
+
   private val enrollmentChangedFlow: Flow<Int?> =
     callbackFlow {
         val callback =
@@ -72,27 +85,34 @@
   override val currentEnrollments: Flow<List<FingerprintData>> =
     userRepo.currentUser
       .distinctUntilChanged()
-      .flatMapLatest { currentUser ->
-        enrollmentChangedFlow.map { enrollmentChanged ->
-          if (enrollmentChanged == null || enrollmentChanged == currentUser) {
-            fingerprintManager
-              .getEnrolledFingerprints(currentUser)
-              ?.map { (FingerprintData(it.name.toString(), it.biometricId, it.deviceId)) }
-              ?.toList()
-          } else {
-            null
-          }
-        }
-      }
+      .combine(enrollmentChangedFlow) { currentUser, _ -> getFingerprintsForUser(currentUser) }
       .filterNotNull()
       .flowOn(backgroundDispatcher)
 
-  override val canEnrollUser: Flow<Boolean> =
-    currentEnrollments.map {
-      it?.size?.let { it < settingsRepository.maxEnrollableFingerprints() } ?: false
+  override val maxFingerprintsEnrollable: Flow<Int> =
+    shouldUseSettingsMaxFingerprints.combine(sensorRepo.fingerprintSensor) {
+      shouldUseSettings,
+      sensor ->
+      if (shouldUseSettings) {
+        settingsRepository.maxEnrollableFingerprints()
+      } else {
+        sensor.maxEnrollmentsPerUser
+      }
     }
 
-  override fun maxFingerprintsEnrollable(): Int {
-    return settingsRepository.maxEnrollableFingerprints()
+  override val canEnrollUser: Flow<Boolean> =
+    currentEnrollments.combine(maxFingerprintsEnrollable) { enrollments, maxFingerprints ->
+      enrollments.size < maxFingerprints
+    }
+
+  override fun setShouldUseSettingsMaxFingerprints(useSettings: Boolean) {
+    _shouldUseSettingsMaxFingerprints.update { useSettings }
+  }
+
+  private fun getFingerprintsForUser(userId: Int): List<FingerprintData>? {
+    return fingerprintManager
+      .getEnrolledFingerprints(userId)
+      ?.map { (FingerprintData(it.name.toString(), it.biometricId, it.deviceId)) }
+      ?.toList()
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/data/repository/UserRepo.kt b/src/com/android/settings/biometrics/fingerprint2/data/repository/UserRepo.kt
index 720e778..9126043 100644
--- a/src/com/android/settings/biometrics/fingerprint2/data/repository/UserRepo.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/data/repository/UserRepo.kt
@@ -17,7 +17,10 @@
 package com.android.settings.biometrics.fingerprint2.data.repository
 
 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
 
 /**
  * A repository responsible for indicating the current user.
@@ -27,8 +30,18 @@
      * This flow indicates the current user.
      */
     val currentUser: Flow<Int>
+
+    /**
+     * Updates the current user.
+     */
+    fun updateUser(user: Int)
 }
 
-class UserRepoImpl(val currUser: Int): UserRepo {
-    override val currentUser: Flow<Int> = flowOf(currUser)
+class UserRepoImpl(currUser: Int): UserRepo {
+    private val _currentUser = MutableStateFlow(currUser)
+    override val currentUser = _currentUser.asStateFlow()
+
+    override fun updateUser(user: Int) {
+        _currentUser.update { user }
+    }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/CanEnrollFingerprintsInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/CanEnrollFingerprintsInteractorImpl.kt
index caeea4e..cfdfbe2 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/CanEnrollFingerprintsInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/CanEnrollFingerprintsInteractorImpl.kt
@@ -21,11 +21,14 @@
 import kotlinx.coroutines.flow.Flow
 
 class CanEnrollFingerprintsInteractorImpl(
-  val fingerprintEnrollmentRepository: FingerprintEnrollmentRepository
+  private val fingerprintEnrollmentRepository: FingerprintEnrollmentRepository
 ) : CanEnrollFingerprintsInteractor {
   override val canEnrollFingerprints: Flow<Boolean> = fingerprintEnrollmentRepository.canEnrollUser
   /** Indicates the maximum fingerprints enrollable for a given user */
-  override fun maxFingerprintsEnrollable(): Int {
-    return fingerprintEnrollmentRepository.maxFingerprintsEnrollable()
+  override val maxFingerprintsEnrollable: Flow<Int> =
+    fingerprintEnrollmentRepository.maxFingerprintsEnrollable
+
+  override fun setShouldUseSettingsMaxFingerprints(useSettings: Boolean) {
+    fingerprintEnrollmentRepository.setShouldUseSettingsMaxFingerprints(useSettings)
   }
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/EnrolledFingerprintsInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/EnrolledFingerprintsInteractorImpl.kt
index 83b532e..f8bcaf7 100644
--- a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/EnrolledFingerprintsInteractorImpl.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/EnrolledFingerprintsInteractorImpl.kt
@@ -16,22 +16,14 @@
 
 package com.android.settings.biometrics.fingerprint2.domain.interactor
 
-import android.hardware.fingerprint.FingerprintManager
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintEnrollmentRepository
 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.EnrolledFingerprintsInteractor
 import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
 import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.flow
 
 class EnrolledFingerprintsInteractorImpl(
-  private val fingerprintManager: FingerprintManager,
-  userId: Int,
+  private val fingerprintEnrollmentRepository: FingerprintEnrollmentRepository
 ) : EnrolledFingerprintsInteractor {
-  override val enrolledFingerprints: Flow<List<FingerprintData>?> = flow {
-    emit(
-      fingerprintManager
-        .getEnrolledFingerprints(userId)
-        ?.map { (FingerprintData(it.name.toString(), it.biometricId, it.deviceId)) }
-        ?.toList()
-    )
-  }
+  override val enrolledFingerprints: Flow<List<FingerprintData>?> =
+    fingerprintEnrollmentRepository.currentEnrollments
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UserInteractorImpl.kt b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UserInteractorImpl.kt
new file mode 100644
index 0000000..506006e
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/domain/interactor/UserInteractorImpl.kt
@@ -0,0 +1,27 @@
+/*
+ * 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 com.android.settings.biometrics.fingerprint2.data.repository.UserRepo
+import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.UserInteractor
+import kotlinx.coroutines.flow.Flow
+
+class UserInteractorImpl(private val userRepo: UserRepo) : UserInteractor {
+  override val currentUser: Flow<Int> = userRepo.currentUser
+
+  override fun updateUser(user: Int) = userRepo.updateUser(user)
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/CanEnrollFingerprintsInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/CanEnrollFingerprintsInteractor.kt
index 11a9258..a5277a5 100644
--- a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/CanEnrollFingerprintsInteractor.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/CanEnrollFingerprintsInteractor.kt
@@ -23,5 +23,17 @@
   /** Returns true if a user can enroll a fingerprint false otherwise. */
   val canEnrollFingerprints: Flow<Boolean>
   /** Indicates the maximum fingerprints enrollable for a given user */
-  fun maxFingerprintsEnrollable(): Int
+  val maxFingerprintsEnrollable: Flow<Int>
+
+  /**
+   * Indicates if we should use the default settings for maximum enrollments or the sensor props
+   * from the fingerprint sensor. This can be useful if you are supporting HIDL & AIDL enrollment
+   * types from one code base. Prior to AIDL there was no way to determine how many
+   * fingerprints were enrollable, Settings relied on
+   * com.android.internal.R.integer.config_fingerprintMaxTemplatesPerUser.
+   *
+   * Typically Fingerprints with AIDL HAL's should not use this
+   * (setShouldUseSettingsMaxFingerprints(false))
+   */
+  fun setShouldUseSettingsMaxFingerprints(useSettings: Boolean)
 }
diff --git a/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/UserInteractor.kt b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/UserInteractor.kt
new file mode 100644
index 0000000..17b147a
--- /dev/null
+++ b/src/com/android/settings/biometrics/fingerprint2/lib/domain/interactor/UserInteractor.kt
@@ -0,0 +1,31 @@
+/*
+ * 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.lib.domain.interactor
+
+import kotlinx.coroutines.flow.Flow
+
+interface UserInteractor {
+    /**
+     * This flow indicates the current user.
+     */
+    val currentUser: Flow<Int>
+
+    /**
+     * Updates the current user.
+     */
+    fun updateUser(user: Int)
+}
diff --git a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
index c306c78..7aad16d 100644
--- a/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
+++ b/src/com/android/settings/biometrics/fingerprint2/ui/settings/viewmodel/FingerprintSettingsViewModel.kt
@@ -43,7 +43,6 @@
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.flow.sample
-import kotlinx.coroutines.flow.transform
 import kotlinx.coroutines.flow.transformLatest
 import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
@@ -72,10 +71,12 @@
 
   /** Represents the stream of the information of "Add Fingerprint" preference. */
   val addFingerprintPrefInfo: Flow<Pair<Boolean, Int>> =
-    _enrolledFingerprints.filterOnlyWhenSettingsIsShown().combine(
-      canEnrollFingerprintsInteractor.canEnrollFingerprints
-    ) { _, canEnrollFingerprints ->
-      Pair(canEnrollFingerprints, canEnrollFingerprintsInteractor.maxFingerprintsEnrollable())
+    combine(
+      _enrolledFingerprints.filterOnlyWhenSettingsIsShown(),
+      canEnrollFingerprintsInteractor.canEnrollFingerprints,
+      canEnrollFingerprintsInteractor.maxFingerprintsEnrollable,
+    ) { _, canEnrollFingerprints, maxFingerprints ->
+      Pair(canEnrollFingerprints, maxFingerprints)
     }
 
   /** Represents the stream of visibility of sfps preference. */
diff --git a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
index f61a3d3..32ca2cd 100644
--- a/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
+++ b/tests/shared/src/com/android/settings/testutils2/FakeFingerprintManagerInteractor.kt
@@ -38,8 +38,12 @@
 import com.android.systemui.biometrics.shared.model.FingerprintSensorType
 import com.android.systemui.biometrics.shared.model.toFingerprintSensor
 import kotlinx.coroutines.flow.Flow
+import kotlinx.coroutines.flow.MutableStateFlow
+import kotlinx.coroutines.flow.asStateFlow
 import kotlinx.coroutines.flow.flow
 import kotlinx.coroutines.flow.flowOf
+import kotlinx.coroutines.flow.transform
+import kotlinx.coroutines.flow.update
 
 /** Fake to be used by other classes to easily fake the FingerprintManager implementation. */
 class FakeFingerprintManagerInteractor :
@@ -52,7 +56,7 @@
   RenameFingerprintInteractor,
   SensorInteractor {
 
-  var enrollableFingerprints: Int = 5
+  private val enrollableFingerprints = MutableStateFlow(5)
   var enrolledFingerprintsInternal: MutableList<FingerprintData> = mutableListOf()
   var challengeToGenerate: Pair<Long, ByteArray> = Pair(-1L, byteArrayOf())
   var authenticateAttempt = FingerprintAuthAttemptModel.Success(1)
@@ -82,13 +86,13 @@
   override val enrolledFingerprints: Flow<List<FingerprintData>> = flow {
     emit(enrolledFingerprintsInternal)
   }
-  override val canEnrollFingerprints: Flow<Boolean> = flow {
-    emit(enrolledFingerprintsInternal.size < enrollableFingerprints)
+  override val canEnrollFingerprints: Flow<Boolean> = enrollableFingerprints.transform {
+     emit(enrolledFingerprintsInternal.size < it)
   }
 
-  override fun maxFingerprintsEnrollable(): Int {
-    return enrollableFingerprints
-  }
+  override val maxFingerprintsEnrollable: Flow<Int> = enrollableFingerprints.asStateFlow()
+
+  override fun setShouldUseSettingsMaxFingerprints(useSettings: Boolean) {}
 
   override val sensorPropertiesInternal: Flow<FingerprintSensor?> = flow { emit(sensorProp) }
   override val hasSideFps: Flow<Boolean> =
@@ -110,4 +114,7 @@
     }
   }
 
+  fun setMaxEnrollableFingerprints(fingerprints: Int) {
+    enrollableFingerprints.update { fingerprints }
+  }
 }
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 691b611..2623206 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
@@ -30,6 +30,7 @@
 import android.os.CancellationSignal
 import android.os.Handler
 import com.android.settings.biometrics.GatekeeperPasswordProvider
+import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintEnrollmentRepository
 import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintEnrollmentRepositoryImpl
 import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository
 import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSettingsRepositoryImpl
@@ -61,7 +62,7 @@
 import kotlinx.coroutines.flow.Flow
 import kotlinx.coroutines.flow.MutableStateFlow
 import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.last
+import kotlinx.coroutines.flow.update
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.test.StandardTestDispatcher
 import kotlinx.coroutines.test.TestScope
@@ -106,9 +107,14 @@
   private val flow: FingerprintFlow = Default
   private val maxFingerprints = 5
   private val currUser = MutableStateFlow(0)
+  private lateinit var fingerprintEnrollRepo: FingerprintEnrollmentRepository
   private val userRepo =
     object : UserRepo {
       override val currentUser: Flow<Int> = currUser
+
+      override fun updateUser(user: Int) {
+        currUser.update { user }
+      }
     }
 
   @Before
@@ -133,17 +139,18 @@
       }
 
     val settingsRepository = FingerprintSettingsRepositoryImpl(maxFingerprints)
-    val fingerprintEnrollmentRepository =
+    fingerprintEnrollRepo =
       FingerprintEnrollmentRepositoryImpl(
         fingerprintManager,
         userRepo,
         settingsRepository,
         backgroundDispatcher,
         backgroundScope,
+        fingerprintSensorRepository,
       )
 
     enrolledFingerprintsInteractorUnderTest =
-      EnrolledFingerprintsInteractorImpl(fingerprintManager, userId)
+      EnrolledFingerprintsInteractorImpl(fingerprintEnrollRepo)
     generateChallengeInteractorUnderTest =
       GenerateChallengeInteractorImpl(fingerprintManager, userId, gateKeeperPasswordProvider)
     removeFingerprintsInteractorUnderTest =
@@ -153,7 +160,7 @@
     authenticateInteractorImplUnderTest = AuthenticateInteractorImpl(fingerprintManager, userId)
 
     canEnrollFingerprintsInteractorUnderTest =
-      CanEnrollFingerprintsInteractorImpl(fingerprintEnrollmentRepository)
+      CanEnrollFingerprintsInteractorImpl(fingerprintEnrollRepo)
 
     enrollInteractorUnderTest = EnrollFingerprintInteractorImpl(userId, fingerprintManager, flow)
   }
@@ -163,9 +170,16 @@
     testScope.runTest {
       whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(emptyList())
 
-      val emptyFingerprintList: List<Fingerprint> = emptyList()
-      assertThat(enrolledFingerprintsInteractorUnderTest.enrolledFingerprints.last())
-        .isEqualTo(emptyFingerprintList)
+      var list: List<FingerprintData>? = null
+      val job =
+        testScope.launch {
+          enrolledFingerprintsInteractorUnderTest.enrolledFingerprints.collect { list = it }
+        }
+
+      runCurrent()
+      job.cancelAndJoin()
+
+      assertThat(list!!.isEmpty())
     }
 
   @Test
@@ -174,10 +188,19 @@
       val expected = Fingerprint("Finger 1,", 2, 3L)
       val fingerprintList: List<Fingerprint> = listOf(expected)
       whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(fingerprintList)
+      // This causes the enrolled fingerprints to be updated
 
-      val list = enrolledFingerprintsInteractorUnderTest.enrolledFingerprints.last()
+      var list: List<FingerprintData>? = null
+      val job =
+        testScope.launch {
+          enrolledFingerprintsInteractorUnderTest.enrolledFingerprints.collect { list = it }
+        }
+
+      runCurrent()
+      job.cancelAndJoin()
+
       assertThat(list!!.size).isEqualTo(fingerprintList.size)
-      val actual = list[0]
+      val actual = list!![0]
       assertThat(actual.name).isEqualTo(expected.name)
       assertThat(actual.fingerId).isEqualTo(expected.biometricId)
       assertThat(actual.deviceId).isEqualTo(expected.deviceId)
@@ -220,11 +243,7 @@
       whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(fingerprintList)
 
       var result: Boolean? = null
-      val job =
-        testScope.launch {
-          canEnrollFingerprintsInteractorUnderTest.canEnrollFingerprints.collect { result = it }
-        }
-
+      val job = testScope.launch { fingerprintEnrollRepo.canEnrollUser.collect { result = it } }
       runCurrent()
       job.cancelAndJoin()
 
diff --git a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollConfirmationViewModelTest.kt b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollConfirmationViewModelTest.kt
index f59d1fc..a9ab589 100644
--- a/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollConfirmationViewModelTest.kt
+++ b/tests/unit/src/com/android/settings/fingerprint2/ui/enrollment/viewmodel/FingerprintEnrollConfirmationViewModelTest.kt
@@ -112,7 +112,7 @@
           .toFingerprintSensor()
 
       fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = mutableListOf()
-      fakeFingerprintManagerInteractor.enrollableFingerprints = 5
+      fakeFingerprintManagerInteractor.setMaxEnrollableFingerprints(5)
 
       var canEnrollFingerprints: Boolean = false
       val job = launch {