1 /* 2 * Copyright (C) 2023 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 package com.android.systemui.tv.dagger 17 18 import android.app.Activity 19 import android.content.Context 20 import android.hardware.SensorPrivacyManager 21 import com.android.internal.logging.UiEventLogger 22 import com.android.keyguard.KeyguardViewController 23 import com.android.systemui.Dependency 24 import com.android.systemui.accessibility.AccessibilityModule 25 import com.android.systemui.accessibility.data.repository.AccessibilityRepositoryModule 26 import com.android.systemui.animation.DialogTransitionAnimator 27 import com.android.systemui.broadcast.BroadcastSender 28 import com.android.systemui.communal.posturing.dagger.NoopPosturingModule 29 import com.android.systemui.dagger.ReferenceSystemUIModule 30 import com.android.systemui.dagger.SysUISingleton 31 import com.android.systemui.display.ui.viewmodel.ConnectingDisplayViewModel 32 import com.android.systemui.dock.DockManager 33 import com.android.systemui.dock.DockManagerImpl 34 import com.android.systemui.doze.DozeHost 35 import com.android.systemui.media.dialog.MediaOutputDialogManager 36 import com.android.systemui.media.dialog.MediaSwitchingController 37 import com.android.systemui.media.muteawait.MediaMuteAwaitConnectionCli 38 import com.android.systemui.media.nearby.NearbyMediaDevicesManager 39 import com.android.systemui.navigationbar.gestural.GestureModule 40 import com.android.systemui.plugins.qs.QSFactory 41 import com.android.systemui.power.dagger.PowerModule 42 import com.android.systemui.privacy.MediaProjectionPrivacyItemMonitor 43 import com.android.systemui.privacy.PrivacyItemMonitor 44 import com.android.systemui.qs.dagger.QSModule 45 import com.android.systemui.qs.tileimpl.QSFactoryImpl 46 import com.android.systemui.screenshot.ReferenceScreenshotModule 47 import com.android.systemui.settings.MultiUserUtilsModule 48 import com.android.systemui.settings.UserTracker 49 import com.android.systemui.settings.brightness.dagger.BrightnessSliderModule 50 import com.android.systemui.shade.ShadeEmptyImplModule 51 import com.android.systemui.statusbar.KeyboardShortcutsModule 52 import com.android.systemui.statusbar.NotificationListener 53 import com.android.systemui.statusbar.NotificationLockscreenUserManager 54 import com.android.systemui.statusbar.NotificationLockscreenUserManagerImpl 55 import com.android.systemui.statusbar.NotificationShadeWindowController 56 import com.android.systemui.statusbar.events.StatusBarEventsModule 57 import com.android.systemui.statusbar.notification.dagger.ReferenceNotificationsModule 58 import com.android.systemui.statusbar.notification.headsup.HeadsUpEmptyImplModule 59 import com.android.systemui.statusbar.phone.DozeServiceHost 60 import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager 61 import com.android.systemui.statusbar.policy.AospPolicyModule 62 import com.android.systemui.statusbar.policy.DeviceProvisionedController 63 import com.android.systemui.statusbar.policy.DeviceProvisionedControllerImpl 64 import com.android.systemui.statusbar.policy.IndividualSensorPrivacyController 65 import com.android.systemui.statusbar.policy.IndividualSensorPrivacyControllerImpl 66 import com.android.systemui.statusbar.policy.SensorPrivacyController 67 import com.android.systemui.statusbar.policy.SensorPrivacyControllerImpl 68 import com.android.systemui.tv.hdmi.HdmiModule 69 import com.android.systemui.tv.media.TvMediaOutputDialogActivity 70 import com.android.systemui.tv.media.TvMediaOutputDialogManager 71 import com.android.systemui.tv.notifications.TvNotificationHandler 72 import com.android.systemui.tv.notifications.TvNotificationsModule 73 import com.android.systemui.tv.privacy.PrivacyModule 74 import com.android.systemui.tv.sensorprivacy.TvSensorPrivacyModule 75 import com.android.systemui.tv.shade.TvNotificationShadeWindowController 76 import com.android.systemui.tv.volume.dagger.TvVolumeModule 77 import com.android.systemui.unfold.SysUIUnfoldStartableModule 78 import com.android.systemui.usb.UsbAccessoryUriActivity 79 import com.android.systemui.usb.UsbDebuggingActivity 80 import com.android.systemui.usb.UsbDebuggingSecondaryUserActivity 81 import com.android.systemui.user.CreateUserActivity 82 import dagger.Binds 83 import dagger.Module 84 import dagger.Provides 85 import dagger.multibindings.ClassKey 86 import dagger.multibindings.IntoMap 87 import dagger.multibindings.IntoSet 88 import javax.inject.Named 89 import kotlinx.coroutines.ExperimentalCoroutinesApi 90 91 /** 92 * A TV specific version of [ReferenceSystemUIModule]. 93 * 94 * Code here should be specific to the TV variant of SystemUI and will not be included in other 95 * variants of SystemUI. 96 */ 97 @Module( 98 includes = [ 99 AccessibilityModule::class, 100 AccessibilityRepositoryModule::class, 101 AospPolicyModule::class, 102 BrightnessSliderModule::class, 103 ConnectingDisplayViewModel.StartableModule::class, 104 GestureModule::class, 105 HdmiModule::class, 106 HeadsUpEmptyImplModule::class, 107 KeyboardShortcutsModule::class, 108 MediaMuteAwaitConnectionCli.StartableModule::class, 109 MultiUserUtilsModule::class, 110 NearbyMediaDevicesManager.StartableModule::class, 111 NoopPosturingModule::class, 112 PowerModule::class, 113 PrivacyModule::class, 114 QSModule::class, 115 ReferenceNotificationsModule::class, 116 ReferenceScreenshotModule::class, 117 ShadeEmptyImplModule::class, 118 StatusBarEventsModule::class, 119 SysUIUnfoldStartableModule::class, 120 TvNotificationsModule::class, 121 TvSensorPrivacyModule::class, 122 TvVolumeModule::class, 123 ] 124 ) 125 abstract class TvSystemUIModule { 126 @Binds bindNotificationLockscreenUserManagernull127 abstract fun bindNotificationLockscreenUserManager( 128 notificationLockscreenUserManager: NotificationLockscreenUserManagerImpl 129 ): NotificationLockscreenUserManager 130 131 @Binds 132 @SysUISingleton 133 abstract fun bindQSFactory(qsFactoryImpl: QSFactoryImpl): QSFactory 134 135 @Binds 136 abstract fun bindDockManager(dockManager: DockManagerImpl): DockManager 137 138 @Binds 139 abstract fun bindKeyguardViewController( 140 statusBarKeyguardViewManager: StatusBarKeyguardViewManager 141 ): KeyguardViewController 142 143 @Binds 144 abstract fun bindNotificationShadeController( 145 notificationShadeWindowController: TvNotificationShadeWindowController 146 ): NotificationShadeWindowController 147 148 @OptIn(ExperimentalCoroutinesApi::class) 149 @Binds 150 abstract fun provideDozeHost(dozeServiceHost: DozeServiceHost): DozeHost 151 152 /** 153 * Binds [MediaProjectionPrivacyItemMonitor] into the set of [PrivacyItemMonitor]. 154 */ 155 @Binds 156 @IntoSet 157 abstract fun bindMediaProjectionPrivacyItemMonitor( 158 mediaProjectionPrivacyItemMonitor: MediaProjectionPrivacyItemMonitor 159 ): PrivacyItemMonitor 160 161 @Binds 162 @IntoMap 163 @ClassKey(TvMediaOutputDialogActivity::class) 164 abstract fun provideTvMediaOutputDialogActivity( 165 tvMediaOutputDialogActivity: TvMediaOutputDialogActivity 166 ): Activity 167 168 /** Inject into UsbDebuggingActivity. */ 169 @Binds 170 @IntoMap 171 @ClassKey(UsbDebuggingActivity::class) 172 abstract fun bindUsbDebuggingActivity(activity: UsbDebuggingActivity): Activity 173 174 /** Inject into UsbDebuggingSecondaryUserActivity. */ 175 @Binds 176 @IntoMap 177 @ClassKey(UsbDebuggingSecondaryUserActivity::class) 178 abstract fun bindUsbDebuggingSecondaryUserActivity( 179 activity: UsbDebuggingSecondaryUserActivity, 180 ): Activity 181 182 /** Inject into UsbAccessoryUriActivity. */ 183 @Binds 184 @IntoMap 185 @ClassKey(UsbAccessoryUriActivity::class) 186 abstract fun bindUsbAccessoryUriActivity(activity: UsbAccessoryUriActivity): Activity 187 188 /** Inject into CreateUserActivity. */ 189 @Binds 190 @IntoMap 191 @ClassKey(CreateUserActivity::class) 192 abstract fun bindCreateUserActivity(activity: CreateUserActivity): Activity 193 194 companion object { 195 @SysUISingleton 196 @Provides 197 @Named(Dependency.LEAK_REPORT_EMAIL_NAME) 198 fun provideLeakReportEmail(): String = "" 199 200 @Provides 201 @SysUISingleton 202 fun provideSensorPrivacyController( 203 sensorPrivacyManager: SensorPrivacyManager 204 ): SensorPrivacyController = 205 SensorPrivacyControllerImpl(sensorPrivacyManager).apply { init() } 206 207 @Provides 208 @SysUISingleton 209 fun provideIndividualSensorPrivacyController( 210 sensorPrivacyManager: SensorPrivacyManager, 211 userTracker: UserTracker 212 ): IndividualSensorPrivacyController = 213 IndividualSensorPrivacyControllerImpl( 214 sensorPrivacyManager, 215 userTracker 216 ).apply { init() } 217 218 @SysUISingleton 219 @Provides 220 @Named(Dependency.ALLOW_NOTIFICATION_LONG_PRESS_NAME) 221 fun provideAllowNotificationLongPress(): Boolean = true 222 223 @SysUISingleton 224 @Provides 225 fun providesDeviceProvisionedController( 226 deviceProvisionedController: DeviceProvisionedControllerImpl 227 ): DeviceProvisionedController { 228 deviceProvisionedController.init() 229 return deviceProvisionedController 230 } 231 232 @Provides 233 @SysUISingleton 234 fun provideTvNotificationHandler( 235 notificationListener: NotificationListener 236 ): TvNotificationHandler = TvNotificationHandler(notificationListener) 237 238 @Provides 239 fun provideMediaOutputDialogFactory( 240 context: Context, 241 broadcastSender: BroadcastSender, 242 uiEventLogger: UiEventLogger, 243 dialogTransitionAnimator: DialogTransitionAnimator, 244 mediaSwitchingControllerFactory: MediaSwitchingController.Factory, 245 ): MediaOutputDialogManager = 246 TvMediaOutputDialogManager( 247 context, 248 broadcastSender, 249 uiEventLogger, 250 dialogTransitionAnimator, 251 mediaSwitchingControllerFactory 252 ) 253 } 254 } 255