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