1 /*
2  * Copyright (C) 2019 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.dagger;
18 
19 import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME;
20 
21 import android.annotation.Nullable;
22 import android.annotation.SuppressLint;
23 import android.app.INotificationManager;
24 import android.content.Context;
25 import android.content.SharedPreferences;
26 import android.content.om.OverlayManager;
27 import android.hardware.display.AmbientDisplayConfiguration;
28 import android.hardware.display.ColorDisplayManager;
29 import android.os.Handler;
30 import android.os.HandlerThread;
31 import android.os.Looper;
32 import android.os.ServiceManager;
33 import android.os.UserHandle;
34 import android.view.Choreographer;
35 import android.view.IWindowManager;
36 import android.view.LayoutInflater;
37 
38 import com.android.internal.logging.MetricsLogger;
39 import com.android.internal.util.NotificationMessagingUtil;
40 import com.android.internal.widget.LockPatternUtils;
41 import com.android.keyguard.KeyguardUpdateMonitor;
42 import com.android.keyguard.ViewMediatorCallback;
43 import com.android.settingslib.bluetooth.LocalBluetoothManager;
44 import com.android.systemui.Prefs;
45 import com.android.systemui.R;
46 import com.android.systemui.accessibility.AccessibilityButtonModeObserver;
47 import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver;
48 import com.android.systemui.accessibility.ModeSwitchesController;
49 import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController;
50 import com.android.systemui.broadcast.BroadcastDispatcher;
51 import com.android.systemui.broadcast.logging.BroadcastDispatcherLogger;
52 import com.android.systemui.dagger.qualifiers.Background;
53 import com.android.systemui.dagger.qualifiers.Main;
54 import com.android.systemui.doze.AlwaysOnDisplayPolicy;
55 import com.android.systemui.dump.DumpManager;
56 import com.android.systemui.keyguard.KeyguardViewMediator;
57 import com.android.systemui.qs.ReduceBrightColorsController;
58 import com.android.systemui.settings.UserTracker;
59 import com.android.systemui.shared.system.ActivityManagerWrapper;
60 import com.android.systemui.shared.system.DevicePolicyManagerWrapper;
61 import com.android.systemui.shared.system.TaskStackChangeListeners;
62 import com.android.systemui.shared.system.WindowManagerWrapper;
63 import com.android.systemui.statusbar.connectivity.NetworkController;
64 import com.android.systemui.statusbar.phone.AutoHideController;
65 import com.android.systemui.statusbar.phone.ConfigurationControllerImpl;
66 import com.android.systemui.statusbar.policy.ConfigurationController;
67 import com.android.systemui.statusbar.policy.DataSaverController;
68 import com.android.systemui.theme.ThemeOverlayApplier;
69 import com.android.systemui.util.leak.LeakDetector;
70 import com.android.systemui.util.settings.SecureSettings;
71 
72 import java.util.concurrent.Executor;
73 
74 import javax.inject.Named;
75 
76 import dagger.Module;
77 import dagger.Provides;
78 
79 /**
80  * Provides dependencies for the root component of sysui injection.
81  *
82  * Only SystemUI owned classes and instances should go in here. Other, framework-owned classes
83  * should go in {@link FrameworkServicesModule}.
84  *
85  * See SystemUI/docs/dagger.md
86  */
87 @Module(includes = {NightDisplayListenerModule.class})
88 public class DependencyProvider {
89 
90     /** */
91     @Provides
92     @SysUISingleton
93     @Named(TIME_TICK_HANDLER_NAME)
provideTimeTickHandler()94     public Handler provideTimeTickHandler() {
95         HandlerThread thread = new HandlerThread("TimeTick");
96         thread.start();
97         return new Handler(thread.getLooper());
98     }
99 
100     /** */
101     @Provides
102     @Main
provideSharePreferences(Context context)103     public SharedPreferences provideSharePreferences(Context context) {
104         return Prefs.get(context);
105     }
106 
107     /** */
108     @Provides
provideAmbientDisplayConfiguration(Context context)109     public AmbientDisplayConfiguration provideAmbientDisplayConfiguration(Context context) {
110         return new AmbientDisplayConfiguration(context);
111     }
112 
113     /** */
114     @Provides
provideHandler()115     public Handler provideHandler() {
116         return new Handler();
117     }
118 
119     /** */
120     @Provides
121     @SysUISingleton
provideDataSaverController(NetworkController networkController)122     public DataSaverController provideDataSaverController(NetworkController networkController) {
123         return networkController.getDataSaverController();
124     }
125 
126     @Provides
127     @SysUISingleton
provideINotificationManager()128     public INotificationManager provideINotificationManager() {
129         return INotificationManager.Stub.asInterface(
130                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
131     }
132 
133     /** */
134     @Provides
135     @SysUISingleton
providerLayoutInflater(Context context)136     public LayoutInflater providerLayoutInflater(Context context) {
137         return LayoutInflater.from(context);
138     }
139 
140     /** */
141     @Provides
142     @SysUISingleton
provideLeakDetector(DumpManager dumpManager)143     public LeakDetector provideLeakDetector(DumpManager dumpManager) {
144         return LeakDetector.create(dumpManager);
145     }
146 
147     @SuppressLint("MissingPermission")
148     @SysUISingleton
149     @Provides
150     @Nullable
provideLocalBluetoothController(Context context, @Background Handler bgHandler)151     static LocalBluetoothManager provideLocalBluetoothController(Context context,
152             @Background Handler bgHandler) {
153         return LocalBluetoothManager.create(context, bgHandler, UserHandle.ALL);
154     }
155 
156     /** */
157     @Provides
158     @SysUISingleton
provideMetricsLogger()159     public MetricsLogger provideMetricsLogger() {
160         return new MetricsLogger();
161     }
162 
163     /** */
164     @SysUISingleton
165     @Provides
provideThemeOverlayManager(Context context, @Background Executor bgExecutor, @Main Executor mainExecutor, OverlayManager overlayManager, DumpManager dumpManager)166     static ThemeOverlayApplier provideThemeOverlayManager(Context context,
167             @Background Executor bgExecutor,
168             @Main Executor mainExecutor,
169             OverlayManager overlayManager,
170             DumpManager dumpManager) {
171         return new ThemeOverlayApplier(overlayManager, bgExecutor, mainExecutor,
172                 context.getString(R.string.launcher_overlayable_package),
173                 context.getString(R.string.themepicker_overlayable_package), dumpManager);
174     }
175 
176     /** */
177     @Provides
178     @SysUISingleton
provideAccessibilityFloatingMenuController( Context context, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver, AccessibilityButtonModeObserver accessibilityButtonModeObserver, KeyguardUpdateMonitor keyguardUpdateMonitor)179     public AccessibilityFloatingMenuController provideAccessibilityFloatingMenuController(
180             Context context, AccessibilityButtonTargetsObserver accessibilityButtonTargetsObserver,
181             AccessibilityButtonModeObserver accessibilityButtonModeObserver,
182             KeyguardUpdateMonitor keyguardUpdateMonitor) {
183         return new AccessibilityFloatingMenuController(context, accessibilityButtonTargetsObserver,
184                 accessibilityButtonModeObserver, keyguardUpdateMonitor);
185     }
186 
187     /** */
188     @Provides
189     @SysUISingleton
provideConfigurationController(Context context)190     public ConfigurationController provideConfigurationController(Context context) {
191         return new ConfigurationControllerImpl(context);
192     }
193 
194     /** */
195     @SysUISingleton
196     @Provides
provideAutoHideController(Context context, @Main Handler mainHandler, IWindowManager iWindowManager)197     public AutoHideController provideAutoHideController(Context context,
198             @Main Handler mainHandler, IWindowManager iWindowManager) {
199         return new AutoHideController(context, mainHandler, iWindowManager);
200     }
201 
202     /** */
203     @SysUISingleton
204     @Provides
provideReduceBrightColorsListener( @ackground Handler bgHandler, UserTracker userTracker, ColorDisplayManager colorDisplayManager, SecureSettings secureSettings)205     public ReduceBrightColorsController provideReduceBrightColorsListener(
206             @Background Handler bgHandler, UserTracker userTracker,
207             ColorDisplayManager colorDisplayManager, SecureSettings secureSettings) {
208         return new ReduceBrightColorsController(userTracker, bgHandler,
209                 colorDisplayManager, secureSettings);
210     }
211 
212     @Provides
213     @SysUISingleton
provideActivityManagerWrapper()214     public ActivityManagerWrapper provideActivityManagerWrapper() {
215         return ActivityManagerWrapper.getInstance();
216     }
217 
218     /** */
219     @Provides
220     @SysUISingleton
provideTaskStackChangeListeners()221     public TaskStackChangeListeners provideTaskStackChangeListeners() {
222         return TaskStackChangeListeners.getInstance();
223     }
224 
225     /** Provides and initializes the {#link BroadcastDispatcher} for SystemUI */
226     @Provides
227     @SysUISingleton
providesBroadcastDispatcher( Context context, @Background Looper backgroundLooper, @Background Executor backgroundExecutor, DumpManager dumpManager, BroadcastDispatcherLogger logger, UserTracker userTracker )228     public BroadcastDispatcher providesBroadcastDispatcher(
229             Context context,
230             @Background Looper backgroundLooper,
231             @Background Executor backgroundExecutor,
232             DumpManager dumpManager,
233             BroadcastDispatcherLogger logger,
234             UserTracker userTracker
235     ) {
236         BroadcastDispatcher bD = new BroadcastDispatcher(context, backgroundLooper,
237                 backgroundExecutor, dumpManager, logger, userTracker);
238         bD.initialize();
239         return bD;
240     }
241 
242     /** */
243     @Provides
244     @SysUISingleton
provideDevicePolicyManagerWrapper()245     public DevicePolicyManagerWrapper provideDevicePolicyManagerWrapper() {
246         return DevicePolicyManagerWrapper.getInstance();
247     }
248 
249     /** */
250     @Provides
251     @SysUISingleton
provideLockPatternUtils(Context context)252     public LockPatternUtils provideLockPatternUtils(Context context) {
253         return new LockPatternUtils(context);
254     }
255 
256     /** */
257     @Provides
258     @SysUISingleton
provideAlwaysOnDisplayPolicy(Context context)259     public AlwaysOnDisplayPolicy provideAlwaysOnDisplayPolicy(Context context) {
260         return new AlwaysOnDisplayPolicy(context);
261     }
262 
263     /***/
264     @Provides
provideNotificationMessagingUtil(Context context)265     public NotificationMessagingUtil provideNotificationMessagingUtil(Context context) {
266         return new NotificationMessagingUtil(context);
267     }
268 
269     /** */
270     @Provides
providesViewMediatorCallback(KeyguardViewMediator viewMediator)271     public ViewMediatorCallback providesViewMediatorCallback(KeyguardViewMediator viewMediator) {
272         return viewMediator.getViewMediatorCallback();
273     }
274 
275     /** */
276     @Provides
providesWindowManagerWrapper()277     public WindowManagerWrapper providesWindowManagerWrapper() {
278         return WindowManagerWrapper.getInstance();
279     }
280 
281     /** */
282     @Provides
283     @SysUISingleton
providesChoreographer()284     public Choreographer providesChoreographer() {
285         return Choreographer.getInstance();
286     }
287 
288     /** */
289     @Provides
290     @SysUISingleton
providesModeSwitchesController(Context context)291     public ModeSwitchesController providesModeSwitchesController(Context context) {
292         return new ModeSwitchesController(context);
293     }
294 }
295