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