• 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.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