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

Commit cb0af41c authored by Chandru S's avatar Chandru S
Browse files

Show unlock with fingerprint only for devices where the fingerprint sensor is not below the display

Fixes: 322937988
Test: atest BouncerMessageInteractorTest
Test: atest DeviceEntryFingerprintAuthInteractorTest
Flag: ACONFIG com.android.systemui.revamped_bouncer_messages TRUNKFOOD
Change-Id: I30facf06e4c4b67a62d32d15a95e138c09d432b3
parent 25530406
Loading
Loading
Loading
Loading
+60 −73
Original line number Diff line number Diff line
@@ -17,7 +17,6 @@
package com.android.systemui.bouncer.domain.interactor

import android.content.pm.UserInfo
import android.os.Handler
import android.testing.TestableLooper
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
@@ -28,27 +27,25 @@ import com.android.keyguard.KeyguardUpdateMonitor
import com.android.systemui.Flags
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.FaceSensorInfo
import com.android.systemui.biometrics.data.repository.FakeFacePropertyRepository
import com.android.systemui.biometrics.data.repository.fakeFacePropertyRepository
import com.android.systemui.biometrics.data.repository.fakeFingerprintPropertyRepository
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.android.systemui.bouncer.data.repository.BouncerMessageRepositoryImpl
import com.android.systemui.bouncer.data.repository.FakeKeyguardBouncerRepository
import com.android.systemui.bouncer.data.repository.fakeKeyguardBouncerRepository
import com.android.systemui.bouncer.shared.model.BouncerMessageModel
import com.android.systemui.bouncer.ui.BouncerView
import com.android.systemui.classifier.FalsingCollector
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor
import com.android.systemui.deviceentry.domain.interactor.deviceEntryFingerprintAuthInteractor
import com.android.systemui.flags.SystemPropertiesHelper
import com.android.systemui.keyguard.DismissCallbackRegistry
import com.android.systemui.keyguard.data.repository.FakeBiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.FakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.FakeTrustRepository
import com.android.systemui.keyguard.data.repository.fakeBiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFaceAuthRepository
import com.android.systemui.keyguard.data.repository.fakeDeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.fakeTrustRepository
import com.android.systemui.keyguard.shared.model.AuthenticationFlags
import com.android.systemui.kosmos.testScope
import com.android.systemui.res.R.string.kg_too_many_failed_attempts_countdown
import com.android.systemui.res.R.string.kg_trust_agent_disabled
import com.android.systemui.statusbar.policy.KeyguardStateController
import com.android.systemui.user.data.repository.FakeUserRepository
import com.android.systemui.user.domain.interactor.SelectedUserInteractor
import com.android.systemui.testKosmos
import com.android.systemui.user.data.repository.fakeUserRepository
import com.android.systemui.util.mockito.KotlinArgumentCaptor
import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat
@@ -61,7 +58,6 @@ import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.ArgumentMatchers.eq
import org.mockito.Mock
import org.mockito.Mockito.mock
import org.mockito.Mockito.verify
import org.mockito.MockitoAnnotations

@@ -70,34 +66,22 @@ import org.mockito.MockitoAnnotations
@TestableLooper.RunWithLooper(setAsMainLooper = true)
@RunWith(AndroidJUnit4::class)
class BouncerMessageInteractorTest : SysuiTestCase() {

    private val kosmos = testKosmos()
    private val countDownTimerCallback = KotlinArgumentCaptor(CountDownTimerCallback::class.java)
    private val repository = BouncerMessageRepositoryImpl()
    private val userRepository = FakeUserRepository()
    private val fakeTrustRepository = FakeTrustRepository()
    private val fakeFacePropertyRepository = FakeFacePropertyRepository()
    private val bouncerRepository = FakeKeyguardBouncerRepository()
    private val fakeDeviceEntryFingerprintAuthRepository =
        FakeDeviceEntryFingerprintAuthRepository()
    private val fakeDeviceEntryFaceAuthRepository = FakeDeviceEntryFaceAuthRepository()
    private val biometricSettingsRepository: FakeBiometricSettingsRepository =
        FakeBiometricSettingsRepository()
    private val biometricSettingsRepository = kosmos.fakeBiometricSettingsRepository
    private val testScope = kosmos.testScope
    @Mock private lateinit var updateMonitor: KeyguardUpdateMonitor
    @Mock private lateinit var securityModel: KeyguardSecurityModel
    @Mock private lateinit var countDownTimerUtil: CountDownTimerUtil
    @Mock private lateinit var systemPropertiesHelper: SystemPropertiesHelper
    @Mock private lateinit var keyguardUpdateMonitor: KeyguardUpdateMonitor
    @Mock private lateinit var mSelectedUserInteractor: SelectedUserInteractor

    private lateinit var primaryBouncerInteractor: PrimaryBouncerInteractor
    private lateinit var testScope: TestScope
    private lateinit var underTest: BouncerMessageInteractor

    @Before
    fun setUp() {
        MockitoAnnotations.initMocks(this)
        userRepository.setUserInfos(listOf(PRIMARY_USER))
        testScope = TestScope()
        kosmos.fakeUserRepository.setUserInfos(listOf(PRIMARY_USER))
        allowTestableLooperAsMainThread()
        whenever(securityModel.getSecurityMode(PRIMARY_USER_ID)).thenReturn(PIN)
        biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)
@@ -105,44 +89,28 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
    }

    suspend fun TestScope.init() {
        userRepository.setSelectedUserInfo(PRIMARY_USER)
        kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
        mSetFlagsRule.enableFlags(Flags.FLAG_REVAMPED_BOUNCER_MESSAGES)
        primaryBouncerInteractor =
            PrimaryBouncerInteractor(
                bouncerRepository,
                mock(BouncerView::class.java),
                mock(Handler::class.java),
                mock(KeyguardStateController::class.java),
                mock(KeyguardSecurityModel::class.java),
                mock(PrimaryBouncerCallbackInteractor::class.java),
                mock(FalsingCollector::class.java),
                mock(DismissCallbackRegistry::class.java),
                context,
                keyguardUpdateMonitor,
                fakeTrustRepository,
                testScope.backgroundScope,
                mSelectedUserInteractor,
                mock(DeviceEntryFaceAuthInteractor::class.java),
            )
        underTest =
            BouncerMessageInteractor(
                repository = repository,
                userRepository = userRepository,
                userRepository = kosmos.fakeUserRepository,
                countDownTimerUtil = countDownTimerUtil,
                updateMonitor = updateMonitor,
                biometricSettingsRepository = biometricSettingsRepository,
                applicationScope = this.backgroundScope,
                trustRepository = fakeTrustRepository,
                applicationScope = testScope.backgroundScope,
                trustRepository = kosmos.fakeTrustRepository,
                systemPropertiesHelper = systemPropertiesHelper,
                primaryBouncerInteractor = primaryBouncerInteractor,
                facePropertyRepository = fakeFacePropertyRepository,
                deviceEntryFingerprintAuthRepository = fakeDeviceEntryFingerprintAuthRepository,
                faceAuthRepository = fakeDeviceEntryFaceAuthRepository,
                primaryBouncerInteractor = kosmos.primaryBouncerInteractor,
                facePropertyRepository = kosmos.fakeFacePropertyRepository,
                deviceEntryFingerprintAuthInteractor = kosmos.deviceEntryFingerprintAuthInteractor,
                faceAuthRepository = kosmos.fakeDeviceEntryFaceAuthRepository,
                securityModel = securityModel
            )
        biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)
        fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
        bouncerRepository.setPrimaryShow(true)
        kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
        kosmos.fakeFingerprintPropertyRepository.supportsSideFps()
        kosmos.fakeKeyguardBouncerRepository.setPrimaryShow(true)
        runCurrent()
    }

@@ -268,7 +236,7 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
            init()
            val lockoutMessage by collectLastValue(underTest.bouncerMessage)

            fakeDeviceEntryFaceAuthRepository.setLockedOut(true)
            kosmos.fakeDeviceEntryFaceAuthRepository.setLockedOut(true)
            runCurrent()

            assertThat(primaryResMessage(lockoutMessage))
@@ -276,7 +244,7 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
            assertThat(secondaryResMessage(lockoutMessage))
                .isEqualTo("Can’t unlock with face. Too many attempts.")

            fakeDeviceEntryFaceAuthRepository.setLockedOut(false)
            kosmos.fakeDeviceEntryFaceAuthRepository.setLockedOut(false)
            runCurrent()

            assertThat(primaryResMessage(lockoutMessage))
@@ -289,15 +257,17 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
        testScope.runTest {
            init()
            val lockoutMessage by collectLastValue(underTest.bouncerMessage)
            fakeFacePropertyRepository.setSensorInfo(FaceSensorInfo(1, SensorStrength.STRONG))
            fakeDeviceEntryFaceAuthRepository.setLockedOut(true)
            kosmos.fakeFacePropertyRepository.setSensorInfo(
                FaceSensorInfo(1, SensorStrength.STRONG)
            )
            kosmos.fakeDeviceEntryFaceAuthRepository.setLockedOut(true)
            runCurrent()

            assertThat(primaryResMessage(lockoutMessage)).isEqualTo("Enter PIN")
            assertThat(secondaryResMessage(lockoutMessage))
                .isEqualTo("PIN is required after too many attempts")

            fakeDeviceEntryFaceAuthRepository.setLockedOut(false)
            kosmos.fakeDeviceEntryFaceAuthRepository.setLockedOut(false)
            runCurrent()

            assertThat(primaryResMessage(lockoutMessage))
@@ -311,14 +281,14 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
            init()
            val lockedOutMessage by collectLastValue(underTest.bouncerMessage)

            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(true)
            runCurrent()

            assertThat(primaryResMessage(lockedOutMessage)).isEqualTo("Enter PIN")
            assertThat(secondaryResMessage(lockedOutMessage))
                .isEqualTo("PIN is required after too many attempts")

            fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            runCurrent()

            assertThat(primaryResMessage(lockedOutMessage))
@@ -326,6 +296,19 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
            assertThat(lockedOutMessage?.secondaryMessage?.message).isNull()
        }

    @Test
    fun onUdfpsFingerprint_DoesNotShowFingerprintMessage() =
        testScope.runTest {
            init()
            kosmos.fakeDeviceEntryFingerprintAuthRepository.setLockedOut(false)
            kosmos.fakeFingerprintPropertyRepository.supportsUdfps()
            val lockedOutMessage by collectLastValue(underTest.bouncerMessage)

            runCurrent()

            assertThat(primaryResMessage(lockedOutMessage)).isEqualTo("Enter PIN")
        }

    @Test
    fun onRestartForMainlineUpdate_shouldProvideRelevantMessage() =
        testScope.runTest {
@@ -344,9 +327,10 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
    fun onAuthFlagsChanged_withTrustNotManagedAndNoBiometrics_isANoop() =
        testScope.runTest {
            init()
            fakeTrustRepository.setTrustUsuallyManaged(false)
            kosmos.fakeTrustRepository.setTrustUsuallyManaged(false)
            biometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(false)
            biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
            runCurrent()

            val defaultMessage = Pair("Enter PIN", null)

@@ -377,12 +361,13 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
        testScope.runTest {
            init()

            userRepository.setSelectedUserInfo(PRIMARY_USER)
            kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
            biometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(false)
            biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)
            runCurrent()

            fakeTrustRepository.setCurrentUserTrustManaged(true)
            fakeTrustRepository.setTrustUsuallyManaged(true)
            kosmos.fakeTrustRepository.setCurrentUserTrustManaged(true)
            kosmos.fakeTrustRepository.setTrustUsuallyManaged(true)

            val defaultMessage = Pair("Enter PIN", null)

@@ -415,8 +400,8 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
    fun authFlagsChanges_withFaceEnrolled_providesDifferentMessages() =
        testScope.runTest {
            init()
            userRepository.setSelectedUserInfo(PRIMARY_USER)
            fakeTrustRepository.setTrustUsuallyManaged(false)
            kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
            kosmos.fakeTrustRepository.setTrustUsuallyManaged(false)
            biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(false)

            biometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(true)
@@ -453,12 +438,13 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
    fun authFlagsChanges_withFingerprintEnrolled_providesDifferentMessages() =
        testScope.runTest {
            init()
            userRepository.setSelectedUserInfo(PRIMARY_USER)
            fakeTrustRepository.setCurrentUserTrustManaged(false)
            kosmos.fakeUserRepository.setSelectedUserInfo(PRIMARY_USER)
            kosmos.fakeTrustRepository.setCurrentUserTrustManaged(false)
            biometricSettingsRepository.setIsFaceAuthEnrolledAndEnabled(false)

            biometricSettingsRepository.setIsFingerprintAuthEnrolledAndEnabled(true)
            biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)
            runCurrent()

            verifyMessagesForAuthFlag(
                LockPatternUtils.StrongAuthTracker.STRONG_AUTH_NOT_REQUIRED to
@@ -466,6 +452,7 @@ class BouncerMessageInteractorTest : SysuiTestCase() {
            )

            biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(false)
            runCurrent()

            verifyMessagesForAuthFlag(
                LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_USER_REQUEST to
+9 −8
Original line number Diff line number Diff line
@@ -26,12 +26,10 @@ import com.android.systemui.keyguard.data.repository.deviceEntryFingerprintAuthR
import com.android.systemui.kosmos.testScope
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlin.test.Test
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.runTest
import org.junit.Test
import org.junit.runner.RunWith

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(AndroidJUnit4::class)
class DeviceEntryFingerprintAuthInteractorTest : SysuiTestCase() {
@@ -59,17 +57,20 @@ class DeviceEntryFingerprintAuthInteractorTest : SysuiTestCase() {
        }

    @Test
    fun isSensorUnderDisplay_trueForUdfpsSensorTypes() =
    fun isFingerprintCurrentlyAllowedInBouncer_trueForNonUdfpsSensorTypes() =
        testScope.runTest {
            val isSensorUnderDisplay by collectLastValue(underTest.isSensorUnderDisplay)
            biometricSettingsRepository.setIsFingerprintAuthCurrentlyAllowed(true)

            val isFingerprintCurrentlyAllowedInBouncer by
                collectLastValue(underTest.isFingerprintCurrentlyAllowedOnBouncer)

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

            fingerprintPropertyRepository.supportsRearFps()
            assertThat(isSensorUnderDisplay).isFalse()
            assertThat(isFingerprintCurrentlyAllowedInBouncer).isTrue()

            fingerprintPropertyRepository.supportsSideFps()
            assertThat(isSensorUnderDisplay).isFalse()
            assertThat(isFingerprintCurrentlyAllowedInBouncer).isTrue()
        }
}
+41 −29
Original line number Diff line number Diff line
@@ -33,15 +33,17 @@ 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.DeviceEntryFingerprintAuthInteractor
import com.android.systemui.flags.SystemPropertiesHelper
import com.android.systemui.keyguard.data.repository.BiometricSettingsRepository
import com.android.systemui.keyguard.data.repository.DeviceEntryFingerprintAuthRepository
import com.android.systemui.keyguard.data.repository.TrustRepository
import com.android.systemui.user.data.repository.UserRepository
import com.android.systemui.util.kotlin.Quint
import com.android.systemui.util.kotlin.Sextuple
import com.android.systemui.util.kotlin.combine
import javax.inject.Inject
import kotlin.math.roundToInt
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.combine
@@ -56,6 +58,7 @@ private const val REBOOT_MAINLINE_UPDATE = "reboot,mainline_update"
private const val TAG = "BouncerMessageInteractor"

/** Handles business logic for the primary bouncer message area. */
@OptIn(ExperimentalCoroutinesApi::class)
@SysUISingleton
class BouncerMessageInteractor
@Inject
@@ -63,23 +66,24 @@ constructor(
    private val repository: BouncerMessageRepository,
    private val userRepository: UserRepository,
    private val countDownTimerUtil: CountDownTimerUtil,
    private val updateMonitor: KeyguardUpdateMonitor,
    updateMonitor: KeyguardUpdateMonitor,
    trustRepository: TrustRepository,
    biometricSettingsRepository: BiometricSettingsRepository,
    private val systemPropertiesHelper: SystemPropertiesHelper,
    primaryBouncerInteractor: PrimaryBouncerInteractor,
    @Application private val applicationScope: CoroutineScope,
    private val facePropertyRepository: FacePropertyRepository,
    deviceEntryFingerprintAuthRepository: DeviceEntryFingerprintAuthRepository,
    private val deviceEntryFingerprintAuthInteractor: DeviceEntryFingerprintAuthInteractor,
    faceAuthRepository: DeviceEntryFaceAuthRepository,
    private val securityModel: KeyguardSecurityModel,
) {

    private val isFingerprintAuthCurrentlyAllowed =
        deviceEntryFingerprintAuthRepository.isLockedOut
            .isFalse()
            .and(biometricSettingsRepository.isFingerprintAuthCurrentlyAllowed)
            .stateIn(applicationScope, SharingStarted.Eagerly, false)
    private val isFingerprintAuthCurrentlyAllowedOnBouncer =
        deviceEntryFingerprintAuthInteractor.isFingerprintCurrentlyAllowedOnBouncer.stateIn(
            applicationScope,
            SharingStarted.Eagerly,
            false
        )

    private val currentSecurityMode
        get() = securityModel.getSecurityMode(currentUserId)
@@ -99,13 +103,13 @@ constructor(
                        BiometricSourceType.FACE ->
                            BouncerMessageStrings.incorrectFaceInput(
                                    currentSecurityMode.toAuthModel(),
                                    isFingerprintAuthCurrentlyAllowed.value
                                    isFingerprintAuthCurrentlyAllowedOnBouncer.value
                                )
                                .toMessage()
                        else ->
                            BouncerMessageStrings.defaultMessage(
                                    currentSecurityMode.toAuthModel(),
                                    isFingerprintAuthCurrentlyAllowed.value
                                    isFingerprintAuthCurrentlyAllowedOnBouncer.value
                                )
                                .toMessage()
                    }
@@ -144,11 +148,12 @@ constructor(
                biometricSettingsRepository.authenticationFlags,
                trustRepository.isCurrentUserTrustManaged,
                isAnyBiometricsEnabledAndEnrolled,
                deviceEntryFingerprintAuthRepository.isLockedOut,
                deviceEntryFingerprintAuthInteractor.isLockedOut,
                faceAuthRepository.isLockedOut,
                ::Quint
                isFingerprintAuthCurrentlyAllowedOnBouncer,
                ::Sextuple
            )
            .map { (flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut) ->
            .map { (flags, _, biometricsEnrolledAndEnabled, fpLockedOut, faceLockedOut, _) ->
                val isTrustUsuallyManaged = trustRepository.isCurrentUserTrustUsuallyManaged.value
                val trustOrBiometricsAvailable =
                    (isTrustUsuallyManaged || biometricsEnrolledAndEnabled)
@@ -193,14 +198,14 @@ constructor(
                    } else {
                        BouncerMessageStrings.faceLockedOut(
                                currentSecurityMode.toAuthModel(),
                                isFingerprintAuthCurrentlyAllowed.value
                                isFingerprintAuthCurrentlyAllowedOnBouncer.value
                            )
                            .toMessage()
                    }
                } else if (flags.isSomeAuthRequiredAfterAdaptiveAuthRequest) {
                    BouncerMessageStrings.authRequiredAfterAdaptiveAuthRequest(
                            currentSecurityMode.toAuthModel(),
                            isFingerprintAuthCurrentlyAllowed.value
                            isFingerprintAuthCurrentlyAllowedOnBouncer.value
                        )
                        .toMessage()
                } else if (
@@ -209,19 +214,19 @@ constructor(
                ) {
                    BouncerMessageStrings.nonStrongAuthTimeout(
                            currentSecurityMode.toAuthModel(),
                            isFingerprintAuthCurrentlyAllowed.value
                            isFingerprintAuthCurrentlyAllowedOnBouncer.value
                        )
                        .toMessage()
                } else if (isTrustUsuallyManaged && flags.someAuthRequiredAfterUserRequest) {
                    BouncerMessageStrings.trustAgentDisabled(
                            currentSecurityMode.toAuthModel(),
                            isFingerprintAuthCurrentlyAllowed.value
                            isFingerprintAuthCurrentlyAllowedOnBouncer.value
                        )
                        .toMessage()
                } else if (isTrustUsuallyManaged && flags.someAuthRequiredAfterTrustAgentExpired) {
                    BouncerMessageStrings.trustAgentDisabled(
                            currentSecurityMode.toAuthModel(),
                            isFingerprintAuthCurrentlyAllowed.value
                            isFingerprintAuthCurrentlyAllowedOnBouncer.value
                        )
                        .toMessage()
                } else if (trustOrBiometricsAvailable && flags.isInUserLockdown) {
@@ -265,7 +270,7 @@ constructor(
        repository.setMessage(
            BouncerMessageStrings.incorrectSecurityInput(
                    currentSecurityMode.toAuthModel(),
                    isFingerprintAuthCurrentlyAllowed.value
                    isFingerprintAuthCurrentlyAllowedOnBouncer.value
                )
                .toMessage()
        )
@@ -274,14 +279,22 @@ constructor(
    fun setFingerprintAcquisitionMessage(value: String?) {
        if (!Flags.revampedBouncerMessages()) return
        repository.setMessage(
            defaultMessage(currentSecurityMode, value, isFingerprintAuthCurrentlyAllowed.value)
            defaultMessage(
                currentSecurityMode,
                value,
                isFingerprintAuthCurrentlyAllowedOnBouncer.value
            )
        )
    }

    fun setFaceAcquisitionMessage(value: String?) {
        if (!Flags.revampedBouncerMessages()) return
        repository.setMessage(
            defaultMessage(currentSecurityMode, value, isFingerprintAuthCurrentlyAllowed.value)
            defaultMessage(
                currentSecurityMode,
                value,
                isFingerprintAuthCurrentlyAllowedOnBouncer.value
            )
        )
    }

@@ -289,7 +302,11 @@ constructor(
        if (!Flags.revampedBouncerMessages()) return

        repository.setMessage(
            defaultMessage(currentSecurityMode, value, isFingerprintAuthCurrentlyAllowed.value)
            defaultMessage(
                currentSecurityMode,
                value,
                isFingerprintAuthCurrentlyAllowedOnBouncer.value
            )
        )
    }

@@ -297,7 +314,7 @@ constructor(
        get() =
            BouncerMessageStrings.defaultMessage(
                    currentSecurityMode.toAuthModel(),
                    isFingerprintAuthCurrentlyAllowed.value
                    isFingerprintAuthCurrentlyAllowedOnBouncer.value
                )
                .toMessage()

@@ -355,11 +372,6 @@ open class CountDownTimerUtil @Inject constructor() {
private fun Flow<Boolean>.or(anotherFlow: Flow<Boolean>) =
    this.combine(anotherFlow) { a, b -> a || b }

private fun Flow<Boolean>.and(anotherFlow: Flow<Boolean>) =
    this.combine(anotherFlow) { a, b -> a && b }

private fun Flow<Boolean>.isFalse() = this.map { !it }

private fun defaultMessage(
    securityMode: SecurityMode,
    secondaryMessage: String?,
+12 −0
Original line number Diff line number Diff line
@@ -29,6 +29,8 @@ import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.filterIsInstance
import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map

@OptIn(ExperimentalCoroutinesApi::class)
@@ -72,4 +74,14 @@ constructor(
     */
    val isSensorUnderDisplay =
        fingerprintPropertyRepository.sensorType.map(FingerprintSensorType::isUdfps)

    /** Whether fingerprint authentication is currently allowed while on the bouncer. */
    val isFingerprintCurrentlyAllowedOnBouncer =
        isSensorUnderDisplay.flatMapLatest { sensorBelowDisplay ->
            if (sensorBelowDisplay) {
                flowOf(false)
            } else {
                isFingerprintAuthCurrentlyAllowed
            }
        }
}
+2 −1

File changed.

Preview size limit exceeded, changes collapsed.