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