/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.systemui; import static com.android.systemui.Dependency.BG_HANDLER_NAME; import static com.android.systemui.Dependency.BG_LOOPER_NAME; import static com.android.systemui.Dependency.MAIN_HANDLER_NAME; import static com.android.systemui.Dependency.TIME_TICK_HANDLER_NAME; import android.annotation.Nullable; import android.app.INotificationManager; import android.content.Context; import android.hardware.SensorPrivacyManager; import android.hardware.display.NightDisplayListener; import android.os.Handler; import android.os.HandlerThread; import android.os.Looper; import android.os.Process; import android.os.ServiceManager; import android.os.UserHandle; import android.util.DisplayMetrics; import android.view.IWindowManager; import android.view.WindowManagerGlobal; import com.android.internal.logging.MetricsLogger; import com.android.internal.statusbar.IStatusBarService; import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.systemui.plugins.PluginInitializerImpl; import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.shared.plugins.PluginManagerImpl; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.DevicePolicyManagerWrapper; import com.android.systemui.shared.system.PackageManagerWrapper; import com.android.systemui.statusbar.NavigationBarController; import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.DataSaverController; import com.android.systemui.statusbar.policy.NetworkController; import com.android.systemui.util.leak.LeakDetector; import javax.inject.Named; import javax.inject.Singleton; import dagger.Module; import dagger.Provides; /** * Provides dependencies for the root component of sysui injection. * See SystemUI/docs/dagger.md */ @Module public class DependencyProvider { @Singleton @Provides @Named(TIME_TICK_HANDLER_NAME) public Handler provideHandler() { HandlerThread thread = new HandlerThread("TimeTick"); thread.start(); return new Handler(thread.getLooper()); } @Singleton @Provides @Named(BG_LOOPER_NAME) public Looper provideBgLooper() { HandlerThread thread = new HandlerThread("SysUiBg", Process.THREAD_PRIORITY_BACKGROUND); thread.start(); return thread.getLooper(); } @Singleton @Provides @Named(BG_HANDLER_NAME) public Handler provideBgHandler(@Named(BG_LOOPER_NAME) Looper bgLooper) { return new Handler(bgLooper); } @Singleton @Provides @Named(MAIN_HANDLER_NAME) public Handler provideMainHandler() { return new Handler(Looper.getMainLooper()); } @Singleton @Provides public DataSaverController provideDataSaverController(NetworkController networkController) { return networkController.getDataSaverController(); } @Singleton @Provides @Nullable public LocalBluetoothManager provideLocalBluetoothController(Context context, @Named(BG_HANDLER_NAME) Handler bgHandler) { return LocalBluetoothManager.create(context, bgHandler, UserHandle.ALL); } @Singleton @Provides public MetricsLogger provideMetricsLogger() { return new MetricsLogger(); } @Singleton @Provides public IWindowManager provideIWindowManager() { return WindowManagerGlobal.getWindowManagerService(); } @Singleton @Provides public IStatusBarService provideIStatusBarService() { return IStatusBarService.Stub.asInterface( ServiceManager.getService(Context.STATUS_BAR_SERVICE)); } /** */ @Singleton @Provides public INotificationManager provideINotificationManager() { return INotificationManager.Stub.asInterface( ServiceManager.getService(Context.NOTIFICATION_SERVICE)); } @Singleton @Provides // Single instance of DisplayMetrics, gets updated by StatusBar, but can be used // anywhere it is needed. public DisplayMetrics provideDisplayMetrics() { return new DisplayMetrics(); } @Singleton @Provides public SensorPrivacyManager provideSensorPrivacyManager(Context context) { return context.getSystemService(SensorPrivacyManager.class); } @Singleton @Provides public LeakDetector provideLeakDetector() { return LeakDetector.create(); } @Singleton @Provides public NightDisplayListener provideNightDisplayListener(Context context, @Named(BG_HANDLER_NAME) Handler bgHandler) { return new NightDisplayListener(context, bgHandler); } @Singleton @Provides public PluginManager providePluginManager(Context context) { return new PluginManagerImpl(context, new PluginInitializerImpl()); } @Singleton @Provides public NavigationBarController provideNavigationBarController(Context context, @Named(MAIN_HANDLER_NAME) Handler mainHandler) { return new NavigationBarController(context, mainHandler); } @Singleton @Provides public ConfigurationController provideConfigurationController(Context context) { return new ConfigurationControllerImpl(context); } @Singleton @Provides public AutoHideController provideAutoHideController(Context context, @Named(MAIN_HANDLER_NAME) Handler mainHandler) { return new AutoHideController(context, mainHandler); } @Singleton @Provides public ActivityManagerWrapper provideActivityManagerWrapper() { return ActivityManagerWrapper.getInstance(); } @Singleton @Provides public DevicePolicyManagerWrapper provideDevicePolicyManagerWrapper() { return DevicePolicyManagerWrapper.getInstance(); } @Singleton @Provides public PackageManagerWrapper providePackageManagerWrapper() { return PackageManagerWrapper.getInstance(); } }