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