• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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