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 android.annotation.Nullable;
20 import android.annotation.SuppressLint;
21 import android.app.ActivityManager;
22 import android.app.ActivityTaskManager;
23 import android.app.AlarmManager;
24 import android.app.AppOpsManager;
25 import android.app.IActivityManager;
26 import android.app.IActivityTaskManager;
27 import android.app.INotificationManager;
28 import android.app.IWallpaperManager;
29 import android.app.KeyguardManager;
30 import android.app.NotificationManager;
31 import android.app.StatsManager;
32 import android.app.StatusBarManager;
33 import android.app.UiModeManager;
34 import android.app.WallpaperManager;
35 import android.app.admin.DevicePolicyManager;
36 import android.app.ambientcontext.AmbientContextManager;
37 import android.app.job.JobScheduler;
38 import android.app.role.RoleManager;
39 import android.app.smartspace.SmartspaceManager;
40 import android.app.trust.TrustManager;
41 import android.bluetooth.BluetoothAdapter;
42 import android.bluetooth.BluetoothManager;
43 import android.content.ClipboardManager;
44 import android.content.ContentResolver;
45 import android.content.Context;
46 import android.content.SharedPreferences;
47 import android.content.om.OverlayManager;
48 import android.content.pm.IPackageManager;
49 import android.content.pm.LauncherApps;
50 import android.content.pm.PackageManager;
51 import android.content.pm.ShortcutManager;
52 import android.content.res.AssetManager;
53 import android.content.res.Resources;
54 import android.graphics.Color;
55 import android.hardware.SensorManager;
56 import android.hardware.SensorPrivacyManager;
57 import android.hardware.biometrics.BiometricManager;
58 import android.hardware.camera2.CameraManager;
59 import android.hardware.devicestate.DeviceStateManager;
60 import android.hardware.display.AmbientDisplayConfiguration;
61 import android.hardware.display.ColorDisplayManager;
62 import android.hardware.display.DisplayManager;
63 import android.hardware.face.FaceManager;
64 import android.hardware.fingerprint.FingerprintManager;
65 import android.hardware.input.InputManager;
66 import android.media.AudioManager;
67 import android.media.IAudioService;
68 import android.media.MediaRouter2Manager;
69 import android.media.projection.MediaProjectionManager;
70 import android.media.session.MediaSessionManager;
71 import android.net.ConnectivityManager;
72 import android.net.NetworkScoreManager;
73 import android.net.wifi.WifiManager;
74 import android.os.BatteryStats;
75 import android.os.PowerExemptionManager;
76 import android.os.PowerManager;
77 import android.os.ServiceManager;
78 import android.os.SystemUpdateManager;
79 import android.os.UserManager;
80 import android.os.Vibrator;
81 import android.os.storage.StorageManager;
82 import android.permission.PermissionManager;
83 import android.safetycenter.SafetyCenterManager;
84 import android.service.dreams.DreamService;
85 import android.service.dreams.IDreamManager;
86 import android.service.vr.IVrManager;
87 import android.telecom.TelecomManager;
88 import android.telephony.CarrierConfigManager;
89 import android.telephony.SubscriptionManager;
90 import android.telephony.TelephonyManager;
91 import android.view.Choreographer;
92 import android.view.CrossWindowBlurListeners;
93 import android.view.IWindowManager;
94 import android.view.LayoutInflater;
95 import android.view.ViewConfiguration;
96 import android.view.WindowManager;
97 import android.view.WindowManagerGlobal;
98 import android.view.accessibility.AccessibilityManager;
99 import android.view.accessibility.CaptioningManager;
100 import android.view.inputmethod.InputMethodManager;
101 import android.view.textclassifier.TextClassificationManager;
102 
103 import androidx.asynclayoutinflater.view.AsyncLayoutInflater;
104 import androidx.core.app.NotificationManagerCompat;
105 
106 import com.android.internal.app.IBatteryStats;
107 import com.android.internal.appwidget.IAppWidgetService;
108 import com.android.internal.jank.InteractionJankMonitor;
109 import com.android.internal.statusbar.IStatusBarService;
110 import com.android.internal.util.LatencyTracker;
111 import com.android.systemui.Prefs;
112 import com.android.systemui.dagger.qualifiers.Application;
113 import com.android.systemui.dagger.qualifiers.DisplayId;
114 import com.android.systemui.dagger.qualifiers.Main;
115 import com.android.systemui.dagger.qualifiers.TestHarness;
116 import com.android.systemui.shared.system.PackageManagerWrapper;
117 
118 import dagger.Module;
119 import dagger.Provides;
120 
121 import java.util.Optional;
122 
123 import javax.inject.Singleton;
124 
125 /**
126  * Provides Non-SystemUI, Framework-Owned instances to the dependency graph.
127  */
128 @SuppressLint("NonInjectedService")
129 @Module
130 public class FrameworkServicesModule {
131     @Provides
132     @Singleton
provideAccessibilityManager(Context context)133     static AccessibilityManager provideAccessibilityManager(Context context) {
134         return context.getSystemService(AccessibilityManager.class);
135     }
136 
137     @Provides
138     @Singleton
provideActivityManager(Context context)139     static ActivityManager provideActivityManager(Context context) {
140         return context.getSystemService(ActivityManager.class);
141     }
142 
143     @Provides
144     @Singleton
provideAlarmManager(Context context)145     static AlarmManager provideAlarmManager(Context context) {
146         return context.getSystemService(AlarmManager.class);
147     }
148 
149     @Provides
150     @Singleton
provideSystemUpdateManager(Context context)151     static Optional<SystemUpdateManager> provideSystemUpdateManager(Context context) {
152         return Optional.ofNullable(context.getSystemService(SystemUpdateManager.class));
153     }
154 
155     @Provides
156     @Nullable
157     @Singleton
provideAmbientContextManager(Context context)158     static AmbientContextManager provideAmbientContextManager(Context context) {
159         return context.getSystemService(AmbientContextManager.class);
160     }
161 
162     /** */
163     @Provides
provideAmbientDisplayConfiguration(Context context)164     public AmbientDisplayConfiguration provideAmbientDisplayConfiguration(Context context) {
165         return new AmbientDisplayConfiguration(context);
166     }
167 
168     @Provides
169     @Singleton
provideAppOpsManager(Context context)170     static AppOpsManager provideAppOpsManager(Context context) {
171         return context.getSystemService(AppOpsManager.class);
172     }
173 
174     @Provides
175     @Singleton
provideAudioManager(Context context)176     static AudioManager provideAudioManager(Context context) {
177         return context.getSystemService(AudioManager.class);
178     }
179 
180     @Provides
181     @Singleton
provideCaptioningManager(Context context)182     static CaptioningManager provideCaptioningManager(Context context) {
183         return context.getSystemService(CaptioningManager.class);
184     }
185 
186     /** */
187     @Provides
188     @Singleton
providesChoreographer()189     public Choreographer providesChoreographer() {
190         return Choreographer.getInstance();
191     }
192 
193     @Provides
194     @Singleton
provideColorDisplayManager(Context context)195     static ColorDisplayManager provideColorDisplayManager(Context context) {
196         return context.getSystemService(ColorDisplayManager.class);
197     }
198 
199     @Provides
200     @Singleton
provideConnectivityManagager(Context context)201     static ConnectivityManager provideConnectivityManagager(Context context) {
202         return context.getSystemService(ConnectivityManager.class);
203     }
204 
205     @Provides
206     @Singleton
provideContentResolver(Context context)207     static ContentResolver provideContentResolver(Context context) {
208         return context.getContentResolver();
209     }
210 
211     @Provides
212     @Singleton
provideDevicePolicyManager(Context context)213     static DevicePolicyManager provideDevicePolicyManager(Context context) {
214         return context.getSystemService(DevicePolicyManager.class);
215     }
216 
217     @Provides
218     @Singleton
provideCrossWindowBlurListeners()219     static CrossWindowBlurListeners provideCrossWindowBlurListeners() {
220         return CrossWindowBlurListeners.getInstance();
221     }
222 
223     @Provides
224     @DisplayId
provideDisplayId(Context context)225     static int provideDisplayId(Context context) {
226         return context.getDisplayId();
227     }
228 
229     @Provides
230     @Singleton
provideDisplayManager(Context context)231     static DisplayManager provideDisplayManager(Context context) {
232         return context.getSystemService(DisplayManager.class);
233     }
234 
235     @Provides
236     @Singleton
provideDeviceStateManager(Context context)237     static DeviceStateManager provideDeviceStateManager(Context context) {
238         return context.getSystemService(DeviceStateManager.class);
239     }
240 
241     @Provides
242     @Singleton
provideIActivityManager()243     static IActivityManager provideIActivityManager() {
244         return ActivityManager.getService();
245     }
246 
247     @Provides
248     @Singleton
provideActivityTaskManager()249     static ActivityTaskManager provideActivityTaskManager() {
250         return ActivityTaskManager.getInstance();
251     }
252 
253     @Provides
254     @Singleton
provideIActivityTaskManager()255     static IActivityTaskManager provideIActivityTaskManager() {
256         return ActivityTaskManager.getService();
257     }
258 
259     @Provides
260     @Singleton
provideIAudioService()261     static IAudioService provideIAudioService() {
262         return IAudioService.Stub.asInterface(ServiceManager.getService(Context.AUDIO_SERVICE));
263     }
264 
265 
266     @Provides
267     @Singleton
provideIBatteryStats()268     static IBatteryStats provideIBatteryStats() {
269         return IBatteryStats.Stub.asInterface(
270                 ServiceManager.getService(BatteryStats.SERVICE_NAME));
271     }
272 
273     @Provides
274     @Singleton
provideIDreamManager()275     static IDreamManager provideIDreamManager() {
276         return IDreamManager.Stub.asInterface(
277                 ServiceManager.getService(DreamService.DREAM_SERVICE));
278     }
279 
280     @Provides
281     @Singleton
282     @Nullable
provideIVrManager()283     static IVrManager provideIVrManager() {
284         return IVrManager.Stub.asInterface(ServiceManager.getService(Context.VR_SERVICE));
285     }
286 
287     @Provides
288     @Singleton
289     @Nullable
provideFaceManager(Context context)290     static FaceManager provideFaceManager(Context context) {
291         if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FACE)) {
292             return context.getSystemService(FaceManager.class);
293         }
294         return null;
295     }
296 
297     @Provides
298     @Singleton
299     @Nullable
providesFingerprintManager(Context context)300     static FingerprintManager providesFingerprintManager(Context context) {
301         if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_FINGERPRINT)) {
302             return context.getSystemService(FingerprintManager.class);
303         }
304         return null;
305     }
306 
307     /**
308      * @return null if both faceManager and fingerprintManager are null.
309      */
310     @Provides
311     @Singleton
312     @Nullable
providesBiometricManager(Context context, @Nullable FaceManager faceManager, @Nullable FingerprintManager fingerprintManager)313     static BiometricManager providesBiometricManager(Context context,
314             @Nullable FaceManager faceManager, @Nullable FingerprintManager fingerprintManager) {
315         return faceManager == null && fingerprintManager == null ? null :
316                 context.getSystemService(BiometricManager.class);
317     }
318 
319     @Provides
320     @Singleton
provideJobScheduler(Context context)321     static JobScheduler provideJobScheduler(Context context) {
322         return context.getSystemService(JobScheduler.class);
323     }
324 
325     @Provides
326     @Singleton
provideInteractionJankMonitor()327     static InteractionJankMonitor provideInteractionJankMonitor() {
328         InteractionJankMonitor jankMonitor = InteractionJankMonitor.getInstance();
329         jankMonitor.configDebugOverlay(Color.YELLOW, 0.75);
330         return jankMonitor;
331     }
332 
333     @Provides
334     @Singleton
provideInputManager(Context context)335     static InputManager provideInputManager(Context context) {
336         return context.getSystemService(InputManager.class);
337     }
338 
339     @Provides
340     @Singleton
provideInputMethodManager(Context context)341     static InputMethodManager provideInputMethodManager(Context context) {
342         return context.getSystemService(InputMethodManager.class);
343     }
344 
345     @Provides
346     @Singleton
provideIAppWidgetService()347     static IAppWidgetService provideIAppWidgetService() {
348         return IAppWidgetService.Stub.asInterface(
349                 ServiceManager.getService(Context.APPWIDGET_SERVICE));
350     }
351 
352     @Provides
353     @Singleton
provideIPackageManager()354     static IPackageManager provideIPackageManager() {
355         return IPackageManager.Stub.asInterface(ServiceManager.getService("package"));
356     }
357 
358     @Provides
359     @Singleton
provideIStatusBarService()360     static IStatusBarService provideIStatusBarService() {
361         return IStatusBarService.Stub.asInterface(
362                 ServiceManager.getService(Context.STATUS_BAR_SERVICE));
363     }
364 
365     @Provides
366     @Nullable
provideIWallPaperManager()367     static IWallpaperManager provideIWallPaperManager() {
368         return IWallpaperManager.Stub.asInterface(
369                 ServiceManager.getService(Context.WALLPAPER_SERVICE));
370     }
371 
372     @Provides
373     @Singleton
provideIWindowManager()374     static IWindowManager provideIWindowManager() {
375         return WindowManagerGlobal.getWindowManagerService();
376     }
377 
378     @Provides
379     @Singleton
provideKeyguardManager(Context context)380     static KeyguardManager provideKeyguardManager(Context context) {
381         return context.getSystemService(KeyguardManager.class);
382     }
383 
384     @Provides
385     @Singleton
provideLatencyTracker(Context context)386     static LatencyTracker provideLatencyTracker(Context context) {
387         return LatencyTracker.getInstance(context);
388     }
389 
390     @Provides
391     @Singleton
provideLauncherApps(Context context)392     static LauncherApps provideLauncherApps(Context context) {
393         return context.getSystemService(LauncherApps.class);
394     }
395 
396     /** */
397     @Provides
398     @Singleton
providerLayoutInflater(Context context)399     public LayoutInflater providerLayoutInflater(Context context) {
400         return LayoutInflater.from(context);
401     }
402 
403     /** */
404     @Provides
405     @Singleton
provideAsyncLayoutInflater(Context context)406     public AsyncLayoutInflater provideAsyncLayoutInflater(Context context) {
407         return new AsyncLayoutInflater(context);
408     }
409 
410     @Provides
provideMediaProjectionManager(Context context)411     static MediaProjectionManager provideMediaProjectionManager(Context context) {
412         return context.getSystemService(MediaProjectionManager.class);
413     }
414 
415     @Provides
provideMediaRouter2Manager(Context context)416     static MediaRouter2Manager provideMediaRouter2Manager(Context context) {
417         return MediaRouter2Manager.getInstance(context);
418     }
419 
420     @Provides
provideMediaSessionManager(Context context)421     static MediaSessionManager provideMediaSessionManager(Context context) {
422         return context.getSystemService(MediaSessionManager.class);
423     }
424 
425     @Provides
426     @Singleton
provideNetworkScoreManager(Context context)427     static NetworkScoreManager provideNetworkScoreManager(Context context) {
428         return context.getSystemService(NetworkScoreManager.class);
429     }
430 
431     @Provides
432     @Singleton
provideNotificationManager(Context context)433     static NotificationManager provideNotificationManager(Context context) {
434         return context.getSystemService(NotificationManager.class);
435     }
436 
437     @Provides
438     @Singleton
provideNotificationManagerCompat(Context context)439     static NotificationManagerCompat provideNotificationManagerCompat(Context context) {
440         return NotificationManagerCompat.from(context);
441     }
442 
443     /** */
444     @Provides
445     @Singleton
provideINotificationManager()446     public INotificationManager provideINotificationManager() {
447         return INotificationManager.Stub.asInterface(
448                 ServiceManager.getService(Context.NOTIFICATION_SERVICE));
449     }
450 
451     @Provides
452     @Singleton
providePackageManager(Context context)453     static PackageManager providePackageManager(Context context) {
454         return context.getPackageManager();
455     }
456 
457     @Provides
458     @Singleton
providePackageManagerWrapper()459     static PackageManagerWrapper providePackageManagerWrapper() {
460         return PackageManagerWrapper.getInstance();
461     }
462 
463     /** */
464     @Provides
465     @Singleton
providePowerManager(Context context)466     static PowerManager providePowerManager(Context context) {
467         return context.getSystemService(PowerManager.class);
468     }
469 
470     /** */
471     @Provides
472     @Singleton
providePowerExemptionManager(Context context)473     static PowerExemptionManager providePowerExemptionManager(Context context) {
474         return context.getSystemService(PowerExemptionManager.class);
475     }
476 
477     /** */
478     @Provides
479     @Main
provideSharePreferences(Context context)480     public SharedPreferences provideSharePreferences(Context context) {
481         return Prefs.get(context);
482     }
483 
484     /** */
485     @Provides
486     @Singleton
provideUiModeManager(Context context)487     static UiModeManager provideUiModeManager(Context context) {
488         return context.getSystemService(UiModeManager.class);
489     }
490 
491     @Provides
492     @Main
provideResources(Context context)493     static Resources provideResources(Context context) {
494         return context.getResources();
495     }
496 
497     @Provides
498     @Application
provideAssetManager(@pplication Context context)499     static AssetManager provideAssetManager(@Application Context context) {
500         return context.getAssets();
501     }
502 
503     @Provides
504     @Singleton
provideRoleManager(Context context)505     static RoleManager provideRoleManager(Context context) {
506         return context.getSystemService(RoleManager.class);
507     }
508 
509     @Provides
510     @Singleton
providesSensorManager(Context context)511     static SensorManager providesSensorManager(Context context) {
512         return context.getSystemService(SensorManager.class);
513     }
514 
515     @Provides
516     @Singleton
provideSensorPrivacyManager(Context context)517     static SensorPrivacyManager provideSensorPrivacyManager(Context context) {
518         return context.getSystemService(SensorPrivacyManager.class);
519     }
520 
521     @Provides
522     @Singleton
provideShortcutManager(Context context)523     static ShortcutManager provideShortcutManager(Context context) {
524         return context.getSystemService(ShortcutManager.class);
525     }
526 
527     @Provides
528     @Singleton
provideStatsManager(Context context)529     static StatsManager provideStatsManager(Context context) {
530         return context.getSystemService(StatsManager.class);
531     }
532 
533     @Provides
534     @Singleton
provideStorageManager(Context context)535     static StorageManager provideStorageManager(Context context) {
536         return context.getSystemService(StorageManager.class);
537     }
538 
539     @Provides
540     @Singleton
provideSubscriptionManager(Context context)541     static SubscriptionManager provideSubscriptionManager(Context context) {
542         return context.getSystemService(SubscriptionManager.class);
543     }
544 
545     @Provides
546     @Singleton
547     @Nullable
provideTelecomManager(Context context)548     static TelecomManager provideTelecomManager(Context context) {
549         return context.getSystemService(TelecomManager.class);
550     }
551 
552     @Provides
553     @Singleton
provideOptionalTelecomManager(Context context)554     static Optional<TelecomManager> provideOptionalTelecomManager(Context context) {
555         return Optional.ofNullable(context.getSystemService(TelecomManager.class));
556     }
557 
558     @Provides
559     @Singleton
provideTelephonyManager(Context context)560     static TelephonyManager provideTelephonyManager(Context context) {
561         return context.getSystemService(TelephonyManager.class);
562     }
563 
564     @Provides
565     @Singleton
566     @TestHarness
provideIsTestHarness()567     static boolean provideIsTestHarness() {
568         return ActivityManager.isRunningInUserTestHarness();
569     }
570 
571     @Provides
572     @Singleton
provideTrustManager(Context context)573     static TrustManager provideTrustManager(Context context) {
574         return context.getSystemService(TrustManager.class);
575     }
576 
577     @Provides
578     @Singleton
579     @Nullable
provideVibrator(Context context)580     static Vibrator provideVibrator(Context context) {
581         return context.getSystemService(Vibrator.class);
582     }
583 
584     @Provides
585     @Singleton
provideOptionalVibrator(Context context)586     static Optional<Vibrator> provideOptionalVibrator(Context context) {
587         return Optional.ofNullable(context.getSystemService(Vibrator.class));
588     }
589 
590     @Provides
591     @Singleton
provideViewConfiguration(Context context)592     static ViewConfiguration provideViewConfiguration(Context context) {
593         return ViewConfiguration.get(context);
594     }
595 
596     @Provides
597     @Singleton
provideUserManager(Context context)598     static UserManager provideUserManager(Context context) {
599         return context.getSystemService(UserManager.class);
600     }
601 
602     @Provides
provideWallpaperManager(Context context)603     static WallpaperManager provideWallpaperManager(Context context) {
604         return context.getSystemService(WallpaperManager.class);
605     }
606 
607     @Provides
608     @Singleton
609     @Nullable
provideWifiManager(Context context)610     static WifiManager provideWifiManager(Context context) {
611         return context.getSystemService(WifiManager.class);
612     }
613 
614     @Provides
615     @Singleton
provideOverlayManager(Context context)616     static OverlayManager provideOverlayManager(Context context) {
617         return context.getSystemService(OverlayManager.class);
618     }
619 
620     @Provides
621     @Singleton
provideCarrierConfigManager(Context context)622     static CarrierConfigManager provideCarrierConfigManager(Context context) {
623         return context.getSystemService(CarrierConfigManager.class);
624     }
625 
626     @Provides
627     @Singleton
provideWindowManager(Context context)628     static WindowManager provideWindowManager(Context context) {
629         return context.getSystemService(WindowManager.class);
630     }
631 
632     @Provides
633     @Singleton
providePermissionManager(Context context)634     static PermissionManager providePermissionManager(Context context) {
635         PermissionManager pm = context.getSystemService(PermissionManager.class);
636         if (pm != null) {
637             pm.initializeUsageHelper();
638         }
639         return pm;
640     }
641 
642     @Provides
643     @Singleton
provideClipboardManager(Context context)644     static ClipboardManager provideClipboardManager(Context context) {
645         return context.getSystemService(ClipboardManager.class);
646     }
647 
648     @Provides
649     @Singleton
provideSmartspaceManager(Context context)650     static SmartspaceManager provideSmartspaceManager(Context context) {
651         return context.getSystemService(SmartspaceManager.class);
652     }
653 
654     @Provides
655     @Singleton
provideSafetyCenterManager(Context context)656     static SafetyCenterManager provideSafetyCenterManager(Context context) {
657         return context.getSystemService(SafetyCenterManager.class);
658     }
659 
660     @Provides
661     @Singleton
provideCameraManager(Context context)662     static CameraManager provideCameraManager(Context context) {
663         return context.getSystemService(CameraManager.class);
664     }
665 
666     @Provides
667     @Singleton
provideBluetoothManager(Context context)668     static BluetoothManager provideBluetoothManager(Context context) {
669         return context.getSystemService(BluetoothManager.class);
670     }
671 
672     @Provides
673     @Singleton
674     @Nullable
provideBluetoothAdapter(BluetoothManager bluetoothManager)675     static BluetoothAdapter provideBluetoothAdapter(BluetoothManager bluetoothManager) {
676         return bluetoothManager.getAdapter();
677     }
678 
679     @Provides
680     @Singleton
provideTextClassificationManager(Context context)681     static TextClassificationManager provideTextClassificationManager(Context context) {
682         return context.getSystemService(TextClassificationManager.class);
683     }
684 
685     @Provides
686     @Singleton
provideStatusBarManager(Context context)687     static StatusBarManager provideStatusBarManager(Context context) {
688         return context.getSystemService(StatusBarManager.class);
689     }
690 }
691