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 {