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