1 /* 2 * Copyright (C) 2017 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file 5 * except in compliance with the License. You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software distributed under the 10 * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 11 * KIND, either express or implied. See the License for the specific language governing 12 * permissions and limitations under the License. 13 */ 14 15 package com.android.systemui; 16 17 import android.annotation.Nullable; 18 import android.app.AlarmManager; 19 import android.app.INotificationManager; 20 import android.app.IWallpaperManager; 21 import android.hardware.SensorPrivacyManager; 22 import android.hardware.display.NightDisplayListener; 23 import android.os.Handler; 24 import android.os.Looper; 25 import android.util.ArrayMap; 26 import android.util.DisplayMetrics; 27 import android.view.IWindowManager; 28 29 import com.android.internal.annotations.VisibleForTesting; 30 import com.android.internal.logging.MetricsLogger; 31 import com.android.internal.logging.UiEventLogger; 32 import com.android.internal.statusbar.IStatusBarService; 33 import com.android.internal.util.Preconditions; 34 import com.android.keyguard.KeyguardSecurityModel; 35 import com.android.keyguard.KeyguardUpdateMonitor; 36 import com.android.settingslib.bluetooth.LocalBluetoothManager; 37 import com.android.systemui.accessibility.AccessibilityButtonModeObserver; 38 import com.android.systemui.accessibility.AccessibilityButtonTargetsObserver; 39 import com.android.systemui.accessibility.floatingmenu.AccessibilityFloatingMenuController; 40 import com.android.systemui.animation.DialogLaunchAnimator; 41 import com.android.systemui.appops.AppOpsController; 42 import com.android.systemui.assist.AssistManager; 43 import com.android.systemui.broadcast.BroadcastDispatcher; 44 import com.android.systemui.colorextraction.SysuiColorExtractor; 45 import com.android.systemui.dagger.SysUISingleton; 46 import com.android.systemui.dagger.qualifiers.Background; 47 import com.android.systemui.dagger.qualifiers.Main; 48 import com.android.systemui.dock.DockManager; 49 import com.android.systemui.dump.DumpManager; 50 import com.android.systemui.flags.FeatureFlags; 51 import com.android.systemui.fragments.FragmentService; 52 import com.android.systemui.hdmi.HdmiCecSetMenuLanguageHelper; 53 import com.android.systemui.keyguard.ScreenLifecycle; 54 import com.android.systemui.keyguard.WakefulnessLifecycle; 55 import com.android.systemui.media.dialog.MediaOutputDialogFactory; 56 import com.android.systemui.model.SysUiState; 57 import com.android.systemui.navigationbar.NavigationBarController; 58 import com.android.systemui.navigationbar.NavigationModeController; 59 import com.android.systemui.navigationbar.gestural.EdgeBackGestureHandler; 60 import com.android.systemui.plugins.ActivityStarter; 61 import com.android.systemui.plugins.DarkIconDispatcher; 62 import com.android.systemui.plugins.PluginDependencyProvider; 63 import com.android.systemui.plugins.PluginManager; 64 import com.android.systemui.plugins.VolumeDialogController; 65 import com.android.systemui.plugins.statusbar.StatusBarStateController; 66 import com.android.systemui.power.EnhancedEstimates; 67 import com.android.systemui.power.PowerUI; 68 import com.android.systemui.privacy.PrivacyItemController; 69 import com.android.systemui.qs.ReduceBrightColorsController; 70 import com.android.systemui.qs.tiles.dialog.InternetDialogFactory; 71 import com.android.systemui.recents.OverviewProxyService; 72 import com.android.systemui.screenrecord.RecordingController; 73 import com.android.systemui.settings.UserTracker; 74 import com.android.systemui.shade.ShadeController; 75 import com.android.systemui.shared.system.ActivityManagerWrapper; 76 import com.android.systemui.shared.system.DevicePolicyManagerWrapper; 77 import com.android.systemui.shared.system.PackageManagerWrapper; 78 import com.android.systemui.statusbar.CommandQueue; 79 import com.android.systemui.statusbar.NotificationListener; 80 import com.android.systemui.statusbar.NotificationLockscreenUserManager; 81 import com.android.systemui.statusbar.NotificationMediaManager; 82 import com.android.systemui.statusbar.NotificationRemoteInputManager; 83 import com.android.systemui.statusbar.NotificationShadeWindowController; 84 import com.android.systemui.statusbar.SmartReplyController; 85 import com.android.systemui.statusbar.VibratorHelper; 86 import com.android.systemui.statusbar.events.PrivacyDotViewController; 87 import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; 88 import com.android.systemui.statusbar.notification.collection.render.GroupExpansionManager; 89 import com.android.systemui.statusbar.notification.collection.render.GroupMembershipManager; 90 import com.android.systemui.statusbar.notification.logging.NotificationLogger; 91 import com.android.systemui.statusbar.notification.row.NotificationGutsManager; 92 import com.android.systemui.statusbar.notification.stack.AmbientState; 93 import com.android.systemui.statusbar.notification.stack.NotificationSectionsManager; 94 import com.android.systemui.statusbar.phone.AutoHideController; 95 import com.android.systemui.statusbar.phone.DozeParameters; 96 import com.android.systemui.statusbar.phone.KeyguardDismissUtil; 97 import com.android.systemui.statusbar.phone.LightBarController; 98 import com.android.systemui.statusbar.phone.LockscreenGestureLogger; 99 import com.android.systemui.statusbar.phone.ManagedProfileController; 100 import com.android.systemui.statusbar.phone.ScreenOffAnimationController; 101 import com.android.systemui.statusbar.phone.StatusBarContentInsetsProvider; 102 import com.android.systemui.statusbar.phone.StatusBarIconController; 103 import com.android.systemui.statusbar.phone.SystemUIDialogManager; 104 import com.android.systemui.statusbar.policy.AccessibilityController; 105 import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; 106 import com.android.systemui.statusbar.policy.BluetoothController; 107 import com.android.systemui.statusbar.policy.CastController; 108 import com.android.systemui.statusbar.policy.DataSaverController; 109 import com.android.systemui.statusbar.policy.DeviceProvisionedController; 110 import com.android.systemui.statusbar.policy.ExtensionController; 111 import com.android.systemui.statusbar.policy.FlashlightController; 112 import com.android.systemui.statusbar.policy.HotspotController; 113 import com.android.systemui.statusbar.policy.KeyguardStateController; 114 import com.android.systemui.statusbar.policy.LocationController; 115 import com.android.systemui.statusbar.policy.NextAlarmController; 116 import com.android.systemui.statusbar.policy.RemoteInputQuickSettingsDisabler; 117 import com.android.systemui.statusbar.policy.RotationLockController; 118 import com.android.systemui.statusbar.policy.SecurityController; 119 import com.android.systemui.statusbar.policy.SensorPrivacyController; 120 import com.android.systemui.statusbar.policy.SmartReplyConstants; 121 import com.android.systemui.statusbar.policy.UserInfoController; 122 import com.android.systemui.statusbar.policy.UserSwitcherController; 123 import com.android.systemui.statusbar.policy.ZenModeController; 124 import com.android.systemui.statusbar.window.StatusBarWindowController; 125 import com.android.systemui.telephony.TelephonyListenerManager; 126 import com.android.systemui.tuner.TunablePadding.TunablePaddingService; 127 import com.android.systemui.tuner.TunerService; 128 import com.android.systemui.util.DeviceConfigProxy; 129 import com.android.systemui.util.leak.GarbageMonitor; 130 import com.android.systemui.util.leak.LeakDetector; 131 import com.android.systemui.util.leak.LeakReporter; 132 import com.android.systemui.util.sensors.AsyncSensorManager; 133 134 import java.util.concurrent.Executor; 135 import java.util.function.Consumer; 136 137 import javax.inject.Inject; 138 import javax.inject.Named; 139 140 import dagger.Lazy; 141 142 /** 143 * Class to handle ugly dependencies throughout sysui until we determine the 144 * long-term dependency injection solution. 145 * 146 * Classes added here should be things that are expected to live the lifetime of sysui, 147 * and are generally applicable to many parts of sysui. They will be lazily 148 * initialized to ensure they aren't created on form factors that don't need them 149 * (e.g. HotspotController on TV). Despite being lazily initialized, it is expected 150 * that all dependencies will be gotten during sysui startup, and not during runtime 151 * to avoid jank. 152 * 153 * All classes used here are expected to manage their own lifecycle, meaning if 154 * they have no clients they should not have any registered resources like bound 155 * services, registered receivers, etc. 156 */ 157 @SysUISingleton 158 public class Dependency { 159 /** 160 * Key for getting a the main looper. 161 */ 162 private static final String MAIN_LOOPER_NAME = "main_looper"; 163 164 /** 165 * Key for getting a background Looper for background work. 166 */ 167 private static final String BG_LOOPER_NAME = "background_looper"; 168 /** 169 * Key for getting a Handler for receiving time tick broadcasts on. 170 */ 171 public static final String TIME_TICK_HANDLER_NAME = "time_tick_handler"; 172 /** 173 * Generic handler on the main thread. 174 */ 175 private static final String MAIN_HANDLER_NAME = "main_handler"; 176 /** 177 * Generic executor on the main thread. 178 */ 179 private static final String MAIN_EXECUTOR_NAME = "main_executor"; 180 181 /** 182 * Generic executor on a background thread. 183 */ 184 private static final String BACKGROUND_EXECUTOR_NAME = "background_executor"; 185 186 /** 187 * An email address to send memory leak reports to by default. 188 */ 189 public static final String LEAK_REPORT_EMAIL_NAME = "leak_report_email"; 190 191 /** 192 * Whether this platform supports long-pressing notifications to show notification channel 193 * settings. 194 */ 195 public static final String ALLOW_NOTIFICATION_LONG_PRESS_NAME = "allow_notif_longpress"; 196 197 /** 198 * Key for getting a background Looper for background work. 199 */ 200 public static final DependencyKey<Looper> BG_LOOPER = new DependencyKey<>(BG_LOOPER_NAME); 201 /** 202 * Key for getting a mainer Looper. 203 */ 204 public static final DependencyKey<Looper> MAIN_LOOPER = new DependencyKey<>(MAIN_LOOPER_NAME); 205 /** 206 * Key for getting a Handler for receiving time tick broadcasts on. 207 */ 208 public static final DependencyKey<Handler> TIME_TICK_HANDLER = 209 new DependencyKey<>(TIME_TICK_HANDLER_NAME); 210 /** 211 * Generic handler on the main thread. 212 */ 213 public static final DependencyKey<Handler> MAIN_HANDLER = 214 new DependencyKey<>(MAIN_HANDLER_NAME); 215 216 /** 217 * Generic executor on the main thread. 218 */ 219 public static final DependencyKey<Executor> MAIN_EXECUTOR = 220 new DependencyKey<>(MAIN_EXECUTOR_NAME); 221 /** 222 * Generic executor on a background thread. 223 */ 224 public static final DependencyKey<Executor> BACKGROUND_EXECUTOR = 225 new DependencyKey<>(BACKGROUND_EXECUTOR_NAME); 226 227 /** 228 * An email address to send memory leak reports to by default. 229 */ 230 public static final DependencyKey<String> LEAK_REPORT_EMAIL = 231 new DependencyKey<>(LEAK_REPORT_EMAIL_NAME); 232 233 private final ArrayMap<Object, Object> mDependencies = new ArrayMap<>(); 234 private final ArrayMap<Object, LazyDependencyCreator> mProviders = new ArrayMap<>(); 235 236 @Inject DumpManager mDumpManager; 237 238 @Inject Lazy<ActivityStarter> mActivityStarter; 239 @Inject Lazy<BroadcastDispatcher> mBroadcastDispatcher; 240 @Inject Lazy<AsyncSensorManager> mAsyncSensorManager; 241 @Inject Lazy<BluetoothController> mBluetoothController; 242 @Inject Lazy<LocationController> mLocationController; 243 @Inject Lazy<RotationLockController> mRotationLockController; 244 @Inject Lazy<ZenModeController> mZenModeController; 245 @Inject Lazy<HdmiCecSetMenuLanguageHelper> mHdmiCecSetMenuLanguageHelper; 246 @Inject Lazy<HotspotController> mHotspotController; 247 @Inject Lazy<CastController> mCastController; 248 @Inject Lazy<FlashlightController> mFlashlightController; 249 @Inject Lazy<UserSwitcherController> mUserSwitcherController; 250 @Inject Lazy<UserInfoController> mUserInfoController; 251 @Inject Lazy<KeyguardStateController> mKeyguardMonitor; 252 @Inject Lazy<KeyguardUpdateMonitor> mKeyguardUpdateMonitor; 253 @Inject Lazy<NightDisplayListener> mNightDisplayListener; 254 @Inject Lazy<ReduceBrightColorsController> mReduceBrightColorsController; 255 @Inject Lazy<ManagedProfileController> mManagedProfileController; 256 @Inject Lazy<NextAlarmController> mNextAlarmController; 257 @Inject Lazy<DataSaverController> mDataSaverController; 258 @Inject Lazy<AccessibilityController> mAccessibilityController; 259 @Inject Lazy<DeviceProvisionedController> mDeviceProvisionedController; 260 @Inject Lazy<PluginManager> mPluginManager; 261 @Inject Lazy<AssistManager> mAssistManager; 262 @Inject Lazy<SecurityController> mSecurityController; 263 @Inject Lazy<LeakDetector> mLeakDetector; 264 @Inject Lazy<LeakReporter> mLeakReporter; 265 @Inject Lazy<GarbageMonitor> mGarbageMonitor; 266 @Inject Lazy<TunerService> mTunerService; 267 @Inject Lazy<NotificationShadeWindowController> mNotificationShadeWindowController; 268 @Inject Lazy<StatusBarWindowController> mTempStatusBarWindowController; 269 @Inject Lazy<DarkIconDispatcher> mDarkIconDispatcher; 270 @Inject Lazy<StatusBarIconController> mStatusBarIconController; 271 @Inject Lazy<ScreenLifecycle> mScreenLifecycle; 272 @Inject Lazy<WakefulnessLifecycle> mWakefulnessLifecycle; 273 @Inject Lazy<FragmentService> mFragmentService; 274 @Inject Lazy<ExtensionController> mExtensionController; 275 @Inject Lazy<PluginDependencyProvider> mPluginDependencyProvider; 276 @Nullable 277 @Inject Lazy<LocalBluetoothManager> mLocalBluetoothManager; 278 @Inject Lazy<VolumeDialogController> mVolumeDialogController; 279 @Inject Lazy<MetricsLogger> mMetricsLogger; 280 @Inject Lazy<AccessibilityManagerWrapper> mAccessibilityManagerWrapper; 281 @Inject Lazy<SysuiColorExtractor> mSysuiColorExtractor; 282 @Inject Lazy<TunablePaddingService> mTunablePaddingService; 283 @Inject Lazy<UiOffloadThread> mUiOffloadThread; 284 @Inject Lazy<PowerUI.WarningsUI> mWarningsUI; 285 @Inject Lazy<LightBarController> mLightBarController; 286 @Inject Lazy<IWindowManager> mIWindowManager; 287 @Inject Lazy<OverviewProxyService> mOverviewProxyService; 288 @Inject Lazy<NavigationModeController> mNavBarModeController; 289 @Inject Lazy<AccessibilityButtonModeObserver> mAccessibilityButtonModeObserver; 290 @Inject Lazy<AccessibilityButtonTargetsObserver> mAccessibilityButtonListController; 291 @Inject Lazy<EnhancedEstimates> mEnhancedEstimates; 292 @Inject Lazy<VibratorHelper> mVibratorHelper; 293 @Inject Lazy<IStatusBarService> mIStatusBarService; 294 @Inject Lazy<DisplayMetrics> mDisplayMetrics; 295 @Inject Lazy<LockscreenGestureLogger> mLockscreenGestureLogger; 296 @Inject Lazy<ShadeController> mShadeController; 297 @Inject Lazy<NotificationRemoteInputManager.Callback> mNotificationRemoteInputManagerCallback; 298 @Inject Lazy<AppOpsController> mAppOpsController; 299 @Inject Lazy<NavigationBarController> mNavigationBarController; 300 @Inject Lazy<AccessibilityFloatingMenuController> mAccessibilityFloatingMenuController; 301 @Inject Lazy<StatusBarStateController> mStatusBarStateController; 302 @Inject Lazy<NotificationLockscreenUserManager> mNotificationLockscreenUserManager; 303 @Inject Lazy<NotificationGutsManager> mNotificationGutsManager; 304 @Inject Lazy<NotificationMediaManager> mNotificationMediaManager; 305 @Inject Lazy<NotificationRemoteInputManager> mNotificationRemoteInputManager; 306 @Inject Lazy<SmartReplyConstants> mSmartReplyConstants; 307 @Inject Lazy<NotificationListener> mNotificationListener; 308 @Inject Lazy<NotificationLogger> mNotificationLogger; 309 @Inject Lazy<KeyguardDismissUtil> mKeyguardDismissUtil; 310 @Inject Lazy<SmartReplyController> mSmartReplyController; 311 @Inject Lazy<RemoteInputQuickSettingsDisabler> mRemoteInputQuickSettingsDisabler; 312 @Inject Lazy<SensorPrivacyManager> mSensorPrivacyManager; 313 @Inject Lazy<AutoHideController> mAutoHideController; 314 @Inject Lazy<PrivacyItemController> mPrivacyItemController; 315 @Inject @Background Lazy<Looper> mBgLooper; 316 @Inject @Background Lazy<Handler> mBgHandler; 317 @Inject @Main Lazy<Looper> mMainLooper; 318 @Inject @Main Lazy<Handler> mMainHandler; 319 @Inject @Named(TIME_TICK_HANDLER_NAME) Lazy<Handler> mTimeTickHandler; 320 @Inject @Named(LEAK_REPORT_EMAIL_NAME) Lazy<String> mLeakReportEmail; 321 @Inject @Main Lazy<Executor> mMainExecutor; 322 @Inject @Background Lazy<Executor> mBackgroundExecutor; 323 @Inject Lazy<ActivityManagerWrapper> mActivityManagerWrapper; 324 @Inject Lazy<DevicePolicyManagerWrapper> mDevicePolicyManagerWrapper; 325 @Inject Lazy<PackageManagerWrapper> mPackageManagerWrapper; 326 @Inject Lazy<SensorPrivacyController> mSensorPrivacyController; 327 @Inject Lazy<DockManager> mDockManager; 328 @Inject Lazy<INotificationManager> mINotificationManager; 329 @Inject Lazy<SysUiState> mSysUiStateFlagsContainer; 330 @Inject Lazy<AlarmManager> mAlarmManager; 331 @Inject Lazy<KeyguardSecurityModel> mKeyguardSecurityModel; 332 @Inject Lazy<DozeParameters> mDozeParameters; 333 @Inject Lazy<IWallpaperManager> mWallpaperManager; 334 @Inject Lazy<CommandQueue> mCommandQueue; 335 @Inject Lazy<RecordingController> mRecordingController; 336 @Inject Lazy<MediaOutputDialogFactory> mMediaOutputDialogFactory; 337 @Inject Lazy<DeviceConfigProxy> mDeviceConfigProxy; 338 @Inject Lazy<TelephonyListenerManager> mTelephonyListenerManager; 339 @Inject Lazy<SystemStatusAnimationScheduler> mSystemStatusAnimationSchedulerLazy; 340 @Inject Lazy<PrivacyDotViewController> mPrivacyDotViewControllerLazy; 341 @Inject Lazy<EdgeBackGestureHandler.Factory> mEdgeBackGestureHandlerFactoryLazy; 342 @Inject Lazy<UiEventLogger> mUiEventLogger; 343 @Inject Lazy<StatusBarContentInsetsProvider> mContentInsetsProviderLazy; 344 @Inject Lazy<InternetDialogFactory> mInternetDialogFactory; 345 @Inject Lazy<FeatureFlags> mFeatureFlagsLazy; 346 @Inject Lazy<NotificationSectionsManager> mNotificationSectionsManagerLazy; 347 @Inject Lazy<ScreenOffAnimationController> mScreenOffAnimationController; 348 @Inject Lazy<AmbientState> mAmbientStateLazy; 349 @Inject Lazy<GroupMembershipManager> mGroupMembershipManagerLazy; 350 @Inject Lazy<GroupExpansionManager> mGroupExpansionManagerLazy; 351 @Inject Lazy<SystemUIDialogManager> mSystemUIDialogManagerLazy; 352 @Inject Lazy<DialogLaunchAnimator> mDialogLaunchAnimatorLazy; 353 @Inject Lazy<UserTracker> mUserTrackerLazy; 354 355 @Inject Dependency()356 public Dependency() { 357 } 358 359 /** 360 * Initialize Depenency. 361 */ start()362 protected void start() { 363 // TODO: Think about ways to push these creation rules out of Dependency to cut down 364 // on imports. 365 mProviders.put(TIME_TICK_HANDLER, mTimeTickHandler::get); 366 mProviders.put(BG_LOOPER, mBgLooper::get); 367 mProviders.put(MAIN_LOOPER, mMainLooper::get); 368 mProviders.put(MAIN_HANDLER, mMainHandler::get); 369 mProviders.put(MAIN_EXECUTOR, mMainExecutor::get); 370 mProviders.put(BACKGROUND_EXECUTOR, mBackgroundExecutor::get); 371 mProviders.put(ActivityStarter.class, mActivityStarter::get); 372 mProviders.put(BroadcastDispatcher.class, mBroadcastDispatcher::get); 373 374 mProviders.put(AsyncSensorManager.class, mAsyncSensorManager::get); 375 376 mProviders.put(BluetoothController.class, mBluetoothController::get); 377 mProviders.put(SensorPrivacyManager.class, mSensorPrivacyManager::get); 378 379 mProviders.put(LocationController.class, mLocationController::get); 380 381 mProviders.put(RotationLockController.class, mRotationLockController::get); 382 383 mProviders.put(ZenModeController.class, mZenModeController::get); 384 385 mProviders.put(HotspotController.class, mHotspotController::get); 386 387 mProviders.put(CastController.class, mCastController::get); 388 389 mProviders.put(FlashlightController.class, mFlashlightController::get); 390 391 mProviders.put(KeyguardStateController.class, mKeyguardMonitor::get); 392 393 mProviders.put(KeyguardUpdateMonitor.class, mKeyguardUpdateMonitor::get); 394 395 mProviders.put(UserSwitcherController.class, mUserSwitcherController::get); 396 397 mProviders.put(UserInfoController.class, mUserInfoController::get); 398 399 mProviders.put(NightDisplayListener.class, mNightDisplayListener::get); 400 401 mProviders.put(ReduceBrightColorsController.class, mReduceBrightColorsController::get); 402 403 mProviders.put(ManagedProfileController.class, mManagedProfileController::get); 404 405 mProviders.put(NextAlarmController.class, mNextAlarmController::get); 406 407 mProviders.put(DataSaverController.class, mDataSaverController::get); 408 409 mProviders.put(AccessibilityController.class, mAccessibilityController::get); 410 411 mProviders.put(DeviceProvisionedController.class, mDeviceProvisionedController::get); 412 413 mProviders.put(PluginManager.class, mPluginManager::get); 414 415 mProviders.put(AssistManager.class, mAssistManager::get); 416 417 mProviders.put(SecurityController.class, mSecurityController::get); 418 419 mProviders.put(LeakDetector.class, mLeakDetector::get); 420 421 mProviders.put(LEAK_REPORT_EMAIL, mLeakReportEmail::get); 422 423 mProviders.put(LeakReporter.class, mLeakReporter::get); 424 425 mProviders.put(GarbageMonitor.class, mGarbageMonitor::get); 426 427 mProviders.put(TunerService.class, mTunerService::get); 428 429 mProviders.put(NotificationShadeWindowController.class, 430 mNotificationShadeWindowController::get); 431 432 mProviders.put(StatusBarWindowController.class, mTempStatusBarWindowController::get); 433 434 mProviders.put(DarkIconDispatcher.class, mDarkIconDispatcher::get); 435 436 mProviders.put(StatusBarIconController.class, mStatusBarIconController::get); 437 438 mProviders.put(ScreenLifecycle.class, mScreenLifecycle::get); 439 440 mProviders.put(WakefulnessLifecycle.class, mWakefulnessLifecycle::get); 441 442 mProviders.put(FragmentService.class, mFragmentService::get); 443 444 mProviders.put(ExtensionController.class, mExtensionController::get); 445 446 mProviders.put(PluginDependencyProvider.class, mPluginDependencyProvider::get); 447 448 mProviders.put(LocalBluetoothManager.class, mLocalBluetoothManager::get); 449 450 mProviders.put(VolumeDialogController.class, mVolumeDialogController::get); 451 452 mProviders.put(MetricsLogger.class, mMetricsLogger::get); 453 454 mProviders.put(AccessibilityManagerWrapper.class, mAccessibilityManagerWrapper::get); 455 456 mProviders.put(SysuiColorExtractor.class, mSysuiColorExtractor::get); 457 458 mProviders.put(TunablePaddingService.class, mTunablePaddingService::get); 459 460 mProviders.put(UiOffloadThread.class, mUiOffloadThread::get); 461 462 mProviders.put(PowerUI.WarningsUI.class, mWarningsUI::get); 463 464 mProviders.put(LightBarController.class, mLightBarController::get); 465 466 mProviders.put(IWindowManager.class, mIWindowManager::get); 467 468 mProviders.put(OverviewProxyService.class, mOverviewProxyService::get); 469 470 mProviders.put(NavigationModeController.class, mNavBarModeController::get); 471 472 mProviders.put(AccessibilityButtonModeObserver.class, 473 mAccessibilityButtonModeObserver::get); 474 mProviders.put(AccessibilityButtonTargetsObserver.class, 475 mAccessibilityButtonListController::get); 476 477 mProviders.put(EnhancedEstimates.class, mEnhancedEstimates::get); 478 479 mProviders.put(VibratorHelper.class, mVibratorHelper::get); 480 481 mProviders.put(IStatusBarService.class, mIStatusBarService::get); 482 483 mProviders.put(DisplayMetrics.class, mDisplayMetrics::get); 484 485 mProviders.put(LockscreenGestureLogger.class, mLockscreenGestureLogger::get); 486 487 mProviders.put(ShadeController.class, mShadeController::get); 488 489 mProviders.put(NotificationRemoteInputManager.Callback.class, 490 mNotificationRemoteInputManagerCallback::get); 491 492 mProviders.put(AppOpsController.class, mAppOpsController::get); 493 494 mProviders.put(NavigationBarController.class, mNavigationBarController::get); 495 496 mProviders.put(AccessibilityFloatingMenuController.class, 497 mAccessibilityFloatingMenuController::get); 498 499 mProviders.put(StatusBarStateController.class, mStatusBarStateController::get); 500 mProviders.put(NotificationLockscreenUserManager.class, 501 mNotificationLockscreenUserManager::get); 502 mProviders.put(NotificationMediaManager.class, mNotificationMediaManager::get); 503 mProviders.put(NotificationGutsManager.class, mNotificationGutsManager::get); 504 mProviders.put(NotificationRemoteInputManager.class, 505 mNotificationRemoteInputManager::get); 506 mProviders.put(SmartReplyConstants.class, mSmartReplyConstants::get); 507 mProviders.put(NotificationListener.class, mNotificationListener::get); 508 mProviders.put(NotificationLogger.class, mNotificationLogger::get); 509 mProviders.put(KeyguardDismissUtil.class, mKeyguardDismissUtil::get); 510 mProviders.put(SmartReplyController.class, mSmartReplyController::get); 511 mProviders.put(RemoteInputQuickSettingsDisabler.class, 512 mRemoteInputQuickSettingsDisabler::get); 513 mProviders.put(PrivacyItemController.class, mPrivacyItemController::get); 514 mProviders.put(ActivityManagerWrapper.class, mActivityManagerWrapper::get); 515 mProviders.put(DevicePolicyManagerWrapper.class, mDevicePolicyManagerWrapper::get); 516 mProviders.put(PackageManagerWrapper.class, mPackageManagerWrapper::get); 517 mProviders.put(SensorPrivacyController.class, mSensorPrivacyController::get); 518 mProviders.put(DockManager.class, mDockManager::get); 519 mProviders.put(INotificationManager.class, mINotificationManager::get); 520 mProviders.put(SysUiState.class, mSysUiStateFlagsContainer::get); 521 mProviders.put(AlarmManager.class, mAlarmManager::get); 522 mProviders.put(KeyguardSecurityModel.class, mKeyguardSecurityModel::get); 523 mProviders.put(DozeParameters.class, mDozeParameters::get); 524 mProviders.put(IWallpaperManager.class, mWallpaperManager::get); 525 mProviders.put(CommandQueue.class, mCommandQueue::get); 526 mProviders.put(DeviceConfigProxy.class, mDeviceConfigProxy::get); 527 mProviders.put(TelephonyListenerManager.class, mTelephonyListenerManager::get); 528 529 // TODO(b/118592525): to support multi-display , we start to add something which is 530 // per-display, while others may be global. I think it's time to add 531 // a new class maybe named DisplayDependency to solve per-display 532 // Dependency problem. 533 mProviders.put(AutoHideController.class, mAutoHideController::get); 534 535 mProviders.put(RecordingController.class, mRecordingController::get); 536 537 mProviders.put(MediaOutputDialogFactory.class, mMediaOutputDialogFactory::get); 538 539 mProviders.put(SystemStatusAnimationScheduler.class, 540 mSystemStatusAnimationSchedulerLazy::get); 541 mProviders.put(PrivacyDotViewController.class, mPrivacyDotViewControllerLazy::get); 542 mProviders.put(InternetDialogFactory.class, mInternetDialogFactory::get); 543 mProviders.put(EdgeBackGestureHandler.Factory.class, 544 mEdgeBackGestureHandlerFactoryLazy::get); 545 mProviders.put(UiEventLogger.class, mUiEventLogger::get); 546 mProviders.put(FeatureFlags.class, mFeatureFlagsLazy::get); 547 mProviders.put(StatusBarContentInsetsProvider.class, mContentInsetsProviderLazy::get); 548 mProviders.put(NotificationSectionsManager.class, mNotificationSectionsManagerLazy::get); 549 mProviders.put(ScreenOffAnimationController.class, mScreenOffAnimationController::get); 550 mProviders.put(AmbientState.class, mAmbientStateLazy::get); 551 mProviders.put(GroupMembershipManager.class, mGroupMembershipManagerLazy::get); 552 mProviders.put(GroupExpansionManager.class, mGroupExpansionManagerLazy::get); 553 mProviders.put(SystemUIDialogManager.class, mSystemUIDialogManagerLazy::get); 554 mProviders.put(DialogLaunchAnimator.class, mDialogLaunchAnimatorLazy::get); 555 mProviders.put(UserTracker.class, mUserTrackerLazy::get); 556 557 Dependency.setInstance(this); 558 } 559 560 @VisibleForTesting setInstance(Dependency dependency)561 public static void setInstance(Dependency dependency) { 562 sDependency = dependency; 563 } 564 getDependency(Class<T> cls)565 protected final <T> T getDependency(Class<T> cls) { 566 return getDependencyInner(cls); 567 } 568 getDependency(DependencyKey<T> key)569 protected final <T> T getDependency(DependencyKey<T> key) { 570 return getDependencyInner(key); 571 } 572 getDependencyInner(Object key)573 private synchronized <T> T getDependencyInner(Object key) { 574 @SuppressWarnings("unchecked") 575 T obj = (T) mDependencies.get(key); 576 if (obj == null) { 577 obj = createDependency(key); 578 mDependencies.put(key, obj); 579 } 580 return obj; 581 } 582 583 @VisibleForTesting createDependency(Object cls)584 public <T> T createDependency(Object cls) { 585 Preconditions.checkArgument(cls instanceof DependencyKey<?> || cls instanceof Class<?>); 586 587 @SuppressWarnings("unchecked") 588 LazyDependencyCreator<T> provider = mProviders.get(cls); 589 if (provider == null) { 590 throw new IllegalArgumentException("Unsupported dependency " + cls 591 + ". " + mProviders.size() + " providers known."); 592 } 593 return provider.createDependency(); 594 } 595 596 private static Dependency sDependency; 597 598 /** 599 * Interface for a class that can create a dependency. Used to implement laziness 600 * @param <T> The type of the dependency being created 601 */ 602 private interface LazyDependencyCreator<T> { createDependency()603 T createDependency(); 604 } 605 destroyDependency(Class<T> cls, Consumer<T> destroy)606 private <T> void destroyDependency(Class<T> cls, Consumer<T> destroy) { 607 T dep = (T) mDependencies.remove(cls); 608 if (dep instanceof Dumpable) { 609 mDumpManager.unregisterDumpable(dep.getClass().getName()); 610 } 611 if (dep != null && destroy != null) { 612 destroy.accept(dep); 613 } 614 } 615 616 /** 617 * Used in separate process teardown to ensure the context isn't leaked. 618 * 619 * TODO: Remove once PreferenceFragment doesn't reference getActivity() 620 * anymore and these context hacks are no longer needed. 621 */ clearDependencies()622 public static void clearDependencies() { 623 sDependency = null; 624 } 625 626 /** 627 * Checks to see if a dependency is instantiated, if it is it removes it from 628 * the cache and calls the destroy callback. 629 */ destroy(Class<T> cls, Consumer<T> destroy)630 public static <T> void destroy(Class<T> cls, Consumer<T> destroy) { 631 sDependency.destroyDependency(cls, destroy); 632 } 633 634 /** 635 * @deprecated see docs/dagger.md 636 */ 637 @Deprecated get(Class<T> cls)638 public static <T> T get(Class<T> cls) { 639 return sDependency.getDependency(cls); 640 } 641 642 /** 643 * @deprecated see docs/dagger.md 644 */ 645 @Deprecated get(DependencyKey<T> cls)646 public static <T> T get(DependencyKey<T> cls) { 647 return sDependency.getDependency(cls); 648 } 649 650 public static final class DependencyKey<V> { 651 private final String mDisplayName; 652 DependencyKey(String displayName)653 public DependencyKey(String displayName) { 654 mDisplayName = displayName; 655 } 656 657 @Override toString()658 public String toString() { 659 return mDisplayName; 660 } 661 } 662 } 663