1 /*
2  * Copyright (C) 2024 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.bluetooth.qsdialog.dagger
18 
19 import com.android.settingslib.bluetooth.LocalBluetoothManager
20 import com.android.settingslib.flags.Flags
21 import com.android.settingslib.volume.data.repository.AudioSharingRepository as SettingsLibAudioSharingRepository
22 import com.android.systemui.bluetooth.qsdialog.ActiveMediaDeviceItemFactory
23 import com.android.systemui.bluetooth.qsdialog.AudioSharingDeviceItemActionInteractorImpl
24 import com.android.systemui.bluetooth.qsdialog.AudioSharingInteractor
25 import com.android.systemui.bluetooth.qsdialog.AudioSharingInteractorEmptyImpl
26 import com.android.systemui.bluetooth.qsdialog.AudioSharingInteractorImpl
27 import com.android.systemui.bluetooth.qsdialog.AudioSharingMediaDeviceItemFactory
28 import com.android.systemui.bluetooth.qsdialog.AudioSharingRepository
29 import com.android.systemui.bluetooth.qsdialog.AudioSharingRepositoryEmptyImpl
30 import com.android.systemui.bluetooth.qsdialog.AudioSharingRepositoryImpl
31 import com.android.systemui.bluetooth.qsdialog.AvailableAudioSharingMediaDeviceItemFactory
32 import com.android.systemui.bluetooth.qsdialog.AvailableMediaDeviceItemFactory
33 import com.android.systemui.bluetooth.qsdialog.ConnectedDeviceItemFactory
34 import com.android.systemui.bluetooth.qsdialog.DeviceItemActionInteractor
35 import com.android.systemui.bluetooth.qsdialog.DeviceItemActionInteractorImpl
36 import com.android.systemui.bluetooth.qsdialog.DeviceItemFactory
37 import com.android.systemui.bluetooth.qsdialog.DeviceItemType
38 import com.android.systemui.bluetooth.qsdialog.SavedDeviceItemFactory
39 import com.android.systemui.dagger.SysUISingleton
40 import com.android.systemui.dagger.qualifiers.Background
41 import dagger.Lazy
42 import dagger.Module
43 import dagger.Provides
44 import kotlinx.coroutines.CoroutineDispatcher
45 
46 /** Dagger module for audio sharing code for BT QS dialog */
47 @Module
48 interface AudioSharingModule {
49 
50     companion object {
51         @Provides
52         @SysUISingleton
provideAudioSharingRepositorynull53         fun provideAudioSharingRepository(
54             localBluetoothManager: LocalBluetoothManager?,
55             settingsLibAudioSharingRepository: SettingsLibAudioSharingRepository,
56             @Background backgroundDispatcher: CoroutineDispatcher,
57         ): AudioSharingRepository =
58             if (
59                 (Flags.enableLeAudioSharing() || Flags.audioSharingDeveloperOption()) &&
60                     localBluetoothManager != null
61             ) {
62                 AudioSharingRepositoryImpl(
63                     localBluetoothManager,
64                     settingsLibAudioSharingRepository,
65                     backgroundDispatcher,
66                 )
67             } else {
68                 AudioSharingRepositoryEmptyImpl()
69             }
70 
71         @Provides
72         @SysUISingleton
provideAudioSharingInteractornull73         fun provideAudioSharingInteractor(
74             localBluetoothManager: LocalBluetoothManager?,
75             impl: Lazy<AudioSharingInteractorImpl>,
76             emptyImpl: Lazy<AudioSharingInteractorEmptyImpl>,
77         ): AudioSharingInteractor =
78             if (
79                 (Flags.enableLeAudioSharing() || Flags.audioSharingDeveloperOption()) &&
80                     localBluetoothManager != null
81             ) {
82                 impl.get()
83             } else {
84                 emptyImpl.get()
85             }
86 
87         @Provides
88         @SysUISingleton
provideDeviceItemActionInteractornull89         fun provideDeviceItemActionInteractor(
90             localBluetoothManager: LocalBluetoothManager?,
91             audioSharingImpl: Lazy<AudioSharingDeviceItemActionInteractorImpl>,
92             impl: Lazy<DeviceItemActionInteractorImpl>,
93         ): DeviceItemActionInteractor =
94             if (
95                 (Flags.enableLeAudioSharing() || Flags.audioSharingDeveloperOption()) &&
96                     localBluetoothManager != null
97             ) {
98                 audioSharingImpl.get()
99             } else {
100                 impl.get()
101             }
102 
103         @Provides
104         @SysUISingleton
provideDeviceItemFactoryListnull105         fun provideDeviceItemFactoryList(
106             localBluetoothManager: LocalBluetoothManager?
107         ): List<DeviceItemFactory> = buildList {
108             add(ActiveMediaDeviceItemFactory())
109             if (
110                 (Flags.enableLeAudioSharing() || Flags.audioSharingDeveloperOption()) &&
111                     localBluetoothManager != null
112             ) {
113                 add(AudioSharingMediaDeviceItemFactory(localBluetoothManager))
114                 add(AvailableAudioSharingMediaDeviceItemFactory(localBluetoothManager))
115             }
116             add(AvailableMediaDeviceItemFactory())
117             add(ConnectedDeviceItemFactory())
118             add(SavedDeviceItemFactory())
119         }
120 
121         @Provides
122         @SysUISingleton
provideDeviceItemDisplayPrioritynull123         fun provideDeviceItemDisplayPriority(
124             localBluetoothManager: LocalBluetoothManager?
125         ): List<DeviceItemType> = buildList {
126             add(DeviceItemType.ACTIVE_MEDIA_BLUETOOTH_DEVICE)
127             if (
128                 (Flags.enableLeAudioSharing() || Flags.audioSharingDeveloperOption()) &&
129                     localBluetoothManager != null
130             ) {
131                 add(DeviceItemType.AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE)
132                 add(DeviceItemType.AVAILABLE_AUDIO_SHARING_MEDIA_BLUETOOTH_DEVICE)
133             }
134             add(DeviceItemType.AVAILABLE_MEDIA_BLUETOOTH_DEVICE)
135             add(DeviceItemType.CONNECTED_BLUETOOTH_DEVICE)
136             add(DeviceItemType.SAVED_BLUETOOTH_DEVICE)
137         }
138     }
139 }
140