• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2025 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.tv.volume.dagger
18 
19 import android.content.BroadcastReceiver
20 import android.content.Context
21 import android.media.AudioManager
22 import android.os.Looper
23 import com.android.internal.jank.InteractionJankMonitor
24 import com.android.systemui.CoreStartable
25 import com.android.systemui.Flags
26 import com.android.systemui.dump.DumpManager
27 import com.android.systemui.media.dialog.MediaOutputDialogManager
28 import com.android.systemui.plugins.VolumeDialog
29 import com.android.systemui.plugins.VolumeDialogController
30 import com.android.systemui.statusbar.VibratorHelper
31 import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper
32 import com.android.systemui.statusbar.policy.ConfigurationController
33 import com.android.systemui.statusbar.policy.DevicePostureController
34 import com.android.systemui.statusbar.policy.DeviceProvisionedController
35 import com.android.systemui.tv.volume.dialog.dagger.TvVolumeDialogPluginComponent
36 import com.android.systemui.util.settings.SecureSettings
37 import com.android.systemui.util.time.SystemClock
38 import com.android.systemui.volume.CsdWarningDialog
39 import com.android.systemui.volume.VolumeComponent
40 import com.android.systemui.volume.VolumeDialogComponent
41 import com.android.systemui.volume.VolumeDialogImpl
42 import com.android.systemui.volume.VolumePanelDialogReceiver
43 import com.android.systemui.volume.VolumeUI
44 import com.android.systemui.volume.dagger.AncModule
45 import com.android.systemui.volume.dagger.AudioModule
46 import com.android.systemui.volume.dagger.AudioSharingModule
47 import com.android.systemui.volume.dagger.CaptioningModule
48 import com.android.systemui.volume.dagger.MediaDevicesModule
49 import com.android.systemui.volume.dagger.SpatializerModule
50 import com.android.systemui.volume.dialog.VolumeDialogPlugin
51 import com.android.systemui.volume.dialog.dagger.factory.VolumeDialogPluginComponentFactory
52 import com.android.systemui.volume.domain.interactor.VolumeDialogInteractor
53 import com.android.systemui.volume.domain.interactor.VolumePanelNavigationInteractor
54 import com.android.systemui.volume.panel.dagger.VolumePanelComponent
55 import com.android.systemui.volume.panel.dagger.factory.VolumePanelComponentFactory
56 import com.android.systemui.volume.panel.shared.flag.VolumePanelFlag
57 import com.android.systemui.volume.ui.navigation.VolumeNavigator
58 import com.google.android.msdl.domain.MSDLPlayer
59 import dagger.Binds
60 import dagger.Lazy
61 import dagger.Module
62 import dagger.Provides
63 import dagger.multibindings.ClassKey
64 import dagger.multibindings.IntoMap
65 import dagger.multibindings.IntoSet
66 
67 @Module(
68     includes =
69         [
70             AudioModule::class,
71             AudioSharingModule::class,
72             AncModule::class,
73             CaptioningModule::class,
74             MediaDevicesModule::class,
75             SpatializerModule::class,
76         ],
77     subcomponents = [VolumePanelComponent::class, TvVolumeDialogPluginComponent::class],
78 )
79 interface TvVolumeModule {
80 
81     @Binds
82     @IntoMap
83     @ClassKey(VolumePanelDialogReceiver::class)
bindVolumePanelDialogReceivernull84     fun bindVolumePanelDialogReceiver(receiver: VolumePanelDialogReceiver): BroadcastReceiver
85 
86     @Binds
87     @IntoMap
88     @ClassKey(VolumeUI::class)
89     fun bindVolumeUIStartable(impl: VolumeUI): CoreStartable
90 
91     @Binds
92     @IntoSet
93     fun bindVolumeUIConfigChanges(impl: VolumeUI): ConfigurationController.ConfigurationListener
94 
95     @Binds fun provideVolumeComponent(volumeDialogComponent: VolumeDialogComponent): VolumeComponent
96 
97     @Binds
98     fun bindVolumePanelComponentFactory(
99         impl: VolumePanelComponent.Factory
100     ): VolumePanelComponentFactory
101 
102     @Binds
103     fun bindVolumeDialogPluginComponentFactory(
104         impl: TvVolumeDialogPluginComponent.Factory
105     ): VolumeDialogPluginComponentFactory
106 
107     companion object {
108         @Provides
109         fun provideVolumeDialog(
110             volumeDialogProvider: Lazy<VolumeDialogPlugin>,
111             context: Context,
112             volumeDialogController: VolumeDialogController,
113             accessibilityManagerWrapper: AccessibilityManagerWrapper,
114             deviceProvisionedController: DeviceProvisionedController,
115             configurationController: ConfigurationController,
116             mediaOutputDialogManager: MediaOutputDialogManager,
117             interactionJankMonitor: InteractionJankMonitor,
118             volumePanelNavigationInteractor: VolumePanelNavigationInteractor,
119             volumeNavigator: VolumeNavigator,
120             csdFactory: CsdWarningDialog.Factory,
121             devicePostureController: DevicePostureController,
122             volumePanelFlag: VolumePanelFlag,
123             dumpManager: DumpManager,
124             secureSettings: Lazy<SecureSettings>,
125             vibratorHelper: VibratorHelper,
126             msdlPlayer: MSDLPlayer,
127             systemClock: SystemClock,
128             interactor: VolumeDialogInteractor,
129         ): VolumeDialog {
130             return if (Flags.volumeRedesign()) {
131                 volumeDialogProvider.get()
132             } else {
133                 VolumeDialogImpl(
134                         context,
135                         volumeDialogController,
136                         accessibilityManagerWrapper,
137                         deviceProvisionedController,
138                         configurationController,
139                         mediaOutputDialogManager,
140                         interactionJankMonitor,
141                         volumePanelNavigationInteractor,
142                         volumeNavigator,
143                         true,
144                         csdFactory,
145                         devicePostureController,
146                         Looper.getMainLooper(),
147                         volumePanelFlag,
148                         dumpManager,
149                         secureSettings,
150                         vibratorHelper,
151                         msdlPlayer,
152                         systemClock,
153                         interactor,
154                     )
155                     .apply {
156                         setStreamImportant(AudioManager.STREAM_SYSTEM, false)
157                         setAutomute(true)
158                         setSilentMode(false)
159                     }
160             }
161         }
162     }
163 }
164