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