Merge "Use shared lib for settings v2." into main

This commit is contained in:
Hao Dong
2023-09-30 17:25:52 +00:00
committed by Android (Google) Code Review
13 changed files with 58 additions and 117 deletions

View File

@@ -17,43 +17,10 @@
package com.android.settings.biometrics.fingerprint2.conversion
import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintSensorPropertyViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorStrength
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
class Util {
companion object {
fun sensorPropsToViewModel(
props: FingerprintSensorPropertiesInternal
): FingerprintSensorPropertyViewModel {
val sensorStrength: SensorStrength =
when (props.sensorStrength) {
FingerprintSensorProperties.STRENGTH_CONVENIENCE -> SensorStrength.Convenient
FingerprintSensorProperties.STRENGTH_WEAK -> SensorStrength.Weak
FingerprintSensorProperties.STRENGTH_STRONG -> SensorStrength.Strong
else -> SensorStrength.Unknown
}
val sensorType: SensorType =
when (props.sensorType) {
FingerprintSensorProperties.TYPE_UDFPS_OPTICAL -> SensorType.Optical
FingerprintSensorProperties.TYPE_UDFPS_ULTRASONIC -> SensorType.Ultrasonic
FingerprintSensorProperties.TYPE_REAR -> SensorType.RFPS
FingerprintSensorProperties.TYPE_POWER_BUTTON -> SensorType.SFPS
else -> SensorType.Unknown
}
return FingerprintSensorPropertyViewModel(
props.sensorId,
sensorStrength,
props.maxEnrollmentsPerUser,
sensorType
)
}
}
class Util
}
fun EnrollReason.toOriginalReason(): Int {
return when (this) {
EnrollReason.EnrollEnrolling -> FingerprintManager.ENROLL_ENROLL

View File

@@ -24,14 +24,14 @@ import android.hardware.fingerprint.FingerprintManager.RemovalCallback
import android.os.CancellationSignal
import android.util.Log
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint2.conversion.Util
import com.android.settings.biometrics.fingerprint2.conversion.toOriginalReason
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
import com.android.settings.password.ChooseLockSettingsHelper
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlin.coroutines.resume
import kotlin.coroutines.suspendCoroutine
import kotlinx.coroutines.CancellableContinuation
@@ -94,7 +94,7 @@ class FingerprintManagerInteractorImpl(
val sensorPropertiesInternal = fingerprintManager.sensorPropertiesInternal
emit(
if (sensorPropertiesInternal.isEmpty()) null
else Util.sensorPropsToViewModel(sensorPropertiesInternal.first())
else sensorPropertiesInternal.first().toFingerprintSensor()
)
}

View File

@@ -8,6 +8,7 @@ android_library {
"**/*.kt"
],
static_libs: [
"BiometricsSharedLib",
"kotlinx-coroutines-android",
],
}

View File

@@ -18,9 +18,9 @@ package com.android.settings.biometrics.fingerprint2.shared.domain.interactor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintSensorPropertyViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import kotlinx.coroutines.flow.Flow
/**
@@ -40,7 +40,7 @@ interface FingerprintManagerInteractor {
val canEnrollFingerprints: Flow<Boolean>
/** Retrieves the sensor properties of a device */
val sensorPropertiesInternal: Flow<FingerprintSensorPropertyViewModel?>
val sensorPropertiesInternal: Flow<FingerprintSensor?>
/** Runs the authenticate flow */
suspend fun authenticate(): FingerprintAuthAttemptViewModel

View File

@@ -32,36 +32,3 @@ sealed class FingerprintAuthAttemptViewModel {
val message: String,
) : FingerprintAuthAttemptViewModel()
}
/** The various types of fingerprint sensors */
sealed class SensorType {
/** Rear fingerprint sensor */
data object RFPS : SensorType()
/** Optical under display sensor */
data object Optical : SensorType()
/** Ultrasonic under display sensor */
data object Ultrasonic : SensorType()
/** Side fingerprint sensor */
data object SFPS : SensorType()
/** Unkonwn fingerprint sensor */
data object Unknown : SensorType()
}
/** The strength of a given sensor */
sealed class SensorStrength {
data object Convenient : SensorStrength()
data object Weak : SensorStrength()
data object Strong : SensorStrength()
data object Unknown : SensorStrength()
}
data class FingerprintSensorPropertyViewModel(
val sensorId: Int,
val sensorStrength: SensorStrength,
val maxEnrollmentsPerUser: Int,
val sensorType: SensorType
)

View File

@@ -29,7 +29,6 @@ import com.airbnb.lottie.LottieAnimationView
import com.android.settings.R
import com.android.settings.biometrics.fingerprint.FingerprintErrorDialog
import com.android.settings.biometrics.fingerprint.FingerprintFindSensorAnimation
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollFindSensorViewModel
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.google.android.setupcompat.template.FooterBarMixin
@@ -66,9 +65,9 @@ class FingerprintEnrollFindSensorV2Fragment : Fragment() {
viewModel.sensorType.collect {
contentLayoutId =
when (it) {
SensorType.Optical,
SensorType.Ultrasonic -> R.layout.udfps_enroll_find_sensor_layout
SensorType.SFPS -> R.layout.sfps_enroll_find_sensor_layout
FingerprintSensorType.UDFPS_OPTICAL,
FingerprintSensorType.UDFPS_ULTRASONIC -> R.layout.udfps_enroll_find_sensor_layout
FingerprintSensorType.POWER_BUTTON -> R.layout.sfps_enroll_find_sensor_layout
else -> R.layout.fingerprint_v2_enroll_find_sensor
}
}
@@ -171,14 +170,14 @@ class FingerprintEnrollFindSensorV2Fragment : Fragment() {
illustrationLottie?.visibility = View.VISIBLE
}
private fun setTexts(sensorType: SensorType, view: GlifLayout) {
private fun setTexts(sensorType: FingerprintSensorType, view: GlifLayout) {
when (sensorType) {
SensorType.Optical,
SensorType.Ultrasonic -> {
FingerprintSensorType.UDFPS_OPTICAL,
FingerprintSensorType.UDFPS_ULTRASONIC -> {
view.setHeaderText(R.string.security_settings_udfps_enroll_find_sensor_title)
view.setDescriptionText(R.string.security_settings_udfps_enroll_find_sensor_message)
}
SensorType.SFPS -> {
FingerprintSensorType.POWER_BUTTON -> {
view.setHeaderText(R.string.security_settings_sfps_enroll_find_sensor_title)
view.setDescriptionText(R.string.security_settings_sfps_enroll_find_sensor_message)
}

View File

@@ -35,10 +35,10 @@ import androidx.lifecycle.lifecycleScope
import com.android.settings.R
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintGatekeeperViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintScrollViewModel
import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Unicorn
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import com.google.android.setupcompat.template.FooterBarMixin
import com.google.android.setupcompat.template.FooterButton
import com.google.android.setupdesign.GlifLayout
@@ -144,8 +144,8 @@ class FingerprintEnrollIntroV2Fragment : Fragment(R.layout.fingerprint_v2_enroll
val iconShield: ImageView = view.requireViewById(R.id.icon_shield)
val footerMessage6: TextView = view.requireViewById(R.id.footer_message_6)
when (sensorType) {
SensorType.Ultrasonic,
SensorType.Optical -> {
FingerprintSensorType.UDFPS_ULTRASONIC,
FingerprintSensorType.UDFPS_OPTICAL -> {
footerMessage6.visibility = View.VISIBLE
iconShield.visibility = View.VISIBLE
}

View File

@@ -22,7 +22,6 @@ import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
@@ -45,13 +44,13 @@ class FingerprintEnrollFindSensorViewModel(
orientationStateViewModel: OrientationStateViewModel
) : ViewModel() {
/** Represents the stream of sensor type. */
val sensorType: Flow<SensorType> =
val sensorType: Flow<FingerprintSensorType> =
fingerprintEnrollViewModel.sensorType.filterWhenEducationIsShown()
private val _isUdfps: Flow<Boolean> =
sensorType.map {
it == SensorType.Optical || it == SensorType.Ultrasonic
it == FingerprintSensorType.UDFPS_OPTICAL || it == FingerprintSensorType.UDFPS_ULTRASONIC
}
private val _isSfps: Flow<Boolean> = sensorType.map { it == SensorType.RFPS }
private val _isSfps: Flow<Boolean> = sensorType.map { it == FingerprintSensorType.POWER_BUTTON }
private val _isRearSfps: Flow<Boolean> =
combineTransform(_isSfps, _isUdfps) { v1, v2 -> !v1 && !v2 }
@@ -95,8 +94,8 @@ class FingerprintEnrollFindSensorViewModel(
) { sensorType, hasValidGatekeeperInfo, gatekeeperInfo, navigationViewModel ->
val shouldStartEnroll =
navigationViewModel.currStep == Education &&
sensorType != SensorType.Optical &&
sensorType != SensorType.Ultrasonic &&
sensorType != FingerprintSensorType.UDFPS_OPTICAL &&
sensorType != FingerprintSensorType.UDFPS_ULTRASONIC &&
hasValidGatekeeperInfo
if (shouldStartEnroll) (gatekeeperInfo as GatekeeperInfo.GatekeeperPasswordInfo).token
else null

View File

@@ -20,7 +20,6 @@ import androidx.lifecycle.ViewModelProvider
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
@@ -46,7 +45,7 @@ class FingerprintEnrollViewModel(
private var _consumerShouldEnroll: MutableStateFlow<Boolean> = MutableStateFlow(false)
/** Represents the stream of [FingerprintSensorType] */
val sensorType: Flow<SensorType> =
val sensorType: Flow<FingerprintSensorType> =
fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map { it.sensorType }
/**

View File

@@ -24,7 +24,7 @@ import androidx.lifecycle.viewModelScope
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.systemui.biometrics.shared.model.FingerprintSensorType
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -89,7 +89,7 @@ class FingerprintSettingsViewModel(
private val _consumerShouldAuthenticate: MutableStateFlow<Boolean> = MutableStateFlow(false)
private val _fingerprintSensorType: Flow<SensorType> =
private val _fingerprintSensorType: Flow<FingerprintSensorType> =
fingerprintManagerInteractor.sensorPropertiesInternal.filterNotNull().map { it.sensorType }
private val _sensorNullOrEmpty: Flow<Boolean> =
@@ -146,7 +146,10 @@ class FingerprintSettingsViewModel(
if (sensorNullOrEmpty) {
return@combine false
}
if (listOf(SensorType.Ultrasonic, SensorType.Optical).contains(sensorType)) {
if (
listOf(FingerprintSensorType.UDFPS_ULTRASONIC, FingerprintSensorType.UDFPS_OPTICAL)
.contains(sensorType)
) {
return@combine false
}

View File

@@ -4,6 +4,7 @@ android_library {
"src/**/*.kt"
],
libs: [
"BiometricsSharedLib",
"FingerprintManagerInteractor",
],
}

View File

@@ -17,13 +17,13 @@
package com.android.settings.testutils2
import com.android.settings.biometrics.fingerprint2.shared.domain.interactor.FingerprintManagerInteractor
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintSensorPropertyViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollStateViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorStrength
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
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 kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
@@ -39,7 +39,12 @@ class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
var pressToAuthEnabled = true
var sensorProp =
FingerprintSensorPropertyViewModel(0 /* sensorId */, SensorStrength.Strong, 5, SensorType.SFPS)
FingerprintSensor(
0 /* sensorId */,
SensorStrength.STRONG,
5,
FingerprintSensorType.POWER_BUTTON
)
override suspend fun authenticate(): FingerprintAuthAttemptViewModel {
return authenticateAttempt
@@ -57,7 +62,7 @@ class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
emit(enrolledFingerprintsInternal.size < enrollableFingerprints)
}
override val sensorPropertiesInternal: Flow<FingerprintSensorPropertyViewModel?> = flow {
override val sensorPropertiesInternal: Flow<FingerprintSensor?> = flow {
emit(sensorProp)
}
@@ -79,7 +84,7 @@ class FakeFingerprintManagerInteractor : FingerprintManagerInteractor {
}
override suspend fun hasSideFps(): Boolean {
return sensorProp.sensorType == SensorType.SFPS
return sensorProp.sensorType == FingerprintSensorType.POWER_BUTTON
}
override suspend fun pressToAuthEnabled(): Boolean {

View File

@@ -18,14 +18,14 @@ package com.android.settings.fingerprint2.ui.settings
import androidx.arch.core.executor.testing.InstantTaskExecutorRule
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintSensorPropertyViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel
import com.android.settings.biometrics.fingerprint2.shared.model.SensorStrength
import com.android.settings.biometrics.fingerprint2.shared.model.SensorType
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsNavigationViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.FingerprintSettingsViewModel
import com.android.settings.biometrics.fingerprint2.ui.settings.viewmodel.PreferenceViewModel
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.google.common.truth.Truth.assertThat
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collectLatest
@@ -96,11 +96,11 @@ class FingerprintSettingsViewModelTest {
fun authenticate_DoesNotRun_ifOptical() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensorPropertyViewModel(
FingerprintSensor(
0 /* sensorId */,
SensorStrength.Strong,
SensorStrength.STRONG,
5 /* maxEnrollmentsPerUser */,
SensorType.Optical,
FingerprintSensorType.UDFPS_OPTICAL,
)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(FingerprintViewModel("a", 1, 3L))
@@ -132,11 +132,11 @@ class FingerprintSettingsViewModelTest {
fun authenticate_DoesNotRun_ifUltrasonic() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensorPropertyViewModel(
FingerprintSensor(
0 /* sensorId */,
SensorStrength.Strong,
SensorStrength.STRONG,
5 /* maxEnrollmentsPerUser */,
SensorType.Ultrasonic,
FingerprintSensorType.UDFPS_ULTRASONIC,
)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(FingerprintViewModel("a", 1, 3L))
@@ -166,11 +166,11 @@ class FingerprintSettingsViewModelTest {
fun authenticate_DoesRun_ifNotUdfps() =
testScope.runTest {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensorPropertyViewModel(
FingerprintSensor(
0 /* sensorId */,
SensorStrength.Strong,
SensorStrength.STRONG,
5 /* maxEnrollmentsPerUser */,
SensorType.SFPS
FingerprintSensorType.POWER_BUTTON
)
fakeFingerprintManagerInteractor.enrolledFingerprintsInternal =
mutableListOf(FingerprintViewModel("a", 1, 3L))
@@ -372,11 +372,11 @@ class FingerprintSettingsViewModelTest {
private fun setupAuth(): MutableList<FingerprintViewModel> {
fakeFingerprintManagerInteractor.sensorProp =
FingerprintSensorPropertyViewModel(
FingerprintSensor(
0 /* sensorId */,
SensorStrength.Strong,
SensorStrength.STRONG,
5 /* maxEnrollmentsPerUser */,
SensorType.SFPS
FingerprintSensorType.POWER_BUTTON
)
val fingerprints =
mutableListOf(FingerprintViewModel("a", 1, 3L), FingerprintViewModel("b", 2, 5L))