Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 4bf11ab1 authored by Beverly's avatar Beverly
Browse files

Fingerprint allowed state should update based on face lockout

If the face sensor is a strong biometric, then fingerprint
is also not allowed when face is locked out.

This CL introduces DeviceEntryBiometricsAllowedInteractor
which coordinates the lockout states of biometrics based
on other biometrics.

Fixes: 354111266
Test: atest AlternateBouncerInteractorTest BouncerMessageInteractorTest
DeviceEntryBiometricsAllowedInteractorTest
Flag: EXEMPT bugfix

Change-Id: I15b28c39a609828f1fdb258ea6b62a77f8c8c771
parent e32053c0
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -35,6 +35,7 @@ import com.android.systemui.bouncer.data.repository.BouncerMessageRepositoryImpl
import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.bouncer.shared.model.BouncerMessageModel
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.domain.interactor.deviceEntryBiometricsAllowedInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor
import com.android.systemui.flags.SystemPropertiesHelper
import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
@@ -108,7 +109,9 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
                facePropertyRepository = kosmos.fakeFacePropertyRepository,
                deviceEntryFingerprintAuthInteractor = kosmos.deviceEntryFingerprintAuthInteractor,
                faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository,
                securityModel = securityModel
                securityModel = securityModel,
                deviceEntryBiometricsAllowedInteractor =
                    kosmos.deviceEntryBiometricsAllowedInteractor,
            )
        biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(
            fingerprintAuthCurrentlyAllowed
+13 −27
Original line number Diff line number Diff line
@@ -21,8 +21,6 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.data.repository.biometricSettingsRepository
import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthRepository
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
@@ -36,41 +34,29 @@ class DeviceEntryFingerprintAuthInteractorTest : SysuiTestCase() {
    private val kosmos = testKosmos()
    private val testScope = kosmos.testScope
    private val underTest = kosmos.deviceEntryFingerprintAuthInteractor
    private val fingerprintAuthRepository = kosmos.deviceEntryFingerprintAuthRepository
    private val fingerprintPropertyRepository = kosmos.fingerprintPropertyRepository
    private val biometricSettingsRepository = kosmos.biometricSettingsRepository

    @Test
    fun isFingerprintAuthCurrentlyAllowed_allowedOnlyWhenItIsNotLockedOutAndAllowedBySettings() =
    fun isSensorUnderDisplay() =
        testScope.runTest {
            val currentlyAllowed by collectLastValue(underTest.isFingerprintAuthCurrentlyAllowed)
            biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)
            fingerprintAuthRepository.setLockedOut(true)

            assertThat(currentlyAllowed).isFalse()

            fingerprintAuthRepository.setLockedOut(false)
            assertThat(currentlyAllowed).isTrue()

            biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(false)
            assertThat(currentlyAllowed).isFalse()
            val isUdfps by collectLastValue(underTest.isSensorUnderDisplay)
            fingerprintPropertyRepository.supportsUdfps()
            assertThat(isUdfps).isTrue()
        }

    @Test
    fun isFingerprintCurrentlyAllowedInBouncer_trueForNonUdfpsSensorTypes() =
    fun isSensorUnderDisplay_rear() =
        testScope.runTest {
            biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)

            val isFingerprintCurrentlyAllowedInBouncer by
                collectLastValue(underTest.isFingerprintCurrentlyAllowedOnBouncer)

            fingerprintPropertyRepository.supportsUdfps()
            assertThat(isFingerprintCurrentlyAllowedInBouncer).isFalse()

            val isUdfps by collectLastValue(underTest.isSensorUnderDisplay)
            fingerprintPropertyRepository.supportsRearFps()
            assertThat(isFingerprintCurrentlyAllowedInBouncer).isTrue()
            assertThat(isUdfps).isFalse()
        }

    @Test
    fun isSensorUnderDisplay_side() =
        testScope.runTest {
            val isUdfps by collectLastValue(underTest.isSensorUnderDisplay)
            fingerprintPropertyRepository.supportsSideFps()
            assertThat(isFingerprintCurrentlyAllowedInBouncer).isTrue()
            assertThat(isUdfps).isFalse()
        }
}
+4 −3
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ import com.android.systemui.biometrics.data.repository.FingerprintPropertyReposi
import com.android.systemui.bouncer.data.repository.KeyguardBouncerRepository
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryBiometricsAllowedInteractor
import com.android.systemui.deviceentry.shared.DeviceEntryUdfpsRefactor
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor
@@ -60,7 +60,8 @@ constructor(
    private val biometricSettingsRepository: BiometricSettingsRepository,
    private val systemClock: SystemClock,
    private val keyguardUpdateMonitor: KeyguardUpdateMonitor,
    private val deviceEntryFingerprintAuthInteractor: Lazy<DeviceEntryFingerprintAuthInteractor>,
    private val deviceEntryBiometricsAllowedInteractor:
        Lazy<DeviceEntryBiometricsAllowedInteractor>,
    private val keyguardInteractor: Lazy<KeyguardInteractor>,
    keyguardTransitionInteractor: Lazy<KeyguardTransitionInteractor>,
    sceneInteractor: Lazy<SceneInteractor>,
@@ -114,7 +115,7 @@ constructor(
                                flowOf(false)
                            } else {
                                combine(
                                    deviceEntryFingerprintAuthInteractor
                                    deviceEntryBiometricsAllowedInteractor
                                        .get()
                                        .isFingerprintAuthCurrentlyAllowed,
                                    keyguardInteractor.get().isKeyguardDismissible,
+5 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ import com.android.systemui.bouncer.shared.model.Message
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.data.repository.DeviceEntryFaceAuthRepository
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryBiometricsAllowedInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
import com.android.systemui.flags.SystemPropertiesHelper
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
@@ -76,10 +77,11 @@ constructor(
    private val deviceEntryFingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor,
    faceAuthRepository: DeviceEntryFaceAuthRepository,
    private val securityModel: KeyguardSecurityModel,
    deviceEntryBiometricsAllowedInteractor: DeviceEntryBiometricsAllowedInteractor,
) {

    private val isFingerprintAuthCurrentlyAllowedOnBouncer =
        deviceEntryFingerprintAuthInteractor.isFingerprintCurrentlyAllowedOnBouncer.stateIn(
        deviceEntryBiometricsAllowedInteractor.isFingerprintCurrentlyAllowedOnBouncer.stateIn(
            applicationScope,
            SharingStarted.Eagerly,
            false
@@ -87,6 +89,7 @@ constructor(

    private val currentSecurityMode
        get() = securityModel.getSecurityMode(currentUserId)

    private val currentUserId
        get() = userRepository.getSelectedUserInfo().id

@@ -349,6 +352,7 @@ constructor(

interface CountDownTimerCallback {
    fun onFinish()

    fun onTick(millisUntilFinished: Long)
}

+9 −7
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import android.os.Build
import com.android.systemui.CoreStartable
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryBiometricSettingsInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryBiometricsAllowedInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor
import com.android.systemui.log.BouncerLogger
@@ -39,6 +40,7 @@ constructor(
    private val faceAuthInteractor: DeviceEntryFaceAuthInteractor,
    private val fingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor,
    private val bouncerLogger: BouncerLogger,
    private val deviceEntryBiometricsAllowedInteractor: DeviceEntryBiometricsAllowedInteractor,
) : CoreStartable {
    override fun start() {
        if (!Build.isDebuggable()) {
@@ -69,8 +71,8 @@ constructor(
            }
        }
        applicationScope.launch {
            fingerprintAuthInteractor.isFingerprintCurrentlyAllowedOnBouncer.collectLatest {
                newValue ->
            deviceEntryBiometricsAllowedInteractor.isFingerprintCurrentlyAllowedOnBouncer
                .collectLatest { newValue ->
                    bouncerLogger.interestedStateChanged(
                        "fingerprintCurrentlyAllowedOnBouncer",
                        newValue
Loading