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