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.notification.dagger;
18 
19 import android.app.INotificationManager;
20 import android.content.Context;
21 import android.content.pm.LauncherApps;
22 import android.content.pm.ShortcutManager;
23 import android.os.Handler;
24 import android.view.accessibility.AccessibilityManager;
25 
26 import com.android.internal.logging.UiEventLogger;
27 import com.android.internal.statusbar.IStatusBarService;
28 import com.android.systemui.R;
29 import com.android.systemui.dagger.SysUISingleton;
30 import com.android.systemui.dagger.qualifiers.Background;
31 import com.android.systemui.dagger.qualifiers.Main;
32 import com.android.systemui.dagger.qualifiers.UiBackground;
33 import com.android.systemui.dump.DumpManager;
34 import com.android.systemui.flags.FeatureFlags;
35 import com.android.systemui.keyguard.WakefulnessLifecycle;
36 import com.android.systemui.people.widget.PeopleSpaceWidgetManager;
37 import com.android.systemui.plugins.statusbar.StatusBarStateController;
38 import com.android.systemui.settings.UserContextProvider;
39 import com.android.systemui.statusbar.NotificationListener;
40 import com.android.systemui.statusbar.NotificationRemoteInputManager;
41 import com.android.systemui.statusbar.notification.AssistantFeedbackController;
42 import com.android.systemui.statusbar.notification.ForegroundServiceDismissalFeatureController;
43 import com.android.systemui.statusbar.notification.NotificationEntryManager;
44 import com.android.systemui.statusbar.notification.NotificationEntryManagerLogger;
45 import com.android.systemui.statusbar.notification.collection.NotifCollection;
46 import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl;
47 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
48 import com.android.systemui.statusbar.notification.collection.coordinator.ShadeEventCoordinator;
49 import com.android.systemui.statusbar.notification.collection.coordinator.VisualStabilityCoordinator;
50 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorsModule;
51 import com.android.systemui.statusbar.notification.collection.inflation.NotifInflater;
52 import com.android.systemui.statusbar.notification.collection.inflation.NotificationRowBinder;
53 import com.android.systemui.statusbar.notification.collection.inflation.OnUserInteractionCallbackImpl;
54 import com.android.systemui.statusbar.notification.collection.legacy.LegacyNotificationPresenterExtensions;
55 import com.android.systemui.statusbar.notification.collection.legacy.NotificationGroupManagerLegacy;
56 import com.android.systemui.statusbar.notification.collection.legacy.OnUserInteractionCallbackImplLegacy;
57 import com.android.systemui.statusbar.notification.collection.legacy.VisualStabilityManager;
58 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
59 import com.android.systemui.statusbar.notification.collection.provider.HighPriorityProvider;
60 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
61 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl;
62 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
63 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManagerImpl;
64 import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager;
65 import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
66 import com.android.systemui.statusbar.notification.init.NotificationsController;
67 import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
68 import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
69 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
70 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
71 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
72 import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger;
73 import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl;
74 import com.android.systemui.statusbar.notification.row.ChannelEditorDialogController;
75 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
76 import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
77 import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager;
78 import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
79 import com.android.systemui.statusbar.phone.KeyguardBypassController;
80 import com.android.systemui.statusbar.phone.ShadeController;
81 import com.android.systemui.statusbar.phone.StatusBar;
82 import com.android.systemui.statusbar.policy.HeadsUpManager;
83 import com.android.systemui.util.leak.LeakDetector;
84 import com.android.systemui.wmshell.BubblesManager;
85 
86 import java.util.Optional;
87 import java.util.concurrent.Executor;
88 
89 import dagger.Binds;
90 import dagger.Lazy;
91 import dagger.Module;
92 import dagger.Provides;
93 
94 /**
95  * Dagger Module for classes found within the com.android.systemui.statusbar.notification package.
96  */
97 @Module(includes = {
98         NotificationSectionHeadersModule.class,
99         CoordinatorsModule.class
100 })
101 public interface NotificationsModule {
102     @Binds
bindSectionProvider( NotificationSectionsManager impl)103     StackScrollAlgorithm.SectionProvider bindSectionProvider(
104             NotificationSectionsManager impl);
105 
106     @Binds
bindBypassController( KeyguardBypassController impl)107     StackScrollAlgorithm.BypassController bindBypassController(
108             KeyguardBypassController impl);
109 
110     /** Provides an instance of {@link NotificationEntryManager} */
111     @SysUISingleton
112     @Provides
provideNotificationEntryManager( NotificationEntryManagerLogger logger, NotificationGroupManagerLegacy groupManager, FeatureFlags featureFlags, Lazy<NotificationRowBinder> notificationRowBinderLazy, Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy, LeakDetector leakDetector, ForegroundServiceDismissalFeatureController fgsFeatureController, IStatusBarService statusBarService, DumpManager dumpManager)113     static NotificationEntryManager provideNotificationEntryManager(
114             NotificationEntryManagerLogger logger,
115             NotificationGroupManagerLegacy groupManager,
116             FeatureFlags featureFlags,
117             Lazy<NotificationRowBinder> notificationRowBinderLazy,
118             Lazy<NotificationRemoteInputManager> notificationRemoteInputManagerLazy,
119             LeakDetector leakDetector,
120             ForegroundServiceDismissalFeatureController fgsFeatureController,
121             IStatusBarService statusBarService,
122             DumpManager dumpManager) {
123         return new NotificationEntryManager(
124                 logger,
125                 groupManager,
126                 featureFlags,
127                 notificationRowBinderLazy,
128                 notificationRemoteInputManagerLazy,
129                 leakDetector,
130                 fgsFeatureController,
131                 statusBarService,
132                 dumpManager);
133     }
134 
135     /** Provides an instance of {@link NotificationGutsManager} */
136     @SysUISingleton
137     @Provides
provideNotificationGutsManager( Context context, Lazy<Optional<StatusBar>> statusBarOptionalLazy, @Main Handler mainHandler, @Background Handler bgHandler, AccessibilityManager accessibilityManager, HighPriorityProvider highPriorityProvider, INotificationManager notificationManager, NotificationEntryManager notificationEntryManager, PeopleSpaceWidgetManager peopleSpaceWidgetManager, LauncherApps launcherApps, ShortcutManager shortcutManager, ChannelEditorDialogController channelEditorDialogController, UserContextProvider contextTracker, AssistantFeedbackController assistantFeedbackController, Optional<BubblesManager> bubblesManagerOptional, UiEventLogger uiEventLogger, OnUserInteractionCallback onUserInteractionCallback, ShadeController shadeController, DumpManager dumpManager)138     static NotificationGutsManager provideNotificationGutsManager(
139             Context context,
140             Lazy<Optional<StatusBar>> statusBarOptionalLazy,
141             @Main Handler mainHandler,
142             @Background Handler bgHandler,
143             AccessibilityManager accessibilityManager,
144             HighPriorityProvider highPriorityProvider,
145             INotificationManager notificationManager,
146             NotificationEntryManager notificationEntryManager,
147             PeopleSpaceWidgetManager peopleSpaceWidgetManager,
148             LauncherApps launcherApps,
149             ShortcutManager shortcutManager,
150             ChannelEditorDialogController channelEditorDialogController,
151             UserContextProvider contextTracker,
152             AssistantFeedbackController assistantFeedbackController,
153             Optional<BubblesManager> bubblesManagerOptional,
154             UiEventLogger uiEventLogger,
155             OnUserInteractionCallback onUserInteractionCallback,
156             ShadeController shadeController,
157             DumpManager dumpManager) {
158         return new NotificationGutsManager(
159                 context,
160                 statusBarOptionalLazy,
161                 mainHandler,
162                 bgHandler,
163                 accessibilityManager,
164                 highPriorityProvider,
165                 notificationManager,
166                 notificationEntryManager,
167                 peopleSpaceWidgetManager,
168                 launcherApps,
169                 shortcutManager,
170                 channelEditorDialogController,
171                 contextTracker,
172                 assistantFeedbackController,
173                 bubblesManagerOptional,
174                 uiEventLogger,
175                 onUserInteractionCallback,
176                 shadeController,
177                 dumpManager);
178     }
179 
180     /** Provides an instance of {@link NotifGutsViewManager} */
181     @SysUISingleton
182     @Provides
provideNotifGutsViewManager( NotificationGutsManager notificationGutsManager)183     static NotifGutsViewManager provideNotifGutsViewManager(
184             NotificationGutsManager notificationGutsManager) {
185         return notificationGutsManager;
186     }
187 
188     /** Provides an instance of {@link VisualStabilityManager} */
189     @SysUISingleton
190     @Provides
provideVisualStabilityManager( NotificationEntryManager notificationEntryManager, Handler handler, StatusBarStateController statusBarStateController, WakefulnessLifecycle wakefulnessLifecycle, DumpManager dumpManager)191     static VisualStabilityManager provideVisualStabilityManager(
192             NotificationEntryManager notificationEntryManager,
193             Handler handler,
194             StatusBarStateController statusBarStateController,
195             WakefulnessLifecycle wakefulnessLifecycle,
196             DumpManager dumpManager) {
197         return new VisualStabilityManager(
198                 notificationEntryManager,
199                 handler,
200                 statusBarStateController,
201                 wakefulnessLifecycle,
202                 dumpManager);
203     }
204 
205     /** Provides an instance of {@link NotificationLogger} */
206     @SysUISingleton
207     @Provides
provideNotificationLogger( NotificationListener notificationListener, @UiBackground Executor uiBgExecutor, NotificationEntryManager entryManager, StatusBarStateController statusBarStateController, NotificationLogger.ExpansionStateLogger expansionStateLogger, NotificationPanelLogger notificationPanelLogger)208     static NotificationLogger provideNotificationLogger(
209             NotificationListener notificationListener,
210             @UiBackground Executor uiBgExecutor,
211             NotificationEntryManager entryManager,
212             StatusBarStateController statusBarStateController,
213             NotificationLogger.ExpansionStateLogger expansionStateLogger,
214             NotificationPanelLogger notificationPanelLogger) {
215         return new NotificationLogger(
216                 notificationListener,
217                 uiBgExecutor,
218                 entryManager,
219                 statusBarStateController,
220                 expansionStateLogger,
221                 notificationPanelLogger);
222     }
223 
224     /** Provides an instance of {@link NotificationPanelLogger} */
225     @SysUISingleton
226     @Provides
provideNotificationPanelLogger()227     static NotificationPanelLogger provideNotificationPanelLogger() {
228         return new NotificationPanelLoggerImpl();
229     }
230 
231     /** Provides an instance of {@link GroupMembershipManager} */
232     @SysUISingleton
233     @Provides
provideGroupMembershipManager( FeatureFlags featureFlags, Lazy<NotificationGroupManagerLegacy> groupManagerLegacy)234     static GroupMembershipManager provideGroupMembershipManager(
235             FeatureFlags featureFlags,
236             Lazy<NotificationGroupManagerLegacy> groupManagerLegacy) {
237         return featureFlags.isNewNotifPipelineRenderingEnabled()
238                 ? new GroupMembershipManagerImpl()
239                 : groupManagerLegacy.get();
240     }
241 
242     /** Provides an instance of {@link GroupExpansionManager} */
243     @SysUISingleton
244     @Provides
provideGroupExpansionManager( FeatureFlags featureFlags, Lazy<GroupMembershipManager> groupMembershipManager, Lazy<NotificationGroupManagerLegacy> groupManagerLegacy)245     static GroupExpansionManager provideGroupExpansionManager(
246             FeatureFlags featureFlags,
247             Lazy<GroupMembershipManager> groupMembershipManager,
248             Lazy<NotificationGroupManagerLegacy> groupManagerLegacy) {
249         return featureFlags.isNewNotifPipelineRenderingEnabled()
250                 ? new GroupExpansionManagerImpl(groupMembershipManager.get())
251                 : groupManagerLegacy.get();
252     }
253 
254     /** Initializes the notification data pipeline (can be disabled via config). */
255     @SysUISingleton
256     @Provides
provideNotificationsController( Context context, Lazy<NotificationsControllerImpl> realController, Lazy<NotificationsControllerStub> stubController)257     static NotificationsController provideNotificationsController(
258             Context context,
259             Lazy<NotificationsControllerImpl> realController,
260             Lazy<NotificationsControllerStub> stubController) {
261         if (context.getResources().getBoolean(R.bool.config_renderNotifications)) {
262             return realController.get();
263         } else {
264             return stubController.get();
265         }
266     }
267 
268     /**
269      * Provide the active notification collection managing the notifications to render.
270      */
271     @Provides
272     @SysUISingleton
provideCommonNotifCollection( FeatureFlags featureFlags, Lazy<NotifPipeline> pipeline, NotificationEntryManager entryManager)273     static CommonNotifCollection provideCommonNotifCollection(
274             FeatureFlags featureFlags,
275             Lazy<NotifPipeline> pipeline,
276             NotificationEntryManager entryManager) {
277         return featureFlags.isNewNotifPipelineRenderingEnabled() ? pipeline.get() : entryManager;
278     }
279 
280     /**
281      * Provide the active implementation for presenting notifications.
282      */
283     @Provides
284     @SysUISingleton
provideNotifShadeEventSource( FeatureFlags featureFlags, Lazy<ShadeEventCoordinator> shadeEventCoordinatorLazy, Lazy<LegacyNotificationPresenterExtensions> legacyNotificationPresenterExtensionsLazy)285     static NotifShadeEventSource provideNotifShadeEventSource(
286             FeatureFlags featureFlags,
287             Lazy<ShadeEventCoordinator> shadeEventCoordinatorLazy,
288             Lazy<LegacyNotificationPresenterExtensions> legacyNotificationPresenterExtensionsLazy) {
289         return featureFlags.isNewNotifPipelineRenderingEnabled()
290                 ? shadeEventCoordinatorLazy.get()
291                 : legacyNotificationPresenterExtensionsLazy.get();
292     }
293 
294     /**
295      * Provide a dismissal callback that's triggered when a user manually dismissed a notification
296      * from the notification shade or it gets auto-cancelled by click.
297      */
298     @Provides
299     @SysUISingleton
provideOnUserInteractionCallback( FeatureFlags featureFlags, HeadsUpManager headsUpManager, StatusBarStateController statusBarStateController, Lazy<NotifPipeline> pipeline, Lazy<NotifCollection> notifCollection, Lazy<VisualStabilityCoordinator> visualStabilityCoordinator, NotificationEntryManager entryManager, VisualStabilityManager visualStabilityManager, Lazy<GroupMembershipManager> groupMembershipManagerLazy)300     static OnUserInteractionCallback provideOnUserInteractionCallback(
301             FeatureFlags featureFlags,
302             HeadsUpManager headsUpManager,
303             StatusBarStateController statusBarStateController,
304             Lazy<NotifPipeline> pipeline,
305             Lazy<NotifCollection> notifCollection,
306             Lazy<VisualStabilityCoordinator> visualStabilityCoordinator,
307             NotificationEntryManager entryManager,
308             VisualStabilityManager visualStabilityManager,
309             Lazy<GroupMembershipManager> groupMembershipManagerLazy) {
310         return featureFlags.isNewNotifPipelineRenderingEnabled()
311                 ? new OnUserInteractionCallbackImpl(
312                         pipeline.get(),
313                         notifCollection.get(),
314                         headsUpManager,
315                         statusBarStateController,
316                         visualStabilityCoordinator.get(),
317                         groupMembershipManagerLazy.get())
318                 : new OnUserInteractionCallbackImplLegacy(
319                         entryManager,
320                         headsUpManager,
321                         statusBarStateController,
322                         visualStabilityManager,
323                         groupMembershipManagerLazy.get());
324     }
325 
326     /** */
327     @Binds
bindNotificationInterruptStateProvider( NotificationInterruptStateProviderImpl notificationInterruptStateProviderImpl)328     NotificationInterruptStateProvider bindNotificationInterruptStateProvider(
329             NotificationInterruptStateProviderImpl notificationInterruptStateProviderImpl);
330 
331     /** */
332     @Binds
bindNotifInflater(NotifInflaterImpl notifInflaterImpl)333     NotifInflater bindNotifInflater(NotifInflaterImpl notifInflaterImpl);
334 }
335