xref: /aosp_15_r20/frameworks/base/packages/SystemUI/src/com/android/systemui/biometrics/dagger/BiometricsModule.kt (revision d57664e9bc4670b3ecf6748a746a57c557b6bc9e)
1 /*
2  * Copyright (C) 2021 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.systemui.biometrics.dagger
18 
19 import android.content.Context
20 import android.content.res.Resources
21 import com.android.internal.R
22 import com.android.launcher3.icons.IconProvider
23 import com.android.systemui.CoreStartable
24 import com.android.systemui.biometrics.AuthController
25 import com.android.systemui.biometrics.EllipseOverlapDetectorParams
26 import com.android.systemui.biometrics.UdfpsUtils
27 import com.android.systemui.biometrics.data.repository.BiometricStatusRepository
28 import com.android.systemui.biometrics.data.repository.BiometricStatusRepositoryImpl
29 import com.android.systemui.biometrics.data.repository.DisplayStateRepository
30 import com.android.systemui.biometrics.data.repository.DisplayStateRepositoryImpl
31 import com.android.systemui.biometrics.data.repository.FacePropertyRepository
32 import com.android.systemui.biometrics.data.repository.FacePropertyRepositoryImpl
33 import com.android.systemui.biometrics.data.repository.FaceSettingsRepository
34 import com.android.systemui.biometrics.data.repository.FaceSettingsRepositoryImpl
35 import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepository
36 import com.android.systemui.biometrics.data.repository.FingerprintPropertyRepositoryImpl
37 import com.android.systemui.biometrics.data.repository.PromptRepository
38 import com.android.systemui.biometrics.data.repository.PromptRepositoryImpl
39 import com.android.systemui.biometrics.plugins.AuthContextPlugins
40 import com.android.systemui.biometrics.udfps.BoundingBoxOverlapDetector
41 import com.android.systemui.biometrics.udfps.EllipseOverlapDetector
42 import com.android.systemui.biometrics.udfps.OverlapDetector
43 import com.android.systemui.biometrics.ui.binder.DeviceEntryUnlockTrackerViewBinder
44 import com.android.systemui.biometrics.ui.binder.SideFpsOverlayViewBinder
45 import com.android.systemui.dagger.SysUISingleton
46 import com.android.systemui.keyguard.ui.binder.AlternateBouncerViewBinder
47 import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener
48 import com.android.systemui.util.concurrency.ThreadFactory
49 import dagger.Binds
50 import dagger.BindsOptionalOf
51 import dagger.Module
52 import dagger.Provides
53 import dagger.multibindings.ClassKey
54 import dagger.multibindings.IntoMap
55 import dagger.multibindings.IntoSet
56 import java.util.concurrent.Executor
57 import javax.inject.Qualifier
58 
59 /** Dagger module for all things biometric. */
60 @Module
61 interface BiometricsModule {
62     /** Starts AuthController. */
63     @Binds
64     @IntoMap
65     @ClassKey(AuthController::class)
bindAuthControllerStartablenull66     fun bindAuthControllerStartable(service: AuthController): CoreStartable
67 
68     /** Listen to config changes for AuthController. */
69     @Binds
70     @IntoSet
71     fun bindAuthControllerConfigChanges(service: AuthController): ConfigurationListener
72 
73     @Binds
74     @IntoMap
75     @ClassKey(SideFpsOverlayViewBinder::class)
76     fun bindsSideFpsOverlayViewBinder(viewBinder: SideFpsOverlayViewBinder): CoreStartable
77 
78     @Binds
79     @IntoMap
80     @ClassKey(AlternateBouncerViewBinder::class)
81     fun bindAlternateBouncerViewBinder(viewBinder: AlternateBouncerViewBinder): CoreStartable
82 
83     @Binds
84     @SysUISingleton
85     fun faceSettings(impl: FaceSettingsRepositoryImpl): FaceSettingsRepository
86 
87     @Binds @SysUISingleton fun faceSensors(impl: FacePropertyRepositoryImpl): FacePropertyRepository
88 
89     @Binds
90     @SysUISingleton
91     fun biometricPromptRepository(impl: PromptRepositoryImpl): PromptRepository
92 
93     @Binds
94     @SysUISingleton
95     fun biometricStatusRepository(impl: BiometricStatusRepositoryImpl): BiometricStatusRepository
96 
97     @Binds
98     @SysUISingleton
99     fun fingerprintRepository(
100         impl: FingerprintPropertyRepositoryImpl
101     ): FingerprintPropertyRepository
102 
103     @Binds
104     @SysUISingleton
105     fun displayStateRepository(impl: DisplayStateRepositoryImpl): DisplayStateRepository
106 
107     @BindsOptionalOf fun authContextPlugins(): AuthContextPlugins
108 
109     @BindsOptionalOf fun deviceEntryUnlockTrackerViewBinder(): DeviceEntryUnlockTrackerViewBinder
110 
111     companion object {
112         /** Background [Executor] for HAL related operations. */
113         @Provides
114         @SysUISingleton
115         @JvmStatic
116         @BiometricsBackground
117         fun providesPluginExecutor(threadFactory: ThreadFactory): Executor =
118             threadFactory.buildExecutorOnNewThread("biometrics")
119 
120         @Provides fun providesUdfpsUtils(): UdfpsUtils = UdfpsUtils()
121 
122         @Provides fun provideIconProvider(context: Context): IconProvider = IconProvider(context)
123 
124         @Provides
125         @SysUISingleton
126         fun providesOverlapDetector(): OverlapDetector {
127             val selectedOption =
128                 Resources.getSystem().getInteger(R.integer.config_selected_udfps_touch_detection)
129             val values =
130                 Resources.getSystem()
131                     .getStringArray(R.array.config_udfps_touch_detection_options)[selectedOption]
132                     .split(",")
133                     .map { it.toFloat() }
134 
135             return if (values[0] == 1f) {
136                 EllipseOverlapDetector(
137                     EllipseOverlapDetectorParams(
138                         minOverlap = values[3],
139                         targetSize = values[2],
140                         stepSize = values[4].toInt(),
141                     )
142                 )
143             } else {
144                 BoundingBoxOverlapDetector(values[2])
145             }
146         }
147     }
148 }
149 
150 /**
151  * Background executor for HAL operations that are latency sensitive but too slow to run on the main
152  * thread. Prefer the shared executors, such as [com.android.systemui.dagger.qualifiers.Background]
153  * when a HAL is not directly involved.
154  */
155 @Qualifier
156 @MustBeDocumented
157 @Retention(AnnotationRetention.RUNTIME)
158 annotation class BiometricsBackground
159