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.content.Context; 20 import android.os.Handler; 21 import android.os.RemoteException; 22 import android.service.dreams.IDreamManager; 23 import android.util.Log; 24 25 import com.android.internal.jank.InteractionJankMonitor; 26 import com.android.internal.statusbar.IStatusBarService; 27 import com.android.systemui.CoreStartable; 28 import com.android.systemui.animation.ActivityTransitionAnimator; 29 import com.android.systemui.animation.DialogTransitionAnimator; 30 import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor; 31 import com.android.systemui.dagger.SysUISingleton; 32 import com.android.systemui.dagger.qualifiers.Background; 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.media.NotificationMediaManager; 37 import com.android.systemui.media.controls.domain.pipeline.MediaDataManager; 38 import com.android.systemui.power.domain.interactor.PowerInteractor; 39 import com.android.systemui.scene.shared.flag.SceneContainerFlag; 40 import com.android.systemui.settings.DisplayTracker; 41 import com.android.systemui.shade.NotificationPanelViewController; 42 import com.android.systemui.shade.ShadeDisplayAware; 43 import com.android.systemui.shade.ShadeSurface; 44 import com.android.systemui.shade.ShadeSurfaceImpl; 45 import com.android.systemui.shade.carrier.ShadeCarrierGroupController; 46 import com.android.systemui.statusbar.CommandQueue; 47 import com.android.systemui.statusbar.NotificationClickNotifier; 48 import com.android.systemui.statusbar.NotificationRemoteInputManager; 49 import com.android.systemui.statusbar.SmartReplyController; 50 import com.android.systemui.statusbar.StatusBarStateControllerImpl; 51 import com.android.systemui.statusbar.SysuiStatusBarStateController; 52 import com.android.systemui.statusbar.commandline.CommandRegistry; 53 import com.android.systemui.statusbar.notification.collection.NotifCollection; 54 import com.android.systemui.statusbar.notification.collection.NotifPipeline; 55 import com.android.systemui.statusbar.notification.collection.render.NotificationVisibilityProvider; 56 import com.android.systemui.statusbar.phone.CentralSurfacesImpl; 57 import com.android.systemui.statusbar.phone.ManagedProfileController; 58 import com.android.systemui.statusbar.phone.ManagedProfileControllerImpl; 59 import com.android.systemui.statusbar.phone.StatusBarRemoteInputCallback; 60 import com.android.systemui.statusbar.phone.ui.StatusBarIconController; 61 import com.android.systemui.statusbar.phone.ui.StatusBarIconControllerImpl; 62 import com.android.systemui.statusbar.phone.ui.StatusBarIconList; 63 import com.android.systemui.statusbar.policy.KeyguardStateController; 64 import com.android.wm.shell.shared.ShellTransitions; 65 66 import dagger.Binds; 67 import dagger.Lazy; 68 import dagger.Module; 69 import dagger.Provides; 70 import dagger.multibindings.ClassKey; 71 import dagger.multibindings.IntoMap; 72 73 import java.util.concurrent.Executor; 74 75 import javax.inject.Provider; 76 77 /** 78 * This module provides instances needed to construct {@link CentralSurfacesImpl}. These are moved to 79 * this separate from {@link CentralSurfacesModule} module so that components that wish to build 80 * their own version of CentralSurfaces can include just dependencies, without injecting 81 * CentralSurfaces itself. 82 */ 83 @Module 84 public interface CentralSurfacesDependenciesModule { 85 86 /** */ 87 @Binds 88 @IntoMap 89 @ClassKey(NotificationRemoteInputManager.class) bindsStartNotificationRemoteInputManager(NotificationRemoteInputManager nrim)90 CoreStartable bindsStartNotificationRemoteInputManager(NotificationRemoteInputManager nrim); 91 92 /** */ 93 @SysUISingleton 94 @Provides provideNotificationMediaManager( @hadeDisplayAware Context context, NotificationVisibilityProvider visibilityProvider, NotifPipeline notifPipeline, NotifCollection notifCollection, MediaDataManager mediaDataManager, DumpManager dumpManager, @Background Executor backgroundExecutor, @Main Handler handler)95 static NotificationMediaManager provideNotificationMediaManager( 96 @ShadeDisplayAware Context context, 97 NotificationVisibilityProvider visibilityProvider, 98 NotifPipeline notifPipeline, 99 NotifCollection notifCollection, 100 MediaDataManager mediaDataManager, 101 DumpManager dumpManager, 102 @Background Executor backgroundExecutor, 103 @Main Handler handler) { 104 return new NotificationMediaManager( 105 context, 106 visibilityProvider, 107 notifPipeline, 108 notifCollection, 109 mediaDataManager, 110 dumpManager, 111 backgroundExecutor, 112 handler); 113 } 114 115 /** */ 116 @SysUISingleton 117 @Provides provideSmartReplyController( DumpManager dumpManager, NotificationVisibilityProvider visibilityProvider, IStatusBarService statusBarService, NotificationClickNotifier clickNotifier)118 static SmartReplyController provideSmartReplyController( 119 DumpManager dumpManager, 120 NotificationVisibilityProvider visibilityProvider, 121 IStatusBarService statusBarService, 122 NotificationClickNotifier clickNotifier) { 123 return new SmartReplyController( 124 dumpManager, 125 visibilityProvider, 126 statusBarService, 127 clickNotifier); 128 } 129 130 131 /** */ 132 @Binds provideNotificationRemoteInputManagerCallback( StatusBarRemoteInputCallback callbackImpl)133 NotificationRemoteInputManager.Callback provideNotificationRemoteInputManagerCallback( 134 StatusBarRemoteInputCallback callbackImpl); 135 136 /** 137 * Provides our instance of CommandQueue which is considered optional. 138 */ 139 @Provides 140 @SysUISingleton provideCommandQueue( Context context, DisplayTracker displayTracker, CommandRegistry registry, DumpHandler dumpHandler, Lazy<PowerInteractor> powerInteractor )141 static CommandQueue provideCommandQueue( 142 Context context, 143 DisplayTracker displayTracker, 144 CommandRegistry registry, 145 DumpHandler dumpHandler, 146 Lazy<PowerInteractor> powerInteractor 147 ) { 148 return new CommandQueue(context, displayTracker, registry, dumpHandler, powerInteractor); 149 } 150 151 /** */ 152 @Binds provideManagedProfileController( ManagedProfileControllerImpl controllerImpl)153 ManagedProfileController provideManagedProfileController( 154 ManagedProfileControllerImpl controllerImpl); 155 156 /** */ 157 @Binds providesSysuiStatusBarStateController( StatusBarStateControllerImpl statusBarStateControllerImpl)158 SysuiStatusBarStateController providesSysuiStatusBarStateController( 159 StatusBarStateControllerImpl statusBarStateControllerImpl); 160 161 /** */ 162 @Binds 163 @IntoMap 164 @ClassKey(SysuiStatusBarStateController.class) bindsStartStatusBarStateController(StatusBarStateControllerImpl sbsc)165 CoreStartable bindsStartStatusBarStateController(StatusBarStateControllerImpl sbsc); 166 167 /** */ 168 @Binds provideStatusBarIconController( StatusBarIconControllerImpl controllerImpl)169 StatusBarIconController provideStatusBarIconController( 170 StatusBarIconControllerImpl controllerImpl); 171 172 /** 173 */ 174 @Provides 175 @SysUISingleton provideStatusBarIconList(Context context)176 static StatusBarIconList provideStatusBarIconList(Context context) { 177 return new StatusBarIconList( 178 context.getResources().getStringArray( 179 com.android.internal.R.array.config_statusBarIcons)); 180 } 181 182 /** 183 * {@link NotificationPanelViewController} implements two interfaces: 184 * - {@link com.android.systemui.shade.ShadeViewController}, which can be used by any class 185 * needing access to the shade. 186 * - {@link ShadeSurface}, which should *only* be used by {@link CentralSurfacesImpl}. 187 * 188 * Since {@link ShadeSurface} should only be accessible by {@link CentralSurfacesImpl}, it's 189 * *only* bound in this CentralSurfaces dependencies module. 190 * The {@link com.android.systemui.shade.ShadeViewController} interface is bound in 191 * {@link com.android.systemui.shade.ShadeModule} so others can access it. 192 */ 193 @Provides 194 @SysUISingleton provideShadeSurface( Provider<ShadeSurfaceImpl> sceneContainerOn, Provider<NotificationPanelViewController> sceneContainerOff)195 static ShadeSurface provideShadeSurface( 196 Provider<ShadeSurfaceImpl> sceneContainerOn, 197 Provider<NotificationPanelViewController> sceneContainerOff) { 198 if (SceneContainerFlag.isEnabled()) { 199 return sceneContainerOn.get(); 200 } else { 201 return sceneContainerOff.get(); 202 } 203 204 } 205 206 207 /** */ 208 @Binds provideSlotIndexResolver( ShadeCarrierGroupController.SubscriptionManagerSlotIndexResolver impl)209 ShadeCarrierGroupController.SlotIndexResolver provideSlotIndexResolver( 210 ShadeCarrierGroupController.SubscriptionManagerSlotIndexResolver impl); 211 212 /** */ 213 @Provides 214 @SysUISingleton provideActivityTransitionAnimator( @ain Executor mainExecutor, ShellTransitions shellTransitions)215 static ActivityTransitionAnimator provideActivityTransitionAnimator( 216 @Main Executor mainExecutor, ShellTransitions shellTransitions) { 217 return new ActivityTransitionAnimator(mainExecutor, shellTransitions); 218 } 219 220 /** */ 221 @Provides 222 @SysUISingleton provideDialogTransitionAnimator(@ain Executor mainExecutor, IDreamManager dreamManager, KeyguardStateController keyguardStateController, Lazy<AlternateBouncerInteractor> alternateBouncerInteractor, InteractionJankMonitor interactionJankMonitor)223 static DialogTransitionAnimator provideDialogTransitionAnimator(@Main Executor mainExecutor, 224 IDreamManager dreamManager, 225 KeyguardStateController keyguardStateController, 226 Lazy<AlternateBouncerInteractor> alternateBouncerInteractor, 227 InteractionJankMonitor interactionJankMonitor) { 228 DialogTransitionAnimator.Callback callback = new DialogTransitionAnimator.Callback() { 229 @Override 230 public boolean isDreaming() { 231 try { 232 return dreamManager.isDreaming(); 233 } catch (RemoteException e) { 234 Log.e("DialogTransitionAnimator.Callback", "dreamManager.isDreaming failed", e); 235 return false; 236 } 237 } 238 239 @Override 240 public boolean isUnlocked() { 241 return keyguardStateController.isUnlocked(); 242 } 243 244 @Override 245 public boolean isShowingAlternateAuthOnUnlock() { 246 return alternateBouncerInteractor.get().canShowAlternateBouncerForFingerprint(); 247 } 248 }; 249 return new DialogTransitionAnimator(mainExecutor, callback, interactionJankMonitor); 250 } 251 } 252