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

Commit e36355b0 authored by Grace Cheng's avatar Grace Cheng Committed by Android (Google) Code Review
Browse files

Merge "Add Kosmos to tests and update sfpsAuthenticationReason" into main

parents 777b25f6 f585fe90
Loading
Loading
Loading
Loading
+8 −4
Original line number Diff line number Diff line
@@ -18,13 +18,14 @@ package com.android.systemui.biometrics.domain.interactor

import android.app.ActivityTaskManager
import com.android.systemui.biometrics.data.repository.BiometricStatusRepository
import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
import com.android.systemui.biometrics.shared.model.AuthenticationReason
import com.android.systemui.biometrics.shared.model.AuthenticationReason.SettingsOperations
import com.android.systemui.keyguard.shared.model.FingerprintAuthenticationStatus
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.map

/** Encapsulates business logic for interacting with biometric authentication state. */
interface BiometricStatusInteractor {
@@ -43,12 +44,15 @@ class BiometricStatusInteractorImpl
constructor(
    private val activityTaskManager: ActivityTaskManager,
    biometricStatusRepository: BiometricStatusRepository,
    fingerprintPropertyRepository: FingerprintPropertyRepository,
) : BiometricStatusInteractor {

    override val sfpsAuthenticationReason: Flow<AuthenticationReason> =
        biometricStatusRepository.fingerprintAuthenticationReason.map { reason: AuthenticationReason
            ->
            if (reason.isReasonToAlwaysUpdateSfpsOverlay(activityTaskManager)) {
        combine(
            biometricStatusRepository.fingerprintAuthenticationReason,
            fingerprintPropertyRepository.sensorType
        ) { reason: AuthenticationReason, sensorType ->
            if (sensorType.isPowerButton() && reason.isReasonToAlwaysUpdateSfpsOverlay(activityTaskManager)) {
                reason
            } else {
                AuthenticationReason.NotRunning
+2 −1
Original line number Diff line number Diff line
@@ -176,7 +176,8 @@ open class AuthContainerViewTest : SysuiTestCase() {
                        testScope.backgroundScope,
                )
        biometricStatusInteractor =
                BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository)
                BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository,
                    fingerprintRepository)
        // Set up default logo icon
        whenever(packageManager.getApplicationIcon(OP_PACKAGE_NAME)).thenReturn(defaultLogoIcon)
        context.setMockPackageManager(packageManager)
+12 −13
Original line number Diff line number Diff line
@@ -35,12 +35,12 @@ import com.android.systemui.biometrics.shared.model.AuthenticationReason
import com.android.systemui.biometrics.shared.model.AuthenticationReason.SettingsOperations
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.testKosmos
import com.android.systemui.util.mockito.withArgCaptor
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
@@ -60,19 +60,18 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {
    @JvmField @Rule var mockitoRule: MockitoRule = MockitoJUnit.rule()
    @Mock private lateinit var biometricManager: BiometricManager

    private val kosmos = testKosmos()
    private lateinit var underTest: BiometricStatusRepository

    private val testScope = TestScope(StandardTestDispatcher())

    @Before
    fun setUp() {
        mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
        underTest = BiometricStatusRepositoryImpl(testScope.backgroundScope, biometricManager)
        underTest = BiometricStatusRepositoryImpl(kosmos.testScope.backgroundScope, biometricManager)
    }

    @Test
    fun updatesFingerprintAuthenticationReason_whenBiometricPromptAuthenticationStarted() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAuthenticationReason by
                collectLastValue(underTest.fingerprintAuthenticationReason)
            runCurrent()
@@ -91,7 +90,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAuthenticationReason_whenDeviceEntryAuthenticationStarted() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAuthenticationReason by
                collectLastValue(underTest.fingerprintAuthenticationReason)
            runCurrent()
@@ -113,7 +112,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAuthenticationReason_whenOtherAuthenticationStarted() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAuthenticationReason by
                collectLastValue(underTest.fingerprintAuthenticationReason)
            runCurrent()
@@ -135,7 +134,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAuthenticationReason_whenSettingsAuthenticationStarted() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAuthenticationReason by
                collectLastValue(underTest.fingerprintAuthenticationReason)
            runCurrent()
@@ -157,7 +156,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAuthenticationReason_whenEnrollmentAuthenticationStarted() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAuthenticationReason by
                collectLastValue(underTest.fingerprintAuthenticationReason)
            runCurrent()
@@ -195,7 +194,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAuthenticationReason_whenAuthenticationStopped() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAuthenticationReason by
                collectLastValue(underTest.fingerprintAuthenticationReason)
            runCurrent()
@@ -215,7 +214,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAcquiredStatusWhenBiometricPromptAuthenticationAcquired() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAcquiredStatus by collectLastValue(underTest.fingerprintAcquiredStatus)
            runCurrent()

@@ -240,7 +239,7 @@ class BiometricStatusRepositoryTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAcquiredStatusWhenDeviceEntryAuthenticationAcquired() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAcquiredStatus by collectLastValue(underTest.fingerprintAcquiredStatus)
            runCurrent()

+51 −39
Original line number Diff line number Diff line
@@ -17,62 +17,69 @@
package com.android.systemui.biometrics.domain.interactor

import android.app.ActivityManager
import android.app.ActivityTaskManager
import android.content.ComponentName
import android.hardware.biometrics.BiometricFingerprintConstants
import androidx.test.filters.SmallTest
import com.android.app.activityTaskManager
import com.android.systemui.SysuiTestCase
import com.android.systemui.biometrics.data.repository.FakeBiometricStatusRepository
import com.android.systemui.biometrics.data.repository.biometricStatusRepository
import com.android.systemui.biometrics.data.repository.fingerprintPropertyRepository
import com.android.systemui.biometrics.shared.model.AuthenticationReason
import com.android.systemui.biometrics.shared.model.AuthenticationReason.SettingsOperations
import com.android.systemui.coroutines.collectLastValue
import com.android.systemui.keyguard.shared.model.AcquiredFingerprintAuthenticationStatus
import com.android.systemui.kosmos.testScope
import com.android.systemui.shared.Flags.FLAG_SIDEFPS_CONTROLLER_REFACTOR
import com.android.systemui.testKosmos
import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.runTest
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.runner.RunWith
import org.junit.runners.JUnit4
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.`when`
import org.mockito.junit.MockitoJUnit
import org.mockito.junit.MockitoRule

@OptIn(ExperimentalCoroutinesApi::class)
@SmallTest
@RunWith(JUnit4::class)
class BiometricStatusInteractorImplTest : SysuiTestCase() {
    @JvmField @Rule var mockitoRule: MockitoRule = MockitoJUnit.rule()
    @Mock private lateinit var activityTaskManager: ActivityTaskManager

    private lateinit var biometricStatusRepository: FakeBiometricStatusRepository
    private val kosmos = testKosmos()
    private lateinit var underTest: BiometricStatusInteractorImpl

    private val testScope = TestScope(StandardTestDispatcher())

    @Before
    fun setup() {
        mSetFlagsRule.enableFlags(FLAG_SIDEFPS_CONTROLLER_REFACTOR)
        biometricStatusRepository = FakeBiometricStatusRepository()
        underTest = BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository)
        underTest = kosmos.biometricStatusInteractor
    }

    @Test
    fun doesNotUpdatesSfpsAuthenticationReason_whenUdfpsAuthenticationStarted() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsUdfps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)

            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.BiometricPromptAuthentication
            )
            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)
        }

    @Test
    fun updatesSfpsAuthenticationReason_whenBiometricPromptAuthenticationStarted() =
        testScope.runTest {
    fun updatesSfpsAuthenticationReason_whenSfpsBiometricPromptAuthenticationStarted() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsSideFps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)

            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.BiometricPromptAuthentication
            )
            assertThat(sfpsAuthenticationReason)
@@ -80,58 +87,62 @@ class BiometricStatusInteractorImplTest : SysuiTestCase() {
        }

    @Test
    fun doesNotUpdateSfpsAuthenticationReason_whenDeviceEntryAuthenticationStarted() =
        testScope.runTest {
    fun doesNotUpdateSfpsAuthenticationReason_whenSfpsDeviceEntryAuthenticationStarted() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsSideFps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)

            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.DeviceEntryAuthentication
            )
            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)
        }

    @Test
    fun updatesSfpsAuthenticationReason_whenOtherAuthenticationStarted() =
        testScope.runTest {
    fun updatesSfpsAuthenticationReason_whenOtherSfpsAuthenticationStarted() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsSideFps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)

            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.OtherAuthentication
            )
            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.OtherAuthentication)
        }

    @Test
    fun doesNotUpdateSfpsAuthenticationReason_whenOtherSettingsAuthenticationStarted() =
        testScope.runTest {
    fun doesNotUpdateSfpsAuthenticationReason_whenOtherSfpsSettingsAuthenticationStarted() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsSideFps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)

            `when`(activityTaskManager.getTasks(Mockito.anyInt()))
            `when`(kosmos.activityTaskManager.getTasks(Mockito.anyInt()))
                .thenReturn(listOf(fpSettingsTask()))
            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.SettingsAuthentication(SettingsOperations.OTHER)
            )
            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)
        }

    @Test
    fun updatesSfpsAuthenticationReason_whenEnrollmentAuthenticationStarted() =
        testScope.runTest {
    fun updatesSfpsAuthenticationReason_whenSfpsEnrollmentStarted() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsSideFps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)

            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.SettingsAuthentication(SettingsOperations.ENROLL_FIND_SENSOR)
            )
            assertThat(sfpsAuthenticationReason)
@@ -141,7 +152,7 @@ class BiometricStatusInteractorImplTest : SysuiTestCase() {
                    )
                )

            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.SettingsAuthentication(SettingsOperations.ENROLL_ENROLLING)
            )
            assertThat(sfpsAuthenticationReason)
@@ -151,15 +162,16 @@ class BiometricStatusInteractorImplTest : SysuiTestCase() {
        }

    @Test
    fun updatesFingerprintAuthenticationReason_whenAuthenticationStopped() =
        testScope.runTest {
    fun updatesFingerprintAuthenticationReason_whenSfpsAuthenticationStopped() =
        kosmos.testScope.runTest {
            kosmos.fingerprintPropertyRepository.supportsSideFps()
            val sfpsAuthenticationReason by collectLastValue(underTest.sfpsAuthenticationReason)
            runCurrent()

            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.BiometricPromptAuthentication
            )
            biometricStatusRepository.setFingerprintAuthenticationReason(
            kosmos.biometricStatusRepository.setFingerprintAuthenticationReason(
                AuthenticationReason.NotRunning
            )
            assertThat(sfpsAuthenticationReason).isEqualTo(AuthenticationReason.NotRunning)
@@ -167,11 +179,11 @@ class BiometricStatusInteractorImplTest : SysuiTestCase() {

    @Test
    fun updatesFingerprintAcquiredStatusWhenBiometricPromptAuthenticationAcquired() =
        testScope.runTest {
        kosmos.testScope.runTest {
            val fingerprintAcquiredStatus by collectLastValue(underTest.fingerprintAcquiredStatus)
            runCurrent()

            biometricStatusRepository.setFingerprintAcquiredStatus(
            kosmos.biometricStatusRepository.setFingerprintAcquiredStatus(
                AcquiredFingerprintAuthenticationStatus(
                    AuthenticationReason.BiometricPromptAuthentication,
                    BiometricFingerprintConstants.FINGERPRINT_ACQUIRED_START
+2 −1
Original line number Diff line number Diff line
@@ -203,7 +203,8 @@ class SideFpsOverlayViewBinderTest : SysuiTestCase() {
            )

        biometricStatusInteractor =
            BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository)
            BiometricStatusInteractorImpl(activityTaskManager, biometricStatusRepository,
                fingerprintPropertyRepository)

        displayStateInteractor =
            DisplayStateInteractorImpl(
Loading