Merge "Updated FakeFingerprintManagerInteractor" into main

This commit is contained in:
Joshua Mccloskey
2024-04-11 20:15:23 +00:00
committed by Android (Google) Code Review
8 changed files with 223 additions and 80 deletions

View File

@@ -17,6 +17,11 @@
package com.android.settings.biometrics.fingerprint2.fragment package com.android.settings.biometrics.fingerprint2.fragment
import android.content.Context import android.content.Context
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.os.Bundle import android.os.Bundle
import androidx.fragment.app.testing.FragmentScenario import androidx.fragment.app.testing.FragmentScenario
import androidx.fragment.app.testing.launchFragmentInContainer import androidx.fragment.app.testing.launchFragmentInContainer
@@ -47,6 +52,7 @@ import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength import com.android.systemui.biometrics.shared.model.SensorStrength
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.google.android.setupdesign.GlifLayout import com.google.android.setupdesign.GlifLayout
import com.google.android.setupdesign.template.RequireScrollMixin import com.google.android.setupdesign.template.RequireScrollMixin
import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher
@@ -67,7 +73,17 @@ class FingerprintEnrollIntroFragmentTest {
private val backgroundDispatcher = StandardTestDispatcher() private val backgroundDispatcher = StandardTestDispatcher()
private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment> private lateinit var fragmentScenario: FragmentScenario<FingerprintEnrollIntroV2Fragment>
private val fingerprintSensor = private val fingerprintSensor =
FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON) FingerprintSensorPropertiesInternal(
0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
var enrollFlow = Default var enrollFlow = Default
val flowViewModel = FingerprintFlowViewModel(enrollFlow) val flowViewModel = FingerprintFlowViewModel(enrollFlow)

View File

@@ -16,6 +16,11 @@
package com.android.settings.tests.screenshot.biometrics.fingerprint package com.android.settings.tests.screenshot.biometrics.fingerprint
import android.content.res.Configuration import android.content.res.Configuration
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.view.Surface import android.view.Surface
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
@@ -39,9 +44,7 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Fing
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
import com.android.settings.testutils2.FakeFingerprintManagerInteractor import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
@@ -56,7 +59,19 @@ import platform.test.screenshot.matchers.PixelPerfectMatcher
class Injector(step: FingerprintNavigationStep.UiStep) { class Injector(step: FingerprintNavigationStep.UiStep) {
var enrollFlow = Default var enrollFlow = Default
var fingerprintSensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.REAR) var fingerprintSensor =
FingerprintSensorPropertiesInternal(
0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_REAR,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
var accessibilityInteractor = var accessibilityInteractor =
object : AccessibilityInteractor { object : AccessibilityInteractor {
override val isAccessibilityEnabled: Flow<Boolean> = flowOf(true) override val isAccessibilityEnabled: Flow<Boolean> = flowOf(true)

View File

@@ -16,6 +16,11 @@
package com.android.settings.testutils2 package com.android.settings.testutils2
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState
@@ -23,7 +28,7 @@ import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAtt
import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
@@ -35,16 +40,20 @@ class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
var enrolledFingerprintsInternal: MutableList<FingerprintData> = mutableListOf() var enrolledFingerprintsInternal: MutableList<FingerprintData> = mutableListOf()
var challengeToGenerate: Pair<Long, ByteArray> = Pair(-1L, byteArrayOf()) var challengeToGenerate: Pair<Long, ByteArray> = Pair(-1L, byteArrayOf())
var authenticateAttempt = FingerprintAuthAttemptModel.Success(1) var authenticateAttempt = FingerprintAuthAttemptModel.Success(1)
var enrollStateViewModel: List<FingerEnrollState> = var enrollStateViewModel: List<FingerEnrollState> = listOf(FingerEnrollState.EnrollProgress(5, 5))
listOf(FingerEnrollState.EnrollProgress(5, 5))
var sensorProp = var sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.POWER_BUTTON listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
override suspend fun authenticate(): FingerprintAuthAttemptModel { override suspend fun authenticate(): FingerprintAuthAttemptModel {
return authenticateAttempt return authenticateAttempt
@@ -68,7 +77,7 @@ class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
override suspend fun enroll( override suspend fun enroll(
hardwareAuthToken: ByteArray?, hardwareAuthToken: ByteArray?,
enrollReason: EnrollReason enrollReason: EnrollReason,
): Flow<FingerEnrollState> = flowOf(*enrollStateViewModel.toTypedArray()) ): Flow<FingerEnrollState> = flowOf(*enrollStateViewModel.toTypedArray())
override suspend fun removeFingerprint(fp: FingerprintData): Boolean { override suspend fun removeFingerprint(fp: FingerprintData): Boolean {
@@ -84,5 +93,4 @@ class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
override suspend fun hasSideFps(): Boolean { override suspend fun hasSideFps(): Boolean {
return sensorProp.sensorType == FingerprintSensorType.POWER_BUTTON return sensorProp.sensorType == FingerprintSensorType.POWER_BUTTON
} }
} }

View File

@@ -18,18 +18,23 @@ package com.android.settings.fingerprint2.domain.interactor
import android.content.Context import android.content.Context
import android.content.Intent import android.content.Intent
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.Fingerprint import android.hardware.fingerprint.Fingerprint
import android.hardware.fingerprint.FingerprintEnrollOptions import android.hardware.fingerprint.FingerprintEnrollOptions
import android.hardware.fingerprint.FingerprintManager import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.FingerprintManager.CryptoObject import android.hardware.fingerprint.FingerprintManager.CryptoObject
import android.hardware.fingerprint.FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT import android.hardware.fingerprint.FingerprintManager.FINGERPRINT_ERROR_LOCKOUT_PERMANENT
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.os.CancellationSignal import android.os.CancellationSignal
import android.os.Handler import android.os.Handler
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
import com.android.settings.biometrics.GatekeeperPasswordProvider import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepository
import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractor
import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl import com.android.settings.biometrics.fingerprint2.domain.interactor.FingerprintManagerInteractorImpl
import com.android.settings.biometrics.fingerprint2.domain.interactor.PressToAuthInteractor
import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.lib.model.Default import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
@@ -38,8 +43,7 @@ import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAtt
import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
import com.android.settings.password.ChooseLockSettingsHelper import com.android.settings.password.ChooseLockSettingsHelper
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.cancelAndJoin import kotlinx.coroutines.cancelAndJoin
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -85,7 +89,18 @@ class FingerprintManagerInteractorTest {
@Before @Before
fun setup() { fun setup() {
val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON) val sensor =
FingerprintSensorPropertiesInternal(
0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
val fingerprintSensorRepository = val fingerprintSensorRepository =
object : FingerprintSensorRepository { object : FingerprintSensorRepository {
override val fingerprintSensor: Flow<FingerprintSensor> = flowOf(sensor) override val fingerprintSensor: Flow<FingerprintSensor> = flowOf(sensor)
@@ -135,7 +150,7 @@ class FingerprintManagerInteractorTest {
listOf( listOf(
Fingerprint("Finger 1,", 2, 3L), Fingerprint("Finger 1,", 2, 3L),
Fingerprint("Finger 2,", 3, 3L), Fingerprint("Finger 2,", 3, 3L),
Fingerprint("Finger 3,", 4, 3L) Fingerprint("Finger 3,", 4, 3L),
) )
val fingerprintList2: List<Fingerprint> = val fingerprintList2: List<Fingerprint> =
fingerprintList1.plus( fingerprintList1.plus(
@@ -160,7 +175,7 @@ class FingerprintManagerInteractorTest {
gateKeeperPasswordProvider.requestGatekeeperHat( gateKeeperPasswordProvider.requestGatekeeperHat(
any(Intent::class.java), any(Intent::class.java),
anyLong(), anyLong(),
anyInt() anyInt(),
) )
) )
.thenReturn(byteArray) .thenReturn(byteArray)
@@ -223,7 +238,7 @@ class FingerprintManagerInteractorTest {
removalCallback.value.onRemovalError( removalCallback.value.onRemovalError(
fingerprintToRemove, fingerprintToRemove,
100, 100,
"Oh no, we couldn't find that one" "Oh no, we couldn't find that one",
) )
runCurrent() runCurrent()
@@ -260,7 +275,7 @@ class FingerprintManagerInteractorTest {
any(CancellationSignal::class.java), any(CancellationSignal::class.java),
capture(authCallback), capture(authCallback),
nullable(Handler::class.java), nullable(Handler::class.java),
anyInt() anyInt(),
) )
authCallback.value.onAuthenticationSucceeded( authCallback.value.onAuthenticationSucceeded(
FingerprintManager.AuthenticationResult(null, fingerprint, 1, false) FingerprintManager.AuthenticationResult(null, fingerprint, 1, false)
@@ -287,7 +302,7 @@ class FingerprintManagerInteractorTest {
any(CancellationSignal::class.java), any(CancellationSignal::class.java),
capture(authCallback), capture(authCallback),
nullable(Handler::class.java), nullable(Handler::class.java),
anyInt() anyInt(),
) )
authCallback.value.onAuthenticationError(FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "Lockout!!") authCallback.value.onAuthenticationError(FINGERPRINT_ERROR_LOCKOUT_PERMANENT, "Lockout!!")

View File

@@ -18,6 +18,11 @@ package com.android.settings.fingerprint2.enrollment.viewmodel
import android.content.Context import android.content.Context
import android.content.res.Configuration import android.content.res.Configuration
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.view.Surface import android.view.Surface
import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import androidx.test.core.app.ApplicationProvider import androidx.test.core.app.ApplicationProvider
@@ -33,9 +38,7 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Fing
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -94,7 +97,19 @@ class FingerprintEnrollFindSensorViewModelV2Test {
) )
.create(FingerprintGatekeeperViewModel::class.java) .create(FingerprintGatekeeperViewModel::class.java)
val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON) val sensor =
FingerprintSensorPropertiesInternal(
0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
val fingerprintFlowViewModel = FingerprintFlowViewModel(Default) val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
navigationViewModel = navigationViewModel =
FingerprintNavigationViewModel( FingerprintNavigationViewModel(
@@ -159,12 +174,17 @@ class FingerprintEnrollFindSensorViewModelV2Test {
fun udfpsLottieInfo() = fun udfpsLottieInfo() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.UDFPS_OPTICAL, listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
var udfpsLottieInfo: Boolean? = null var udfpsLottieInfo: Boolean? = null
val job = launch { underTest.udfpsLottieInfo.collect { udfpsLottieInfo = it } } val job = launch { underTest.udfpsLottieInfo.collect { udfpsLottieInfo = it } }
@@ -218,7 +238,17 @@ class FingerprintEnrollFindSensorViewModelV2Test {
fun rfpsAnimation() = fun rfpsAnimation() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor(0 /* sensorId */, SensorStrength.STRONG, 5, FingerprintSensorType.REAR) FingerprintSensorPropertiesInternal(
0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_REAR,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
var showRfpsAnimation: Boolean? = null var showRfpsAnimation: Boolean? = null
val job = launch { underTest.showRfpsAnimation.collect { showRfpsAnimation = it } } val job = launch { underTest.showRfpsAnimation.collect { showRfpsAnimation = it } }
@@ -232,12 +262,17 @@ class FingerprintEnrollFindSensorViewModelV2Test {
fun showPrimaryButton_ifUdfps() = fun showPrimaryButton_ifUdfps() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.UDFPS_OPTICAL, listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
var showPrimaryButton: Boolean? = null var showPrimaryButton: Boolean? = null
val job = launch { underTest.showPrimaryButton.collect { showPrimaryButton = it } } val job = launch { underTest.showPrimaryButton.collect { showPrimaryButton = it } }

View File

@@ -16,6 +16,11 @@
package com.android.settings.fingerprint2.ui.enrollment.viewmodel package com.android.settings.fingerprint2.ui.enrollment.viewmodel
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.fingerprint2.lib.model.Default import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollConfirmationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollConfirmationViewModel
@@ -26,6 +31,7 @@ import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength import com.android.systemui.biometrics.shared.model.SensorStrength
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher import kotlinx.coroutines.test.StandardTestDispatcher
@@ -68,8 +74,18 @@ class FingerprintEnrollConfirmationViewModelTest {
@Test @Test
fun testCanEnrollFingerprints() = fun testCanEnrollFingerprints() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp = FingerprintSensorPropertiesInternal(
FingerprintSensor(0 /* sensorId */, SensorStrength.STRONG, 5, FingerprintSensorType.REAR) 0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = mutableListOf() fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = mutableListOf()
fakeFingerprintManagerInteractor.enrollableFingerprints = 5 fakeFingerprintManagerInteractor.enrollableFingerprints = 5

View File

@@ -16,6 +16,11 @@
package com.android.settings.fingerprint2.ui.enrollment.viewmodel package com.android.settings.fingerprint2.ui.enrollment.viewmodel
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.fingerprint2.lib.model.Default import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.BackgroundViewModel
@@ -26,11 +31,8 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Fing
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep.Enrollment
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.GatekeeperInfo
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.NavigationState
import com.android.settings.testutils2.FakeFingerprintManagerInteractor import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -72,7 +74,18 @@ class FingerprintEnrollEnrollingViewModelTest {
fakeFingerprintManagerInteractor, fakeFingerprintManagerInteractor,
) )
.create(FingerprintGatekeeperViewModel::class.java) .create(FingerprintGatekeeperViewModel::class.java)
val sensor = FingerprintSensor(1, SensorStrength.STRONG, 5, FingerprintSensorType.POWER_BUTTON) val sensor =
FingerprintSensorPropertiesInternal(
1 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
val fingerprintFlowViewModel = FingerprintFlowViewModel(Default) val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
navigationViewModel = navigationViewModel =

View File

@@ -16,6 +16,11 @@
package com.android.settings.fingerprint2.ui.settings package com.android.settings.fingerprint2.ui.settings
import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel
import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData
@@ -23,9 +28,7 @@ import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.Finger
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.android.systemui.biometrics.shared.model.SensorStrength
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
@@ -96,12 +99,18 @@ class FingerprintSettingsViewModelTest {
fun authenticate_DoesNotRun_ifOptical() = fun authenticate_DoesNotRun_ifOptical() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.UDFPS_OPTICAL, listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_UDFPS_OPTICAL,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(FingerprintData("a", 1, 3L)) mutableListOf(FingerprintData("a", 1, 3L))
@@ -132,12 +141,18 @@ class FingerprintSettingsViewModelTest {
fun authenticate_DoesNotRun_ifUltrasonic() = fun authenticate_DoesNotRun_ifUltrasonic() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.UDFPS_ULTRASONIC, listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(FingerprintData("a", 1, 3L)) mutableListOf(FingerprintData("a", 1, 3L))
@@ -166,12 +181,18 @@ class FingerprintSettingsViewModelTest {
fun authenticate_DoesRun_ifNotUdfps() = fun authenticate_DoesRun_ifNotUdfps() =
testScope.runTest { testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.POWER_BUTTON listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(FingerprintData("a", 1, 3L)) mutableListOf(FingerprintData("a", 1, 3L))
val success = FingerprintAuthAttemptModel.Success(1) val success = FingerprintAuthAttemptModel.Success(1)
@@ -324,8 +345,7 @@ class FingerprintSettingsViewModelTest {
runCurrent() runCurrent()
assertThat(authAttempt).isEqualTo(success) assertThat(authAttempt).isEqualTo(success)
fakeFingerprintManagerInteractor.authenticateAttempt = fakeFingerprintManagerInteractor.authenticateAttempt = FingerprintAuthAttemptModel.Success(10)
FingerprintAuthAttemptModel.Success(10)
underTest.shouldAuthenticate(false) underTest.shouldAuthenticate(false)
advanceTimeBy(400) advanceTimeBy(400)
runCurrent() runCurrent()
@@ -372,14 +392,19 @@ class FingerprintSettingsViewModelTest {
private fun setupAuth(): MutableList<FingerprintData> { private fun setupAuth(): MutableList<FingerprintData> {
fakeFingerprintManagerInteractor.sensorProp = fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensor( FingerprintSensorPropertiesInternal(
0 /* sensorId */, 0 /* sensorId */,
SensorStrength.STRONG, SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */, 5 /* maxEnrollmentsPerUser */,
FingerprintSensorType.POWER_BUTTON listOf<ComponentInfoInternal>(),
) FingerprintSensorProperties.TYPE_POWER_BUTTON,
val fingerprints = false /* halControlsIllumination */,
mutableListOf(FingerprintData("a", 1, 3L), FingerprintData("b", 2, 5L)) true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
val fingerprints = mutableListOf(FingerprintData("a", 1, 3L), FingerprintData("b", 2, 5L))
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fingerprints fakeFingerprintManagerInteractor.enrolledFingerprintsInternal = fingerprints
val success = FingerprintAuthAttemptModel.Success(1) val success = FingerprintAuthAttemptModel.Success(1)
fakeFingerprintManagerInteractor.authenticateAttempt = success fakeFingerprintManagerInteractor.authenticateAttempt = success