Loading src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt +61 −0 Original line number Diff line number Diff line Loading @@ -27,12 +27,18 @@ import android.util.Log import com.android.settings.biometrics.GatekeeperPasswordProvider import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.EnrollReason import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerEnrollStateViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.toOriginalReason import com.android.settings.password.ChooseLockSettingsHelper import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.onFailure import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext Loading Loading @@ -66,6 +72,16 @@ interface FingerprintManagerInteractor { */ suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray> /** * Runs [FingerprintManager.enroll] with the [hardwareAuthToken] and [EnrollReason] for this * enrollment. Returning the [FingerEnrollStateViewModel] that represents this fingerprint * enrollment state. */ suspend fun enroll( hardwareAuthToken: ByteArray?, enrollReason: EnrollReason, ): Flow<FingerEnrollStateViewModel> /** * Removes the given fingerprint, returning true if it was successfully removed and false * otherwise Loading Loading @@ -133,6 +149,51 @@ class FingerprintManagerInteractorImpl( override val maxEnrollableFingerprints = flow { emit(maxFingerprints) } override suspend fun enroll( hardwareAuthToken: ByteArray?, enrollReason: EnrollReason, ): Flow<FingerEnrollStateViewModel> = callbackFlow { var streamEnded = false val enrollmentCallback = object : FingerprintManager.EnrollmentCallback() { override fun onEnrollmentProgress(remaining: Int) { trySend(FingerEnrollStateViewModel.EnrollProgress(remaining)).onFailure { error -> Log.d(TAG, "onEnrollmentProgress($remaining) failed to send, due to $error") } if (remaining == 0) { streamEnded = true } } override fun onEnrollmentHelp(helpMsgId: Int, helpString: CharSequence?) { trySend(FingerEnrollStateViewModel.EnrollHelp(helpMsgId, helpString.toString())) .onFailure { error -> Log.d(TAG, "onEnrollmentHelp failed to send, due to $error") } } override fun onEnrollmentError(errMsgId: Int, errString: CharSequence?) { trySend(FingerEnrollStateViewModel.EnrollError(errMsgId, errString.toString())) .onFailure { error -> Log.d(TAG, "onEnrollmentError failed to send, due to $error") } streamEnded = true } } val cancellationSignal = CancellationSignal() fingerprintManager.enroll( hardwareAuthToken, cancellationSignal, applicationContext.userId, enrollmentCallback, enrollReason.toOriginalReason() ) awaitClose { // If the stream has not been ended, and the user has stopped collecting the flow // before it was over, send cancel. if (!streamEnded) { cancellationSignal.cancel() } } } override suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean = suspendCoroutine { val callback = object : RemovalCallback() { Loading src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt +7 −7 Original line number Diff line number Diff line Loading @@ -43,12 +43,12 @@ import com.android.settings.biometrics.fingerprint2.domain.interactor.Fingerprin import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollEnrollingV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollmentIntroV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment 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.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel 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.Finish Loading @@ -70,7 +70,7 @@ private const val TAG = "FingerprintEnrollmentV2Activity" * children fragments. */ class FingerprintEnrollmentV2Activity : FragmentActivity() { private lateinit var navigationViewModel: FingerprintEnrollmentNavigationViewModel private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel private val coroutineDispatcher = Dispatchers.Default Loading Loading @@ -170,18 +170,18 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() { navigationViewModel = ViewModelProvider( this, FingerprintEnrollmentNavigationViewModel.FingerprintEnrollmentNavigationViewModelFactory( FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory( backgroundDispatcher, interactor, gatekeeperViewModel, gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo, /* canSkipConfirm */ ) )[FingerprintEnrollmentNavigationViewModel::class.java] )[FingerprintEnrollNavigationViewModel::class.java] // Initialize FingerprintViewModel ViewModelProvider( this, FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(interactor) FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(interactor, backgroundDispatcher) )[FingerprintEnrollViewModel::class.java] // Initialize scroll view model Loading @@ -198,7 +198,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() { Confirmation -> FingerprintEnrollConfirmationV2Fragment::class.java as Class<Fragment> Education -> FingerprintEnrollFindSensorV2Fragment::class.java as Class<Fragment> Enrollment -> FingerprintEnrollEnrollingV2Fragment::class.java as Class<Fragment> Intro -> FingerprintEnrollmentIntroV2Fragment::class.java as Class<Fragment> Intro -> FingerprintEnrollIntroV2Fragment::class.java as Class<Fragment> else -> null } Loading src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment import android.os.Bundle import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel /** * A fragment to indicate that fingerprint enrollment has been completed. Loading @@ -33,7 +33,7 @@ class FingerprintEnrollConfirmationV2Fragment : Fragment() { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val navigationViewModel = ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java] ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java] } } } src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment import android.os.Bundle import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel /** A fragment that is responsible for enrolling a users fingerprint. */ class FingerprintEnrollEnrollingV2Fragment : Fragment() { Loading @@ -28,7 +28,7 @@ class FingerprintEnrollEnrollingV2Fragment : Fragment() { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val navigationViewModel = ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java] ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java] } } } src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt +2 −2 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ import android.os.Bundle import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.android.settings.R import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel /** * A fragment that is used to educate the user about the fingerprint sensor on this device. Loading @@ -36,7 +36,7 @@ class FingerprintEnrollFindSensorV2Fragment : Fragment(R.layout.fingerprint_v2_e super.onCreate(savedInstanceState) if (savedInstanceState == null) { val navigationViewModel = ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java] ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java] } } } Loading
src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractor.kt +61 −0 Original line number Diff line number Diff line Loading @@ -27,12 +27,18 @@ import android.util.Log import com.android.settings.biometrics.GatekeeperPasswordProvider import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptViewModel import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.EnrollReason import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerEnrollStateViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.toOriginalReason import com.android.settings.password.ChooseLockSettingsHelper import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine import kotlinx.coroutines.CancellableContinuation import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.channels.onFailure import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.callbackFlow import kotlinx.coroutines.flow.flow import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext Loading Loading @@ -66,6 +72,16 @@ interface FingerprintManagerInteractor { */ suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray> /** * Runs [FingerprintManager.enroll] with the [hardwareAuthToken] and [EnrollReason] for this * enrollment. Returning the [FingerEnrollStateViewModel] that represents this fingerprint * enrollment state. */ suspend fun enroll( hardwareAuthToken: ByteArray?, enrollReason: EnrollReason, ): Flow<FingerEnrollStateViewModel> /** * Removes the given fingerprint, returning true if it was successfully removed and false * otherwise Loading Loading @@ -133,6 +149,51 @@ class FingerprintManagerInteractorImpl( override val maxEnrollableFingerprints = flow { emit(maxFingerprints) } override suspend fun enroll( hardwareAuthToken: ByteArray?, enrollReason: EnrollReason, ): Flow<FingerEnrollStateViewModel> = callbackFlow { var streamEnded = false val enrollmentCallback = object : FingerprintManager.EnrollmentCallback() { override fun onEnrollmentProgress(remaining: Int) { trySend(FingerEnrollStateViewModel.EnrollProgress(remaining)).onFailure { error -> Log.d(TAG, "onEnrollmentProgress($remaining) failed to send, due to $error") } if (remaining == 0) { streamEnded = true } } override fun onEnrollmentHelp(helpMsgId: Int, helpString: CharSequence?) { trySend(FingerEnrollStateViewModel.EnrollHelp(helpMsgId, helpString.toString())) .onFailure { error -> Log.d(TAG, "onEnrollmentHelp failed to send, due to $error") } } override fun onEnrollmentError(errMsgId: Int, errString: CharSequence?) { trySend(FingerEnrollStateViewModel.EnrollError(errMsgId, errString.toString())) .onFailure { error -> Log.d(TAG, "onEnrollmentError failed to send, due to $error") } streamEnded = true } } val cancellationSignal = CancellationSignal() fingerprintManager.enroll( hardwareAuthToken, cancellationSignal, applicationContext.userId, enrollmentCallback, enrollReason.toOriginalReason() ) awaitClose { // If the stream has not been ended, and the user has stopped collecting the flow // before it was over, send cancel. if (!streamEnded) { cancellationSignal.cancel() } } } override suspend fun removeFingerprint(fp: FingerprintViewModel): Boolean = suspendCoroutine { val callback = object : RemovalCallback() { Loading
src/com/android/settings/biometrics/fingerprint2/ui/enrollment/activity/FingerprintEnrollmentV2Activity.kt +7 −7 Original line number Diff line number Diff line Loading @@ -43,12 +43,12 @@ import com.android.settings.biometrics.fingerprint2.domain.interactor.Fingerprin import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollConfirmationV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollEnrollingV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollFindSensorV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollmentIntroV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment.FingerprintEnrollIntroV2Fragment import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Confirmation import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Education import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.Enrollment 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.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel 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.Finish Loading @@ -70,7 +70,7 @@ private const val TAG = "FingerprintEnrollmentV2Activity" * children fragments. */ class FingerprintEnrollmentV2Activity : FragmentActivity() { private lateinit var navigationViewModel: FingerprintEnrollmentNavigationViewModel private lateinit var navigationViewModel: FingerprintEnrollNavigationViewModel private lateinit var gatekeeperViewModel: FingerprintGatekeeperViewModel private val coroutineDispatcher = Dispatchers.Default Loading Loading @@ -170,18 +170,18 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() { navigationViewModel = ViewModelProvider( this, FingerprintEnrollmentNavigationViewModel.FingerprintEnrollmentNavigationViewModelFactory( FingerprintEnrollNavigationViewModel.FingerprintEnrollNavigationViewModelFactory( backgroundDispatcher, interactor, gatekeeperViewModel, gatekeeperInfo is GatekeeperInfo.GatekeeperPasswordInfo, /* canSkipConfirm */ ) )[FingerprintEnrollmentNavigationViewModel::class.java] )[FingerprintEnrollNavigationViewModel::class.java] // Initialize FingerprintViewModel ViewModelProvider( this, FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(interactor) FingerprintEnrollViewModel.FingerprintEnrollViewModelFactory(interactor, backgroundDispatcher) )[FingerprintEnrollViewModel::class.java] // Initialize scroll view model Loading @@ -198,7 +198,7 @@ class FingerprintEnrollmentV2Activity : FragmentActivity() { Confirmation -> FingerprintEnrollConfirmationV2Fragment::class.java as Class<Fragment> Education -> FingerprintEnrollFindSensorV2Fragment::class.java as Class<Fragment> Enrollment -> FingerprintEnrollEnrollingV2Fragment::class.java as Class<Fragment> Intro -> FingerprintEnrollmentIntroV2Fragment::class.java as Class<Fragment> Intro -> FingerprintEnrollIntroV2Fragment::class.java as Class<Fragment> else -> null } Loading
src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollConfirmationV2Fragment.kt +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment import android.os.Bundle import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel /** * A fragment to indicate that fingerprint enrollment has been completed. Loading @@ -33,7 +33,7 @@ class FingerprintEnrollConfirmationV2Fragment : Fragment() { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val navigationViewModel = ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java] ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java] } } }
src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollEnrollingV2Fragment.kt +2 −2 Original line number Diff line number Diff line Loading @@ -19,7 +19,7 @@ package com.android.settings.biometrics.fingerprint2.ui.enrollment.fragment import android.os.Bundle import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel /** A fragment that is responsible for enrolling a users fingerprint. */ class FingerprintEnrollEnrollingV2Fragment : Fragment() { Loading @@ -28,7 +28,7 @@ class FingerprintEnrollEnrollingV2Fragment : Fragment() { super.onCreate(savedInstanceState) if (savedInstanceState == null) { val navigationViewModel = ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java] ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java] } } }
src/com/android/settings/biometrics/fingerprint2/ui/enrollment/fragment/FingerprintEnrollFindSensorV2Fragment.kt +2 −2 Original line number Diff line number Diff line Loading @@ -20,7 +20,7 @@ import android.os.Bundle import androidx.fragment.app.Fragment import androidx.lifecycle.ViewModelProvider import com.android.settings.R import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollmentNavigationViewModel import com.android.settings.biometrics.fingerprint2.ui.enrollment.viewmodel.FingerprintEnrollNavigationViewModel /** * A fragment that is used to educate the user about the fingerprint sensor on this device. Loading @@ -36,7 +36,7 @@ class FingerprintEnrollFindSensorV2Fragment : Fragment(R.layout.fingerprint_v2_e super.onCreate(savedInstanceState) if (savedInstanceState == null) { val navigationViewModel = ViewModelProvider(requireActivity())[FingerprintEnrollmentNavigationViewModel::class.java] ViewModelProvider(requireActivity())[FingerprintEnrollNavigationViewModel::class.java] } } }