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.content.Context;
20 
21 import com.android.systemui.R;
22 import com.android.systemui.dagger.SysUISingleton;
23 import com.android.systemui.dagger.qualifiers.UiBackground;
24 import com.android.systemui.plugins.statusbar.StatusBarStateController;
25 import com.android.systemui.shade.ShadeEventsModule;
26 import com.android.systemui.shade.ShadeExpansionStateManager;
27 import com.android.systemui.statusbar.NotificationListener;
28 import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
29 import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl;
30 import com.android.systemui.statusbar.notification.collection.NotifLiveDataStore;
31 import com.android.systemui.statusbar.notification.collection.NotifLiveDataStoreImpl;
32 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
33 import com.android.systemui.statusbar.notification.collection.NotifPipelineChoreographerModule;
34 import com.android.systemui.statusbar.notification.collection.coordinator.ShadeEventCoordinator;
35 import com.android.systemui.statusbar.notification.collection.coordinator.dagger.CoordinatorsModule;
36 import com.android.systemui.statusbar.notification.collection.inflation.BindEventManager;
37 import com.android.systemui.statusbar.notification.collection.inflation.BindEventManagerImpl;
38 import com.android.systemui.statusbar.notification.collection.inflation.NotifInflater;
39 import com.android.systemui.statusbar.notification.collection.inflation.OnUserInteractionCallbackImpl;
40 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
41 import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProvider;
42 import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProviderImpl;
43 import com.android.systemui.statusbar.notification.collection.provider.NotificationVisibilityProviderImpl;
44 import com.android.systemui.statusbar.notification.collection.provider.SeenNotificationsProviderModule;
45 import com.android.systemui.statusbar.notification.collection.provider.VisibilityLocationProviderDelegator;
46 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
47 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl;
48 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
49 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManagerImpl;
50 import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager;
51 import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
52 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
53 import com.android.systemui.statusbar.notification.icon.ConversationIconManager;
54 import com.android.systemui.statusbar.notification.icon.IconManager;
55 import com.android.systemui.statusbar.notification.init.NotificationsController;
56 import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
57 import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
58 import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProviderModule;
59 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
60 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
61 import com.android.systemui.statusbar.notification.logging.NotificationLogger;
62 import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger;
63 import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl;
64 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
65 import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
66 import com.android.systemui.statusbar.notification.row.ui.viewmodel.ActivatableNotificationViewModelModule;
67 import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
68 import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager;
69 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
70 import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
71 import com.android.systemui.statusbar.notification.stack.ui.viewmodel.NotificationListViewModelModule;
72 import com.android.systemui.statusbar.phone.KeyguardBypassController;
73 
74 import dagger.Binds;
75 import dagger.Module;
76 import dagger.Provides;
77 
78 import java.util.concurrent.Executor;
79 
80 import javax.inject.Provider;
81 
82 /**
83  * Dagger Module for classes found within the com.android.systemui.statusbar.notification package.
84  */
85 @Module(includes = {
86         CoordinatorsModule.class,
87         KeyguardNotificationVisibilityProviderModule.class,
88         SeenNotificationsProviderModule.class,
89         ShadeEventsModule.class,
90         NotifPipelineChoreographerModule.class,
91         NotificationSectionHeadersModule.class,
92         NotificationListViewModelModule.class,
93         ActivatableNotificationViewModelModule.class,
94         NotificationMemoryModule.class,
95 })
96 public interface NotificationsModule {
97     @Binds
bindSectionProvider(NotificationSectionsManager impl)98     StackScrollAlgorithm.SectionProvider bindSectionProvider(NotificationSectionsManager impl);
99 
100     @Binds
bindBypassController(KeyguardBypassController impl)101     StackScrollAlgorithm.BypassController bindBypassController(KeyguardBypassController impl);
102 
103     /** Provides an instance of {@link NotifGutsViewManager} */
104     @Binds
bindNotifGutsViewManager(NotificationGutsManager notificationGutsManager)105     NotifGutsViewManager bindNotifGutsViewManager(NotificationGutsManager notificationGutsManager);
106 
107     /** Provides an instance of {@link VisibilityLocationProvider} */
108     @Binds
bindVisibilityLocationProvider( VisibilityLocationProviderDelegator visibilityLocationProviderDelegator)109     VisibilityLocationProvider bindVisibilityLocationProvider(
110             VisibilityLocationProviderDelegator visibilityLocationProviderDelegator);
111 
112     /** Provides an instance of {@link NotificationLogger} */
113     @SysUISingleton
114     @Provides
provideNotificationLogger( NotificationListener notificationListener, @UiBackground Executor uiBgExecutor, NotifLiveDataStore notifLiveDataStore, NotificationVisibilityProvider visibilityProvider, NotifPipeline notifPipeline, StatusBarStateController statusBarStateController, ShadeExpansionStateManager shadeExpansionStateManager, NotificationLogger.ExpansionStateLogger expansionStateLogger, NotificationPanelLogger notificationPanelLogger)115     static NotificationLogger provideNotificationLogger(
116             NotificationListener notificationListener,
117             @UiBackground Executor uiBgExecutor,
118             NotifLiveDataStore notifLiveDataStore,
119             NotificationVisibilityProvider visibilityProvider,
120             NotifPipeline notifPipeline,
121             StatusBarStateController statusBarStateController,
122             ShadeExpansionStateManager shadeExpansionStateManager,
123             NotificationLogger.ExpansionStateLogger expansionStateLogger,
124             NotificationPanelLogger notificationPanelLogger) {
125         return new NotificationLogger(
126                 notificationListener,
127                 uiBgExecutor,
128                 notifLiveDataStore,
129                 visibilityProvider,
130                 notifPipeline,
131                 statusBarStateController,
132                 shadeExpansionStateManager,
133                 expansionStateLogger,
134                 notificationPanelLogger);
135     }
136 
137     /** Provides an instance of {@link NotificationPanelLogger} */
138     @SysUISingleton
139     @Provides
provideNotificationPanelLogger()140     static NotificationPanelLogger provideNotificationPanelLogger() {
141         return new NotificationPanelLoggerImpl();
142     }
143 
144     /** Provides an instance of {@link GroupMembershipManager} */
145     @SysUISingleton
146     @Provides
provideGroupMembershipManager()147     static GroupMembershipManager provideGroupMembershipManager() {
148         return new GroupMembershipManagerImpl();
149     }
150 
151     /** Provides an instance of {@link GroupExpansionManager} */
152     @Binds
provideGroupExpansionManager(GroupExpansionManagerImpl impl)153     GroupExpansionManager provideGroupExpansionManager(GroupExpansionManagerImpl impl);
154 
155     /** Initializes the notification data pipeline (can be disabled via config). */
156     @SysUISingleton
157     @Provides
provideNotificationsController( Context context, Provider<NotificationsControllerImpl> realController, Provider<NotificationsControllerStub> stubController)158     static NotificationsController provideNotificationsController(
159             Context context,
160             Provider<NotificationsControllerImpl> realController,
161             Provider<NotificationsControllerStub> stubController) {
162         if (context.getResources().getBoolean(R.bool.config_renderNotifications)) {
163             return realController.get();
164         } else {
165             return stubController.get();
166         }
167     }
168 
169     /** Provides the container for the notification list. */
170     @Provides
171     @SysUISingleton
provideListContainer( NotificationStackScrollLayoutController nsslController)172     static NotificationListContainer provideListContainer(
173             NotificationStackScrollLayoutController nsslController) {
174         return nsslController.getNotificationListContainer();
175     }
176 
177     /**
178      * Provide the active notification collection managing the notifications to render.
179      */
180     @Binds
provideCommonNotifCollection(NotifPipeline pipeline)181     CommonNotifCollection provideCommonNotifCollection(NotifPipeline pipeline);
182 
183     /**
184      * Provide the object which can be used to obtain dismissibility of a Notification.
185      */
186     @Binds
provideNotificationDismissibilityProvider( NotificationDismissibilityProviderImpl impl)187     NotificationDismissibilityProvider provideNotificationDismissibilityProvider(
188             NotificationDismissibilityProviderImpl impl);
189 
190     /**
191      * Provide the object which can be used to obtain NotificationVisibility objects.
192      */
193     @Binds
provideNotificationVisibilityProvider( NotificationVisibilityProviderImpl impl)194     NotificationVisibilityProvider provideNotificationVisibilityProvider(
195             NotificationVisibilityProviderImpl impl);
196 
197     /**
198      * Provide the active implementation for presenting notifications.
199      */
200     @Binds
provideNotifShadeEventSource(ShadeEventCoordinator shadeEventCoordinator)201     NotifShadeEventSource provideNotifShadeEventSource(ShadeEventCoordinator shadeEventCoordinator);
202 
203     /**
204      * Provide a dismissal callback that's triggered when a user manually dismissed a notification
205      * from the notification shade or it gets auto-cancelled by click.
206      */
207     @Binds
provideOnUserInteractionCallback(OnUserInteractionCallbackImpl impl)208     OnUserInteractionCallback provideOnUserInteractionCallback(OnUserInteractionCallbackImpl impl);
209 
210     /** */
211     @Binds
bindNotificationInterruptStateProvider( NotificationInterruptStateProviderImpl notificationInterruptStateProviderImpl)212     NotificationInterruptStateProvider bindNotificationInterruptStateProvider(
213             NotificationInterruptStateProviderImpl notificationInterruptStateProviderImpl);
214 
215     /** */
216     @Binds
bindNotifInflater(NotifInflaterImpl notifInflaterImpl)217     NotifInflater bindNotifInflater(NotifInflaterImpl notifInflaterImpl);
218 
219     /** */
220     @Binds
bindConversationIconManager(IconManager iconManager)221     ConversationIconManager bindConversationIconManager(IconManager iconManager);
222 
223     /** */
224     @Binds
bindBindEventManagerImpl(BindEventManagerImpl bindEventManagerImpl)225     BindEventManager bindBindEventManagerImpl(BindEventManagerImpl bindEventManagerImpl);
226 
227     /** */
228     @Binds
bindNotifLiveDataStore(NotifLiveDataStoreImpl notifLiveDataStoreImpl)229     NotifLiveDataStore bindNotifLiveDataStore(NotifLiveDataStoreImpl notifLiveDataStoreImpl);
230 }
231