1 /* 2 * Copyright (C) 2018 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; 18 19 import static com.android.systemui.Dependency.BG_HANDLER_NAME; 20 import static com.android.systemui.Dependency.BG_LOOPER_NAME; 21 import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; 22 import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; 23 24 import android.annotation.Nullable; 25 import android.app.INotificationManager; 26 import android.content.Context; 27 import android.hardware.SensorPrivacyManager; 28 import android.hardware.display.NightDisplayListener; 29 import android.os.Handler; 30 import android.os.HandlerThread; 31 import android.os.Looper; 32 import android.os.Process; 33 import android.os.ServiceManager; 34 import android.os.UserHandle; 35 import android.util.DisplayMetrics; 36 import android.view.IWindowManager; 37 import android.view.WindowManagerGlobal; 38 39 import com.android.internal.logging.MetricsLogger; 40 import com.android.internal.statusbar.IStatusBarService; 41 import com.android.settingslib.bluetooth.LocalBluetoothManager; 42 import com.android.systemui.plugins.PluginInitializerImpl; 43 import com.android.systemui.shared.plugins.PluginManager; 44 import com.android.systemui.shared.plugins.PluginManagerImpl; 45 import com.android.systemui.shared.system.ActivityManagerWrapper; 46 import com.android.systemui.shared.system.DevicePolicyManagerWrapper; 47 import com.android.systemui.shared.system.PackageManagerWrapper; 48 import com.android.systemui.statusbar.NavigationBarController; 49 import com.android.systemui.statusbar.phone.AutoHideController; 50 import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; 51 import com.android.systemui.statusbar.policy.ConfigurationController; 52 import com.android.systemui.statusbar.policy.DataSaverController; 53 import com.android.systemui.statusbar.policy.NetworkController; 54 import com.android.systemui.util.leak.LeakDetector; 55 56 import javax.inject.Named; 57 import javax.inject.Singleton; 58 59 import dagger.Module; 60 import dagger.Provides; 61 62 /** 63 * Provides dependencies for the root component of sysui injection. 64 * See SystemUI/docs/dagger.md 65 */ 66 @Module 67 public class DependencyProvider { 68 69 @Singleton 70 @Provides 71 @Named(TIME_TICK_HANDLER_NAME) 72 public Handler provideHandler() { 73 HandlerThread thread = new HandlerThread("TimeTick"); 74 thread.start(); 75 return new Handler(thread.getLooper()); 76 } 77 78 @Singleton 79 @Provides 80 @Named(BG_LOOPER_NAME) 81 public Looper provideBgLooper() { 82 HandlerThread thread = new HandlerThread("SysUiBg", 83 Process.THREAD_PRIORITY_BACKGROUND); 84 thread.start(); 85 return thread.getLooper(); 86 } 87 88 @Singleton 89 @Provides 90 @Named(BG_HANDLER_NAME) 91 public Handler provideBgHandler(@Named(BG_LOOPER_NAME) Looper bgLooper) { 92 return new Handler(bgLooper); 93 } 94 95 @Singleton 96 @Provides 97 @Named(MAIN_HANDLER_NAME) 98 public Handler provideMainHandler() { 99 return new Handler(Looper.getMainLooper()); 100 } 101 102 @Singleton 103 @Provides 104 public DataSaverController provideDataSaverController(NetworkController networkController) { 105 return networkController.getDataSaverController(); 106 } 107 108 @Singleton 109 @Provides 110 @Nullable 111 public LocalBluetoothManager provideLocalBluetoothController(Context context, 112 @Named(BG_HANDLER_NAME) Handler bgHandler) { 113 return LocalBluetoothManager.create(context, bgHandler, 114 UserHandle.ALL); 115 } 116 117 @Singleton 118 @Provides 119 public MetricsLogger provideMetricsLogger() { 120 return new MetricsLogger(); 121 } 122 123 @Singleton 124 @Provides 125 public IWindowManager provideIWindowManager() { 126 return WindowManagerGlobal.getWindowManagerService(); 127 } 128 129 @Singleton 130 @Provides 131 public IStatusBarService provideIStatusBarService() { 132 return IStatusBarService.Stub.asInterface( 133 ServiceManager.getService(Context.STATUS_BAR_SERVICE)); 134 } 135 136 /** */ 137 @Singleton 138 @Provides 139 public INotificationManager provideINotificationManager() { 140 return INotificationManager.Stub.asInterface( 141 ServiceManager.getService(Context.NOTIFICATION_SERVICE)); 142 } 143 144 @Singleton 145 @Provides 146 // Single instance of DisplayMetrics, gets updated by StatusBar, but can be used 147 // anywhere it is needed. 148 public DisplayMetrics provideDisplayMetrics() { 149 return new DisplayMetrics(); 150 } 151 152 @Singleton 153 @Provides 154 public SensorPrivacyManager provideSensorPrivacyManager(Context context) { 155 return context.getSystemService(SensorPrivacyManager.class); 156 } 157 158 @Singleton 159 @Provides 160 public LeakDetector provideLeakDetector() { 161 return LeakDetector.create(); 162 163 } 164 165 @Singleton 166 @Provides 167 public NightDisplayListener provideNightDisplayListener(Context context, 168 @Named(BG_HANDLER_NAME) Handler bgHandler) { 169 return new NightDisplayListener(context, bgHandler); 170 } 171 172 @Singleton 173 @Provides 174 public PluginManager providePluginManager(Context context) { 175 return new PluginManagerImpl(context, new PluginInitializerImpl()); 176 } 177 178 @Singleton 179 @Provides 180 public NavigationBarController provideNavigationBarController(Context context, 181 @Named(MAIN_HANDLER_NAME) Handler mainHandler) { 182 return new NavigationBarController(context, mainHandler); 183 } 184 185 @Singleton 186 @Provides 187 public ConfigurationController provideConfigurationController(Context context) { 188 return new ConfigurationControllerImpl(context); 189 } 190 191 @Singleton 192 @Provides 193 public AutoHideController provideAutoHideController(Context context, 194 @Named(MAIN_HANDLER_NAME) Handler mainHandler) { 195 return new AutoHideController(context, mainHandler); 196 } 197 198 @Singleton 199 @Provides 200 public ActivityManagerWrapper provideActivityManagerWrapper() { 201 return ActivityManagerWrapper.getInstance(); 202 } 203 204 @Singleton 205 @Provides 206 public DevicePolicyManagerWrapper provideDevicePolicyManagerWrapper() { 207 return DevicePolicyManagerWrapper.getInstance(); 208 } 209 210 @Singleton 211 @Provides 212 public PackageManagerWrapper providePackageManagerWrapper() { 213 return PackageManagerWrapper.getInstance(); 214 } 215 } 216