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

Commit 48621c5a authored by Joshua Mccloskey's avatar Joshua Mccloskey Committed by Android (Google) Code Review
Browse files

Merge changes If2fc46b1,Ib54da7a8 into main

* changes:
  Add enroll() in FingerprintManagerInteractor.
  Fix SettingsV2 tests.
parents 14655b03 2200f55f
Loading
Loading
Loading
Loading
+61 −0
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -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() {
+7 −7
Original line number Diff line number Diff line
@@ -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
@@ -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

@@ -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
@@ -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
          }

+2 −2
Original line number Diff line number Diff line
@@ -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.
@@ -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]
    }
  }
}
+2 −2
Original line number Diff line number Diff line
@@ -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() {
@@ -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]
    }
  }
}
+2 −2
Original line number Diff line number Diff line
@@ -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.
@@ -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