• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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