• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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.Flags
22 import com.android.systemui.dagger.SysUISingleton
23 import com.android.systemui.kairos.ExperimentalKairosApi
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.events.data.repository.SystemStatusEventAnimationRepository
29 import com.android.systemui.statusbar.events.data.repository.SystemStatusEventAnimationRepositoryImpl
30 import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository
31 import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepositoryImpl
32 import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
33 import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl
34 import com.android.systemui.statusbar.pipeline.icons.shared.BindableIconsRegistry
35 import com.android.systemui.statusbar.pipeline.icons.shared.BindableIconsRegistryImpl
36 import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigCoreStartable
37 import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepository
38 import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepositoryImpl
39 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository
40 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepositoryKairosAdapter
41 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileRepositorySwitcher
42 import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileRepositorySwitcherKairos
43 import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.DemoModeMobileConnectionDataSourceKairosImpl
44 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileConnectionRepositoryKairosFactoryImpl
45 import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileConnectionsRepositoryKairosImpl
46 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
47 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorImpl
48 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorKairosAdapter
49 import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractorKairosImpl
50 import com.android.systemui.statusbar.pipeline.mobile.ui.MobileUiAdapter
51 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
52 import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModelKairos
53 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
54 import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxyImpl
55 import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxy
56 import com.android.systemui.statusbar.pipeline.mobile.util.SubscriptionManagerProxyImpl
57 import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepository
58 import com.android.systemui.statusbar.pipeline.satellite.data.DeviceBasedSatelliteRepositorySwitcher
59 import com.android.systemui.statusbar.pipeline.satellite.data.RealDeviceBasedSatelliteRepository
60 import com.android.systemui.statusbar.pipeline.satellite.data.prod.DeviceBasedSatelliteRepositoryImpl
61 import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.DeviceBasedSatelliteViewModel
62 import com.android.systemui.statusbar.pipeline.satellite.ui.viewmodel.DeviceBasedSatelliteViewModelImpl
63 import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
64 import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstantsImpl
65 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
66 import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl
67 import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarViewBinder
68 import com.android.systemui.statusbar.pipeline.shared.ui.binder.HomeStatusBarViewBinderImpl
69 import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.HomeStatusBarViewModelFactory
70 import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModelImpl.HomeStatusBarViewModelFactoryImpl
71 import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
72 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
73 import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepositorySwitcher
74 import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.DisabledWifiRepository
75 import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl
76 import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
77 import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractorImpl
78 import com.android.systemui.statusbar.policy.data.repository.UserSetupRepository
79 import com.android.systemui.statusbar.policy.data.repository.UserSetupRepositoryImpl
80 import dagger.Binds
81 import dagger.Module
82 import dagger.Provides
83 import dagger.multibindings.ClassKey
84 import dagger.multibindings.IntoMap
85 import java.util.function.Supplier
86 import javax.inject.Named
87 import javax.inject.Provider
88 import kotlinx.coroutines.flow.Flow
89 
90 @OptIn(ExperimentalKairosApi::class)
91 @Module(
92     includes =
93         [
94             DemoModeMobileConnectionDataSourceKairosImpl.Module::class,
95             MobileRepositorySwitcherKairos.Module::class,
96             MobileConnectionsRepositoryKairosImpl.Module::class,
97             MobileIconsInteractorKairosImpl.Module::class,
98             MobileIconsViewModelKairos.Module::class,
99             MobileConnectionRepositoryKairosFactoryImpl.Module::class,
100             MobileConnectionsRepositoryKairosAdapter.Module::class,
101             MobileIconsInteractorKairosAdapter.Module::class,
102         ]
103 )
104 abstract class StatusBarPipelineModule {
105     @Binds
airplaneModeRepositorynull106     abstract fun airplaneModeRepository(impl: AirplaneModeRepositoryImpl): AirplaneModeRepository
107 
108     @Binds
109     abstract fun airplaneModeViewModel(impl: AirplaneModeViewModelImpl): AirplaneModeViewModel
110 
111     @Binds
112     abstract fun bindableIconsRepository(impl: BindableIconsRegistryImpl): BindableIconsRegistry
113 
114     @Binds
115     abstract fun connectivityRepository(impl: ConnectivityRepositoryImpl): ConnectivityRepository
116 
117     @Binds
118     abstract fun systemStatusEventAnimationRepository(
119         impl: SystemStatusEventAnimationRepositoryImpl
120     ): SystemStatusEventAnimationRepository
121 
122     @Binds
123     abstract fun realDeviceBasedSatelliteRepository(
124         impl: DeviceBasedSatelliteRepositoryImpl
125     ): RealDeviceBasedSatelliteRepository
126 
127     @Binds
128     abstract fun deviceBasedSatelliteRepository(
129         impl: DeviceBasedSatelliteRepositorySwitcher
130     ): DeviceBasedSatelliteRepository
131 
132     @Binds
133     abstract fun deviceBasedSatelliteViewModel(
134         impl: DeviceBasedSatelliteViewModelImpl
135     ): DeviceBasedSatelliteViewModel
136 
137     @Binds
138     abstract fun connectivityConstants(impl: ConnectivityConstantsImpl): ConnectivityConstants
139 
140     @Binds abstract fun wifiRepository(impl: WifiRepositorySwitcher): WifiRepository
141 
142     @Binds abstract fun wifiInteractor(impl: WifiInteractorImpl): WifiInteractor
143 
144     @Binds abstract fun userSetupRepository(impl: UserSetupRepositoryImpl): UserSetupRepository
145 
146     @Binds abstract fun mobileMappingsProxy(impl: MobileMappingsProxyImpl): MobileMappingsProxy
147 
148     @Binds
149     abstract fun carrierConfigRepository(impl: CarrierConfigRepositoryImpl): CarrierConfigRepository
150 
151     @Binds
152     abstract fun subscriptionManagerProxy(
153         impl: SubscriptionManagerProxyImpl
154     ): SubscriptionManagerProxy
155 
156     @Binds
157     @IntoMap
158     @ClassKey(MobileUiAdapter::class)
159     abstract fun bindFeature(impl: MobileUiAdapter): CoreStartable
160 
161     @Binds
162     @IntoMap
163     @ClassKey(CarrierConfigCoreStartable::class)
164     abstract fun bindCarrierConfigStartable(impl: CarrierConfigCoreStartable): CoreStartable
165 
166     @Binds
167     abstract fun homeStatusBarViewModelFactory(
168         impl: HomeStatusBarViewModelFactoryImpl
169     ): HomeStatusBarViewModelFactory
170 
171     @Binds
172     abstract fun homeStatusBarViewBinder(impl: HomeStatusBarViewBinderImpl): HomeStatusBarViewBinder
173 
174     companion object {
175 
176         @Provides
177         fun mobileIconsInteractor(
178             impl: Provider<MobileIconsInteractorImpl>,
179             kairosImpl: Provider<MobileIconsInteractorKairosAdapter>,
180         ): MobileIconsInteractor {
181             return if (Flags.statusBarMobileIconKairos()) {
182                 kairosImpl.get()
183             } else {
184                 impl.get()
185             }
186         }
187 
188         @Provides
189         fun mobileConnectionsRepository(
190             impl: Provider<MobileRepositorySwitcher>,
191             kairosImpl: Provider<MobileConnectionsRepositoryKairosAdapter>,
192         ): MobileConnectionsRepository {
193             return if (Flags.statusBarMobileIconKairos()) {
194                 kairosImpl.get()
195             } else {
196                 impl.get()
197             }
198         }
199 
200         @Provides
201         @SysUISingleton
202         fun provideRealWifiRepository(
203             wifiManager: WifiManager?,
204             disabledWifiRepository: DisabledWifiRepository,
205             wifiRepositoryImplFactory: WifiRepositoryImpl.Factory,
206         ): RealWifiRepository {
207             // If we have a null [WifiManager], then the wifi repository should be permanently
208             // disabled.
209             return if (wifiManager == null) {
210                 disabledWifiRepository
211             } else {
212                 wifiRepositoryImplFactory.create(wifiManager)
213             }
214         }
215 
216         @Provides
217         @SysUISingleton
218         @Named(FIRST_MOBILE_SUB_SHOWING_NETWORK_TYPE_ICON)
219         fun provideFirstMobileSubShowingNetworkTypeIconProvider(
220             mobileIconsViewModel: MobileIconsViewModel
221         ): Supplier<Flow<Boolean>> {
222             // TODO: kairos-ify
223             return Supplier<Flow<Boolean>> {
224                 mobileIconsViewModel.firstMobileSubShowingNetworkTypeIcon
225             }
226         }
227 
228         @Provides
229         @SysUISingleton
230         @WifiInputLog
231         fun provideWifiLogBuffer(factory: LogBufferFactory): LogBuffer {
232             return factory.create("WifiInputLog", 200)
233         }
234 
235         @Provides
236         @SysUISingleton
237         @WifiTableLog
238         fun provideWifiTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
239             return factory.create("WifiTableLog", 100)
240         }
241 
242         @Provides
243         @SysUISingleton
244         @AirplaneTableLog
245         fun provideAirplaneTableLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
246             return factory.create("AirplaneTableLog", 30)
247         }
248 
249         @Provides
250         @SysUISingleton
251         @SharedConnectivityInputLog
252         fun provideSharedConnectivityTableLogBuffer(factory: LogBufferFactory): LogBuffer {
253             return factory.create("SharedConnectivityInputLog", 60)
254         }
255 
256         @Provides
257         @SysUISingleton
258         @MobileSummaryLog
259         fun provideMobileSummaryLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
260             return factory.create("MobileSummaryLog", 100)
261         }
262 
263         @Provides
264         @SysUISingleton
265         @MobileInputLog
266         fun provideMobileInputLogBuffer(factory: LogBufferFactory): LogBuffer {
267             return factory.create("MobileInputLog", 300)
268         }
269 
270         @Provides
271         @SysUISingleton
272         @MobileViewLog
273         fun provideMobileViewLogBuffer(factory: LogBufferFactory): LogBuffer {
274             return factory.create("MobileViewLog", 100)
275         }
276 
277         @Provides
278         @SysUISingleton
279         @VerboseMobileViewLog
280         fun provideVerboseMobileViewLogBuffer(factory: LogBufferFactory): LogBuffer {
281             return factory.create("VerboseMobileViewLog", 100)
282         }
283 
284         @Provides
285         @SysUISingleton
286         @DeviceBasedSatelliteInputLog
287         fun provideDeviceBasedSatelliteInputLog(factory: LogBufferFactory): LogBuffer {
288             return factory.create("DeviceBasedSatelliteInputLog", 200)
289         }
290 
291         @Provides
292         @SysUISingleton
293         @VerboseDeviceBasedSatelliteInputLog
294         fun provideVerboseDeviceBasedSatelliteInputLog(factory: LogBufferFactory): LogBuffer {
295             return factory.create("VerboseDeviceBasedSatelliteInputLog", 200)
296         }
297 
298         @Provides
299         @SysUISingleton
300         @DeviceBasedSatelliteTableLog
301         fun provideDeviceBasedSatelliteTableLog(factory: TableLogBufferFactory): TableLogBuffer {
302             return factory.create("DeviceBasedSatelliteTableLog", 200)
303         }
304 
305         const val FIRST_MOBILE_SUB_SHOWING_NETWORK_TYPE_ICON =
306             "FirstMobileSubShowingNetworkTypeIcon"
307     }
308 }
309