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 
22 import androidx.annotation.Nullable;
23 
24 import com.android.internal.statusbar.IStatusBarService;
25 import com.android.keyguard.clock.ClockModule;
26 import com.android.keyguard.dagger.KeyguardBouncerComponent;
27 import com.android.systemui.BootCompleteCache;
28 import com.android.systemui.BootCompleteCacheImpl;
29 import com.android.systemui.SystemUIFactory;
30 import com.android.systemui.appops.dagger.AppOpsModule;
31 import com.android.systemui.assist.AssistModule;
32 import com.android.systemui.biometrics.UdfpsHbmProvider;
33 import com.android.systemui.classifier.FalsingModule;
34 import com.android.systemui.controls.dagger.ControlsModule;
35 import com.android.systemui.dagger.qualifiers.Main;
36 import com.android.systemui.demomode.dagger.DemoModeModule;
37 import com.android.systemui.doze.dagger.DozeComponent;
38 import com.android.systemui.dump.DumpManager;
39 import com.android.systemui.flags.FeatureFlagManager;
40 import com.android.systemui.flags.FeatureFlags;
41 import com.android.systemui.flags.FlagReader;
42 import com.android.systemui.flags.FlagWriter;
43 import com.android.systemui.flags.FlagsModule;
44 import com.android.systemui.fragments.FragmentService;
45 import com.android.systemui.log.dagger.LogModule;
46 import com.android.systemui.model.SysUiState;
47 import com.android.systemui.plugins.BcSmartspaceDataPlugin;
48 import com.android.systemui.plugins.statusbar.StatusBarStateController;
49 import com.android.systemui.recents.Recents;
50 import com.android.systemui.screenshot.dagger.ScreenshotModule;
51 import com.android.systemui.settings.dagger.SettingsModule;
52 import com.android.systemui.shared.system.smartspace.SmartspaceTransitionController;
53 import com.android.systemui.statusbar.CommandQueue;
54 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
55 import com.android.systemui.statusbar.NotificationShadeWindowController;
56 import com.android.systemui.statusbar.notification.NotificationEntryManager;
57 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
58 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
59 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinderImpl;
60 import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
61 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
62 import com.android.systemui.statusbar.notification.people.PeopleHubModule;
63 import com.android.systemui.statusbar.notification.row.dagger.ExpandableNotificationRowComponent;
64 import com.android.systemui.statusbar.notification.row.dagger.NotificationRowComponent;
65 import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfComponent;
66 import com.android.systemui.statusbar.phone.ShadeController;
67 import com.android.systemui.statusbar.phone.StatusBar;
68 import com.android.systemui.statusbar.phone.dagger.StatusBarComponent;
69 import com.android.systemui.statusbar.policy.ConfigurationController;
70 import com.android.systemui.statusbar.policy.HeadsUpManager;
71 import com.android.systemui.statusbar.policy.ZenModeController;
72 import com.android.systemui.statusbar.policy.dagger.SmartRepliesInflationModule;
73 import com.android.systemui.statusbar.policy.dagger.StatusBarPolicyModule;
74 import com.android.systemui.statusbar.window.StatusBarWindowModule;
75 import com.android.systemui.tuner.dagger.TunerModule;
76 import com.android.systemui.unfold.SysUIUnfoldModule;
77 import com.android.systemui.user.UserModule;
78 import com.android.systemui.util.concurrency.SysUIConcurrencyModule;
79 import com.android.systemui.util.dagger.UtilModule;
80 import com.android.systemui.util.sensors.SensorModule;
81 import com.android.systemui.util.settings.SettingsUtilModule;
82 import com.android.systemui.util.time.SystemClock;
83 import com.android.systemui.util.time.SystemClockImpl;
84 import com.android.systemui.wallet.dagger.WalletModule;
85 import com.android.systemui.wmshell.BubblesManager;
86 import com.android.wm.shell.bubbles.Bubbles;
87 
88 import java.util.Optional;
89 import java.util.concurrent.Executor;
90 
91 import dagger.Binds;
92 import dagger.BindsOptionalOf;
93 import dagger.Module;
94 import dagger.Provides;
95 
96 /**
97  * A dagger module for injecting components of System UI that are not overridden by the System UI
98  * implementation.
99  */
100 @Module(includes = {
101             AppOpsModule.class,
102             AssistModule.class,
103             ClockModule.class,
104             ControlsModule.class,
105             DemoModeModule.class,
106             FalsingModule.class,
107             FlagsModule.class,
108             LogModule.class,
109             PeopleHubModule.class,
110             PluginModule.class,
111             ScreenshotModule.class,
112             SensorModule.class,
113             SettingsModule.class,
114             SettingsUtilModule.class,
115             SmartRepliesInflationModule.class,
116             StatusBarPolicyModule.class,
117             StatusBarWindowModule.class,
118             SysUIConcurrencyModule.class,
119             SysUIUnfoldModule.class,
120             TunerModule.class,
121             UserModule.class,
122             UtilModule.class,
123             WalletModule.class
124         },
125         subcomponents = {
126             StatusBarComponent.class,
127             NotificationRowComponent.class,
128             DozeComponent.class,
129             ExpandableNotificationRowComponent.class,
130             KeyguardBouncerComponent.class,
131             NotificationShelfComponent.class,
132             FragmentService.FragmentCreator.class
133         })
134 public abstract class SystemUIModule {
135 
136     @Binds
bindBootCompleteCache(BootCompleteCacheImpl bootCompleteCache)137     abstract BootCompleteCache bindBootCompleteCache(BootCompleteCacheImpl bootCompleteCache);
138 
139     /** */
140     @Binds
bindComponentHelper( ContextComponentResolver componentHelper)141     public abstract ContextComponentHelper bindComponentHelper(
142             ContextComponentResolver componentHelper);
143 
144     /** */
145     @Binds
bindNotificationRowBinder( NotificationRowBinderImpl notificationRowBinder)146     public abstract NotificationRowBinder bindNotificationRowBinder(
147             NotificationRowBinderImpl notificationRowBinder);
148 
149     @SysUISingleton
150     @Provides
provideSysUiState(DumpManager dumpManager)151     static SysUiState provideSysUiState(DumpManager dumpManager) {
152         final SysUiState state = new SysUiState();
153         dumpManager.registerDumpable(state);
154         return state;
155     }
156 
157     @Binds
provideFlagReader(FeatureFlagManager impl)158     abstract FlagReader provideFlagReader(FeatureFlagManager impl);
159 
160     @Binds
provideFlagWriter(FeatureFlagManager impl)161     abstract FlagWriter provideFlagWriter(FeatureFlagManager impl);
162 
163     @BindsOptionalOf
optionalCommandQueue()164     abstract CommandQueue optionalCommandQueue();
165 
166     @BindsOptionalOf
optionalHeadsUpManager()167     abstract HeadsUpManager optionalHeadsUpManager();
168 
169     @BindsOptionalOf
optionalBcSmartspaceDataPlugin()170     abstract BcSmartspaceDataPlugin optionalBcSmartspaceDataPlugin();
171 
172     @BindsOptionalOf
optionalRecents()173     abstract Recents optionalRecents();
174 
175     @BindsOptionalOf
optionalStatusBar()176     abstract StatusBar optionalStatusBar();
177 
178     @BindsOptionalOf
optionalUdfpsHbmProvider()179     abstract UdfpsHbmProvider optionalUdfpsHbmProvider();
180 
181     @SysUISingleton
182     @Binds
bindSystemClock(SystemClockImpl systemClock)183     abstract SystemClock bindSystemClock(SystemClockImpl systemClock);
184 
185     @Provides
getSystemUIFactory()186     static SystemUIFactory getSystemUIFactory() {
187         return SystemUIFactory.getInstance();
188     }
189 
190     @SysUISingleton
191     @Provides
provideSmartspaceTransitionController()192     static SmartspaceTransitionController provideSmartspaceTransitionController() {
193         return new SmartspaceTransitionController();
194     }
195 
196     // TODO: This should provided by the WM component
197     /** Provides Optional of BubbleManager */
198     @SysUISingleton
199     @Provides
provideBubblesManager(Context context, Optional<Bubbles> bubblesOptional, NotificationShadeWindowController notificationShadeWindowController, StatusBarStateController statusBarStateController, ShadeController shadeController, ConfigurationController configurationController, @Nullable IStatusBarService statusBarService, INotificationManager notificationManager, NotificationInterruptStateProvider interruptionStateProvider, ZenModeController zenModeController, NotificationLockscreenUserManager notifUserManager, NotificationGroupManagerLegacy groupManager, NotificationEntryManager entryManager, NotifPipeline notifPipeline, SysUiState sysUiState, FeatureFlags featureFlags, DumpManager dumpManager, @Main Executor sysuiMainExecutor)200     static Optional<BubblesManager> provideBubblesManager(Context context,
201             Optional<Bubbles> bubblesOptional,
202             NotificationShadeWindowController notificationShadeWindowController,
203             StatusBarStateController statusBarStateController, ShadeController shadeController,
204             ConfigurationController configurationController,
205             @Nullable IStatusBarService statusBarService, INotificationManager notificationManager,
206             NotificationInterruptStateProvider interruptionStateProvider,
207             ZenModeController zenModeController, NotificationLockscreenUserManager notifUserManager,
208             NotificationGroupManagerLegacy groupManager, NotificationEntryManager entryManager,
209             NotifPipeline notifPipeline, SysUiState sysUiState, FeatureFlags featureFlags,
210             DumpManager dumpManager, @Main Executor sysuiMainExecutor) {
211         return Optional.ofNullable(BubblesManager.create(context, bubblesOptional,
212                 notificationShadeWindowController, statusBarStateController, shadeController,
213                 configurationController, statusBarService, notificationManager,
214                 interruptionStateProvider, zenModeController, notifUserManager,
215                 groupManager, entryManager, notifPipeline, sysUiState, featureFlags, dumpManager,
216                 sysuiMainExecutor));
217     }
218 }
219