Loading Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -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: [ Loading src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt +2 −4 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -71,6 +71,4 @@ object Util { this == FINGERPRINT_ERROR_CANCELED, ) } } src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt 0 → 100644 +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() } } src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt→src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt +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. Loading @@ -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 = Loading @@ -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) Loading src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt +25 −28 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading @@ -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) } Loading Loading @@ -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") } Loading @@ -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 } Loading Loading @@ -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) } Loading @@ -200,7 +197,7 @@ class FingerprintManagerInteractorImpl( fingerprintManager.remove( android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId), applicationContext.userId, callback callback, ) } Loading @@ -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 = Loading Loading @@ -249,7 +246,7 @@ class FingerprintManagerInteractorImpl( cancellationSignal, authenticationCallback, null, applicationContext.userId applicationContext.userId, ) } } Loading
Android.bp +1 −1 Original line number Diff line number Diff line Loading @@ -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: [ Loading
src/com/android/settings/biometrics/fingerprint2/conversion/Util.kt +2 −4 Original line number Diff line number Diff line Loading @@ -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 { Loading Loading @@ -71,6 +71,4 @@ object Util { this == FINGERPRINT_ERROR_CANCELED, ) } }
src/com/android/settings/biometrics/fingerprint2/data/repository/FingerprintSensorRepo.kt 0 → 100644 +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() } }
src/com/android/settings/biometrics/fingerprint2/repository/PressToAuthProviderImpl.kt→src/com/android/settings/biometrics/fingerprint2/data/repository/PressToAuthRepo.kt +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. Loading @@ -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 = Loading @@ -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) Loading
src/com/android/settings/biometrics/fingerprint2/domain/interactor/FingerprintManagerInteractorImpl.kt +25 −28 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 { Loading Loading @@ -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) } Loading Loading @@ -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") } Loading @@ -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 } Loading Loading @@ -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) } Loading @@ -200,7 +197,7 @@ class FingerprintManagerInteractorImpl( fingerprintManager.remove( android.hardware.fingerprint.Fingerprint(fp.name, fp.fingerId, fp.deviceId), applicationContext.userId, callback callback, ) } Loading @@ -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 = Loading Loading @@ -249,7 +246,7 @@ class FingerprintManagerInteractorImpl( cancellationSignal, authenticationCallback, null, applicationContext.userId applicationContext.userId, ) } }