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