1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.settings.testutils2 18 19 import android.hardware.biometrics.ComponentInfoInternal 20 import android.hardware.biometrics.SensorLocationInternal 21 import android.hardware.biometrics.SensorProperties 22 import android.hardware.fingerprint.FingerprintEnrollOptions 23 import android.hardware.fingerprint.FingerprintSensorProperties 24 import android.hardware.fingerprint.FingerprintSensorPropertiesInternal 25 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.AuthenitcateInteractor 26 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.CanEnrollFingerprintsInteractor 27 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.EnrollFingerprintInteractor 28 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.EnrolledFingerprintsInteractor 29 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.GenerateChallengeInteractor 30 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.RemoveFingerprintInteractor 31 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.RenameFingerprintInteractor 32 import com.android.settings.biometrics.fingerprint2.lib.domain.interactor.SensorInteractor 33 import com.android.settings.biometrics.fingerprint2.lib.model.EnrollReason 34 import com.android.settings.biometrics.fingerprint2.lib.model.FingerEnrollState 35 import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintAuthAttemptModel 36 import com.android.settings.biometrics.fingerprint2.lib.model.FingerprintData 37 import com.android.systemui.biometrics.shared.model.FingerprintSensor 38 import com.android.systemui.biometrics.shared.model.FingerprintSensorType 39 import com.android.systemui.biometrics.shared.model.toFingerprintSensor 40 import kotlinx.coroutines.flow.Flow 41 import kotlinx.coroutines.flow.MutableStateFlow 42 import kotlinx.coroutines.flow.asStateFlow 43 import kotlinx.coroutines.flow.flow 44 import kotlinx.coroutines.flow.flowOf 45 import kotlinx.coroutines.flow.transform 46 import kotlinx.coroutines.flow.update 47 48 /** Fake to be used by other classes to easily fake the FingerprintManager implementation. */ 49 class FakeFingerprintManagerInteractor : 50 AuthenitcateInteractor, 51 CanEnrollFingerprintsInteractor, 52 EnrolledFingerprintsInteractor, 53 EnrollFingerprintInteractor, 54 GenerateChallengeInteractor, 55 RemoveFingerprintInteractor, 56 RenameFingerprintInteractor, 57 SensorInteractor { 58 59 private val enrollableFingerprints = MutableStateFlow(5) 60 var enrolledFingerprintsInternal: MutableList<FingerprintData> = mutableListOf() 61 var challengeToGenerate: Pair<Long, ByteArray> = Pair(-1L, byteArrayOf()) 62 var authenticateAttempt = FingerprintAuthAttemptModel.Success(1) 63 var enrollStateViewModel: List<FingerEnrollState> = listOf(FingerEnrollState.EnrollProgress(5, 5)) 64 65 var sensorProp = 66 FingerprintSensorPropertiesInternal( 67 0 /* sensorId */, 68 SensorProperties.STRENGTH_STRONG, 69 5 /* maxEnrollmentsPerUser */, 70 listOf<ComponentInfoInternal>(), 71 FingerprintSensorProperties.TYPE_POWER_BUTTON, 72 false /* halControlsIllumination */, 73 true /* resetLockoutRequiresHardwareAuthToken */, 74 listOf<SensorLocationInternal>(SensorLocationInternal.DEFAULT), 75 ) 76 .toFingerprintSensor() 77 authenticatenull78 override suspend fun authenticate(): FingerprintAuthAttemptModel { 79 return authenticateAttempt 80 } 81 generateChallengenull82 override suspend fun generateChallenge(gateKeeperPasswordHandle: Long): Pair<Long, ByteArray> { 83 return challengeToGenerate 84 } 85 <lambda>null86 override val enrolledFingerprints: Flow<List<FingerprintData>> = flow { 87 emit(enrolledFingerprintsInternal) 88 } <lambda>null89 override val canEnrollFingerprints: Flow<Boolean> = enrollableFingerprints.transform { 90 emit(enrolledFingerprintsInternal.size < it) 91 } 92 93 override val maxFingerprintsEnrollable: Flow<Int> = enrollableFingerprints.asStateFlow() 94 setShouldUseSettingsMaxFingerprintsnull95 override fun setShouldUseSettingsMaxFingerprints(useSettings: Boolean) {} 96 <lambda>null97 override val sensorPropertiesInternal: Flow<FingerprintSensor?> = flow { emit(sensorProp) } 98 override val hasSideFps: Flow<Boolean> = 99 flowOf(sensorProp.sensorType == FingerprintSensorType.POWER_BUTTON) 100 enrollnull101 override suspend fun enroll( 102 hardwareAuthToken: ByteArray?, 103 enrollReason: EnrollReason, 104 fingerprintEnrollOptions: FingerprintEnrollOptions, 105 ): Flow<FingerEnrollState> = flowOf(*enrollStateViewModel.toTypedArray()) 106 107 override suspend fun removeFingerprint(fp: FingerprintData): Boolean { 108 return enrolledFingerprintsInternal.remove(fp) 109 } 110 renameFingerprintnull111 override suspend fun renameFingerprint(fp: FingerprintData, newName: String) { 112 if (enrolledFingerprintsInternal.remove(fp)) { 113 enrolledFingerprintsInternal.add(FingerprintData(newName, fp.fingerId, fp.deviceId)) 114 } 115 } 116 setMaxEnrollableFingerprintsnull117 fun setMaxEnrollableFingerprints(fingerprints: Int) { 118 enrollableFingerprints.update { fingerprints } 119 } 120 } 121