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