• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.NotificationManager;
20 import android.content.Context;
21 import android.os.Handler;
22 import android.service.notification.NotificationListenerService;
23 
24 import com.android.internal.jank.InteractionJankMonitor;
25 import com.android.settingslib.notification.data.repository.ZenModeRepository;
26 import com.android.settingslib.notification.data.repository.ZenModeRepositoryImpl;
27 import com.android.settingslib.notification.domain.interactor.NotificationsSoundPolicyInteractor;
28 import com.android.settingslib.notification.modes.ZenModesBackend;
29 import com.android.systemui.CoreStartable;
30 import com.android.systemui.Flags;
31 import com.android.systemui.dagger.SysUISingleton;
32 import com.android.systemui.dagger.qualifiers.Application;
33 import com.android.systemui.dagger.qualifiers.Background;
34 import com.android.systemui.res.R;
35 import com.android.systemui.shade.ShadeDisplayAware;
36 import com.android.systemui.statusbar.NotificationListener;
37 import com.android.systemui.statusbar.notification.NotificationActivityStarter;
38 import com.android.systemui.statusbar.notification.NotificationLaunchAnimatorControllerProvider;
39 import com.android.systemui.statusbar.notification.VisibilityLocationProvider;
40 import com.android.systemui.statusbar.notification.collection.EntryAdapterFactory;
41 import com.android.systemui.statusbar.notification.collection.EntryAdapterFactoryImpl;
42 import com.android.systemui.statusbar.notification.collection.NotifInflaterImpl;
43 import com.android.systemui.statusbar.notification.collection.NotifLiveDataStore;
44 import com.android.systemui.statusbar.notification.collection.NotifLiveDataStoreImpl;
45 import com.android.systemui.statusbar.notification.collection.NotifPipeline;
46 import com.android.systemui.statusbar.notification.collection.NotifPipelineChoreographerModule;
47 import com.android.systemui.statusbar.notification.collection.coordinator.ShadeEventCoordinator;
48 import com.android.systemui.statusbar.notification.collection.inflation.BindEventManager;
49 import com.android.systemui.statusbar.notification.collection.inflation.BindEventManagerImpl;
50 import com.android.systemui.statusbar.notification.collection.inflation.NotifInflater;
51 import com.android.systemui.statusbar.notification.collection.inflation.OnUserInteractionCallbackImpl;
52 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection;
53 import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProvider;
54 import com.android.systemui.statusbar.notification.collection.provider.NotificationDismissibilityProviderImpl;
55 import com.android.systemui.statusbar.notification.collection.provider.NotificationVisibilityProviderImpl;
56 import com.android.systemui.statusbar.notification.collection.provider.VisibilityLocationProviderDelegator;
57 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager;
58 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManagerImpl;
59 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager;
60 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManagerImpl;
61 import com.android.systemui.statusbar.notification.collection.render.NotifGutsViewManager;
62 import com.android.systemui.statusbar.notification.collection.render.NotifShadeEventSource;
63 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider;
64 import com.android.systemui.statusbar.notification.data.NotificationDataLayerModule;
65 import com.android.systemui.statusbar.notification.domain.NotificationDomainLayerModule;
66 import com.android.systemui.statusbar.notification.domain.interactor.NotificationLaunchAnimationInteractor;
67 import com.android.systemui.statusbar.notification.headsup.HeadsUpManager;
68 import com.android.systemui.statusbar.notification.icon.ConversationIconManager;
69 import com.android.systemui.statusbar.notification.icon.IconManager;
70 import com.android.systemui.statusbar.notification.init.NotificationsController;
71 import com.android.systemui.statusbar.notification.init.NotificationsControllerImpl;
72 import com.android.systemui.statusbar.notification.init.NotificationsControllerStub;
73 import com.android.systemui.statusbar.notification.interruption.KeyguardNotificationVisibilityProviderModule;
74 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProvider;
75 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderImpl;
76 import com.android.systemui.statusbar.notification.interruption.NotificationInterruptStateProviderWrapper;
77 import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProvider;
78 import com.android.systemui.statusbar.notification.interruption.VisualInterruptionDecisionProviderImpl;
79 import com.android.systemui.statusbar.notification.interruption.VisualInterruptionRefactor;
80 import com.android.systemui.statusbar.notification.logging.NotificationPanelLogger;
81 import com.android.systemui.statusbar.notification.logging.NotificationPanelLoggerImpl;
82 import com.android.systemui.statusbar.notification.logging.dagger.NotificationsLogModule;
83 import com.android.systemui.statusbar.notification.promoted.PromotedNotificationContentExtractor;
84 import com.android.systemui.statusbar.notification.promoted.PromotedNotificationContentExtractorImpl;
85 import com.android.systemui.statusbar.notification.promoted.shared.model.PromotedNotificationContentModel;
86 import com.android.systemui.statusbar.notification.row.NotificationEntryProcessorFactory;
87 import com.android.systemui.statusbar.notification.row.NotificationEntryProcessorFactoryLooperImpl;
88 import com.android.systemui.statusbar.notification.row.NotificationGutsManager;
89 import com.android.systemui.statusbar.notification.row.OnUserInteractionCallback;
90 import com.android.systemui.statusbar.notification.row.ui.viewmodel.ActivatableNotificationViewModelModule;
91 import com.android.systemui.statusbar.notification.stack.MagneticNotificationRowManager;
92 import com.android.systemui.statusbar.notification.stack.MagneticNotificationRowManagerImpl;
93 import com.android.systemui.statusbar.notification.stack.NotificationListContainer;
94 import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager;
95 import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController;
96 import com.android.systemui.statusbar.notification.stack.StackScrollAlgorithm;
97 import com.android.systemui.statusbar.phone.KeyguardBypassController;
98 import com.android.systemui.statusbar.phone.StatusBarNotificationActivityStarter;
99 import com.android.systemui.statusbar.policy.ZenModesCleanupStartable;
100 
101 import dagger.Binds;
102 import dagger.Module;
103 import dagger.Provides;
104 import dagger.multibindings.ClassKey;
105 import dagger.multibindings.IntoMap;
106 
107 import kotlin.coroutines.CoroutineContext;
108 
109 import kotlinx.coroutines.CoroutineScope;
110 
111 import javax.inject.Provider;
112 
113 /**
114  * Dagger Module for classes found within the com.android.systemui.statusbar.notification package.
115  */
116 @Module(includes = {
117         KeyguardNotificationVisibilityProviderModule.class,
118         NotificationDataLayerModule.class,
119         NotificationDomainLayerModule.class,
120         NotifPipelineChoreographerModule.class,
121         NotificationSectionHeadersModule.class,
122         ActivatableNotificationViewModelModule.class,
123         NotificationMemoryModule.class,
124         NotificationStatsLoggerModule.class,
125         NotificationsLogModule.class,
126 })
127 public interface NotificationsModule {
128     @Binds
bindSectionProvider(NotificationSectionsManager impl)129     StackScrollAlgorithm.SectionProvider bindSectionProvider(NotificationSectionsManager impl);
130 
131     @Binds
bindBypassController(KeyguardBypassController impl)132     StackScrollAlgorithm.BypassController bindBypassController(KeyguardBypassController impl);
133 
134     /** Provides an instance of {@link NotifGutsViewManager} */
135     @Binds
bindNotifGutsViewManager(NotificationGutsManager notificationGutsManager)136     NotifGutsViewManager bindNotifGutsViewManager(NotificationGutsManager notificationGutsManager);
137 
138     /** Binds {@link NotificationGutsManager} as a {@link CoreStartable}. */
139     @Binds
140     @IntoMap
141     @ClassKey(NotificationGutsManager.class)
bindsNotificationGutsManager(NotificationGutsManager notificationGutsManager)142     CoreStartable bindsNotificationGutsManager(NotificationGutsManager notificationGutsManager);
143 
144 
145     /** Provides an instance of {@link VisibilityLocationProvider} */
146     @Binds
bindVisibilityLocationProvider( VisibilityLocationProviderDelegator visibilityLocationProviderDelegator)147     VisibilityLocationProvider bindVisibilityLocationProvider(
148             VisibilityLocationProviderDelegator visibilityLocationProviderDelegator);
149 
150     /** Provides an instance of {@link NotificationPanelLogger} */
151     @SysUISingleton
152     @Provides
provideNotificationPanelLogger()153     static NotificationPanelLogger provideNotificationPanelLogger() {
154         return new NotificationPanelLoggerImpl();
155     }
156 
157     /** Provides an instance of {@link GroupMembershipManager} */
158     @Binds
provideGroupMembershipManager(GroupMembershipManagerImpl impl)159     GroupMembershipManager provideGroupMembershipManager(GroupMembershipManagerImpl impl);
160 
161     /** Provides an instance of {@link GroupExpansionManager} */
162     @Binds
provideGroupExpansionManager(GroupExpansionManagerImpl impl)163     GroupExpansionManager provideGroupExpansionManager(GroupExpansionManagerImpl impl);
164 
165     /** Provides an instance of {@link NotificationActivityStarter}. */
166     @Binds
bindActivityStarter(StatusBarNotificationActivityStarter impl)167     NotificationActivityStarter bindActivityStarter(StatusBarNotificationActivityStarter impl);
168 
169     /** Initializes the notification data pipeline (can be disabled via config). */
170     @SysUISingleton
171     @Provides
provideNotificationsController( @hadeDisplayAware Context context, Provider<NotificationsControllerImpl> realController, Provider<NotificationsControllerStub> stubController)172     static NotificationsController provideNotificationsController(
173             @ShadeDisplayAware Context context,
174             Provider<NotificationsControllerImpl> realController,
175             Provider<NotificationsControllerStub> stubController) {
176         if (context.getResources().getBoolean(R.bool.config_renderNotifications)) {
177             return realController.get();
178         } else {
179             return stubController.get();
180         }
181     }
182 
183     /** Provides the container for the notification list. */
184     @Provides
185     @SysUISingleton
provideListContainer( NotificationStackScrollLayoutController nsslController)186     static NotificationListContainer provideListContainer(
187             NotificationStackScrollLayoutController nsslController) {
188         return nsslController.getNotificationListContainer();
189     }
190 
191     /** Provides notification launch animator. */
192     @Provides
193     @SysUISingleton
194     static NotificationLaunchAnimatorControllerProvider
provideNotificationTransitionAnimatorControllerProvider( NotificationLaunchAnimationInteractor notificationLaunchAnimationInteractor, NotificationListContainer notificationListContainer, HeadsUpManager headsUpManager, InteractionJankMonitor jankMonitor)195             provideNotificationTransitionAnimatorControllerProvider(
196                     NotificationLaunchAnimationInteractor notificationLaunchAnimationInteractor,
197                     NotificationListContainer notificationListContainer,
198                     HeadsUpManager headsUpManager,
199                     InteractionJankMonitor jankMonitor) {
200         return new NotificationLaunchAnimatorControllerProvider(
201                 notificationLaunchAnimationInteractor,
202                 notificationListContainer,
203                 headsUpManager,
204                 jankMonitor);
205     }
206 
207     /**
208      * Provide the active notification collection managing the notifications to render.
209      */
210     @Binds
provideCommonNotifCollection(NotifPipeline pipeline)211     CommonNotifCollection provideCommonNotifCollection(NotifPipeline pipeline);
212 
213     /**
214      * Provide the object which can be used to obtain dismissibility of a Notification.
215      */
216     @Binds
provideNotificationDismissibilityProvider( NotificationDismissibilityProviderImpl impl)217     NotificationDismissibilityProvider provideNotificationDismissibilityProvider(
218             NotificationDismissibilityProviderImpl impl);
219 
220     /**
221      * Provide the object which can be used to obtain NotificationVisibility objects.
222      */
223     @Binds
provideNotificationVisibilityProvider( NotificationVisibilityProviderImpl impl)224     NotificationVisibilityProvider provideNotificationVisibilityProvider(
225             NotificationVisibilityProviderImpl impl);
226 
227     /**
228      * Provide the active implementation for presenting notifications.
229      */
230     @Binds
provideNotifShadeEventSource(ShadeEventCoordinator shadeEventCoordinator)231     NotifShadeEventSource provideNotifShadeEventSource(ShadeEventCoordinator shadeEventCoordinator);
232 
233     /**
234      * Provide a dismissal callback that's triggered when a user manually dismissed a notification
235      * from the notification shade or it gets auto-cancelled by click.
236      */
237     @Binds
provideOnUserInteractionCallback(OnUserInteractionCallbackImpl impl)238     OnUserInteractionCallback provideOnUserInteractionCallback(OnUserInteractionCallbackImpl impl);
239 
240     /** */
241     @Binds
bindNotificationInterruptStateProvider( NotificationInterruptStateProviderImpl notificationInterruptStateProviderImpl)242     NotificationInterruptStateProvider bindNotificationInterruptStateProvider(
243             NotificationInterruptStateProviderImpl notificationInterruptStateProviderImpl);
244 
245     /** */
246     @Binds
bindNotifInflater(NotifInflaterImpl notifInflaterImpl)247     NotifInflater bindNotifInflater(NotifInflaterImpl notifInflaterImpl);
248 
249     /** */
250     @Binds
bindNotificationEntryProcessorFactory( NotificationEntryProcessorFactoryLooperImpl factoryImpl)251     NotificationEntryProcessorFactory bindNotificationEntryProcessorFactory(
252             NotificationEntryProcessorFactoryLooperImpl factoryImpl);
253 
254     /** */
255     @Binds
bindConversationIconManager(IconManager iconManager)256     ConversationIconManager bindConversationIconManager(IconManager iconManager);
257 
258     /** */
259     @Binds
bindBindEventManagerImpl(BindEventManagerImpl bindEventManagerImpl)260     BindEventManager bindBindEventManagerImpl(BindEventManagerImpl bindEventManagerImpl);
261 
262     /** */
263     @Binds
bindNotifLiveDataStore(NotifLiveDataStoreImpl notifLiveDataStoreImpl)264     NotifLiveDataStore bindNotifLiveDataStore(NotifLiveDataStoreImpl notifLiveDataStoreImpl);
265 
266     /** */
267     @Binds
bindNotificationListener(NotificationListener notificationListener)268     NotificationListenerService bindNotificationListener(NotificationListener notificationListener);
269 
270     /** */
271     @Provides
272     @SysUISingleton
provideVisualInterruptionDecisionProvider( Provider<NotificationInterruptStateProviderImpl> oldImplProvider, Provider<VisualInterruptionDecisionProviderImpl> newImplProvider)273     static VisualInterruptionDecisionProvider provideVisualInterruptionDecisionProvider(
274             Provider<NotificationInterruptStateProviderImpl> oldImplProvider,
275             Provider<VisualInterruptionDecisionProviderImpl> newImplProvider) {
276         if (VisualInterruptionRefactor.isEnabled()) {
277             return newImplProvider.get();
278         } else {
279             return new NotificationInterruptStateProviderWrapper(oldImplProvider.get());
280         }
281     }
282 
283     /** */
284     @Binds
285     @IntoMap
286     @ClassKey(VisualInterruptionDecisionProvider.class)
startVisualInterruptionDecisionProvider( VisualInterruptionDecisionProvider provider)287     CoreStartable startVisualInterruptionDecisionProvider(
288             VisualInterruptionDecisionProvider provider);
289 
290     @Provides
291     @SysUISingleton
provideZenModeRepository( Context context, NotificationManager notificationManager, @Application CoroutineScope coroutineScope, @Background CoroutineContext coroutineContext, @Background Handler handler )292     static ZenModeRepository provideZenModeRepository(
293             Context context,
294             NotificationManager notificationManager,
295             @Application CoroutineScope coroutineScope,
296             @Background CoroutineContext coroutineContext,
297             @Background Handler handler
298     ) {
299         return new ZenModeRepositoryImpl(context, notificationManager,
300                 ZenModesBackend.getInstance(context), context.getContentResolver(),
301                 coroutineScope, coroutineContext, handler);
302     }
303 
304     @Provides
305     @SysUISingleton
provideNotificationsSoundPolicyInteractor( ZenModeRepository repository)306     static NotificationsSoundPolicyInteractor provideNotificationsSoundPolicyInteractor(
307             ZenModeRepository repository) {
308         return new NotificationsSoundPolicyInteractor(repository);
309     }
310 
311     /** Binds {@link ZenModesCleanupStartable} as a {@link CoreStartable}. */
312     @Binds
313     @IntoMap
314     @ClassKey(ZenModesCleanupStartable.class)
bindsZenModesCleanup(ZenModesCleanupStartable zenModesCleanup)315     CoreStartable bindsZenModesCleanup(ZenModesCleanupStartable zenModesCleanup);
316 
317     /** Provides the default implementation of {@link PromotedNotificationContentExtractor} if at
318      * least one of the relevant feature flags is enabled, or an implementation that always returns
319      * null if none are enabled. */
320     @Provides
321     @SysUISingleton
providesPromotedNotificationContentExtractor( Provider<PromotedNotificationContentExtractorImpl> implProvider)322     static PromotedNotificationContentExtractor providesPromotedNotificationContentExtractor(
323             Provider<PromotedNotificationContentExtractorImpl> implProvider) {
324         if (PromotedNotificationContentModel.featureFlagEnabled()) {
325             return implProvider.get();
326         } else {
327             return (entry, recoveredBuilder, redactionType, imageModelProvider) -> null;
328         }
329     }
330 
331     /**
332      * Provide an implementation of {@link MagneticNotificationRowManager} based on its flag.
333      */
334     @Provides
335     @SysUISingleton
provideMagneticNotificationRowManager( Provider<MagneticNotificationRowManagerImpl> implProvider )336     static MagneticNotificationRowManager provideMagneticNotificationRowManager(
337             Provider<MagneticNotificationRowManagerImpl> implProvider
338     ) {
339         if (Flags.magneticNotificationSwipes()) {
340             return implProvider.get();
341         } else {
342             return MagneticNotificationRowManager.getEmpty();
343         }
344     }
345 
346     /** Provides an instance of {@link EntryAdapterFactory} */
347     @Binds
provideEntryAdapterFactory(EntryAdapterFactoryImpl impl)348     EntryAdapterFactory provideEntryAdapterFactory(EntryAdapterFactoryImpl impl);
349 
350 }
351