Merge "Biometrics Enrollment refactor (7/N)" into main

This commit is contained in:
Joshua Mccloskey
2024-06-07 18:23:56 +00:00
committed by Android (Google) Code Review
68 changed files with 1068 additions and 939 deletions

View File

@@ -109,12 +109,7 @@ class FingerprintManagerInteractorTest {
fingerprintManager,
fingerprintSensorRepository,
gateKeeperPasswordProvider,
FingerprintEnrollInteractorImpl(
context,
FingerprintEnrollOptions.Builder().build(),
fingerprintManager,
Default,
),
FingerprintEnrollInteractorImpl(context, fingerprintManager, Default),
)
}
@@ -135,7 +130,7 @@ class FingerprintManagerInteractorTest {
whenever(fingerprintManager.getEnrolledFingerprints(anyInt())).thenReturn(fingerprintList)
val list = underTest.enrolledFingerprints.last()
assertThat(list.size).isEqualTo(fingerprintList.size)
assertThat(list!!.size).isEqualTo(fingerprintList.size)
val actual = list[0]
assertThat(actual.name).isEqualTo(expected.name)
assertThat(actual.fingerId).isEqualTo(expected.biometricId)
@@ -318,7 +313,11 @@ class FingerprintManagerInteractorTest {
testScope.runTest {
val token = byteArrayOf(5, 3, 2)
var result: FingerEnrollState? = null
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
val job = launch {
underTest
.enroll(token, EnrollReason.FindSensor, FingerprintEnrollOptions.Builder().build())
.collect { result = it }
}
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
runCurrent()
@@ -343,7 +342,11 @@ class FingerprintManagerInteractorTest {
testScope.runTest {
val token = byteArrayOf(5, 3, 2)
var result: FingerEnrollState? = null
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
val job = launch {
underTest
.enroll(token, EnrollReason.FindSensor, FingerprintEnrollOptions.Builder().build())
.collect { result = it }
}
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
runCurrent()
@@ -368,7 +371,11 @@ class FingerprintManagerInteractorTest {
testScope.runTest {
val token = byteArrayOf(5, 3, 2)
var result: FingerEnrollState? = null
val job = launch { underTest.enroll(token, EnrollReason.FindSensor).collect { result = it } }
val job = launch {
underTest
.enroll(token, EnrollReason.FindSensor, FingerprintEnrollOptions.Builder().build())
.collect { result = it }
}
val enrollCallback: ArgumentCaptor<FingerprintManager.EnrollmentCallback> = argumentCaptor()
runCurrent()

View File

@@ -35,7 +35,6 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Fing
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
@@ -90,45 +89,20 @@ class FingerprintEnrollFindSensorViewModelV2Test {
Dispatchers.setMain(backgroundDispatcher)
fakeFingerprintManagerInteractor = FakeFingerprintManagerInteractor()
gatekeeperViewModel =
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
null,
fakeFingerprintManagerInteractor,
)
.create(FingerprintGatekeeperViewModel::class.java)
gatekeeperViewModel = FingerprintGatekeeperViewModel(fakeFingerprintManagerInteractor)
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()
fingerprintFlowViewModel.updateFlowType(Default)
navigationViewModel = FingerprintNavigationViewModel(fakeFingerprintManagerInteractor)
val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
navigationViewModel =
FingerprintNavigationViewModel(
FingerprintNavigationStep.Education(sensor),
false,
fingerprintFlowViewModel,
fakeFingerprintManagerInteractor,
)
backgroundViewModel =
BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
backgroundViewModel = BackgroundViewModel()
backgroundViewModel.inForeground()
enrollViewModel =
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
fakeFingerprintManagerInteractor,
gatekeeperViewModel,
navigationViewModel,
)
.create(FingerprintEnrollViewModel::class.java)
FingerprintEnrollViewModel(
fakeFingerprintManagerInteractor,
gatekeeperViewModel,
navigationViewModel,
)
accessibilityInteractor =
object : AccessibilityInteractor {
override val isAccessibilityEnabled: Flow<Boolean> = flowOf(false)
@@ -145,23 +119,23 @@ class FingerprintEnrollFindSensorViewModelV2Test {
orientationInteractor =
object : OrientationInteractor {
override val orientation: Flow<Int> = flowOf(Configuration.ORIENTATION_LANDSCAPE)
override val rotation: Flow<Int> = flowOf(Surface.ROTATION_0)
override val rotationFromDefault: Flow<Int> = flowOf(Surface.ROTATION_0)
override val rotation: Flow<Int> = flowOf(Surface.ROTATION_0)
override val rotationFromDefault: Flow<Int> = flowOf(Surface.ROTATION_0)
override fun getRotationFromDefault(rotation: Int): Int = rotation
}
underTest =
FingerprintEnrollFindSensorViewModel.FingerprintEnrollFindSensorViewModelFactory(
navigationViewModel,
enrollViewModel,
gatekeeperViewModel,
backgroundViewModel,
accessibilityInteractor,
foldStateInteractor,
orientationInteractor,
fingerprintFlowViewModel,
fakeFingerprintManagerInteractor,
)
.create(FingerprintEnrollFindSensorViewModel::class.java)
FingerprintEnrollFindSensorViewModel(
navigationViewModel,
enrollViewModel,
gatekeeperViewModel,
backgroundViewModel,
fingerprintFlowViewModel,
accessibilityInteractor,
foldStateInteractor,
orientationInteractor,
fakeFingerprintManagerInteractor,
)
}
@After

View File

@@ -23,22 +23,23 @@ import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.fingerprint2.lib.model.Default
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintAction
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollConfirmationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationStep
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintNavigationViewModel
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.FingerprintSensor
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 com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import kotlinx.coroutines.test.StandardTestDispatcher
import kotlinx.coroutines.test.TestScope
import kotlinx.coroutines.test.advanceUntilIdle
import kotlinx.coroutines.test.runCurrent
import kotlinx.coroutines.test.resetMain
import kotlinx.coroutines.test.runTest
import kotlinx.coroutines.test.setMain
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
@@ -53,44 +54,70 @@ class FingerprintEnrollConfirmationViewModelTest {
@get:Rule val instantTaskRule = InstantTaskExecutorRule()
private var backgroundDispatcher = StandardTestDispatcher()
private var testScope = TestScope(backgroundDispatcher)
val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
val fingerprintFlowViewModel = FingerprintFlowViewModel()
val fakeFingerprintManagerInteractor = FakeFingerprintManagerInteractor()
lateinit var navigationViewModel: FingerprintNavigationViewModel
lateinit var underTest: FingerprintEnrollConfirmationViewModel
@Before
fun setup() {
navigationViewModel =
FingerprintNavigationViewModel(
FingerprintNavigationStep.Confirmation,
false,
fingerprintFlowViewModel,
fakeFingerprintManagerInteractor,
)
Dispatchers.setMain(backgroundDispatcher)
fingerprintFlowViewModel.updateFlowType(Default)
navigationViewModel = FingerprintNavigationViewModel(fakeFingerprintManagerInteractor)
underTest =
FingerprintEnrollConfirmationViewModel(navigationViewModel, fakeFingerprintManagerInteractor)
navigationViewModel.updateFingerprintFlow(Default)
navigationViewModel.hasConfirmedDeviceCredential(true)
}
@After
fun tearDown() {
Dispatchers.resetMain()
}
private fun bringToConfirmation() {
navigationViewModel.update(
FingerprintAction.NEXT,
FingerprintNavigationStep.Introduction::class,
"Intro.Test.NEXT",
)
navigationViewModel.update(
FingerprintAction.NEXT,
FingerprintNavigationStep.Education::class,
"Edu.Test.NEXT",
)
navigationViewModel.update(
FingerprintAction.NEXT,
FingerprintNavigationStep.Enrollment::class,
"Enrollment.Test.NEXT",
)
}
@Test
fun testCanEnrollFingerprints() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp = FingerprintSensorPropertiesInternal(
0 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
5 /* maxEnrollmentsPerUser */,
listOf<ComponentInfoInternal>(),
FingerprintSensorProperties.TYPE_POWER_BUTTON,
false /* halControlsIllumination */,
true /* resetLockoutRequiresHardwareAuthToken */,
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
advanceUntilIdle()
bringToConfirmation()
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensorPropertiesInternal(
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.enrollableFingerprints = 5
var canEnrollFingerprints: Boolean = false
val job = launch { underTest.isAddAnotherButtonVisible.collect { canEnrollFingerprints = it } }
val job = launch {
underTest.isAddAnotherButtonVisible.collect { canEnrollFingerprints = it }
}
advanceUntilIdle()
assertThat(canEnrollFingerprints).isTrue()
@@ -100,12 +127,14 @@ class FingerprintEnrollConfirmationViewModelTest {
@Test
fun testNextButtonSendsNextStep() =
testScope.runTest {
advanceUntilIdle()
bringToConfirmation()
var step: FingerprintNavigationStep.UiStep? = null
val job = launch { navigationViewModel.navigateTo.collect { step = it } }
underTest.onNextButtonClicked()
runCurrent()
advanceUntilIdle()
assertThat(step).isNull()
job.cancel()
@@ -114,14 +143,18 @@ class FingerprintEnrollConfirmationViewModelTest {
@Test
fun testAddAnotherSendsAction() =
testScope.runTest {
advanceUntilIdle()
bringToConfirmation()
advanceUntilIdle()
var step: FingerprintNavigationStep.UiStep? = null
val job = launch { navigationViewModel.navigateTo.collect { step = it } }
underTest.onAddAnotherButtonClicked()
runCurrent()
advanceUntilIdle()
assertThat(step).isInstanceOf(FingerprintNavigationStep.Enrollment::class.java)
assertThat(step).isNull()
job.cancel()
}
}

View File

@@ -28,9 +28,7 @@ import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Fing
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintFlowViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
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.GatekeeperInfo
import com.android.settings.testutils2.FakeFingerprintManagerInteractor
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import com.google.common.truth.Truth.assertThat
@@ -61,20 +59,15 @@ class FingerprintEnrollEnrollingViewModelTest {
private lateinit var backgroundViewModel: BackgroundViewModel
private lateinit var gateKeeperViewModel: FingerprintGatekeeperViewModel
private lateinit var navigationViewModel: FingerprintNavigationViewModel
private val defaultGatekeeperInfo = GatekeeperInfo.GatekeeperPasswordInfo(byteArrayOf(1, 3), 3)
private var testScope = TestScope(backgroundDispatcher)
private lateinit var fakeFingerprintManagerInteractor: FakeFingerprintManagerInteractor
private fun initialize(gatekeeperInfo: GatekeeperInfo = defaultGatekeeperInfo) {
private fun initialize() {
fakeFingerprintManagerInteractor = FakeFingerprintManagerInteractor()
gateKeeperViewModel =
FingerprintGatekeeperViewModel.FingerprintGatekeeperViewModelFactory(
gatekeeperInfo,
fakeFingerprintManagerInteractor,
)
.create(FingerprintGatekeeperViewModel::class.java)
val sensor =
gateKeeperViewModel = FingerprintGatekeeperViewModel(fakeFingerprintManagerInteractor)
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensorPropertiesInternal(
1 /* sensorId */,
SensorProperties.STRENGTH_STRONG,
@@ -86,32 +79,21 @@ class FingerprintEnrollEnrollingViewModelTest {
listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
)
.toFingerprintSensor()
val fingerprintFlowViewModel = FingerprintFlowViewModel(Default)
val fingerprintFlowViewModel = FingerprintFlowViewModel()
fingerprintFlowViewModel.updateFlowType(Default)
navigationViewModel =
FingerprintNavigationViewModel(
Enrollment(sensor),
false,
fingerprintFlowViewModel,
fakeFingerprintManagerInteractor,
)
navigationViewModel = FingerprintNavigationViewModel(fakeFingerprintManagerInteractor)
backgroundViewModel =
BackgroundViewModel.BackgroundViewModelFactory().create(BackgroundViewModel::class.java)
backgroundViewModel = BackgroundViewModel()
backgroundViewModel.inForeground()
val fingerprintEnrollViewModel =
FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(
fakeFingerprintManagerInteractor,
gateKeeperViewModel,
navigationViewModel,
)
.create(FingerprintEnrollViewModel::class.java)
FingerprintEnrollViewModel(
fakeFingerprintManagerInteractor,
gateKeeperViewModel,
navigationViewModel,
)
enrollEnrollingViewModel =
FingerprintEnrollEnrollingViewModel.FingerprintEnrollEnrollingViewModelFactory(
fingerprintEnrollViewModel,
backgroundViewModel,
)
.create(FingerprintEnrollEnrollingViewModel::class.java)
FingerprintEnrollEnrollingViewModel(fingerprintEnrollViewModel, backgroundViewModel)
}
@Before
@@ -128,6 +110,7 @@ class FingerprintEnrollEnrollingViewModelTest {
@Test
fun testEnrollShouldBeFalse() =
testScope.runTest {
gateKeeperViewModel.onConfirmDevice(true, 3L, false)
var shouldEnroll = false
val job = launch {
@@ -147,6 +130,7 @@ class FingerprintEnrollEnrollingViewModelTest {
@Test
fun testEnrollShouldBeFalseWhenBackground() =
testScope.runTest {
gateKeeperViewModel.onConfirmDevice(true, 3L, false)
var shouldEnroll = false
val job = launch {