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