1 /* 2 * Copyright (C) 2019 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.dagger; 18 19 import android.app.INotificationManager; 20 import android.content.Context; 21 import android.service.dreams.IDreamManager; 22 23 import androidx.annotation.Nullable; 24 25 import com.android.internal.statusbar.IStatusBarService; 26 import com.android.keyguard.dagger.ClockRegistryModule; 27 import com.android.keyguard.dagger.KeyguardBouncerComponent; 28 import com.android.systemui.BootCompleteCache; 29 import com.android.systemui.BootCompleteCacheImpl; 30 import com.android.systemui.accessibility.AccessibilityModule; 31 import com.android.systemui.accessibility.data.repository.AccessibilityRepositoryModule; 32 import com.android.systemui.appops.dagger.AppOpsModule; 33 import com.android.systemui.assist.AssistModule; 34 import com.android.systemui.authentication.AuthenticationModule; 35 import com.android.systemui.biometrics.AlternateUdfpsTouchProvider; 36 import com.android.systemui.biometrics.FingerprintInteractiveToAuthProvider; 37 import com.android.systemui.biometrics.FingerprintReEnrollNotification; 38 import com.android.systemui.biometrics.UdfpsDisplayModeProvider; 39 import com.android.systemui.biometrics.dagger.BiometricsModule; 40 import com.android.systemui.biometrics.dagger.UdfpsModule; 41 import com.android.systemui.bouncer.ui.BouncerViewModule; 42 import com.android.systemui.classifier.FalsingModule; 43 import com.android.systemui.clipboardoverlay.dagger.ClipboardOverlayModule; 44 import com.android.systemui.common.ui.data.repository.CommonRepositoryModule; 45 import com.android.systemui.complication.dagger.ComplicationComponent; 46 import com.android.systemui.controls.dagger.ControlsModule; 47 import com.android.systemui.dagger.qualifiers.Main; 48 import com.android.systemui.dagger.qualifiers.SystemUser; 49 import com.android.systemui.demomode.dagger.DemoModeModule; 50 import com.android.systemui.display.DisplayModule; 51 import com.android.systemui.doze.dagger.DozeComponent; 52 import com.android.systemui.dreams.dagger.DreamModule; 53 import com.android.systemui.dump.DumpManager; 54 import com.android.systemui.flags.FeatureFlags; 55 import com.android.systemui.flags.FlagsModule; 56 import com.android.systemui.keyboard.KeyboardModule; 57 import com.android.systemui.keyguard.ui.view.layout.blueprints.KeyguardBlueprintModule; 58 import com.android.systemui.log.dagger.LogModule; 59 import com.android.systemui.log.dagger.MonitorLog; 60 import com.android.systemui.log.table.TableLogBuffer; 61 import com.android.systemui.mediaprojection.appselector.MediaProjectionModule; 62 import com.android.systemui.mediaprojection.taskswitcher.MediaProjectionTaskSwitcherModule; 63 import com.android.systemui.model.SysUiState; 64 import com.android.systemui.motiontool.MotionToolModule; 65 import com.android.systemui.navigationbar.NavigationBarComponent; 66 import com.android.systemui.notetask.NoteTaskModule; 67 import com.android.systemui.people.PeopleModule; 68 import com.android.systemui.plugins.BcSmartspaceConfigPlugin; 69 import com.android.systemui.plugins.BcSmartspaceDataPlugin; 70 import com.android.systemui.privacy.PrivacyModule; 71 import com.android.systemui.process.condition.SystemProcessCondition; 72 import com.android.systemui.qrcodescanner.dagger.QRCodeScannerModule; 73 import com.android.systemui.qs.FgsManagerController; 74 import com.android.systemui.qs.FgsManagerControllerImpl; 75 import com.android.systemui.qs.QSFragmentStartableModule; 76 import com.android.systemui.qs.footer.dagger.FooterActionsModule; 77 import com.android.systemui.recents.Recents; 78 import com.android.systemui.retail.dagger.RetailModeModule; 79 import com.android.systemui.scene.SceneContainerFrameworkModule; 80 import com.android.systemui.screenrecord.ScreenRecordModule; 81 import com.android.systemui.screenshot.dagger.ScreenshotModule; 82 import com.android.systemui.security.data.repository.SecurityRepositoryModule; 83 import com.android.systemui.settings.DisplayTracker; 84 import com.android.systemui.shade.ShadeController; 85 import com.android.systemui.shade.transition.LargeScreenShadeInterpolator; 86 import com.android.systemui.shade.transition.LargeScreenShadeInterpolatorImpl; 87 import com.android.systemui.shared.condition.Monitor; 88 import com.android.systemui.smartspace.dagger.SmartspaceModule; 89 import com.android.systemui.statusbar.CommandQueue; 90 import com.android.systemui.statusbar.NotificationLockscreenUserManager; 91 import com.android.systemui.statusbar.NotificationShadeWindowController; 92 import com.android.systemui.statusbar.connectivity.ConnectivityModule; 93 import com.android.systemui.statusbar.disableflags.dagger.DisableFlagsModule; 94 import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; 95 import com.android.systemui.statusbar.notification.NotifPipelineFlags; 96 import com.android.systemui.statusbar.notification.collection.NotifPipeline; 97 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder; 98 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl; 99 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; 100 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; 101 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider; 102 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderWrapper; 103 import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider; 104 import com.android.systemui.statusbar.notification.people.PeopleHubModule; 105 import com.android.systemui.statusbar.notification.row.dagger.ExpandableNotificationRowComponent; 106 import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent; 107 import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfComponent; 108 import com.android.systemui.statusbar.phone.CentralSurfaces; 109 import com.android.systemui.statusbar.phone.LetterboxModule; 110 import com.android.systemui.statusbar.phone.NotificationIconAreaControllerModule; 111 import com.android.systemui.statusbar.phone.dagger.CentralSurfacesComponent; 112 import com.android.systemui.statusbar.pipeline.dagger.StatusBarPipelineModule; 113 import com.android.systemui.statusbar.policy.HeadsUpManager; 114 import com.android.systemui.statusbar.policy.KeyguardStateController; 115 import com.android.systemui.statusbar.policy.PolicyModule; 116 import com.android.systemui.statusbar.policy.ZenModeController; 117 import com.android.systemui.statusbar.policy.dagger.SmartRepliesInflationModule; 118 import com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule; 119 import com.android.systemui.statusbar.window.StatusBarWindowModule; 120 import com.android.systemui.telephony.data.repository.TelephonyRepositoryModule; 121 import com.android.systemui.temporarydisplay.dagger.TemporaryDisplayModule; 122 import com.android.systemui.tuner.dagger.TunerModule; 123 import com.android.systemui.unfold.SysUIUnfoldModule; 124 import com.android.systemui.user.UserModule; 125 import com.android.systemui.util.concurrency.SysUIConcurrencyModule; 126 import com.android.systemui.util.dagger.UtilModule; 127 import com.android.systemui.util.kotlin.CoroutinesModule; 128 import com.android.systemui.util.leak.GarbageMonitorModule; 129 import com.android.systemui.util.sensors.SensorModule; 130 import com.android.systemui.util.settings.SettingsUtilModule; 131 import com.android.systemui.util.time.SystemClock; 132 import com.android.systemui.util.time.SystemClockImpl; 133 import com.android.systemui.wallet.dagger.WalletModule; 134 import com.android.systemui.wmshell.BubblesManager; 135 import com.android.wm.shell.bubbles.Bubbles; 136 137 import dagger.Binds; 138 import dagger.BindsOptionalOf; 139 import dagger.Module; 140 import dagger.Provides; 141 142 import java.util.Collections; 143 import java.util.Optional; 144 import java.util.concurrent.Executor; 145 146 import javax.inject.Named; 147 148 /** 149 * A dagger module for injecting components of System UI that are required by System UI. 150 * 151 * If your feature can be excluded, subclassed, or re-implemented by a variant of SystemUI, put 152 * your Dagger Module in {@link ReferenceSystemUIModule} and/or any variant modules that 153 * rely on the feature. 154 * 155 * Adding an entry in this file means that _all_ variants of SystemUI will receive that code. They 156 * may not appreciate that. 157 */ 158 @Module(includes = { 159 AccessibilityModule.class, 160 AccessibilityRepositoryModule.class, 161 AppOpsModule.class, 162 AssistModule.class, 163 AuthenticationModule.class, 164 BiometricsModule.class, 165 BouncerViewModule.class, 166 ClipboardOverlayModule.class, 167 ClockRegistryModule.class, 168 CommonRepositoryModule.class, 169 DisplayModule.class, 170 ConnectivityModule.class, 171 CoroutinesModule.class, 172 DreamModule.class, 173 ControlsModule.class, 174 DemoModeModule.class, 175 DisableFlagsModule.class, 176 FalsingModule.class, 177 FlagsModule.class, 178 SystemPropertiesFlagsModule.class, 179 FooterActionsModule.class, 180 GarbageMonitorModule.class, 181 KeyboardModule.class, 182 LetterboxModule.class, 183 KeyguardBlueprintModule.class, 184 LogModule.class, 185 MediaProjectionModule.class, 186 MediaProjectionTaskSwitcherModule.class, 187 MotionToolModule.class, 188 NotificationIconAreaControllerModule.class, 189 PeopleHubModule.class, 190 PeopleModule.class, 191 PluginModule.class, 192 PolicyModule.class, 193 PrivacyModule.class, 194 QRCodeScannerModule.class, 195 QSFragmentStartableModule.class, 196 RetailModeModule.class, 197 SceneContainerFrameworkModule.class, 198 ScreenshotModule.class, 199 SensorModule.class, 200 SecurityRepositoryModule.class, 201 ScreenRecordModule.class, 202 SettingsUtilModule.class, 203 SmartRepliesInflationModule.class, 204 SmartspaceModule.class, 205 StatusBarPipelineModule.class, 206 StatusBarPolicyModule.class, 207 StatusBarWindowModule.class, 208 SysUIConcurrencyModule.class, 209 SysUIUnfoldModule.class, 210 TelephonyRepositoryModule.class, 211 TemporaryDisplayModule.class, 212 TunerModule.class, 213 UdfpsModule.class, 214 UserModule.class, 215 UtilModule.class, 216 NoteTaskModule.class, 217 WalletModule.class 218 }, 219 subcomponents = { 220 CentralSurfacesComponent.class, 221 ComplicationComponent.class, 222 NavigationBarComponent.class, 223 NotificationRowComponent.class, 224 DozeComponent.class, 225 ExpandableNotificationRowComponent.class, 226 KeyguardBouncerComponent.class, 227 NotificationShelfComponent.class 228 }) 229 public abstract class SystemUIModule { 230 231 @Binds bindBootCompleteCache(BootCompleteCacheImpl bootCompleteCache)232 abstract BootCompleteCache bindBootCompleteCache(BootCompleteCacheImpl bootCompleteCache); 233 234 /** 235 * 236 */ 237 @Binds bindComponentHelper( ContextComponentResolver componentHelper)238 public abstract ContextComponentHelper bindComponentHelper( 239 ContextComponentResolver componentHelper); 240 241 /** 242 * 243 */ 244 @Binds bindNotificationRowBinder( NotificationRowBinderImpl notificationRowBinder)245 public abstract NotificationRowBinder bindNotificationRowBinder( 246 NotificationRowBinderImpl notificationRowBinder); 247 248 @SysUISingleton 249 @Provides provideSysUiState(DisplayTracker displayTracker, DumpManager dumpManager)250 static SysUiState provideSysUiState(DisplayTracker displayTracker, DumpManager dumpManager) { 251 final SysUiState state = new SysUiState(displayTracker); 252 dumpManager.registerDumpable(state); 253 return state; 254 } 255 256 /** 257 * Provides the monitor for SystemUI that requires the process running as the system user. 258 */ 259 @SysUISingleton 260 @Provides 261 @SystemUser provideSystemUserMonitor(@ain Executor executor, SystemProcessCondition systemProcessCondition, @MonitorLog TableLogBuffer logBuffer)262 static Monitor provideSystemUserMonitor(@Main Executor executor, 263 SystemProcessCondition systemProcessCondition, @MonitorLog TableLogBuffer logBuffer) { 264 return new Monitor(executor, Collections.singleton(systemProcessCondition), logBuffer); 265 } 266 267 @BindsOptionalOf optionalCommandQueue()268 abstract CommandQueue optionalCommandQueue(); 269 270 @BindsOptionalOf optionalHeadsUpManager()271 abstract HeadsUpManager optionalHeadsUpManager(); 272 273 @BindsOptionalOf optionalBcSmartspaceDataPlugin()274 abstract BcSmartspaceDataPlugin optionalBcSmartspaceDataPlugin(); 275 276 @BindsOptionalOf optionalBcSmartspaceConfigPlugin()277 abstract BcSmartspaceConfigPlugin optionalBcSmartspaceConfigPlugin(); 278 279 @BindsOptionalOf 280 @Named(SmartspaceModule.DATE_SMARTSPACE_DATA_PLUGIN) optionalDateSmartspaceConfigPlugin()281 abstract BcSmartspaceDataPlugin optionalDateSmartspaceConfigPlugin(); 282 283 @BindsOptionalOf 284 @Named(SmartspaceModule.WEATHER_SMARTSPACE_DATA_PLUGIN) optionalWeatherSmartspaceConfigPlugin()285 abstract BcSmartspaceDataPlugin optionalWeatherSmartspaceConfigPlugin(); 286 287 @BindsOptionalOf optionalRecents()288 abstract Recents optionalRecents(); 289 290 @BindsOptionalOf optionalCentralSurfaces()291 abstract CentralSurfaces optionalCentralSurfaces(); 292 293 @BindsOptionalOf optionalUdfpsDisplayModeProvider()294 abstract UdfpsDisplayModeProvider optionalUdfpsDisplayModeProvider(); 295 296 @BindsOptionalOf optionalUdfpsTouchProvider()297 abstract AlternateUdfpsTouchProvider optionalUdfpsTouchProvider(); 298 299 @BindsOptionalOf optionalFingerprintInteractiveToAuthProvider()300 abstract FingerprintInteractiveToAuthProvider optionalFingerprintInteractiveToAuthProvider(); 301 302 @BindsOptionalOf optionalSystemStatusAnimationScheduler()303 abstract SystemStatusAnimationScheduler optionalSystemStatusAnimationScheduler(); 304 305 @BindsOptionalOf optionalFingerprintReEnrollNotification()306 abstract FingerprintReEnrollNotification optionalFingerprintReEnrollNotification(); 307 308 @SysUISingleton 309 @Binds bindSystemClock(SystemClockImpl systemClock)310 abstract SystemClock bindSystemClock(SystemClockImpl systemClock); 311 312 // TODO: This should provided by the WM component 313 314 /** Provides Optional of BubbleManager */ 315 @SysUISingleton 316 @Provides provideBubblesManager(Context context, Optional<Bubbles> bubblesOptional, NotificationShadeWindowController notificationShadeWindowController, KeyguardStateController keyguardStateController, ShadeController shadeController, @Nullable IStatusBarService statusBarService, INotificationManager notificationManager, IDreamManager dreamManager, NotificationVisibilityProvider visibilityProvider, VisualInterruptionDecisionProvider visualInterruptionDecisionProvider, ZenModeController zenModeController, NotificationLockscreenUserManager notifUserManager, CommonNotifCollection notifCollection, NotifPipeline notifPipeline, SysUiState sysUiState, FeatureFlags featureFlags, NotifPipelineFlags notifPipelineFlags, @Main Executor sysuiMainExecutor)317 static Optional<BubblesManager> provideBubblesManager(Context context, 318 Optional<Bubbles> bubblesOptional, 319 NotificationShadeWindowController notificationShadeWindowController, 320 KeyguardStateController keyguardStateController, 321 ShadeController shadeController, 322 @Nullable IStatusBarService statusBarService, 323 INotificationManager notificationManager, 324 IDreamManager dreamManager, 325 NotificationVisibilityProvider visibilityProvider, 326 VisualInterruptionDecisionProvider visualInterruptionDecisionProvider, 327 ZenModeController zenModeController, 328 NotificationLockscreenUserManager notifUserManager, 329 CommonNotifCollection notifCollection, 330 NotifPipeline notifPipeline, 331 SysUiState sysUiState, 332 FeatureFlags featureFlags, 333 NotifPipelineFlags notifPipelineFlags, 334 @Main Executor sysuiMainExecutor) { 335 return Optional.ofNullable(BubblesManager.create(context, 336 bubblesOptional, 337 notificationShadeWindowController, 338 keyguardStateController, 339 shadeController, 340 statusBarService, 341 notificationManager, 342 dreamManager, 343 visibilityProvider, 344 visualInterruptionDecisionProvider, 345 zenModeController, 346 notifUserManager, 347 notifCollection, 348 notifPipeline, 349 sysUiState, 350 featureFlags, 351 notifPipelineFlags, 352 sysuiMainExecutor)); 353 } 354 355 @Binds bindFgsManagerController(FgsManagerControllerImpl impl)356 abstract FgsManagerController bindFgsManagerController(FgsManagerControllerImpl impl); 357 358 @Binds largeScreensShadeInterpolator( LargeScreenShadeInterpolatorImpl impl)359 abstract LargeScreenShadeInterpolator largeScreensShadeInterpolator( 360 LargeScreenShadeInterpolatorImpl impl); 361 362 @SysUISingleton 363 @Provides provideVisualInterruptionDecisionProvider( NotificationInterruptStateProvider innerProvider)364 static VisualInterruptionDecisionProvider provideVisualInterruptionDecisionProvider( 365 NotificationInterruptStateProvider innerProvider) { 366 return new NotificationInterruptStateProviderWrapper(innerProvider); 367 } 368 } 369