1 /*
2  * Copyright (C) 2020 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.statusbar.dagger;
18 
19 import android.app.IActivityManager;
20 import android.app.NotificationManager;
21 import android.content.Context;
22 import android.os.Handler;
23 import android.service.dreams.IDreamManager;
24 
25 import com.android.internal.statusbar.IStatusBarService;
26 import com.android.systemui.animation.ActivityLaunchAnimator;
27 import com.android.systemui.animation.DialogLaunchAnimator;
28 import com.android.systemui.dagger.SysUISingleton;
29 import com.android.systemui.dagger.qualifiers.Main;
30 import com.android.systemui.dump.DumpManager;
31 import com.android.systemui.flags.FeatureFlags;
32 import com.android.systemui.media.MediaDataManager;
33 import com.android.systemui.plugins.ActivityStarter;
34 import com.android.systemui.plugins.statusbar.StatusBarStateController;
35 import com.android.systemui.qs.carrier.QSCarrierGroupController;
36 import com.android.systemui.statusbar.ActionClickLogger;
37 import com.android.systemui.statusbar.CommandQueue;
38 import com.android.systemui.statusbar.MediaArtworkProcessor;
39 import com.android.systemui.statusbar.NotificationClickNotifier;
40 import com.android.systemui.statusbar.NotificationListener;
41 import com.android.systemui.statusbar.NotificationLockscreenUserManager;
42 import com.android.systemui.statusbar.NotificationMediaManager;
43 import com.android.systemui.statusbar.NotificationRemoteInputManager;
44 import com.android.systemui.statusbar.NotificationShadeWindowController;
45 import com.android.systemui.statusbar.NotificationViewHierarchyManager;
46 import com.android.systemui.statusbar.RemoteInputNotificationRebuilder;
47 import com.android.systemui.statusbar.SmartReplyController;
48 import com.android.systemui.statusbar.StatusBarStateControllerImpl;
49 import com.android.systemui.statusbar.SysuiStatusBarStateController;
50 import com.android.systemui.statusbar.commandline.CommandRegistry;
51 import com.android.systemui.statusbar.gesture.SwipeStatusBarAwayGestureHandler;
52 import com.android.systemui.statusbar.notification.AssistantFeedbackController;
53 import com.android.systemui.statusbar.notification.DynamicChildBindController;
54 import com.android.systemui.statusbar.notification.DynamicPrivacyController;
55 import com.android.systemui.statusbar.notification.NotificationEntryManager;
56 import com.android.systemui.statusbar.notification.collection.NotifCollection;
57 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
58 import com.android.systemui.statusbar.notification.collection.inflation.LowPriorityInflationHelper;
59 import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
60 import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
61 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
62 import com.android.systemui.statusbar.notification.stack.ForegroundServiceSectionController;
63 import com.android.systemui.statusbar.phone.KeyguardBypassController;
64 import com.android.systemui.statusbar.phone.ManagedProfileController;
65 import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl;
66 import com.android.systemui.statusbar.phone.StatusBar;
67 import com.android.systemui.statusbar.phone.StatusBarIconController;
68 import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl;
69 import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback;
70 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController;
71 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger;
72 import com.android.systemui.statusbar.policy.RemoteInputUriController;
73 import com.android.systemui.statusbar.window.StatusBarWindowController;
74 import com.android.systemui.tracing.ProtoTracer;
75 import com.android.systemui.util.concurrency.DelayableExecutor;
76 import com.android.systemui.util.time.SystemClock;
77 import com.android.wm.shell.bubbles.Bubbles;
78 
79 import java.util.Optional;
80 import java.util.concurrent.Executor;
81 
82 import dagger.Binds;
83 import dagger.Lazy;
84 import dagger.Module;
85 import dagger.Provides;
86 
87 /**
88  * This module provides instances needed to construct {@link StatusBar}. These are moved to this
89  * separate from {@link StatusBarModule} module so that components that wish to build their own
90  * version of StatusBar can include just dependencies, without injecting StatusBar itself.
91  */
92 @Module
93 public interface StatusBarDependenciesModule {
94     /** */
95     @SysUISingleton
96     @Provides
provideNotificationRemoteInputManager( Context context, FeatureFlags featureFlags, NotificationLockscreenUserManager lockscreenUserManager, SmartReplyController smartReplyController, NotificationEntryManager notificationEntryManager, RemoteInputNotificationRebuilder rebuilder, Lazy<Optional<StatusBar>> statusBarOptionalLazy, StatusBarStateController statusBarStateController, Handler mainHandler, RemoteInputUriController remoteInputUriController, NotificationClickNotifier clickNotifier, ActionClickLogger actionClickLogger, DumpManager dumpManager)97     static NotificationRemoteInputManager provideNotificationRemoteInputManager(
98             Context context,
99             FeatureFlags featureFlags,
100             NotificationLockscreenUserManager lockscreenUserManager,
101             SmartReplyController smartReplyController,
102             NotificationEntryManager notificationEntryManager,
103             RemoteInputNotificationRebuilder rebuilder,
104             Lazy<Optional<StatusBar>> statusBarOptionalLazy,
105             StatusBarStateController statusBarStateController,
106             Handler mainHandler,
107             RemoteInputUriController remoteInputUriController,
108             NotificationClickNotifier clickNotifier,
109             ActionClickLogger actionClickLogger,
110             DumpManager dumpManager) {
111         return new NotificationRemoteInputManager(
112                 context,
113                 featureFlags,
114                 lockscreenUserManager,
115                 smartReplyController,
116                 notificationEntryManager,
117                 rebuilder,
118                 statusBarOptionalLazy,
119                 statusBarStateController,
120                 mainHandler,
121                 remoteInputUriController,
122                 clickNotifier,
123                 actionClickLogger,
124                 dumpManager);
125     }
126 
127     /** */
128     @SysUISingleton
129     @Provides
provideNotificationMediaManager( Context context, Lazy<Optional<StatusBar>> statusBarOptionalLazy, Lazy<NotificationShadeWindowController> notificationShadeWindowController, NotificationEntryManager notificationEntryManager, MediaArtworkProcessor mediaArtworkProcessor, KeyguardBypassController keyguardBypassController, NotifPipeline notifPipeline, NotifCollection notifCollection, FeatureFlags featureFlags, @Main DelayableExecutor mainExecutor, MediaDataManager mediaDataManager, DumpManager dumpManager)130     static NotificationMediaManager provideNotificationMediaManager(
131             Context context,
132             Lazy<Optional<StatusBar>> statusBarOptionalLazy,
133             Lazy<NotificationShadeWindowController> notificationShadeWindowController,
134             NotificationEntryManager notificationEntryManager,
135             MediaArtworkProcessor mediaArtworkProcessor,
136             KeyguardBypassController keyguardBypassController,
137             NotifPipeline notifPipeline,
138             NotifCollection notifCollection,
139             FeatureFlags featureFlags,
140             @Main DelayableExecutor mainExecutor,
141             MediaDataManager mediaDataManager,
142             DumpManager dumpManager) {
143         return new NotificationMediaManager(
144                 context,
145                 statusBarOptionalLazy,
146                 notificationShadeWindowController,
147                 notificationEntryManager,
148                 mediaArtworkProcessor,
149                 keyguardBypassController,
150                 notifPipeline,
151                 notifCollection,
152                 featureFlags,
153                 mainExecutor,
154                 mediaDataManager,
155                 dumpManager);
156     }
157 
158     /** */
159     @SysUISingleton
160     @Provides
provideNotificationListener( Context context, NotificationManager notificationManager, @Main Handler mainHandler)161     static NotificationListener provideNotificationListener(
162             Context context,
163             NotificationManager notificationManager,
164             @Main Handler mainHandler) {
165         return new NotificationListener(
166                 context, notificationManager, mainHandler);
167     }
168 
169     /** */
170     @SysUISingleton
171     @Provides
provideSmartReplyController( DumpManager dumpManager, NotificationEntryManager entryManager, IStatusBarService statusBarService, NotificationClickNotifier clickNotifier)172     static SmartReplyController provideSmartReplyController(
173             DumpManager dumpManager,
174             NotificationEntryManager entryManager,
175             IStatusBarService statusBarService,
176             NotificationClickNotifier clickNotifier) {
177         return new SmartReplyController(dumpManager, entryManager, statusBarService, clickNotifier);
178     }
179 
180 
181     /** */
182     @Binds
provideNotificationRemoteInputManagerCallback( StatusBarRemoteInputCallback callbackImpl)183     NotificationRemoteInputManager.Callback provideNotificationRemoteInputManagerCallback(
184             StatusBarRemoteInputCallback callbackImpl);
185 
186     /** */
187     @SysUISingleton
188     @Provides
provideNotificationViewHierarchyManager( Context context, @Main Handler mainHandler, FeatureFlags featureFlags, NotificationLockscreenUserManager notificationLockscreenUserManager, NotificationGroupManagerLegacy groupManager, VisualStabilityManager visualStabilityManager, StatusBarStateController statusBarStateController, NotificationEntryManager notificationEntryManager, KeyguardBypassController bypassController, Optional<Bubbles> bubblesOptional, DynamicPrivacyController privacyController, ForegroundServiceSectionController fgsSectionController, DynamicChildBindController dynamicChildBindController, LowPriorityInflationHelper lowPriorityInflationHelper, AssistantFeedbackController assistantFeedbackController)189     static NotificationViewHierarchyManager provideNotificationViewHierarchyManager(
190             Context context,
191             @Main Handler mainHandler,
192             FeatureFlags featureFlags,
193             NotificationLockscreenUserManager notificationLockscreenUserManager,
194             NotificationGroupManagerLegacy groupManager,
195             VisualStabilityManager visualStabilityManager,
196             StatusBarStateController statusBarStateController,
197             NotificationEntryManager notificationEntryManager,
198             KeyguardBypassController bypassController,
199             Optional<Bubbles> bubblesOptional,
200             DynamicPrivacyController privacyController,
201             ForegroundServiceSectionController fgsSectionController,
202             DynamicChildBindController dynamicChildBindController,
203             LowPriorityInflationHelper lowPriorityInflationHelper,
204             AssistantFeedbackController assistantFeedbackController) {
205         return new NotificationViewHierarchyManager(
206                 context,
207                 mainHandler,
208                 featureFlags,
209                 notificationLockscreenUserManager,
210                 groupManager,
211                 visualStabilityManager,
212                 statusBarStateController,
213                 notificationEntryManager,
214                 bypassController,
215                 bubblesOptional,
216                 privacyController,
217                 fgsSectionController,
218                 dynamicChildBindController,
219                 lowPriorityInflationHelper,
220                 assistantFeedbackController);
221     }
222 
223     /**
224      * Provides our instance of CommandQueue which is considered optional.
225      */
226     @Provides
227     @SysUISingleton
provideCommandQueue( Context context, ProtoTracer protoTracer, CommandRegistry registry)228     static CommandQueue provideCommandQueue(
229             Context context,
230             ProtoTracer protoTracer,
231             CommandRegistry registry) {
232         return new CommandQueue(context, protoTracer, registry);
233     }
234 
235     /**
236      */
237     @Binds
provideManagedProfileController( ManagedProfileControllerImpl controllerImpl)238     ManagedProfileController provideManagedProfileController(
239             ManagedProfileControllerImpl controllerImpl);
240 
241     /**
242      */
243     @Binds
providesSysuiStatusBarStateController( StatusBarStateControllerImpl statusBarStateControllerImpl)244     SysuiStatusBarStateController providesSysuiStatusBarStateController(
245             StatusBarStateControllerImpl statusBarStateControllerImpl);
246 
247     /**
248      */
249     @Binds
provideStatusBarIconController( StatusBarIconControllerImpl controllerImpl)250     StatusBarIconController provideStatusBarIconController(
251             StatusBarIconControllerImpl controllerImpl);
252 
253     /**
254      */
255     @Provides
256     @SysUISingleton
provideOngoingCallController( CommonNotifCollection notifCollection, FeatureFlags featureFlags, SystemClock systemClock, ActivityStarter activityStarter, @Main Executor mainExecutor, IActivityManager iActivityManager, OngoingCallLogger logger, DumpManager dumpManager, StatusBarWindowController statusBarWindowController, SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler, StatusBarStateController statusBarStateController)257     static OngoingCallController provideOngoingCallController(
258             CommonNotifCollection notifCollection,
259             FeatureFlags featureFlags,
260             SystemClock systemClock,
261             ActivityStarter activityStarter,
262             @Main Executor mainExecutor,
263             IActivityManager iActivityManager,
264             OngoingCallLogger logger,
265             DumpManager dumpManager,
266             StatusBarWindowController statusBarWindowController,
267             SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler,
268             StatusBarStateController statusBarStateController) {
269         Optional<StatusBarWindowController> windowController =
270                 featureFlags.isOngoingCallInImmersiveEnabled()
271                         ? Optional.of(statusBarWindowController)
272                         : Optional.empty();
273         Optional<SwipeStatusBarAwayGestureHandler> gestureHandler =
274                 featureFlags.isOngoingCallInImmersiveEnabled()
275                         ? Optional.of(swipeStatusBarAwayGestureHandler)
276                         : Optional.empty();
277         OngoingCallController ongoingCallController =
278                 new OngoingCallController(
279                         notifCollection,
280                         featureFlags,
281                         systemClock,
282                         activityStarter,
283                         mainExecutor,
284                         iActivityManager,
285                         logger,
286                         dumpManager,
287                         windowController,
288                         gestureHandler,
289                         statusBarStateController);
290         ongoingCallController.init();
291         return ongoingCallController;
292     }
293 
294     /** */
295     @Binds
provideSlotIndexResolver( QSCarrierGroupController.SubscriptionManagerSlotIndexResolver impl)296     QSCarrierGroupController.SlotIndexResolver provideSlotIndexResolver(
297             QSCarrierGroupController.SubscriptionManagerSlotIndexResolver impl);
298 
299     /**
300      */
301     @Provides
302     @SysUISingleton
provideActivityLaunchAnimator()303     static ActivityLaunchAnimator provideActivityLaunchAnimator() {
304         return new ActivityLaunchAnimator();
305     }
306 
307     /**
308      */
309     @Provides
310     @SysUISingleton
provideDialogLaunchAnimator(IDreamManager dreamManager)311     static DialogLaunchAnimator provideDialogLaunchAnimator(IDreamManager dreamManager) {
312         return new DialogLaunchAnimator(dreamManager);
313     }
314 }
315