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

Commit 98374376 authored by Joshua McCloskey's avatar Joshua McCloskey
Browse files

Updating navigation view model

Test: atest com.android.settings.fingerprint2.ui.enrollment.modules.enrolling.rfps.viewmodel
com.android.settings.fingerprint2.ui.enrollment.viewmodel
com.android.settings.fingerprint2.ui.settings
com.android.settings.fingerprint2.domain.interactor
com.android.settings.fingerprint2.enrollment.viewmodel
Bug: 295205754

Change-Id: I210712ab76050b89452fb871cd2a4fb28bfd4012
parent 9531458c
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -57,7 +57,7 @@ android_library {
        "src/**/*.kt",
    ],
    exclude_srcs: [
        "src/com/android/settings/biometrics/fingerprint2/shared/**/*.kt",
        "src/com/android/settings/biometrics/fingerprint2/lib/**/*.kt",
    ],
    use_resource_processor: true,
    resource_dirs: [
+2 −4
Original line number Diff line number Diff line
@@ -20,8 +20,8 @@ import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERR
import android.hardware.biometrics.BiometricFingerprintConstants.FINGERPRINT_ERROR_UNABLE_TO_PROCESS
import android.hardware.fingerprint.FingerprintManager
import com.android.settings.R
import com.android.settings.biometrics.fingerprint2.shared.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason
import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState

object Util {
  fun EnrollReason.toOriginalReason(): Int {
@@ -71,6 +71,4 @@ object Util {
      this == FINGERPRINT_ERROR_CANCELED,
    )
  }

}
+90 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.settings.biometrics.fingerprint2.data.repository

import android.hardware.biometrics.ComponentInfoInternal
import android.hardware.biometrics.SensorLocationInternal
import android.hardware.biometrics.SensorProperties
import android.hardware.fingerprint.FingerprintManager
import android.hardware.fingerprint.FingerprintSensorProperties
import android.hardware.fingerprint.FingerprintSensorPropertiesInternal
import android.hardware.fingerprint.IFingerprintAuthenticatorsRegisteredCallback
import com.android.systemui.biometrics.shared.model.FingerprintSensor
import com.android.systemui.biometrics.shared.model.toFingerprintSensor
import kotlinx.coroutines.CoroutineDispatcher
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.callbackFlow
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.withContext

/**
 * Provides the [FingerprintSensor]
 *
 * TODO(b/313493336): Move this to systemui
 */
interface FingerprintSensorRepo {
  /** Get the [FingerprintSensor] */
  val fingerprintSensor: Flow<FingerprintSensor>
}

class FingerprintSensorRepoImpl(
    fingerprintManager: FingerprintManager,
    backgroundDispatcher: CoroutineDispatcher,
    activityScope: CoroutineScope,
) : FingerprintSensorRepo {

  override val fingerprintSensor: Flow<FingerprintSensor> =
    callbackFlow {
        val callback =
          object : IFingerprintAuthenticatorsRegisteredCallback.Stub() {
            override fun onAllAuthenticatorsRegistered(
              sensors: List<FingerprintSensorPropertiesInternal>
            ) {
              if (sensors.isEmpty()) {
                trySend(DEFAULT_PROPS)
              } else {
                trySend(sensors[0].toFingerprintSensor())
              }
            }
          }
        withContext(backgroundDispatcher) {
          fingerprintManager?.addAuthenticatorsRegisteredCallback(callback)
        }
        awaitClose {}
      }
      .stateIn(activityScope, started = SharingStarted.Eagerly, initialValue = DEFAULT_PROPS)

    companion object {
        private const val TAG = "FingerprintSensorRepoImpl"

        private val DEFAULT_PROPS =
            FingerprintSensorPropertiesInternal(
                -1 /* sensorId */,
                SensorProperties.STRENGTH_CONVENIENCE,
                0 /* maxEnrollmentsPerUser */,
                listOf<ComponentInfoInternal>(),
                FingerprintSensorProperties.TYPE_UNKNOWN,
                false /* halControlsIllumination */,
                true /* resetLockoutRequiresHardwareAuthToken */,
                listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT),
            )
                .toFingerprintSensor()
    }
}
+16 −5
Original line number Diff line number Diff line
/*
 * Copyright (C) 2023 The Android Open Source Project
 * Copyright (C) 2024 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
@@ -14,13 +14,24 @@
 * limitations under the License.
 */

package com.android.settings.biometrics.fingerprint2.repository
package com.android.settings.biometrics.fingerprint2.data.repository

import android.content.Context
import android.provider.Settings
import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider

class PressToAuthProviderImpl(val context: Context) : PressToAuthProvider {
/** Interface that indicates if press to auth is on or off. */
interface PressToAuthRepo {
  /** Indicates true if the PressToAuth feature is enabled, false otherwise. */
  val isEnabled: Boolean
}

/** Indicates whether or not the press to auth feature is enabled. */
class PressToAuthRepoImpl(private val context: Context) : PressToAuthRepo {
  /**
   * Gets the status of the press to auth feature.
   *
   * Returns whether or not the press to auth feature is enabled.
   */
  override val isEnabled: Boolean
    get() {
      var toReturn: Int =
@@ -43,7 +54,7 @@ class PressToAuthProviderImpl(val context: Context) : PressToAuthProvider {
          context.contentResolver,
          Settings.Secure.SFPS_PERFORMANT_AUTH_ENABLED,
          toReturn,
          context.userId
          context.userId,
        )
      }
      return (toReturn == 1)
+25 −28
Original line number Diff line number Diff line
@@ -26,16 +26,16 @@ import android.util.Log
import com.android.settings.biometrics.GatekeeperPasswordProvider
import com.android.settings.biometrics.fingerprint2.conversion.Util.toEnrollError
import com.android.settings.biometrics.fingerprint2.conversion.Util.toOriginalReason
import com.android.settings.biometrics.fingerprint2.shared.data.repository.PressToAuthProvider
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.FingerprintFlow
import com.android.settings.biometrics.fingerprint2.shared.model.FingerEnrollState
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintAuthAttemptModel
import com.android.settings.biometrics.fingerprint2.shared.model.FingerprintData
import com.android.settings.biometrics.fingerprint2.shared.model.SetupWizard
import com.android.settings.biometrics.fingerprint2.data.repository.FingerprintSensorRepo
import com.android.settings.biometrics.fingerprint2.data.repository.PressToAuthRepo
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.FingerEnrollState
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.FingerprintFlow
import com.android.settings.biometrics.fingerprint2.lib.model.SetupWizard
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
@@ -57,8 +57,9 @@ class FingerprintManagerInteractorImpl(
  applicationContext: Context,
  private val backgroundDispatcher: CoroutineDispatcher,
  private val fingerprintManager: FingerprintManager,
  fingerprintSensorRepo: FingerprintSensorRepo,
  private val gatekeeperPasswordProvider: GatekeeperPasswordProvider,
  private val pressToAuthProvider: PressToAuthProvider,
  private val pressToAuthRepo: PressToAuthRepo,
  private val fingerprintFlow: FingerprintFlow,
) : FingerprintManagerInteractor {

@@ -100,13 +101,7 @@ class FingerprintManagerInteractorImpl(
    )
  }

  override val sensorPropertiesInternal = flow {
    val sensorPropertiesInternal = fingerprintManager.sensorPropertiesInternal
    emit(
      if (sensorPropertiesInternal.isEmpty()) null
      else sensorPropertiesInternal.first().toFingerprintSensor()
    )
  }
  override val sensorPropertiesInternal = fingerprintSensorRepo.fingerprintSensor

  override val maxEnrollableFingerprints = flow { emit(maxFingerprints) }

@@ -136,8 +131,7 @@ class FingerprintManagerInteractorImpl(
            totalSteps = remaining + 1
          }

          trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure {
            error ->
          trySend(FingerEnrollState.EnrollProgress(remaining, totalSteps!!)).onFailure { error ->
            Log.d(TAG, "onEnrollmentProgress($remaining) failed to send, due to $error")
          }

@@ -148,13 +142,16 @@ class FingerprintManagerInteractorImpl(
        }

        override fun onEnrollmentHelp(helpMsgId: Int, helpString: CharSequence?) {
          trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString()))
            .onFailure { error -> Log.d(TAG, "onEnrollmentHelp failed to send, due to $error") }
          trySend(FingerEnrollState.EnrollHelp(helpMsgId, helpString.toString())).onFailure { error
            ->
            Log.d(TAG, "onEnrollmentHelp failed to send, due to $error")
          }
        }

        override fun onEnrollmentError(errMsgId: Int, errString: CharSequence?) {
          trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard))
            .onFailure { error -> Log.d(TAG, "onEnrollmentError failed to send, due to $error") }
          trySend(errMsgId.toEnrollError(fingerprintFlow == SetupWizard)).onFailure { error ->
            Log.d(TAG, "onEnrollmentError failed to send, due to $error")
          }
          Log.d(TAG, "onEnrollmentError($errMsgId)")
          streamEnded = true
          enrollRequestOutstanding.update { false }
@@ -185,14 +182,14 @@ class FingerprintManagerInteractorImpl(
        override fun onRemovalError(
          fp: android.hardware.fingerprint.Fingerprint,
          errMsgId: Int,
          errString: CharSequence
          errString: CharSequence,
        ) {
          it.resume(false)
        }

        override fun onRemovalSucceeded(
          fp: android.hardware.fingerprint.Fingerprint?,
          remaining: Int
          remaining: Int,
        ) {
          it.resume(true)
        }
@@ -200,7 +197,7 @@ class FingerprintManagerInteractorImpl(
    fingerprintManager.remove(
      android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId),
      applicationContext.userId,
      callback
      callback,
    )
  }

@@ -215,7 +212,7 @@ class FingerprintManagerInteractorImpl(
  }

  override suspend fun pressToAuthEnabled(): Boolean = suspendCancellableCoroutine {
    it.resume(pressToAuthProvider.isEnabled)
    it.resume(pressToAuthRepo.isEnabled)
  }

  override suspend fun authenticate(): FingerprintAuthAttemptModel =
@@ -249,7 +246,7 @@ class FingerprintManagerInteractorImpl(
        cancellationSignal,
        authenticationCallback,
        null,
        applicationContext.userId
        applicationContext.userId,
      )
    }
}
Loading