diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricRepository.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt similarity index 96% rename from packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricRepository.kt rename to packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt index de1589089b05a..0af596a53a4d5 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricRepository.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepository.kt @@ -33,7 +33,6 @@ import com.android.systemui.dagger.qualifiers.Background import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.user.data.repository.UserRepository import javax.inject.Inject -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.channels.awaitClose @@ -48,12 +47,13 @@ import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest /** - * Acts as source of truth for biometric features. + * Acts as source of truth for biometric authentication related settings like enrollments, device + * policy, etc. * * Abstracts-away data sources and their schemas so the rest of the app doesn't need to worry about * upstream changes. */ -interface BiometricRepository { +interface BiometricSettingsRepository { /** Whether any fingerprints are enrolled for the current user. */ val isFingerprintEnrolled: StateFlow @@ -68,9 +68,8 @@ interface BiometricRepository { val isFingerprintEnabledByDevicePolicy: StateFlow } -@OptIn(ExperimentalCoroutinesApi::class) @SysUISingleton -class BiometricRepositoryImpl +class BiometricSettingsRepositoryImpl @Inject constructor( context: Context, @@ -82,7 +81,7 @@ constructor( @Application scope: CoroutineScope, @Background backgroundDispatcher: CoroutineDispatcher, @Main looper: Looper, -) : BiometricRepository { +) : BiometricSettingsRepository { /** UserId of the current selected user. */ private val selectedUserId: Flow = @@ -90,7 +89,7 @@ constructor( override val isFingerprintEnrolled: StateFlow = selectedUserId - .flatMapLatest { userId -> + .flatMapLatest { conflatedCallbackFlow { val callback = object : AuthController.Callback { diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt index 2cbc2bb44189b..4a262f580749f 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/data/repository/KeyguardRepositoryModule.kt @@ -31,7 +31,10 @@ interface KeyguardRepositoryModule { @Binds fun lightRevealScrimRepository(impl: LightRevealScrimRepositoryImpl): LightRevealScrimRepository - @Binds fun biometricRepository(impl: BiometricRepositoryImpl): BiometricRepository + @Binds + fun biometricSettingsRepository( + impl: BiometricSettingsRepositoryImpl + ): BiometricSettingsRepository @Binds fun deviceEntryFingerprintAuthRepository( diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt index 6020ef8017c86..6452e0e094ceb 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractor.kt @@ -20,7 +20,7 @@ import com.android.keyguard.KeyguardUpdateMonitor import com.android.systemui.dagger.SysUISingleton import com.android.systemui.flags.FeatureFlags import com.android.systemui.flags.Flags -import com.android.systemui.keyguard.data.repository.BiometricRepository +import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager.LegacyAlternateBouncer @@ -34,7 +34,7 @@ class AlternateBouncerInteractor @Inject constructor( private val bouncerRepository: KeyguardBouncerRepository, - private val biometricRepository: BiometricRepository, + private val biometricSettingsRepository: BiometricSettingsRepository, private val deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository, private val systemClock: SystemClock, private val keyguardUpdateMonitor: KeyguardUpdateMonitor, @@ -99,9 +99,9 @@ constructor( fun canShowAlternateBouncerForFingerprint(): Boolean { return if (isModernAlternateBouncerEnabled) { bouncerRepository.isAlternateBouncerUIAvailable.value && - biometricRepository.isFingerprintEnrolled.value && - biometricRepository.isStrongBiometricAllowed.value && - biometricRepository.isFingerprintEnabledByDevicePolicy.value && + biometricSettingsRepository.isFingerprintEnrolled.value && + biometricSettingsRepository.isStrongBiometricAllowed.value && + biometricSettingsRepository.isFingerprintEnabledByDevicePolicy.value && !deviceEntryFingerprintAuthRepository.isLockedOut.value } else { legacyAlternateBouncer != null && diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt index b5c0f201dc3b9..41beada11fa97 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/SideFpsControllerTest.kt @@ -58,7 +58,7 @@ import com.android.systemui.SysuiTestableContext import com.android.systemui.dump.DumpManager import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags.MODERN_ALTERNATE_BOUNCER -import com.android.systemui.keyguard.data.repository.FakeBiometricRepository +import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.FakeKeyguardBouncerRepository import com.android.systemui.keyguard.domain.interactor.AlternateBouncerInteractor @@ -137,7 +137,7 @@ class SideFpsControllerTest : SysuiTestCase() { alternateBouncerInteractor = AlternateBouncerInteractor( keyguardBouncerRepository, - FakeBiometricRepository(), + FakeBiometricSettingsRepository(), FakeDeviceEntryFingerprintAuthRepository(), FakeSystemClock(), mock(KeyguardUpdateMonitor::class.java), diff --git a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt index d2183b317bbe6..c73ff1dab3d8d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/biometrics/UdfpsKeyguardViewControllerWithCoroutinesTest.kt @@ -26,7 +26,7 @@ import com.android.systemui.classifier.FalsingCollector import com.android.systemui.flags.FeatureFlags import com.android.systemui.keyguard.DismissCallbackRegistry import com.android.systemui.keyguard.data.BouncerView -import com.android.systemui.keyguard.data.repository.BiometricRepository +import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepositoryImpl @@ -92,7 +92,7 @@ class UdfpsKeyguardViewControllerWithCoroutinesTest : UdfpsKeyguardViewControlle mAlternateBouncerInteractor = AlternateBouncerInteractor( keyguardBouncerRepository, - mock(BiometricRepository::class.java), + mock(BiometricSettingsRepository::class.java), mock(DeviceEntryFingerprintAuthRepository::class.java), mock(SystemClock::class.java), mock(KeyguardUpdateMonitor::class.java), diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricRepositoryTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt similarity index 94% rename from packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricRepositoryTest.kt rename to packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt index 4aac7d0958117..ddd10493571c2 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricRepositoryTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/data/repository/BiometricSettingsRepositoryTest.kt @@ -33,7 +33,6 @@ import com.android.systemui.user.data.repository.FakeUserRepository import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.whenever import com.google.common.truth.Truth.assertThat -import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.TestDispatcher import kotlinx.coroutines.test.TestScope @@ -48,12 +47,11 @@ import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations -@OptIn(ExperimentalCoroutinesApi::class) @SmallTest @TestableLooper.RunWithLooper(setAsMainLooper = true) @RunWith(AndroidTestingRunner::class) -class BiometricRepositoryTest : SysuiTestCase() { - private lateinit var underTest: BiometricRepository +class BiometricSettingsRepositoryTest : SysuiTestCase() { + private lateinit var underTest: BiometricSettingsRepository @Mock private lateinit var authController: AuthController @Mock private lateinit var lockPatternUtils: LockPatternUtils @@ -73,11 +71,11 @@ class BiometricRepositoryTest : SysuiTestCase() { userRepository = FakeUserRepository() } - private suspend fun createBiometricRepository() { + private suspend fun createBiometricSettingsRepository() { userRepository.setUserInfos(listOf(PRIMARY_USER)) userRepository.setSelectedUserInfo(PRIMARY_USER) underTest = - BiometricRepositoryImpl( + BiometricSettingsRepositoryImpl( context = context, lockPatternUtils = lockPatternUtils, broadcastDispatcher = fakeBroadcastDispatcher, @@ -93,7 +91,7 @@ class BiometricRepositoryTest : SysuiTestCase() { @Test fun fingerprintEnrollmentChange() = testScope.runTest { - createBiometricRepository() + createBiometricSettingsRepository() val fingerprintEnabledByDevicePolicy = collectLastValue(underTest.isFingerprintEnrolled) runCurrent() @@ -119,7 +117,7 @@ class BiometricRepositoryTest : SysuiTestCase() { @Test fun strongBiometricAllowedChange() = testScope.runTest { - createBiometricRepository() + createBiometricSettingsRepository() val strongBiometricAllowed = collectLastValue(underTest.isStrongBiometricAllowed) runCurrent() @@ -142,7 +140,7 @@ class BiometricRepositoryTest : SysuiTestCase() { @Test fun fingerprintDisabledByDpmChange() = testScope.runTest { - createBiometricRepository() + createBiometricSettingsRepository() val fingerprintEnabledByDevicePolicy = collectLastValue(underTest.isFingerprintEnabledByDevicePolicy) runCurrent() diff --git a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt index 28974f8252c15..8caf60fb3ebd6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/keyguard/domain/interactor/AlternateBouncerInteractorTest.kt @@ -22,7 +22,7 @@ import com.android.keyguard.ViewMediatorCallback import com.android.systemui.SysuiTestCase import com.android.systemui.flags.FakeFeatureFlags import com.android.systemui.flags.Flags -import com.android.systemui.keyguard.data.repository.FakeBiometricRepository +import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepository import com.android.systemui.keyguard.data.repository.KeyguardBouncerRepositoryImpl @@ -47,7 +47,7 @@ import org.mockito.MockitoAnnotations class AlternateBouncerInteractorTest : SysuiTestCase() { private lateinit var underTest: AlternateBouncerInteractor private lateinit var bouncerRepository: KeyguardBouncerRepository - private lateinit var biometricRepository: FakeBiometricRepository + private lateinit var biometricSettingsRepository: FakeBiometricSettingsRepository private lateinit var deviceEntryFingerprintAuthRepository: FakeDeviceEntryFingerprintAuthRepository @Mock private lateinit var systemClock: SystemClock @@ -65,13 +65,13 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { TestCoroutineScope(), bouncerLogger, ) - biometricRepository = FakeBiometricRepository() + biometricSettingsRepository = FakeBiometricSettingsRepository() deviceEntryFingerprintAuthRepository = FakeDeviceEntryFingerprintAuthRepository() featureFlags = FakeFeatureFlags().apply { this.set(Flags.MODERN_ALTERNATE_BOUNCER, true) } underTest = AlternateBouncerInteractor( bouncerRepository, - biometricRepository, + biometricSettingsRepository, deviceEntryFingerprintAuthRepository, systemClock, keyguardUpdateMonitor, @@ -96,7 +96,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { @Test fun canShowAlternateBouncerForFingerprint_noFingerprintsEnrolled() { givenCanShowAlternateBouncer() - biometricRepository.setFingerprintEnrolled(false) + biometricSettingsRepository.setFingerprintEnrolled(false) assertFalse(underTest.canShowAlternateBouncerForFingerprint()) } @@ -104,7 +104,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { @Test fun canShowAlternateBouncerForFingerprint_strongBiometricNotAllowed() { givenCanShowAlternateBouncer() - biometricRepository.setStrongBiometricAllowed(false) + biometricSettingsRepository.setStrongBiometricAllowed(false) assertFalse(underTest.canShowAlternateBouncerForFingerprint()) } @@ -112,7 +112,7 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { @Test fun canShowAlternateBouncerForFingerprint_devicePolicyDoesNotAllowFingerprint() { givenCanShowAlternateBouncer() - biometricRepository.setFingerprintEnabledByDevicePolicy(false) + biometricSettingsRepository.setFingerprintEnabledByDevicePolicy(false) assertFalse(underTest.canShowAlternateBouncerForFingerprint()) } @@ -159,13 +159,13 @@ class AlternateBouncerInteractorTest : SysuiTestCase() { private fun givenCanShowAlternateBouncer() { bouncerRepository.setAlternateBouncerUIAvailable(true) - biometricRepository.setFingerprintEnrolled(true) - biometricRepository.setStrongBiometricAllowed(true) - biometricRepository.setFingerprintEnabledByDevicePolicy(true) + biometricSettingsRepository.setFingerprintEnrolled(true) + biometricSettingsRepository.setStrongBiometricAllowed(true) + biometricSettingsRepository.setFingerprintEnabledByDevicePolicy(true) deviceEntryFingerprintAuthRepository.setLockedOut(false) } private fun givenCannotShowAlternateBouncer() { - biometricRepository.setFingerprintEnrolled(false) + biometricSettingsRepository.setFingerprintEnrolled(false) } } diff --git a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricRepository.kt b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt similarity index 96% rename from packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricRepository.kt rename to packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt index f3e52de0d7a0c..044679d6e9a8e 100644 --- a/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricRepository.kt +++ b/packages/SystemUI/tests/utils/src/com/android/systemui/keyguard/data/repository/FakeBiometricSettingsRepository.kt @@ -21,7 +21,7 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow -class FakeBiometricRepository : BiometricRepository { +class FakeBiometricSettingsRepository : BiometricSettingsRepository { private val _isFingerprintEnrolled = MutableStateFlow(false) override val isFingerprintEnrolled: StateFlow = _isFingerprintEnrolled.asStateFlow()