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.dagger; 18 19 import android.app.IActivityManager; 20 import android.app.WallpaperManager; 21 import android.content.Context; 22 import android.hardware.display.DisplayManager; 23 import android.os.RemoteException; 24 import android.service.dreams.IDreamManager; 25 import android.util.Log; 26 27 import com.android.internal.jank.InteractionJankMonitor; 28 import com.android.internal.statusbar.IStatusBarService; 29 import com.android.systemui.animation.ActivityLaunchAnimator; 30 import com.android.systemui.animation.AnimationFeatureFlags; 31 import com.android.systemui.animation.DialogLaunchAnimator; 32 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; 33 import com.android.systemui.colorextraction.SysuiColorExtractor; 34 import com.android.systemui.dagger.SysUISingleton; 35 import com.android.systemui.dagger.qualifiers.Main; 36 import com.android.systemui.dump.DumpHandler; 37 import com.android.systemui.dump.DumpManager; 38 import com.android.systemui.flags.FeatureFlags; 39 import com.android.systemui.flags.Flags; 40 import com.android.systemui.media.controls.pipeline.MediaDataManager; 41 import com.android.systemui.plugins.ActivityStarter; 42 import com.android.systemui.plugins.statusbar.StatusBarStateController; 43 import com.android.systemui.power.domain.interactor.PowerInteractor; 44 import com.android.systemui.settings.DisplayTracker; 45 import com.android.systemui.shade.NotificationPanelViewController; 46 import com.android.systemui.shade.ShadeSurface; 47 import com.android.systemui.shade.carrier.ShadeCarrierGroupController; 48 import com.android.systemui.statusbar.ActionClickLogger; 49 import com.android.systemui.statusbar.CommandQueue; 50 import com.android.systemui.statusbar.MediaArtworkProcessor; 51 import com.android.systemui.statusbar.NotificationClickNotifier; 52 import com.android.systemui.statusbar.NotificationLockscreenUserManager; 53 import com.android.systemui.statusbar.NotificationMediaManager; 54 import com.android.systemui.statusbar.NotificationRemoteInputManager; 55 import com.android.systemui.statusbar.NotificationShadeWindowController; 56 import com.android.systemui.statusbar.SmartReplyController; 57 import com.android.systemui.statusbar.StatusBarStateControllerImpl; 58 import com.android.systemui.statusbar.SysuiStatusBarStateController; 59 import com.android.systemui.statusbar.commandline.CommandRegistry; 60 import com.android.systemui.statusbar.gesture.SwipeStatusBarAwayGestureHandler; 61 import com.android.systemui.statusbar.notification.NotifPipelineFlags; 62 import com.android.systemui.statusbar.notification.RemoteInputControllerLogger; 63 import com.android.systemui.statusbar.notification.collection.NotifCollection; 64 import com.android.systemui.statusbar.notification.collection.NotifPipeline; 65 import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection; 66 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; 67 import com.android.systemui.statusbar.phone.CentralSurfaces; 68 import com.android.systemui.statusbar.phone.CentralSurfacesImpl; 69 import com.android.systemui.statusbar.phone.KeyguardBypassController; 70 import com.android.systemui.statusbar.phone.ManagedProfileController; 71 import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl; 72 import com.android.systemui.statusbar.phone.StatusBarIconController; 73 import com.android.systemui.statusbar.phone.StatusBarIconControllerImpl; 74 import com.android.systemui.statusbar.phone.StatusBarIconList; 75 import com.android.systemui.statusbar.phone.StatusBarNotificationPresenterModule; 76 import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback; 77 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallController; 78 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallFlags; 79 import com.android.systemui.statusbar.phone.ongoingcall.OngoingCallLogger; 80 import com.android.systemui.statusbar.policy.KeyguardStateController; 81 import com.android.systemui.statusbar.policy.RemoteInputUriController; 82 import com.android.systemui.statusbar.window.StatusBarWindowController; 83 import com.android.systemui.util.concurrency.DelayableExecutor; 84 import com.android.systemui.util.time.SystemClock; 85 86 import dagger.Binds; 87 import dagger.Lazy; 88 import dagger.Module; 89 import dagger.Provides; 90 91 import java.util.Optional; 92 import java.util.concurrent.Executor; 93 94 /** 95 * This module provides instances needed to construct {@link CentralSurfacesImpl}. These are moved to 96 * this separate from {@link CentralSurfacesModule} module so that components that wish to build 97 * their own version of CentralSurfaces can include just dependencies, without injecting 98 * CentralSurfaces itself. 99 */ 100 @Module(includes = {StatusBarNotificationPresenterModule.class}) 101 public interface CentralSurfacesDependenciesModule { 102 /** */ 103 @SysUISingleton 104 @Provides provideNotificationRemoteInputManager( Context context, NotifPipelineFlags notifPipelineFlags, NotificationLockscreenUserManager lockscreenUserManager, SmartReplyController smartReplyController, NotificationVisibilityProvider visibilityProvider, PowerInteractor powerInteractor, StatusBarStateController statusBarStateController, RemoteInputUriController remoteInputUriController, RemoteInputControllerLogger remoteInputControllerLogger, NotificationClickNotifier clickNotifier, ActionClickLogger actionClickLogger, DumpManager dumpManager)105 static NotificationRemoteInputManager provideNotificationRemoteInputManager( 106 Context context, 107 NotifPipelineFlags notifPipelineFlags, 108 NotificationLockscreenUserManager lockscreenUserManager, 109 SmartReplyController smartReplyController, 110 NotificationVisibilityProvider visibilityProvider, 111 PowerInteractor powerInteractor, 112 StatusBarStateController statusBarStateController, 113 RemoteInputUriController remoteInputUriController, 114 RemoteInputControllerLogger remoteInputControllerLogger, 115 NotificationClickNotifier clickNotifier, 116 ActionClickLogger actionClickLogger, 117 DumpManager dumpManager) { 118 return new NotificationRemoteInputManager( 119 context, 120 notifPipelineFlags, 121 lockscreenUserManager, 122 smartReplyController, 123 visibilityProvider, 124 powerInteractor, 125 statusBarStateController, 126 remoteInputUriController, 127 remoteInputControllerLogger, 128 clickNotifier, 129 actionClickLogger, 130 dumpManager); 131 } 132 133 /** */ 134 @SysUISingleton 135 @Provides provideNotificationMediaManager( Context context, Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, Lazy<NotificationShadeWindowController> notificationShadeWindowController, NotificationVisibilityProvider visibilityProvider, MediaArtworkProcessor mediaArtworkProcessor, KeyguardBypassController keyguardBypassController, NotifPipeline notifPipeline, NotifCollection notifCollection, @Main DelayableExecutor mainExecutor, MediaDataManager mediaDataManager, StatusBarStateController statusBarStateController, SysuiColorExtractor colorExtractor, KeyguardStateController keyguardStateController, DumpManager dumpManager, WallpaperManager wallpaperManager, DisplayManager displayManager)136 static NotificationMediaManager provideNotificationMediaManager( 137 Context context, 138 Lazy<Optional<CentralSurfaces>> centralSurfacesOptionalLazy, 139 Lazy<NotificationShadeWindowController> notificationShadeWindowController, 140 NotificationVisibilityProvider visibilityProvider, 141 MediaArtworkProcessor mediaArtworkProcessor, 142 KeyguardBypassController keyguardBypassController, 143 NotifPipeline notifPipeline, 144 NotifCollection notifCollection, 145 @Main DelayableExecutor mainExecutor, 146 MediaDataManager mediaDataManager, 147 StatusBarStateController statusBarStateController, 148 SysuiColorExtractor colorExtractor, 149 KeyguardStateController keyguardStateController, 150 DumpManager dumpManager, 151 WallpaperManager wallpaperManager, 152 DisplayManager displayManager) { 153 return new NotificationMediaManager( 154 context, 155 centralSurfacesOptionalLazy, 156 notificationShadeWindowController, 157 visibilityProvider, 158 mediaArtworkProcessor, 159 keyguardBypassController, 160 notifPipeline, 161 notifCollection, 162 mainExecutor, 163 mediaDataManager, 164 statusBarStateController, 165 colorExtractor, 166 keyguardStateController, 167 dumpManager, 168 wallpaperManager, 169 displayManager); 170 } 171 172 /** */ 173 @SysUISingleton 174 @Provides provideSmartReplyController( DumpManager dumpManager, NotificationVisibilityProvider visibilityProvider, IStatusBarService statusBarService, NotificationClickNotifier clickNotifier)175 static SmartReplyController provideSmartReplyController( 176 DumpManager dumpManager, 177 NotificationVisibilityProvider visibilityProvider, 178 IStatusBarService statusBarService, 179 NotificationClickNotifier clickNotifier) { 180 return new SmartReplyController( 181 dumpManager, 182 visibilityProvider, 183 statusBarService, 184 clickNotifier); 185 } 186 187 188 /** */ 189 @Binds provideNotificationRemoteInputManagerCallback( StatusBarRemoteInputCallback callbackImpl)190 NotificationRemoteInputManager.Callback provideNotificationRemoteInputManagerCallback( 191 StatusBarRemoteInputCallback callbackImpl); 192 193 /** 194 * Provides our instance of CommandQueue which is considered optional. 195 */ 196 @Provides 197 @SysUISingleton provideCommandQueue( Context context, DisplayTracker displayTracker, CommandRegistry registry, DumpHandler dumpHandler )198 static CommandQueue provideCommandQueue( 199 Context context, 200 DisplayTracker displayTracker, 201 CommandRegistry registry, 202 DumpHandler dumpHandler 203 ) { 204 return new CommandQueue(context, displayTracker, registry, dumpHandler); 205 } 206 207 /** 208 */ 209 @Binds provideManagedProfileController( ManagedProfileControllerImpl controllerImpl)210 ManagedProfileController provideManagedProfileController( 211 ManagedProfileControllerImpl controllerImpl); 212 213 /** 214 */ 215 @Binds providesSysuiStatusBarStateController( StatusBarStateControllerImpl statusBarStateControllerImpl)216 SysuiStatusBarStateController providesSysuiStatusBarStateController( 217 StatusBarStateControllerImpl statusBarStateControllerImpl); 218 219 /** 220 */ 221 @Binds provideStatusBarIconController( StatusBarIconControllerImpl controllerImpl)222 StatusBarIconController provideStatusBarIconController( 223 StatusBarIconControllerImpl controllerImpl); 224 225 /** 226 */ 227 @Provides 228 @SysUISingleton provideStatusBarIconList(Context context)229 static StatusBarIconList provideStatusBarIconList(Context context) { 230 return new StatusBarIconList( 231 context.getResources().getStringArray( 232 com.android.internal.R.array.config_statusBarIcons)); 233 } 234 235 /** 236 */ 237 @Provides 238 @SysUISingleton provideOngoingCallController( Context context, CommonNotifCollection notifCollection, SystemClock systemClock, ActivityStarter activityStarter, @Main Executor mainExecutor, IActivityManager iActivityManager, OngoingCallLogger logger, DumpManager dumpManager, StatusBarWindowController statusBarWindowController, SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler, StatusBarStateController statusBarStateController, OngoingCallFlags ongoingCallFlags)239 static OngoingCallController provideOngoingCallController( 240 Context context, 241 CommonNotifCollection notifCollection, 242 SystemClock systemClock, 243 ActivityStarter activityStarter, 244 @Main Executor mainExecutor, 245 IActivityManager iActivityManager, 246 OngoingCallLogger logger, 247 DumpManager dumpManager, 248 StatusBarWindowController statusBarWindowController, 249 SwipeStatusBarAwayGestureHandler swipeStatusBarAwayGestureHandler, 250 StatusBarStateController statusBarStateController, 251 OngoingCallFlags ongoingCallFlags) { 252 253 boolean ongoingCallInImmersiveEnabled = ongoingCallFlags.isInImmersiveEnabled(); 254 Optional<StatusBarWindowController> windowController = 255 ongoingCallInImmersiveEnabled 256 ? Optional.of(statusBarWindowController) 257 : Optional.empty(); 258 Optional<SwipeStatusBarAwayGestureHandler> gestureHandler = 259 ongoingCallInImmersiveEnabled 260 ? Optional.of(swipeStatusBarAwayGestureHandler) 261 : Optional.empty(); 262 OngoingCallController ongoingCallController = 263 new OngoingCallController( 264 context, 265 notifCollection, 266 ongoingCallFlags, 267 systemClock, 268 activityStarter, 269 mainExecutor, 270 iActivityManager, 271 logger, 272 dumpManager, 273 windowController, 274 gestureHandler, 275 statusBarStateController); 276 ongoingCallController.init(); 277 return ongoingCallController; 278 } 279 280 /** 281 * {@link NotificationPanelViewController} implements two interfaces: 282 * - {@link com.android.systemui.shade.ShadeViewController}, which can be used by any class 283 * needing access to the shade. 284 * - {@link ShadeSurface}, which should *only* be used by {@link CentralSurfacesImpl}. 285 * 286 * Since {@link ShadeSurface} should only be accessible by {@link CentralSurfacesImpl}, it's 287 * *only* bound in this CentralSurfaces dependencies module. 288 * The {@link com.android.systemui.shade.ShadeViewController} interface is bound in 289 * {@link com.android.systemui.shade.ShadeModule} so others can access it. 290 */ 291 @Binds 292 @SysUISingleton provideShadeSurface(NotificationPanelViewController impl)293 ShadeSurface provideShadeSurface(NotificationPanelViewController impl); 294 295 /** */ 296 @Binds provideSlotIndexResolver( ShadeCarrierGroupController.SubscriptionManagerSlotIndexResolver impl)297 ShadeCarrierGroupController.SlotIndexResolver provideSlotIndexResolver( 298 ShadeCarrierGroupController.SubscriptionManagerSlotIndexResolver impl); 299 300 /** 301 */ 302 @Provides 303 @SysUISingleton provideActivityLaunchAnimator()304 static ActivityLaunchAnimator provideActivityLaunchAnimator() { 305 return new ActivityLaunchAnimator(); 306 } 307 308 /** 309 */ 310 @Provides 311 @SysUISingleton provideDialogLaunchAnimator(IDreamManager dreamManager, KeyguardStateController keyguardStateController, Lazy<AlternateBouncerInteractor> alternateBouncerInteractor, InteractionJankMonitor interactionJankMonitor, AnimationFeatureFlags animationFeatureFlags)312 static DialogLaunchAnimator provideDialogLaunchAnimator(IDreamManager dreamManager, 313 KeyguardStateController keyguardStateController, 314 Lazy<AlternateBouncerInteractor> alternateBouncerInteractor, 315 InteractionJankMonitor interactionJankMonitor, 316 AnimationFeatureFlags animationFeatureFlags) { 317 DialogLaunchAnimator.Callback callback = new DialogLaunchAnimator.Callback() { 318 @Override 319 public boolean isDreaming() { 320 try { 321 return dreamManager.isDreaming(); 322 } catch (RemoteException e) { 323 Log.e("DialogLaunchAnimator.Callback", "dreamManager.isDreaming failed", e); 324 return false; 325 } 326 } 327 328 @Override 329 public boolean isUnlocked() { 330 return keyguardStateController.isUnlocked(); 331 } 332 333 @Override 334 public boolean isShowingAlternateAuthOnUnlock() { 335 return alternateBouncerInteractor.get().canShowAlternateBouncerForFingerprint(); 336 } 337 }; 338 return new DialogLaunchAnimator(callback, interactionJankMonitor, animationFeatureFlags); 339 } 340 341 /** 342 */ 343 @Provides 344 @SysUISingleton provideAnimationFeatureFlags(FeatureFlags featureFlags)345 static AnimationFeatureFlags provideAnimationFeatureFlags(FeatureFlags featureFlags) { 346 return new AnimationFeatureFlags() { 347 @Override 348 public boolean isPredictiveBackQsDialogAnim() { 349 return featureFlags.isEnabled(Flags.WM_ENABLE_PREDICTIVE_BACK_QS_DIALOG_ANIM); 350 } 351 }; 352 } 353 } 354