1 /*
2  * Copyright (C) 2022 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.statusbar.pipeline.dagger
18 
19 import android.net.wifi.WifiManager
20 import com.android.systemui.CoreStartable
21 import com.android.systemui.dagger.SysUISingleton
22 import com.android.systemui.flags.FeatureFlags
23 import com.android.systemui.flags.Flags
24 import com.android.systemui.log.LogBuffer
25 import com.android.systemui.log.LogBufferFactory
26 import com.android.systemui.log.table.TableLogBuffer
27 import com.android.systemui.log.table.TableLogBufferFactory
28 import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository
29 import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepositoryImpl
30 import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
31 import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl
32 import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigCoreStartable
33 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository
34 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileRepositorySwitcher
35 import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository
36 import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepositoryImpl
37 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
38 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorImpl
39 import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter
40 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
41 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
42 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxyImpl
43 import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxy
44 import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxyImpl
45 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
46 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl
47 import com.android.systemui.statusbar.pipeline.shared.ui.binder.CollapsedStatusBarViewBinder
48 import com.android.systemui.statusbar.pipeline.shared.ui.binder.CollapsedStatusBarViewBinderImpl
49 import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.CollapsedStatusBarViewModel
50 import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.CollapsedStatusBarViewModelImpl
51 import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
52 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
53 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryDagger
54 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositorySwitcher
55 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositoryViaTrackerLibDagger
56 import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.DisabledWifiRepository
57 import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl
58 import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryViaTrackerLib
59 import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
60 import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
61 import dagger.Binds
62 import dagger.Module
63 import dagger.Provides
64 import dagger.multibindings.ClassKey
65 import dagger.multibindings.IntoMap
66 import java.util.function.Supplier
67 import javax.inject.Named
68 import kotlinx.coroutines.flow.Flow
69 
70 @Module
71 abstract class StatusBarPipelineModule {
72     @Binds
73     abstract fun airplaneModeRepository(impl: AirplaneModeRepositoryImpl): AirplaneModeRepository
74 
75     @Binds
76     abstract fun airplaneModeViewModel(impl: AirplaneModeViewModelImpl): AirplaneModeViewModel
77 
78     @Binds
79     abstract fun connectivityRepository(impl: ConnectivityRepositoryImpl): ConnectivityRepository
80 
81     @Binds abstract fun wifiRepository(impl: WifiRepositorySwitcher): WifiRepository
82 
83     @Binds abstract fun wifiInteractor(impl: WifiInteractorImpl): WifiInteractor
84 
85     @Binds
86     abstract fun mobileConnectionsRepository(
87         impl: MobileRepositorySwitcher
88     ): MobileConnectionsRepository
89 
90     @Binds abstract fun userSetupRepository(impl: UserSetupRepositoryImpl): UserSetupRepository
91 
92     @Binds abstract fun mobileMappingsProxy(impl: MobileMappingsProxyImpl): MobileMappingsProxy
93 
94     @Binds
95     abstract fun subscriptionManagerProxy(
96         impl: SubscriptionManagerProxyImpl
97     ): SubscriptionManagerProxy
98 
99     @Binds
100     abstract fun mobileIconsInteractor(impl: MobileIconsInteractorImpl): MobileIconsInteractor
101 
102     @Binds
103     @IntoMap
104     @ClassKey(MobileUiAdapter::class)
105     abstract fun bindFeature(impl: MobileUiAdapter): CoreStartable
106 
107     @Binds
108     @IntoMap
109     @ClassKey(CarrierConfigCoreStartable::class)
110     abstract fun bindCarrierConfigStartable(impl: CarrierConfigCoreStartable): CoreStartable
111 
112     @Binds
113     abstract fun collapsedStatusBarViewModel(
114         impl: CollapsedStatusBarViewModelImpl
115     ): CollapsedStatusBarViewModel
116 
117     @Binds
118     abstract fun collapsedStatusBarViewBinder(
119         impl: CollapsedStatusBarViewBinderImpl
120     ): CollapsedStatusBarViewBinder
121 
122     @Binds
123     @IntoMap
124     @ClassKey(WifiRepositoryDagger::class)
125     abstract fun bindWifiRepositoryDagger(impl: WifiRepositoryDagger): CoreStartable
126 
127     companion object {
128         @Provides
129         @SysUISingleton
130         fun provideWifiRepositoryDagger(
131             wifiManager: WifiManager?,
132             disabledWifiRepository: DisabledWifiRepository,
133             wifiRepositoryImplFactory: WifiRepositoryImpl.Factory,
134         ): WifiRepositoryDagger {
135             // If we have a null [WifiManager], then the wifi repository should be permanently
136             // disabled.
137             return if (wifiManager == null) {
138                 disabledWifiRepository
139             } else {
140                 wifiRepositoryImplFactory.create(wifiManager)
141             }
142         }
143 
144         @Provides
145         @SysUISingleton
146         fun provideWifiRepositoryViaTrackerLibDagger(
147             wifiManager: WifiManager?,
148             disabledWifiRepository: DisabledWifiRepository,
149             wifiRepositoryFromTrackerLibFactory: WifiRepositoryViaTrackerLib.Factory,
150         ): WifiRepositoryViaTrackerLibDagger {
151             // If we have a null [WifiManager], then the wifi repository should be permanently
152             // disabled.
153             return if (wifiManager == null) {
154                 disabledWifiRepository
155             } else {
156                 wifiRepositoryFromTrackerLibFactory.create(wifiManager)
157             }
158         }
159 
160         @Provides
161         @SysUISingleton
162         fun provideRealWifiRepository(
163             wifiRepository: WifiRepositoryDagger,
164             wifiRepositoryFromTrackerLib: WifiRepositoryViaTrackerLibDagger,
165             flags: FeatureFlags,
166         ): RealWifiRepository {
167             return if (flags.isEnabled(Flags.WIFI_TRACKER_LIB_FOR_WIFI_ICON)) {
168                 wifiRepositoryFromTrackerLib
169             } else {
170                 wifiRepository
171             }
172         }
173 
174         @Provides
175         @SysUISingleton
176         @Named(FIRST_MOBILE_SUB_SHOWING_NETWORK_TYPE_ICON)
177         fun provideFirstMobileSubShowingNetworkTypeIconProvider(
178             mobileIconsViewModel: MobileIconsViewModel,
179         ): Supplier<Flow<Boolean>> {
180             return Supplier<Flow<Boolean>> {
181                 mobileIconsViewModel.firstMobileSubShowingNetworkTypeIcon
182             }
183         }
184 
185         @Provides
186         @SysUISingleton
187         @WifiInputLog
188         fun provideWifiInputLogBuffer(factory: LogBufferFactory): LogBuffer {
189             return factory.create("WifiInputLog", 50)
190         }
191 
192         @Provides
193         @SysUISingleton
194         @WifiTrackerLibInputLog
195         fun provideWifiTrackerLibInputLogBuffer(factory: LogBufferFactory): LogBuffer {
196             // WifiTrackerLib is pretty noisy, so give it more room than WifiInputLog.
197             return factory.create("WifiTrackerLibInputLog", 200)
198         }
199 
200         @Provides
201         @SysUISingleton
202         @WifiTableLog
203         fun provideWifiTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
204             return factory.create("WifiTableLog", 100)
205         }
206 
207         @Provides
208         @SysUISingleton
209         @WifiTrackerLibTableLog
210         fun provideWifiTrackerLibTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
211             return factory.create("WifiTrackerLibTableLog", 100)
212         }
213 
214         @Provides
215         @SysUISingleton
216         @AirplaneTableLog
217         fun provideAirplaneTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
218             return factory.create("AirplaneTableLog", 30)
219         }
220 
221         @Provides
222         @SysUISingleton
223         @SharedConnectivityInputLog
224         fun provideSharedConnectivityTableLogBuffer(factory: LogBufferFactory): LogBuffer {
225             return factory.create("SharedConnectivityInputLog", 60)
226         }
227 
228         @Provides
229         @SysUISingleton
230         @MobileSummaryLog
231         fun provideMobileSummaryLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
232             return factory.create("MobileSummaryLog", 100)
233         }
234 
235         @Provides
236         @SysUISingleton
237         @MobileInputLog
238         fun provideMobileInputLogBuffer(factory: LogBufferFactory): LogBuffer {
239             return factory.create("MobileInputLog", 100)
240         }
241 
242         @Provides
243         @SysUISingleton
244         @MobileViewLog
245         fun provideMobileViewLogBuffer(factory: LogBufferFactory): LogBuffer {
246             return factory.create("MobileViewLog", 100)
247         }
248 
249         @Provides
250         @SysUISingleton
251         @VerboseMobileViewLog
252         fun provideVerboseMobileViewLogBuffer(factory: LogBufferFactory): LogBuffer {
253             return factory.create("VerboseMobileViewLog", 100)
254         }
255 
256         const val FIRST_MOBILE_SUB_SHOWING_NETWORK_TYPE_ICON =
257             "FirstMobileSubShowingNetworkTypeIcon"
258     }
259 }
260