Merge changes from topic "caitlinshk-wifi-logging-split" into tm-qpr-dev

* changes:
  [SB Refactor] Remove non-mobile usages of MobileInputLogger.
  [SB Refactor] Re-name ConnectivityPipelineLogger -> MobileInputLogger.
  [SB Refactor] Define a new buffer for the shared connectivity repo.
  [SB Refactor] Don't use ConnectivityPipelineLogger for the airplane VM.
  [SB Refactor] Split the wifi input logging into its own class.
This commit is contained in:
Caitlin Shkuratov
2023-02-15 16:34:29 +00:00
committed by Android (Google) Code Review
38 changed files with 752 additions and 741 deletions

View File

@@ -451,7 +451,6 @@
-packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherController.kt -packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherController.kt
-packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherFeatureController.kt -packages/SystemUI/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherFeatureController.kt
-packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt -packages/SystemUI/src/com/android/systemui/statusbar/pipeline/dagger/StatusBarPipelineModule.kt
-packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt
-packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt -packages/SystemUI/src/com/android/systemui/statusbar/policy/BatteryStateNotifier.kt
-packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt -packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsController.kt
-packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt -packages/SystemUI/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImpl.kt
@@ -736,7 +735,6 @@
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallLoggerTest.kt -packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallLoggerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/panelstate/ShadeExpansionStateManagerTest.kt -packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/panelstate/ShadeExpansionStateManagerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherControllerOldImplTest.kt -packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/userswitcher/StatusBarUserSwitcherControllerOldImplTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLoggerTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt -packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/BatteryStateNotifierTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ClockTest.kt -packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ClockTest.kt
-packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt -packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/DeviceControlsControllerImplTest.kt

View File

@@ -265,16 +265,6 @@ public class LogModule {
return factory.create("MediaCarouselCtlrLog", 20); return factory.create("MediaCarouselCtlrLog", 20);
} }
/**
* Provides a {@link LogBuffer} for use in the status bar connectivity pipeline
*/
@Provides
@SysUISingleton
@StatusBarConnectivityLog
public static LogBuffer provideStatusBarConnectivityBuffer(LogBufferFactory factory) {
return factory.create("SbConnectivity", 64);
}
/** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */ /** Allows logging buffers to be tweaked via adb on debug builds but not on prod builds. */
@Provides @Provides
@SysUISingleton @SysUISingleton

View File

@@ -18,9 +18,10 @@ package com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger import com.android.systemui.statusbar.pipeline.dagger.AirplaneTableLog
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logOutputChange
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
@@ -46,7 +47,7 @@ class AirplaneModeViewModelImpl
@Inject @Inject
constructor( constructor(
interactor: AirplaneModeInteractor, interactor: AirplaneModeInteractor,
logger: ConnectivityPipelineLogger, @AirplaneTableLog logger: TableLogBuffer,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
) : AirplaneModeViewModel { ) : AirplaneModeViewModel {
override val isAirplaneModeIconVisible: StateFlow<Boolean> = override val isAirplaneModeIconVisible: StateFlow<Boolean> =
@@ -56,6 +57,11 @@ constructor(
isAirplaneMode && !isAirplaneIconForceHidden isAirplaneMode && !isAirplaneIconForceHidden
} }
.distinctUntilChanged() .distinctUntilChanged()
.logOutputChange(logger, "isAirplaneModeIconVisible") .logDiffsForTable(
logger,
columnPrefix = "",
columnName = "isAirplaneModeIconVisible",
initialValue = false,
)
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false) .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)
} }

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (C) 2022 The Android Open Source Project * Copyright (C) 2023 The Android Open Source Project
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -14,22 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
package com.android.systemui.log.dagger; package com.android.systemui.statusbar.pipeline.dagger
import static java.lang.annotation.RetentionPolicy.RUNTIME; import javax.inject.Qualifier
import com.android.systemui.plugins.log.LogBuffer; /** Logs for inputs into the mobile pipeline. */
import java.lang.annotation.Documented;
import java.lang.annotation.Retention;
import javax.inject.Qualifier;
/**
* A {@link LogBuffer} for status bar connectivity events.
*/
@Qualifier @Qualifier
@Documented @MustBeDocumented
@Retention(RUNTIME) @kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
public @interface StatusBarConnectivityLog { annotation class MobileInputLog
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.dagger
import javax.inject.Qualifier
/** Logs for connectivity-related inputs that are shared across wifi, mobile, etc. */
@Qualifier
@MustBeDocumented
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
annotation class SharedConnectivityInputLog

View File

@@ -19,8 +19,10 @@ package com.android.systemui.statusbar.pipeline.dagger
import android.net.wifi.WifiManager import android.net.wifi.WifiManager
import com.android.systemui.CoreStartable import com.android.systemui.CoreStartable
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.log.LogBufferFactory
import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.TableLogBufferFactory import com.android.systemui.log.table.TableLogBufferFactory
import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepository
import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepositoryImpl import com.android.systemui.statusbar.pipeline.airplane.data.repository.AirplaneModeRepositoryImpl
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
@@ -105,6 +107,13 @@ abstract class StatusBarPipelineModule {
} }
} }
@Provides
@SysUISingleton
@WifiInputLog
fun provideWifiInputLogBuffer(factory: LogBufferFactory): LogBuffer {
return factory.create("WifiInputLog", 50)
}
@Provides @Provides
@SysUISingleton @SysUISingleton
@WifiTableLog @WifiTableLog
@@ -119,11 +128,25 @@ abstract class StatusBarPipelineModule {
return factory.create("AirplaneTableLog", 30) return factory.create("AirplaneTableLog", 30)
} }
@Provides
@SysUISingleton
@SharedConnectivityInputLog
fun provideSharedConnectivityTableLogBuffer(factory: LogBufferFactory): LogBuffer {
return factory.create("SharedConnectivityInputLog", 30)
}
@Provides @Provides
@SysUISingleton @SysUISingleton
@MobileSummaryLog @MobileSummaryLog
fun provideMobileSummaryLogBuffer(factory: TableLogBufferFactory): TableLogBuffer { fun provideMobileSummaryLogBuffer(factory: TableLogBufferFactory): TableLogBuffer {
return factory.create("MobileSummaryLog", 100) return factory.create("MobileSummaryLog", 100)
} }
@Provides
@SysUISingleton
@MobileInputLog
fun provideMobileInputLogBuffer(factory: LogBufferFactory): LogBuffer {
return factory.create("MobileInputLog", 100)
}
} }
} }

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.dagger
import javax.inject.Qualifier
/** Wifi logs for inputs into the wifi pipeline. */
@Qualifier
@MustBeDocumented
@kotlin.annotation.Retention(AnnotationRetention.RUNTIME)
annotation class WifiInputLog

View File

@@ -31,7 +31,7 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -57,7 +57,7 @@ constructor(
broadcastDispatcher: BroadcastDispatcher, broadcastDispatcher: BroadcastDispatcher,
private val carrierConfigManager: CarrierConfigManager, private val carrierConfigManager: CarrierConfigManager,
dumpManager: DumpManager, dumpManager: DumpManager,
logger: ConnectivityPipelineLogger, logger: MobileInputLogger,
@Application scope: CoroutineScope, @Application scope: CoroutineScope,
) : Dumpable { ) : Dumpable {
private var isListening = false private var isListening = false

View File

@@ -47,8 +47,8 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.toNetworkNameMo
import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS
import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.CoroutineDispatcher
@@ -85,7 +85,7 @@ class MobileConnectionRepositoryImpl(
broadcastDispatcher: BroadcastDispatcher, broadcastDispatcher: BroadcastDispatcher,
private val mobileMappingsProxy: MobileMappingsProxy, private val mobileMappingsProxy: MobileMappingsProxy,
bgDispatcher: CoroutineDispatcher, bgDispatcher: CoroutineDispatcher,
logger: ConnectivityPipelineLogger, logger: MobileInputLogger,
override val tableLogBuffer: TableLogBuffer, override val tableLogBuffer: TableLogBuffer,
scope: CoroutineScope, scope: CoroutineScope,
) : MobileConnectionRepository { ) : MobileConnectionRepository {
@@ -291,7 +291,7 @@ class MobileConnectionRepositoryImpl(
private val broadcastDispatcher: BroadcastDispatcher, private val broadcastDispatcher: BroadcastDispatcher,
private val context: Context, private val context: Context,
private val telephonyManager: TelephonyManager, private val telephonyManager: TelephonyManager,
private val logger: ConnectivityPipelineLogger, private val logger: MobileInputLogger,
private val carrierConfigRepository: CarrierConfigRepository, private val carrierConfigRepository: CarrierConfigRepository,
private val mobileMappingsProxy: MobileMappingsProxy, private val mobileMappingsProxy: MobileMappingsProxy,
@Background private val bgDispatcher: CoroutineDispatcher, @Background private val bgDispatcher: CoroutineDispatcher,

View File

@@ -49,9 +49,8 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.MobileConnectiv
import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.model.NetworkNameModel
import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.MobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.util.kotlin.pairwise import com.android.systemui.util.kotlin.pairwise
@@ -84,7 +83,7 @@ constructor(
private val connectivityManager: ConnectivityManager, private val connectivityManager: ConnectivityManager,
private val subscriptionManager: SubscriptionManager, private val subscriptionManager: SubscriptionManager,
private val telephonyManager: TelephonyManager, private val telephonyManager: TelephonyManager,
private val logger: ConnectivityPipelineLogger, private val logger: MobileInputLogger,
@MobileSummaryLog private val tableLogger: TableLogBuffer, @MobileSummaryLog private val tableLogger: TableLogBuffer,
mobileMappingsProxy: MobileMappingsProxy, mobileMappingsProxy: MobileMappingsProxy,
broadcastDispatcher: BroadcastDispatcher, broadcastDispatcher: BroadcastDispatcher,
@@ -222,13 +221,13 @@ constructor(
private val carrierConfigChangedEvent = private val carrierConfigChangedEvent =
broadcastDispatcher broadcastDispatcher
.broadcastFlow(IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED)) .broadcastFlow(IntentFilter(CarrierConfigManager.ACTION_CARRIER_CONFIG_CHANGED))
.logInputChange(logger, "ACTION_CARRIER_CONFIG_CHANGED") .onEach { logger.logActionCarrierConfigChanged() }
override val defaultDataSubRatConfig: StateFlow<Config> = override val defaultDataSubRatConfig: StateFlow<Config> =
merge(defaultDataSubIdChangeEvent, carrierConfigChangedEvent) merge(defaultDataSubIdChangeEvent, carrierConfigChangedEvent)
.mapLatest { Config.readConfig(context) } .mapLatest { Config.readConfig(context) }
.distinctUntilChanged() .distinctUntilChanged()
.logInputChange(logger, "defaultDataSubRatConfig") .onEach { logger.logDefaultDataSubRatConfig(it) }
.stateIn( .stateIn(
scope, scope,
SharingStarted.WhileSubscribed(), SharingStarted.WhileSubscribed(),
@@ -239,13 +238,13 @@ constructor(
defaultDataSubRatConfig defaultDataSubRatConfig
.map { mobileMappingsProxy.mapIconSets(it) } .map { mobileMappingsProxy.mapIconSets(it) }
.distinctUntilChanged() .distinctUntilChanged()
.logInputChange(logger, "defaultMobileIconMapping") .onEach { logger.logDefaultMobileIconMapping(it) }
override val defaultMobileIconGroup: Flow<MobileIconGroup> = override val defaultMobileIconGroup: Flow<MobileIconGroup> =
defaultDataSubRatConfig defaultDataSubRatConfig
.map { mobileMappingsProxy.getDefaultIcons(it) } .map { mobileMappingsProxy.getDefaultIcons(it) }
.distinctUntilChanged() .distinctUntilChanged()
.logInputChange(logger, "defaultMobileIconGroup") .onEach { logger.logDefaultMobileIconGroup(it) }
override fun getRepoForSubId(subId: Int): FullMobileConnectionRepository { override fun getRepoForSubId(subId: Int): FullMobileConnectionRepository {
if (!isValidSubId(subId)) { if (!isValidSubId(subId)) {

View File

@@ -30,7 +30,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionMod
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.UserSetupRepository
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepository
import com.android.systemui.util.CarrierConfigTracker import com.android.systemui.util.CarrierConfigTracker
@@ -111,7 +110,6 @@ class MobileIconsInteractorImpl
constructor( constructor(
private val mobileConnectionsRepo: MobileConnectionsRepository, private val mobileConnectionsRepo: MobileConnectionsRepository,
private val carrierConfigTracker: CarrierConfigTracker, private val carrierConfigTracker: CarrierConfigTracker,
private val logger: ConnectivityPipelineLogger,
@MobileSummaryLog private val tableLogger: TableLogBuffer, @MobileSummaryLog private val tableLogger: TableLogBuffer,
connectivityRepository: ConnectivityRepository, connectivityRepository: ConnectivityRepository,
userSetupRepo: UserSetupRepository, userSetupRepo: UserSetupRepository,

View File

@@ -0,0 +1,202 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.mobile.shared
import android.net.Network
import android.net.NetworkCapabilities
import android.telephony.ServiceState
import android.telephony.SignalStrength
import android.telephony.TelephonyDisplayInfo
import com.android.settingslib.SignalIcon
import com.android.settingslib.mobile.MobileMappings
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel
import com.android.systemui.statusbar.pipeline.dagger.MobileInputLog
import com.android.systemui.statusbar.pipeline.shared.LoggerHelper
import javax.inject.Inject
/** Logs for inputs into the mobile pipeline. */
@SysUISingleton
class MobileInputLogger
@Inject
constructor(
@MobileInputLog private val buffer: LogBuffer,
) {
fun logOnCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities,
isDefaultNetworkCallback: Boolean,
) {
LoggerHelper.logOnCapabilitiesChanged(
buffer,
TAG,
network,
networkCapabilities,
isDefaultNetworkCallback,
)
}
fun logOnLost(network: Network) {
LoggerHelper.logOnLost(buffer, TAG, network)
}
fun logOnServiceStateChanged(serviceState: ServiceState, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
bool1 = serviceState.isEmergencyOnly
bool2 = serviceState.roaming
str1 = serviceState.operatorAlphaShort
},
{
"onServiceStateChanged: subId=$int1 emergencyOnly=$bool1 roaming=$bool2" +
" operator=$str1"
}
)
}
fun logOnSignalStrengthsChanged(signalStrength: SignalStrength, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
str1 = signalStrength.toString()
},
{ "onSignalStrengthsChanged: subId=$int1 strengths=$str1" }
)
}
fun logOnDataConnectionStateChanged(dataState: Int, networkType: Int, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
int2 = dataState
str1 = networkType.toString()
},
{ "onDataConnectionStateChanged: subId=$int1 dataState=$int2 networkType=$str1" },
)
}
fun logOnDataActivity(direction: Int, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
int2 = direction
},
{ "onDataActivity: subId=$int1 direction=$int2" },
)
}
fun logOnCarrierNetworkChange(active: Boolean, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
bool1 = active
},
{ "onCarrierNetworkChange: subId=$int1 active=$bool1" },
)
}
fun logOnDisplayInfoChanged(displayInfo: TelephonyDisplayInfo, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
str1 = displayInfo.toString()
},
{ "onDisplayInfoChanged: subId=$int1 displayInfo=$str1" },
)
}
fun logUiAdapterSubIdsUpdated(subs: List<Int>) {
buffer.log(
TAG,
LogLevel.INFO,
{ str1 = subs.toString() },
{ "Sub IDs in MobileUiAdapter updated internally: $str1" },
)
}
fun logUiAdapterSubIdsSentToIconController(subs: List<Int>) {
buffer.log(
TAG,
LogLevel.INFO,
{ str1 = subs.toString() },
{ "Sub IDs in MobileUiAdapter being sent to icon controller: $str1" },
)
}
fun logCarrierConfigChanged(subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{ int1 = subId },
{ "onCarrierConfigChanged: subId=$int1" },
)
}
fun logOnDataEnabledChanged(enabled: Boolean, subId: Int) {
buffer.log(
TAG,
LogLevel.INFO,
{
int1 = subId
bool1 = enabled
},
{ "onDataEnabledChanged: subId=$int1 enabled=$bool1" },
)
}
fun logActionCarrierConfigChanged() {
buffer.log(TAG, LogLevel.INFO, {}, { "Intent received: ACTION_CARRIER_CONFIG_CHANGED" })
}
fun logDefaultDataSubRatConfig(config: MobileMappings.Config) {
buffer.log(
TAG,
LogLevel.INFO,
{ str1 = config.toString() },
{ "defaultDataSubRatConfig: $str1" }
)
}
fun logDefaultMobileIconMapping(mapping: Map<String, SignalIcon.MobileIconGroup>) {
buffer.log(
TAG,
LogLevel.INFO,
{ str1 = mapping.toString() },
{ "defaultMobileIconMapping: $str1" }
)
}
fun logDefaultMobileIconGroup(group: SignalIcon.MobileIconGroup) {
buffer.log(TAG, LogLevel.INFO, { str1 = group.name }, { "defaultMobileIconGroup: $str1" })
}
}
private const val TAG = "MobileInputLog"

View File

@@ -22,8 +22,8 @@ import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel import com.android.systemui.statusbar.pipeline.mobile.ui.viewmodel.MobileIconsViewModel
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -55,7 +55,7 @@ constructor(
interactor: MobileIconsInteractor, interactor: MobileIconsInteractor,
private val iconController: StatusBarIconController, private val iconController: StatusBarIconController,
private val iconsViewModelFactory: MobileIconsViewModel.Factory, private val iconsViewModelFactory: MobileIconsViewModel.Factory,
private val logger: ConnectivityPipelineLogger, private val logger: MobileInputLogger,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
private val statusBarPipelineFlags: StatusBarPipelineFlags, private val statusBarPipelineFlags: StatusBarPipelineFlags,
) : CoreStartable { ) : CoreStartable {

View File

@@ -25,7 +25,6 @@ import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.Airpla
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.MobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView import com.android.systemui.statusbar.pipeline.mobile.ui.view.ModernStatusBarMobileView
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
@@ -42,7 +41,6 @@ constructor(
val subscriptionIdsFlow: StateFlow<List<Int>>, val subscriptionIdsFlow: StateFlow<List<Int>>,
private val interactor: MobileIconsInteractor, private val interactor: MobileIconsInteractor,
private val airplaneModeInteractor: AirplaneModeInteractor, private val airplaneModeInteractor: AirplaneModeInteractor,
private val logger: ConnectivityPipelineLogger,
private val constants: ConnectivityConstants, private val constants: ConnectivityConstants,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
private val statusBarPipelineFlags: StatusBarPipelineFlags, private val statusBarPipelineFlags: StatusBarPipelineFlags,
@@ -83,7 +81,6 @@ constructor(
constructor( constructor(
private val interactor: MobileIconsInteractor, private val interactor: MobileIconsInteractor,
private val airplaneModeInteractor: AirplaneModeInteractor, private val airplaneModeInteractor: AirplaneModeInteractor,
private val logger: ConnectivityPipelineLogger,
private val constants: ConnectivityConstants, private val constants: ConnectivityConstants,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
private val statusBarPipelineFlags: StatusBarPipelineFlags, private val statusBarPipelineFlags: StatusBarPipelineFlags,
@@ -93,7 +90,6 @@ constructor(
subscriptionIdsFlow, subscriptionIdsFlow,
interactor, interactor,
airplaneModeInteractor, airplaneModeInteractor,
logger,
constants, constants,
scope, scope,
statusBarPipelineFlags, statusBarPipelineFlags,

View File

@@ -22,7 +22,6 @@ import com.android.systemui.Dumpable
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.SB_LOGGING_TAG
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
@@ -40,7 +39,7 @@ constructor(
telephonyManager: TelephonyManager, telephonyManager: TelephonyManager,
) : Dumpable { ) : Dumpable {
init { init {
dumpManager.registerNormalDumpable("${SB_LOGGING_TAG}Constants", this) dumpManager.registerNormalDumpable("ConnectivityConstants", this)
} }
/** True if this device has the capability for data connections and false otherwise. */ /** True if this device has the capability for data connections and false otherwise. */

View File

@@ -0,0 +1,37 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.shared
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel
import com.android.systemui.statusbar.pipeline.dagger.SharedConnectivityInputLog
import javax.inject.Inject
/** Logs for connectivity-related inputs that are shared across wifi, mobile, etc. */
@SysUISingleton
class ConnectivityInputLogger
@Inject
constructor(
@SharedConnectivityInputLog private val buffer: LogBuffer,
) {
fun logTuningChanged(tuningList: String?) {
buffer.log(TAG, LogLevel.DEBUG, { str1 = tuningList }, { "onTuningChanged: $str1" })
}
}
private const val TAG = "ConnectivityInputLogger"

View File

@@ -1,285 +0,0 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.shared
import android.net.Network
import android.net.NetworkCapabilities
import android.telephony.ServiceState
import android.telephony.SignalStrength
import android.telephony.TelephonyDisplayInfo
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.log.dagger.StatusBarConnectivityLog
import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel
import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionModel
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.toString
import javax.inject.Inject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.onEach
@SysUISingleton
class ConnectivityPipelineLogger
@Inject
constructor(
@StatusBarConnectivityLog private val buffer: LogBuffer,
) {
/**
* Logs a change in one of the **raw inputs** to the connectivity pipeline.
*
* Use this method for inputs that don't have any extra information besides their callback name.
*/
fun logInputChange(callbackName: String) {
buffer.log(SB_LOGGING_TAG, LogLevel.INFO, { str1 = callbackName }, { "Input: $str1" })
}
/** Logs a change in one of the **raw inputs** to the connectivity pipeline. */
fun logInputChange(callbackName: String, changeInfo: String?) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
str1 = callbackName
str2 = changeInfo
},
{ "Input: $str1: $str2" }
)
}
/** Logs a **data transformation** that we performed within the connectivity pipeline. */
fun logTransformation(transformationName: String, oldValue: Any?, newValue: Any?) {
if (oldValue == newValue) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
str1 = transformationName
str2 = oldValue.toString()
},
{ "Transform: $str1: $str2 (transformation didn't change it)" }
)
} else {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
str1 = transformationName
str2 = oldValue.toString()
str3 = newValue.toString()
},
{ "Transform: $str1: $str2 -> $str3" }
)
}
}
/** Logs a change in one of the **outputs** to the connectivity pipeline. */
fun logOutputChange(outputParamName: String, changeInfo: String) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
str1 = outputParamName
str2 = changeInfo
},
{ "Output: $str1: $str2" }
)
}
fun logOnCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities,
isDefaultNetworkCallback: Boolean,
) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
bool1 = isDefaultNetworkCallback
int1 = network.getNetId()
str1 = networkCapabilities.toString()
},
{ "onCapabilitiesChanged[default=$bool1]: net=$int1 capabilities=$str1" }
)
}
fun logOnLost(network: Network) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{ int1 = network.getNetId() },
{ "onLost: net=$int1" }
)
}
fun logOnServiceStateChanged(serviceState: ServiceState, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
bool1 = serviceState.isEmergencyOnly
bool2 = serviceState.roaming
str1 = serviceState.operatorAlphaShort
},
{
"onServiceStateChanged: subId=$int1 emergencyOnly=$bool1 roaming=$bool2" +
" operator=$str1"
}
)
}
fun logOnSignalStrengthsChanged(signalStrength: SignalStrength, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
str1 = signalStrength.toString()
},
{ "onSignalStrengthsChanged: subId=$int1 strengths=$str1" }
)
}
fun logOnDataConnectionStateChanged(dataState: Int, networkType: Int, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
int2 = dataState
str1 = networkType.toString()
},
{ "onDataConnectionStateChanged: subId=$int1 dataState=$int2 networkType=$str1" },
)
}
fun logOnDataActivity(direction: Int, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
int2 = direction
},
{ "onDataActivity: subId=$int1 direction=$int2" },
)
}
fun logOnCarrierNetworkChange(active: Boolean, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
bool1 = active
},
{ "onCarrierNetworkChange: subId=$int1 active=$bool1" },
)
}
fun logOnDisplayInfoChanged(displayInfo: TelephonyDisplayInfo, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
str1 = displayInfo.toString()
},
{ "onDisplayInfoChanged: subId=$int1 displayInfo=$str1" },
)
}
// TODO(b/238425913): We should split this class into mobile-specific and wifi-specific loggers.
fun logUiAdapterSubIdsUpdated(subs: List<Int>) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{ str1 = subs.toString() },
{ "Sub IDs in MobileUiAdapter updated internally: $str1" },
)
}
fun logUiAdapterSubIdsSentToIconController(subs: List<Int>) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{ str1 = subs.toString() },
{ "Sub IDs in MobileUiAdapter being sent to icon controller: $str1" },
)
}
fun logCarrierConfigChanged(subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{ int1 = subId },
{ "onCarrierConfigChanged: subId=$int1" },
)
}
fun logOnDataEnabledChanged(enabled: Boolean, subId: Int) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{
int1 = subId
bool1 = enabled
},
{ "onDataEnabledChanged: subId=$int1 enabled=$bool1" },
)
}
companion object {
const val SB_LOGGING_TAG = "SbConnectivity"
/** Log a change in one of the **inputs** to the connectivity pipeline. */
fun Flow<Unit>.logInputChange(
logger: ConnectivityPipelineLogger,
inputParamName: String,
): Flow<Unit> {
return this.onEach { logger.logInputChange(inputParamName) }
}
/**
* Log a change in one of the **inputs** to the connectivity pipeline.
*
* @param prettyPrint an optional function to transform the value into a readable string.
* [toString] is used if no custom function is provided.
*/
fun <T> Flow<T>.logInputChange(
logger: ConnectivityPipelineLogger,
inputParamName: String,
prettyPrint: (T) -> String = { it.toString() }
): Flow<T> {
return this.onEach { logger.logInputChange(inputParamName, prettyPrint(it)) }
}
/**
* Log a change in one of the **outputs** to the connectivity pipeline.
*
* @param prettyPrint an optional function to transform the value into a readable string.
* [toString] is used if no custom function is provided.
*/
fun <T> Flow<T>.logOutputChange(
logger: ConnectivityPipelineLogger,
outputParamName: String,
prettyPrint: (T) -> String = { it.toString() }
): Flow<T> {
return this.onEach { logger.logOutputChange(outputParamName, prettyPrint(it)) }
}
}
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.shared
import android.net.Network
import android.net.NetworkCapabilities
import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel
/** Helper object for logs that are shared between wifi and mobile. */
object LoggerHelper {
fun logOnCapabilitiesChanged(
buffer: LogBuffer,
tag: String,
network: Network,
networkCapabilities: NetworkCapabilities,
isDefaultNetworkCallback: Boolean,
) {
buffer.log(
tag,
LogLevel.INFO,
{
bool1 = isDefaultNetworkCallback
int1 = network.getNetId()
str1 = networkCapabilities.toString()
},
{ "onCapabilitiesChanged[default=$bool1]: net=$int1 capabilities=$str1" }
)
}
fun logOnLost(buffer: LogBuffer, tag: String, network: Network) {
buffer.log(tag, LogLevel.INFO, { int1 = network.getNetId() }, { "onLost: net=$int1" })
}
}

View File

@@ -26,8 +26,7 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.phone.StatusBarIconController
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger import com.android.systemui.statusbar.pipeline.shared.ConnectivityInputLogger
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.SB_LOGGING_TAG
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots
import com.android.systemui.tuner.TunerService import com.android.systemui.tuner.TunerService
@@ -45,59 +44,61 @@ import kotlinx.coroutines.flow.stateIn
* types of connectivity (wifi, mobile, ethernet, etc.) * types of connectivity (wifi, mobile, ethernet, etc.)
*/ */
interface ConnectivityRepository { interface ConnectivityRepository {
/** /** Observable for the current set of connectivity icons that should be force-hidden. */
* Observable for the current set of connectivity icons that should be force-hidden.
*/
val forceHiddenSlots: StateFlow<Set<ConnectivitySlot>> val forceHiddenSlots: StateFlow<Set<ConnectivitySlot>>
} }
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
@SysUISingleton @SysUISingleton
class ConnectivityRepositoryImpl @Inject constructor( class ConnectivityRepositoryImpl
@Inject
constructor(
private val connectivitySlots: ConnectivitySlots, private val connectivitySlots: ConnectivitySlots,
context: Context, context: Context,
dumpManager: DumpManager, dumpManager: DumpManager,
logger: ConnectivityPipelineLogger, logger: ConnectivityInputLogger,
@Application scope: CoroutineScope, @Application scope: CoroutineScope,
tunerService: TunerService, tunerService: TunerService,
) : ConnectivityRepository, Dumpable { ) : ConnectivityRepository, Dumpable {
init { init {
dumpManager.registerDumpable("${SB_LOGGING_TAG}Repository", this) dumpManager.registerDumpable("ConnectivityRepository", this)
} }
// The default set of hidden icons to use if we don't get any from [TunerService]. // The default set of hidden icons to use if we don't get any from [TunerService].
private val defaultHiddenIcons: Set<ConnectivitySlot> = private val defaultHiddenIcons: Set<ConnectivitySlot> =
context.resources.getStringArray(DEFAULT_HIDDEN_ICONS_RESOURCE) context.resources
.asList() .getStringArray(DEFAULT_HIDDEN_ICONS_RESOURCE)
.toSlotSet(connectivitySlots) .asList()
.toSlotSet(connectivitySlots)
override val forceHiddenSlots: StateFlow<Set<ConnectivitySlot>> = conflatedCallbackFlow { override val forceHiddenSlots: StateFlow<Set<ConnectivitySlot>> =
val callback = object : TunerService.Tunable { conflatedCallbackFlow {
override fun onTuningChanged(key: String, newHideList: String?) { val callback =
if (key != HIDDEN_ICONS_TUNABLE_KEY) { object : TunerService.Tunable {
return override fun onTuningChanged(key: String, newHideList: String?) {
} if (key != HIDDEN_ICONS_TUNABLE_KEY) {
logger.logInputChange("onTuningChanged", newHideList) return
}
logger.logTuningChanged(newHideList)
val outputList = newHideList?.split(",")?.toSlotSet(connectivitySlots) val outputList =
?: defaultHiddenIcons newHideList?.split(",")?.toSlotSet(connectivitySlots)
trySend(outputList) ?: defaultHiddenIcons
trySend(outputList)
}
}
tunerService.addTunable(callback, HIDDEN_ICONS_TUNABLE_KEY)
awaitClose { tunerService.removeTunable(callback) }
} }
} .stateIn(
tunerService.addTunable(callback, HIDDEN_ICONS_TUNABLE_KEY) scope,
started = SharingStarted.WhileSubscribed(),
awaitClose { tunerService.removeTunable(callback) } initialValue = defaultHiddenIcons
} )
.stateIn(
scope,
started = SharingStarted.WhileSubscribed(),
initialValue = defaultHiddenIcons
)
override fun dump(pw: PrintWriter, args: Array<out String>) { override fun dump(pw: PrintWriter, args: Array<out String>) {
pw.apply { pw.apply { println("defaultHiddenIcons=$defaultHiddenIcons") }
println("defaultHiddenIcons=$defaultHiddenIcons")
}
} }
companion object { companion object {
@@ -111,8 +112,7 @@ class ConnectivityRepositoryImpl @Inject constructor(
private fun List<String>.toSlotSet( private fun List<String>.toSlotSet(
connectivitySlots: ConnectivitySlots connectivitySlots: ConnectivitySlots
): Set<ConnectivitySlot> { ): Set<ConnectivitySlot> {
return this return this.filter { it.isNotBlank() }
.filter { it.isNotBlank() }
.mapNotNull { connectivitySlots.getSlotFromName(it) } .mapNotNull { connectivitySlots.getSlotFromName(it) }
.toSet() .toSet()
} }

View File

@@ -39,12 +39,11 @@ import com.android.systemui.dagger.qualifiers.Main
import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.log.table.logDiffsForTable import com.android.systemui.log.table.logDiffsForTable
import com.android.systemui.statusbar.pipeline.dagger.WifiTableLog import com.android.systemui.statusbar.pipeline.dagger.WifiTableLog
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.shared.data.model.toWifiDataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.toWifiDataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.RealWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.WifiRepository
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiInputLogger
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import java.util.concurrent.Executor import java.util.concurrent.Executor
import javax.inject.Inject import javax.inject.Inject
@@ -58,6 +57,7 @@ import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.merge import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
/** Real implementation of [WifiRepository]. */ /** Real implementation of [WifiRepository]. */
@@ -70,7 +70,7 @@ class WifiRepositoryImpl
constructor( constructor(
broadcastDispatcher: BroadcastDispatcher, broadcastDispatcher: BroadcastDispatcher,
connectivityManager: ConnectivityManager, connectivityManager: ConnectivityManager,
logger: ConnectivityPipelineLogger, logger: WifiInputLogger,
@WifiTableLog wifiTableLogBuffer: TableLogBuffer, @WifiTableLog wifiTableLogBuffer: TableLogBuffer,
@Main mainExecutor: Executor, @Main mainExecutor: Executor,
@Application scope: CoroutineScope, @Application scope: CoroutineScope,
@@ -80,7 +80,7 @@ constructor(
private val wifiStateChangeEvents: Flow<Unit> = private val wifiStateChangeEvents: Flow<Unit> =
broadcastDispatcher broadcastDispatcher
.broadcastFlow(IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION)) .broadcastFlow(IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION))
.logInputChange(logger, "WIFI_STATE_CHANGED_ACTION intent") .onEach { logger.logIntent("WIFI_STATE_CHANGED_ACTION") }
private val wifiNetworkChangeEvents: MutableSharedFlow<Unit> = private val wifiNetworkChangeEvents: MutableSharedFlow<Unit> =
MutableSharedFlow(extraBufferCapacity = 1) MutableSharedFlow(extraBufferCapacity = 1)
@@ -173,11 +173,6 @@ constructor(
networkCapabilities, networkCapabilities,
wifiManager, wifiManager,
) )
logger.logTransformation(
WIFI_NETWORK_CALLBACK_NAME,
oldValue = currentWifi,
newValue = wifiNetworkModel,
)
currentWifi = wifiNetworkModel currentWifi = wifiNetworkModel
trySend(wifiNetworkModel) trySend(wifiNetworkModel)
} }
@@ -194,11 +189,6 @@ constructor(
wifi.networkId == network.getNetId() wifi.networkId == network.getNetId()
) { ) {
val newNetworkModel = WifiNetworkModel.Inactive val newNetworkModel = WifiNetworkModel.Inactive
logger.logTransformation(
WIFI_NETWORK_CALLBACK_NAME,
oldValue = wifi,
newValue = newNetworkModel,
)
currentWifi = newNetworkModel currentWifi = newNetworkModel
trySend(newNetworkModel) trySend(newNetworkModel)
} }
@@ -228,7 +218,7 @@ constructor(
override val wifiActivity: StateFlow<DataActivityModel> = override val wifiActivity: StateFlow<DataActivityModel> =
conflatedCallbackFlow { conflatedCallbackFlow {
val callback = TrafficStateCallback { state -> val callback = TrafficStateCallback { state ->
logger.logInputChange("onTrafficStateChange", prettyPrintActivity(state)) logger.logActivity(prettyPrintActivity(state))
trySend(state.toWifiDataActivityModel()) trySend(state.toWifiDataActivityModel())
} }
wifiManager.registerTrafficStateCallback(mainExecutor, callback) wifiManager.registerTrafficStateCallback(mainExecutor, callback)
@@ -336,8 +326,6 @@ constructor(
.addTransportType(TRANSPORT_CELLULAR) .addTransportType(TRANSPORT_CELLULAR)
.build() .build()
private const val WIFI_NETWORK_CALLBACK_NAME = "wifiNetworkModel"
private const val CARRIER_MERGED_INVALID_SUB_ID_REASON = private const val CARRIER_MERGED_INVALID_SUB_ID_REASON =
"Wifi network was carrier merged but had invalid sub ID" "Wifi network was carrier merged but had invalid sub ID"
} }
@@ -348,7 +336,7 @@ constructor(
constructor( constructor(
private val broadcastDispatcher: BroadcastDispatcher, private val broadcastDispatcher: BroadcastDispatcher,
private val connectivityManager: ConnectivityManager, private val connectivityManager: ConnectivityManager,
private val logger: ConnectivityPipelineLogger, private val logger: WifiInputLogger,
@WifiTableLog private val wifiTableLogBuffer: TableLogBuffer, @WifiTableLog private val wifiTableLogBuffer: TableLogBuffer,
@Main private val mainExecutor: Executor, @Main private val mainExecutor: Executor,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,

View File

@@ -21,7 +21,6 @@ import com.android.systemui.Dumpable
import com.android.systemui.R import com.android.systemui.R
import com.android.systemui.dagger.SysUISingleton import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.SB_LOGGING_TAG
import java.io.PrintWriter import java.io.PrintWriter
import javax.inject.Inject import javax.inject.Inject
@@ -30,12 +29,14 @@ import javax.inject.Inject
* logging purposes. * logging purposes.
*/ */
@SysUISingleton @SysUISingleton
class WifiConstants @Inject constructor( class WifiConstants
context: Context, @Inject
dumpManager: DumpManager, constructor(
context: Context,
dumpManager: DumpManager,
) : Dumpable { ) : Dumpable {
init { init {
dumpManager.registerDumpable("${SB_LOGGING_TAG}WifiConstants", this) dumpManager.registerNormalDumpable("WifiConstants", this)
} }
/** True if we should always show the wifi icon when wifi is enabled and false otherwise. */ /** True if we should always show the wifi icon when wifi is enabled and false otherwise. */
@@ -43,8 +44,6 @@ class WifiConstants @Inject constructor(
context.resources.getBoolean(R.bool.config_showWifiIndicatorWhenEnabled) context.resources.getBoolean(R.bool.config_showWifiIndicatorWhenEnabled)
override fun dump(pw: PrintWriter, args: Array<out String>) { override fun dump(pw: PrintWriter, args: Array<out String>) {
pw.apply { pw.apply { println("alwaysShowIconIfEnabled=$alwaysShowIconIfEnabled") }
println("alwaysShowIconIfEnabled=$alwaysShowIconIfEnabled")
}
} }
} }

View File

@@ -0,0 +1,64 @@
/*
* Copyright (C) 2023 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.wifi.shared
import android.net.Network
import android.net.NetworkCapabilities
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel
import com.android.systemui.statusbar.pipeline.dagger.WifiInputLog
import com.android.systemui.statusbar.pipeline.shared.LoggerHelper
import javax.inject.Inject
/**
* Logger for all the wifi-related inputs (intents, callbacks, etc.) that the wifi repo receives.
*/
@SysUISingleton
class WifiInputLogger
@Inject
constructor(
@WifiInputLog val buffer: LogBuffer,
) {
fun logOnCapabilitiesChanged(
network: Network,
networkCapabilities: NetworkCapabilities,
isDefaultNetworkCallback: Boolean,
) {
LoggerHelper.logOnCapabilitiesChanged(
buffer,
TAG,
network,
networkCapabilities,
isDefaultNetworkCallback,
)
}
fun logOnLost(network: Network) {
LoggerHelper.logOnLost(buffer, TAG, network)
}
fun logIntent(intentName: String) {
buffer.log(TAG, LogLevel.DEBUG, { str1 = intentName }, { "Intent received: $str1" })
}
fun logActivity(activity: String) {
buffer.log(TAG, LogLevel.DEBUG, { str1 = activity }, { "Activity: $str1" })
}
}
private const val TAG = "WifiInputLog"

View File

@@ -34,8 +34,6 @@ import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
import com.android.systemui.statusbar.pipeline.dagger.WifiTableLog import com.android.systemui.statusbar.pipeline.dagger.WifiTableLog
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logOutputChange
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants
@@ -69,7 +67,6 @@ constructor(
airplaneModeViewModel: AirplaneModeViewModel, airplaneModeViewModel: AirplaneModeViewModel,
connectivityConstants: ConnectivityConstants, connectivityConstants: ConnectivityConstants,
private val context: Context, private val context: Context,
logger: ConnectivityPipelineLogger,
@WifiTableLog wifiTableLogBuffer: TableLogBuffer, @WifiTableLog wifiTableLogBuffer: TableLogBuffer,
interactor: WifiInteractor, interactor: WifiInteractor,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
@@ -143,29 +140,35 @@ constructor(
) )
/** The wifi activity status. Null if we shouldn't display the activity status. */ /** The wifi activity status. Null if we shouldn't display the activity status. */
private val activity: Flow<DataActivityModel?> = private val activity: Flow<DataActivityModel> = run {
val default = DataActivityModel(hasActivityIn = false, hasActivityOut = false)
if (!connectivityConstants.shouldShowActivityConfig) { if (!connectivityConstants.shouldShowActivityConfig) {
flowOf(null) flowOf(default)
} else { } else {
combine(interactor.activity, interactor.ssid) { activity, ssid -> combine(interactor.activity, interactor.ssid) { activity, ssid ->
when (ssid) { when (ssid) {
null -> null null -> default
else -> activity else -> activity
} }
} }
} }
.distinctUntilChanged() .distinctUntilChanged()
.logOutputChange(logger, "activity") .logDiffsForTable(
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = null) wifiTableLogBuffer,
columnPrefix = "VM.activity",
initialValue = default,
)
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = default)
}
private val isActivityInViewVisible: Flow<Boolean> = private val isActivityInViewVisible: Flow<Boolean> =
activity activity
.map { it?.hasActivityIn == true } .map { it.hasActivityIn }
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false) .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)
private val isActivityOutViewVisible: Flow<Boolean> = private val isActivityOutViewVisible: Flow<Boolean> =
activity activity
.map { it?.hasActivityOut == true } .map { it.hasActivityOut }
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false) .stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)
private val isActivityContainerVisible: Flow<Boolean> = private val isActivityContainerVisible: Flow<Boolean> =

View File

@@ -18,9 +18,9 @@ package com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository import com.android.systemui.statusbar.pipeline.airplane.data.repository.FakeAirplaneModeRepository
import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.AirplaneModeInteractor
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -42,7 +42,7 @@ class AirplaneModeViewModelImplTest : SysuiTestCase() {
private lateinit var underTest: AirplaneModeViewModelImpl private lateinit var underTest: AirplaneModeViewModelImpl
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: TableLogBuffer
private lateinit var airplaneModeRepository: FakeAirplaneModeRepository private lateinit var airplaneModeRepository: FakeAirplaneModeRepository
private lateinit var connectivityRepository: FakeConnectivityRepository private lateinit var connectivityRepository: FakeConnectivityRepository
private lateinit var interactor: AirplaneModeInteractor private lateinit var interactor: AirplaneModeInteractor

View File

@@ -25,7 +25,7 @@ import com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfigTest.Companion.createTestConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfigTest.Companion.createTestConfig
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -53,7 +53,7 @@ class CarrierConfigRepositoryTest : SysuiTestCase() {
private lateinit var mockitoSession: MockitoSession private lateinit var mockitoSession: MockitoSession
private lateinit var carrierConfigCoreStartable: CarrierConfigCoreStartable private lateinit var carrierConfigCoreStartable: CarrierConfigCoreStartable
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: MobileInputLogger
@Mock private lateinit var carrierConfigManager: CarrierConfigManager @Mock private lateinit var carrierConfigManager: CarrierConfigManager
@Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var dumpManager: DumpManager

View File

@@ -33,8 +33,8 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.DemoM
import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.model.FakeNetworkEventModel import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.model.FakeNetworkEventModel
import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.validMobileEvent import com.android.systemui.statusbar.pipeline.mobile.data.repository.demo.validMobileEvent
import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileConnectionsRepositoryImpl import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileConnectionsRepositoryImpl
import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoModeWifiDataSource import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoModeWifiDataSource
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
@@ -81,7 +81,7 @@ class MobileRepositorySwitcherTest : SysuiTestCase() {
@Mock private lateinit var connectivityManager: ConnectivityManager @Mock private lateinit var connectivityManager: ConnectivityManager
@Mock private lateinit var subscriptionManager: SubscriptionManager @Mock private lateinit var subscriptionManager: SubscriptionManager
@Mock private lateinit var telephonyManager: TelephonyManager @Mock private lateinit var telephonyManager: TelephonyManager
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: MobileInputLogger
@Mock private lateinit var summaryLogger: TableLogBuffer @Mock private lateinit var summaryLogger: TableLogBuffer
@Mock private lateinit var demoModeController: DemoModeController @Mock private lateinit var demoModeController: DemoModeController
@Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var dumpManager: DumpManager

View File

@@ -65,8 +65,8 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrier
import com.android.systemui.statusbar.pipeline.mobile.data.model.toNetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.model.toNetworkNameModel
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS
import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
@@ -94,7 +94,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
private lateinit var connectionsRepo: FakeMobileConnectionsRepository private lateinit var connectionsRepo: FakeMobileConnectionsRepository
@Mock private lateinit var telephonyManager: TelephonyManager @Mock private lateinit var telephonyManager: TelephonyManager
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: MobileInputLogger
@Mock private lateinit var tableLogger: TableLogBuffer @Mock private lateinit var tableLogger: TableLogBuffer
private val scope = CoroutineScope(IMMEDIATE) private val scope = CoroutineScope(IMMEDIATE)

View File

@@ -42,8 +42,8 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionMod
import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.CarrierConfigRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository
import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Factory.Companion.tableBufferLogName import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.FullMobileConnectionRepository.Factory.Companion.tableBufferLogName
import com.android.systemui.statusbar.pipeline.mobile.shared.MobileInputLogger
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
@@ -86,7 +86,7 @@ class MobileConnectionsRepositoryTest : SysuiTestCase() {
@Mock private lateinit var connectivityManager: ConnectivityManager @Mock private lateinit var connectivityManager: ConnectivityManager
@Mock private lateinit var subscriptionManager: SubscriptionManager @Mock private lateinit var subscriptionManager: SubscriptionManager
@Mock private lateinit var telephonyManager: TelephonyManager @Mock private lateinit var telephonyManager: TelephonyManager
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: MobileInputLogger
@Mock private lateinit var summaryLogger: TableLogBuffer @Mock private lateinit var summaryLogger: TableLogBuffer
@Mock private lateinit var logBufferFactory: TableLogBufferFactory @Mock private lateinit var logBufferFactory: TableLogBufferFactory

View File

@@ -85,7 +85,6 @@ class MobileIconsInteractorTest : SysuiTestCase() {
MobileIconsInteractorImpl( MobileIconsInteractorImpl(
connectionsRepository, connectionsRepository,
carrierConfigTracker, carrierConfigTracker,
logger = mock(),
tableLogger = mock(), tableLogger = mock(),
connectivityRepository, connectivityRepository,
userSetupRepository, userSetupRepository,

View File

@@ -0,0 +1,80 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.mobile.shared
import android.net.Network
import android.net.NetworkCapabilities
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.log.LogBufferFactory
import com.android.systemui.plugins.log.LogcatEchoTracker
import com.google.common.truth.Truth.assertThat
import java.io.PrintWriter
import java.io.StringWriter
import org.junit.Test
import org.mockito.Mockito
import org.mockito.Mockito.mock
@SmallTest
class MobileInputLoggerTest : SysuiTestCase() {
private val buffer =
LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java)).create("buffer", 10)
private val logger = MobileInputLogger(buffer)
@Test
fun testLogNetworkCapsChange_bufferHasInfo() {
logger.logOnCapabilitiesChanged(NET_1, NET_1_CAPS, isDefaultNetworkCallback = true)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
val expectedNetId = NET_1_ID.toString()
val expectedCaps = NET_1_CAPS.toString()
assertThat(actualString).contains("true")
assertThat(actualString).contains(expectedNetId)
assertThat(actualString).contains(expectedCaps)
}
@Test
fun testLogOnLost_bufferHasNetIdOfLostNetwork() {
logger.logOnLost(NET_1)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
val expectedNetId = NET_1_ID.toString()
assertThat(actualString).contains(expectedNetId)
}
companion object {
private const val NET_1_ID = 100
private val NET_1 =
com.android.systemui.util.mockito.mock<Network>().also {
Mockito.`when`(it.getNetId()).thenReturn(NET_1_ID)
}
private val NET_1_CAPS =
NetworkCapabilities.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
.build()
}
}

View File

@@ -26,7 +26,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionMod
import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor import com.android.systemui.statusbar.pipeline.mobile.domain.interactor.FakeMobileIconsInteractor
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.mock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -51,7 +50,6 @@ class MobileIconsViewModelTest : SysuiTestCase() {
private lateinit var airplaneModeInteractor: AirplaneModeInteractor private lateinit var airplaneModeInteractor: AirplaneModeInteractor
@Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags @Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags
@Mock private lateinit var logger: ConnectivityPipelineLogger
@Mock private lateinit var constants: ConnectivityConstants @Mock private lateinit var constants: ConnectivityConstants
private val testDispatcher = UnconfinedTestDispatcher() private val testDispatcher = UnconfinedTestDispatcher()
@@ -77,7 +75,6 @@ class MobileIconsViewModelTest : SysuiTestCase() {
subscriptionIdsFlow, subscriptionIdsFlow,
interactor, interactor,
airplaneModeInteractor, airplaneModeInteractor,
logger,
constants, constants,
testScope.backgroundScope, testScope.backgroundScope,
statusBarPipelineFlags, statusBarPipelineFlags,

View File

@@ -1,141 +0,0 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.systemui.statusbar.pipeline.shared
import android.net.Network
import android.net.NetworkCapabilities
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager
import com.android.systemui.log.LogBufferFactory
import com.android.systemui.plugins.log.LogcatEchoTracker
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logInputChange
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.logOutputChange
import com.google.common.truth.Truth.assertThat
import java.io.PrintWriter
import java.io.StringWriter
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.runBlocking
import org.junit.Test
import org.mockito.Mockito
import org.mockito.Mockito.mock
@SmallTest
class ConnectivityPipelineLoggerTest : SysuiTestCase() {
private val buffer = LogBufferFactory(DumpManager(), mock(LogcatEchoTracker::class.java))
.create("buffer", 10)
private val logger = ConnectivityPipelineLogger(buffer)
@Test
fun testLogNetworkCapsChange_bufferHasInfo() {
logger.logOnCapabilitiesChanged(NET_1, NET_1_CAPS, isDefaultNetworkCallback = true)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
val expectedNetId = NET_1_ID.toString()
val expectedCaps = NET_1_CAPS.toString()
assertThat(actualString).contains("true")
assertThat(actualString).contains(expectedNetId)
assertThat(actualString).contains(expectedCaps)
}
@Test
fun testLogOnLost_bufferHasNetIdOfLostNetwork() {
logger.logOnLost(NET_1)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
val expectedNetId = NET_1_ID.toString()
assertThat(actualString).contains(expectedNetId)
}
@Test
fun logOutputChange_printsValuesAndNulls() = runBlocking(IMMEDIATE) {
val flow: Flow<Int?> = flowOf(1, null, 3)
val job = flow
.logOutputChange(logger, "testInts")
.launchIn(this)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
assertThat(actualString).contains("1")
assertThat(actualString).contains("null")
assertThat(actualString).contains("3")
job.cancel()
}
@Test
fun logInputChange_unit_printsInputName() = runBlocking(IMMEDIATE) {
val flow: Flow<Unit> = flowOf(Unit, Unit)
val job = flow
.logInputChange(logger, "testInputs")
.launchIn(this)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
assertThat(actualString).contains("testInputs")
job.cancel()
}
@Test
fun logInputChange_any_printsValuesAndNulls() = runBlocking(IMMEDIATE) {
val flow: Flow<Any?> = flowOf(null, 2, "threeString")
val job = flow
.logInputChange(logger, "testInputs")
.launchIn(this)
val stringWriter = StringWriter()
buffer.dump(PrintWriter(stringWriter), tailLength = 0)
val actualString = stringWriter.toString()
assertThat(actualString).contains("null")
assertThat(actualString).contains("2")
assertThat(actualString).contains("threeString")
job.cancel()
}
companion object {
private const val NET_1_ID = 100
private val NET_1 = com.android.systemui.util.mockito.mock<Network>().also {
Mockito.`when`(it.getNetId()).thenReturn(NET_1_ID)
}
private val NET_1_CAPS = NetworkCapabilities.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)
.build()
private val IMMEDIATE = Dispatchers.Main.immediate
}
}

View File

@@ -19,7 +19,7 @@ package com.android.systemui.statusbar.pipeline.shared.data.repository
import androidx.test.filters.SmallTest import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.dump.DumpManager import com.android.systemui.dump.DumpManager
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger import com.android.systemui.statusbar.pipeline.shared.ConnectivityInputLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlots
import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl.Companion.DEFAULT_HIDDEN_ICONS_RESOURCE import com.android.systemui.statusbar.pipeline.shared.data.repository.ConnectivityRepositoryImpl.Companion.DEFAULT_HIDDEN_ICONS_RESOURCE
@@ -52,7 +52,7 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
@Mock private lateinit var connectivitySlots: ConnectivitySlots @Mock private lateinit var connectivitySlots: ConnectivitySlots
@Mock private lateinit var dumpManager: DumpManager @Mock private lateinit var dumpManager: DumpManager
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: ConnectivityInputLogger
private lateinit var scope: CoroutineScope private lateinit var scope: CoroutineScope
@Mock private lateinit var tunerService: TunerService @Mock private lateinit var tunerService: TunerService
@@ -61,14 +61,15 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
MockitoAnnotations.initMocks(this) MockitoAnnotations.initMocks(this)
scope = CoroutineScope(IMMEDIATE) scope = CoroutineScope(IMMEDIATE)
underTest = ConnectivityRepositoryImpl( underTest =
connectivitySlots, ConnectivityRepositoryImpl(
context, connectivitySlots,
dumpManager, context,
logger, dumpManager,
scope, logger,
tunerService, scope,
) tunerService,
)
} }
@After @After
@@ -77,199 +78,179 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
} }
@Test @Test
fun forceHiddenSlots_initiallyGetsDefault() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_initiallyGetsDefault() =
setUpEthernetWifiMobileSlotNames() runBlocking(IMMEDIATE) {
context.getOrCreateTestableResources().addOverride( setUpEthernetWifiMobileSlotNames()
DEFAULT_HIDDEN_ICONS_RESOURCE, context
arrayOf(SLOT_WIFI, SLOT_ETHERNET) .getOrCreateTestableResources()
) .addOverride(DEFAULT_HIDDEN_ICONS_RESOURCE, arrayOf(SLOT_WIFI, SLOT_ETHERNET))
// Re-create our [ConnectivityRepositoryImpl], since it fetches // Re-create our [ConnectivityRepositoryImpl], since it fetches
// config_statusBarIconsToExclude when it's first constructed // config_statusBarIconsToExclude when it's first constructed
underTest = ConnectivityRepositoryImpl( underTest =
connectivitySlots, ConnectivityRepositoryImpl(
context, connectivitySlots,
dumpManager, context,
logger, dumpManager,
scope, logger,
tunerService, scope,
) tunerService,
)
var latest: Set<ConnectivitySlot>? = null var latest: Set<ConnectivitySlot>? = null
val job = underTest val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest = it }
.launchIn(this)
assertThat(latest).containsExactly(ConnectivitySlot.ETHERNET, ConnectivitySlot.WIFI) assertThat(latest).containsExactly(ConnectivitySlot.ETHERNET, ConnectivitySlot.WIFI)
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_slotNamesAdded_flowHasSlots() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_slotNamesAdded_flowHasSlots() =
setUpEthernetWifiMobileSlotNames() runBlocking(IMMEDIATE) {
setUpEthernetWifiMobileSlotNames()
var latest: Set<ConnectivitySlot>? = null var latest: Set<ConnectivitySlot>? = null
val job = underTest val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest = it }
.launchIn(this)
getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, SLOT_MOBILE) getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, SLOT_MOBILE)
assertThat(latest).containsExactly(ConnectivitySlot.MOBILE) assertThat(latest).containsExactly(ConnectivitySlot.MOBILE)
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_wrongKey_doesNotUpdate() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_wrongKey_doesNotUpdate() =
setUpEthernetWifiMobileSlotNames() runBlocking(IMMEDIATE) {
setUpEthernetWifiMobileSlotNames()
var latest: Set<ConnectivitySlot>? = null var latest: Set<ConnectivitySlot>? = null
val job = underTest val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest = it }
.launchIn(this)
getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, SLOT_MOBILE) getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, SLOT_MOBILE)
// WHEN onTuningChanged with the wrong key // WHEN onTuningChanged with the wrong key
getTunable().onTuningChanged("wrongKey", SLOT_WIFI) getTunable().onTuningChanged("wrongKey", SLOT_WIFI)
yield() yield()
// THEN we didn't update our value and still have the old one // THEN we didn't update our value and still have the old one
assertThat(latest).containsExactly(ConnectivitySlot.MOBILE) assertThat(latest).containsExactly(ConnectivitySlot.MOBILE)
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_slotNamesAddedThenNull_flowHasDefault() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_slotNamesAddedThenNull_flowHasDefault() =
setUpEthernetWifiMobileSlotNames() runBlocking(IMMEDIATE) {
context.getOrCreateTestableResources().addOverride( setUpEthernetWifiMobileSlotNames()
DEFAULT_HIDDEN_ICONS_RESOURCE, context
arrayOf(SLOT_WIFI, SLOT_ETHERNET) .getOrCreateTestableResources()
) .addOverride(DEFAULT_HIDDEN_ICONS_RESOURCE, arrayOf(SLOT_WIFI, SLOT_ETHERNET))
// Re-create our [ConnectivityRepositoryImpl], since it fetches // Re-create our [ConnectivityRepositoryImpl], since it fetches
// config_statusBarIconsToExclude when it's first constructed // config_statusBarIconsToExclude when it's first constructed
underTest = ConnectivityRepositoryImpl( underTest =
connectivitySlots, ConnectivityRepositoryImpl(
context, connectivitySlots,
dumpManager, context,
logger, dumpManager,
scope, logger,
tunerService, scope,
) tunerService,
)
var latest: Set<ConnectivitySlot>? = null var latest: Set<ConnectivitySlot>? = null
val job = underTest val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest = it }
.launchIn(this)
// First, update the slots // First, update the slots
getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, SLOT_MOBILE) getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, SLOT_MOBILE)
assertThat(latest).containsExactly(ConnectivitySlot.MOBILE) assertThat(latest).containsExactly(ConnectivitySlot.MOBILE)
// WHEN we update to a null value // WHEN we update to a null value
getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, null) getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, null)
yield() yield()
// THEN we go back to our default value // THEN we go back to our default value
assertThat(latest).containsExactly(ConnectivitySlot.ETHERNET, ConnectivitySlot.WIFI) assertThat(latest).containsExactly(ConnectivitySlot.ETHERNET, ConnectivitySlot.WIFI)
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_someInvalidSlotNames_flowHasValidSlotsOnly() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_someInvalidSlotNames_flowHasValidSlotsOnly() =
var latest: Set<ConnectivitySlot>? = null runBlocking(IMMEDIATE) {
val job = underTest var latest: Set<ConnectivitySlot>? = null
.forceHiddenSlots val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.onEach { latest = it }
.launchIn(this)
whenever(connectivitySlots.getSlotFromName(SLOT_WIFI)) whenever(connectivitySlots.getSlotFromName(SLOT_WIFI)).thenReturn(ConnectivitySlot.WIFI)
.thenReturn(ConnectivitySlot.WIFI) whenever(connectivitySlots.getSlotFromName(SLOT_MOBILE)).thenReturn(null)
whenever(connectivitySlots.getSlotFromName(SLOT_MOBILE)).thenReturn(null)
getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_WIFI,$SLOT_MOBILE") getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_WIFI,$SLOT_MOBILE")
assertThat(latest).containsExactly(ConnectivitySlot.WIFI) assertThat(latest).containsExactly(ConnectivitySlot.WIFI)
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_someEmptySlotNames_flowHasValidSlotsOnly() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_someEmptySlotNames_flowHasValidSlotsOnly() =
setUpEthernetWifiMobileSlotNames() runBlocking(IMMEDIATE) {
setUpEthernetWifiMobileSlotNames()
var latest: Set<ConnectivitySlot>? = null var latest: Set<ConnectivitySlot>? = null
val job = underTest val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest = it }
.launchIn(this)
// WHEN there's empty and blank slot names // WHEN there's empty and blank slot names
getTunable().onTuningChanged( getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_MOBILE, ,,$SLOT_WIFI")
HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_MOBILE, ,,$SLOT_WIFI"
)
// THEN we skip that slot but still process the other ones // THEN we skip that slot but still process the other ones
assertThat(latest).containsExactly(ConnectivitySlot.WIFI, ConnectivitySlot.MOBILE) assertThat(latest).containsExactly(ConnectivitySlot.WIFI, ConnectivitySlot.MOBILE)
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_allInvalidOrEmptySlotNames_flowHasEmpty() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_allInvalidOrEmptySlotNames_flowHasEmpty() =
var latest: Set<ConnectivitySlot>? = null runBlocking(IMMEDIATE) {
val job = underTest var latest: Set<ConnectivitySlot>? = null
.forceHiddenSlots val job = underTest.forceHiddenSlots.onEach { latest = it }.launchIn(this)
.onEach { latest = it }
.launchIn(this)
whenever(connectivitySlots.getSlotFromName(SLOT_WIFI)).thenReturn(null) whenever(connectivitySlots.getSlotFromName(SLOT_WIFI)).thenReturn(null)
whenever(connectivitySlots.getSlotFromName(SLOT_ETHERNET)).thenReturn(null) whenever(connectivitySlots.getSlotFromName(SLOT_ETHERNET)).thenReturn(null)
whenever(connectivitySlots.getSlotFromName(SLOT_MOBILE)).thenReturn(null) whenever(connectivitySlots.getSlotFromName(SLOT_MOBILE)).thenReturn(null)
getTunable().onTuningChanged( getTunable()
HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_MOBILE,,$SLOT_WIFI,$SLOT_ETHERNET,,," .onTuningChanged(
) HIDDEN_ICONS_TUNABLE_KEY,
"$SLOT_MOBILE,,$SLOT_WIFI,$SLOT_ETHERNET,,,"
)
assertThat(latest).isEmpty() assertThat(latest).isEmpty()
job.cancel() job.cancel()
} }
@Test @Test
fun forceHiddenSlots_newSubscriberGetsCurrentValue() = runBlocking(IMMEDIATE) { fun forceHiddenSlots_newSubscriberGetsCurrentValue() =
setUpEthernetWifiMobileSlotNames() runBlocking(IMMEDIATE) {
setUpEthernetWifiMobileSlotNames()
var latest1: Set<ConnectivitySlot>? = null var latest1: Set<ConnectivitySlot>? = null
val job1 = underTest val job1 = underTest.forceHiddenSlots.onEach { latest1 = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest1 = it }
.launchIn(this)
getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_WIFI,$SLOT_ETHERNET") getTunable().onTuningChanged(HIDDEN_ICONS_TUNABLE_KEY, "$SLOT_WIFI,$SLOT_ETHERNET")
assertThat(latest1).containsExactly(ConnectivitySlot.WIFI, ConnectivitySlot.ETHERNET) assertThat(latest1).containsExactly(ConnectivitySlot.WIFI, ConnectivitySlot.ETHERNET)
// WHEN we add a second subscriber after having already emitted a value // WHEN we add a second subscriber after having already emitted a value
var latest2: Set<ConnectivitySlot>? = null var latest2: Set<ConnectivitySlot>? = null
val job2 = underTest val job2 = underTest.forceHiddenSlots.onEach { latest2 = it }.launchIn(this)
.forceHiddenSlots
.onEach { latest2 = it }
.launchIn(this)
// THEN the second subscribe receives the already-emitted value // THEN the second subscribe receives the already-emitted value
assertThat(latest2).containsExactly(ConnectivitySlot.WIFI, ConnectivitySlot.ETHERNET) assertThat(latest2).containsExactly(ConnectivitySlot.WIFI, ConnectivitySlot.ETHERNET)
job1.cancel() job1.cancel()
job2.cancel() job2.cancel()
} }
private fun getTunable(): TunerService.Tunable { private fun getTunable(): TunerService.Tunable {
val callbackCaptor = argumentCaptor<TunerService.Tunable>() val callbackCaptor = argumentCaptor<TunerService.Tunable>()
@@ -280,10 +261,8 @@ class ConnectivityRepositoryImplTest : SysuiTestCase() {
private fun setUpEthernetWifiMobileSlotNames() { private fun setUpEthernetWifiMobileSlotNames() {
whenever(connectivitySlots.getSlotFromName(SLOT_ETHERNET)) whenever(connectivitySlots.getSlotFromName(SLOT_ETHERNET))
.thenReturn(ConnectivitySlot.ETHERNET) .thenReturn(ConnectivitySlot.ETHERNET)
whenever(connectivitySlots.getSlotFromName(SLOT_WIFI)) whenever(connectivitySlots.getSlotFromName(SLOT_WIFI)).thenReturn(ConnectivitySlot.WIFI)
.thenReturn(ConnectivitySlot.WIFI) whenever(connectivitySlots.getSlotFromName(SLOT_MOBILE)).thenReturn(ConnectivitySlot.MOBILE)
whenever(connectivitySlots.getSlotFromName(SLOT_MOBILE))
.thenReturn(ConnectivitySlot.MOBILE)
} }
companion object { companion object {

View File

@@ -23,11 +23,11 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.demomode.DemoMode import com.android.systemui.demomode.DemoMode
import com.android.systemui.demomode.DemoModeController import com.android.systemui.demomode.DemoModeController
import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoModeWifiDataSource import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoModeWifiDataSource
import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.DemoWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.model.FakeWifiEventModel import com.android.systemui.statusbar.pipeline.wifi.data.repository.demo.model.FakeWifiEventModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiInputLogger
import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.kotlinArgumentCaptor import com.android.systemui.util.mockito.kotlinArgumentCaptor
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
@@ -47,6 +47,7 @@ import org.mockito.Mockito
import org.mockito.MockitoAnnotations import org.mockito.MockitoAnnotations
@OptIn(ExperimentalCoroutinesApi::class) @OptIn(ExperimentalCoroutinesApi::class)
@Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
@SmallTest @SmallTest
class WifiRepositorySwitcherTest : SysuiTestCase() { class WifiRepositorySwitcherTest : SysuiTestCase() {
private lateinit var underTest: WifiRepositorySwitcher private lateinit var underTest: WifiRepositorySwitcher
@@ -54,7 +55,7 @@ class WifiRepositorySwitcherTest : SysuiTestCase() {
private lateinit var demoImpl: DemoWifiRepository private lateinit var demoImpl: DemoWifiRepository
@Mock private lateinit var demoModeController: DemoModeController @Mock private lateinit var demoModeController: DemoModeController
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: WifiInputLogger
@Mock private lateinit var tableLogger: TableLogBuffer @Mock private lateinit var tableLogger: TableLogBuffer
@Mock private lateinit var connectivityManager: ConnectivityManager @Mock private lateinit var connectivityManager: ConnectivityManager
@Mock private lateinit var wifiManager: WifiManager @Mock private lateinit var wifiManager: WifiManager

View File

@@ -34,9 +34,9 @@ import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase import com.android.systemui.SysuiTestCase
import com.android.systemui.broadcast.BroadcastDispatcher import com.android.systemui.broadcast.BroadcastDispatcher
import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.log.table.TableLogBuffer
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl.Companion.WIFI_NETWORK_DEFAULT import com.android.systemui.statusbar.pipeline.wifi.data.repository.prod.WifiRepositoryImpl.Companion.WIFI_NETWORK_DEFAULT
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiInputLogger
import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel import com.android.systemui.statusbar.pipeline.wifi.shared.model.WifiNetworkModel
import com.android.systemui.util.concurrency.FakeExecutor import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.any
@@ -72,7 +72,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
private lateinit var underTest: WifiRepositoryImpl private lateinit var underTest: WifiRepositoryImpl
@Mock private lateinit var broadcastDispatcher: BroadcastDispatcher @Mock private lateinit var broadcastDispatcher: BroadcastDispatcher
@Mock private lateinit var logger: ConnectivityPipelineLogger @Mock private lateinit var logger: WifiInputLogger
@Mock private lateinit var tableLogger: TableLogBuffer @Mock private lateinit var tableLogger: TableLogBuffer
@Mock private lateinit var connectivityManager: ConnectivityManager @Mock private lateinit var connectivityManager: ConnectivityManager
@Mock private lateinit var wifiManager: WifiManager @Mock private lateinit var wifiManager: WifiManager

View File

@@ -36,7 +36,6 @@ import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.Airpla
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor import com.android.systemui.statusbar.pipeline.wifi.domain.interactor.WifiInteractor
@@ -63,7 +62,6 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
private lateinit var testableLooper: TestableLooper private lateinit var testableLooper: TestableLooper
@Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags @Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags
@Mock private lateinit var logger: ConnectivityPipelineLogger
@Mock private lateinit var tableLogBuffer: TableLogBuffer @Mock private lateinit var tableLogBuffer: TableLogBuffer
@Mock private lateinit var connectivityConstants: ConnectivityConstants @Mock private lateinit var connectivityConstants: ConnectivityConstants
@Mock private lateinit var wifiConstants: WifiConstants @Mock private lateinit var wifiConstants: WifiConstants
@@ -92,7 +90,7 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
airplaneModeRepository, airplaneModeRepository,
connectivityRepository, connectivityRepository,
), ),
logger, tableLogBuffer,
scope, scope,
) )
viewModel = viewModel =
@@ -100,7 +98,6 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
airplaneModeViewModel, airplaneModeViewModel,
connectivityConstants, connectivityConstants,
context, context,
logger,
tableLogBuffer, tableLogBuffer,
interactor, interactor,
scope, scope,

View File

@@ -33,7 +33,6 @@ import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.Airpla
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository import com.android.systemui.statusbar.pipeline.wifi.data.repository.FakeWifiRepository
@@ -68,7 +67,6 @@ internal class WifiViewModelIconParameterizedTest(private val testCase: TestCase
private lateinit var underTest: WifiViewModel private lateinit var underTest: WifiViewModel
@Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags @Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags
@Mock private lateinit var logger: ConnectivityPipelineLogger
@Mock private lateinit var tableLogBuffer: TableLogBuffer @Mock private lateinit var tableLogBuffer: TableLogBuffer
@Mock private lateinit var connectivityConstants: ConnectivityConstants @Mock private lateinit var connectivityConstants: ConnectivityConstants
@Mock private lateinit var wifiConstants: WifiConstants @Mock private lateinit var wifiConstants: WifiConstants
@@ -94,7 +92,7 @@ internal class WifiViewModelIconParameterizedTest(private val testCase: TestCase
airplaneModeRepository, airplaneModeRepository,
connectivityRepository, connectivityRepository,
), ),
logger, tableLogBuffer,
scope, scope,
) )
} }
@@ -125,7 +123,6 @@ internal class WifiViewModelIconParameterizedTest(private val testCase: TestCase
airplaneModeViewModel, airplaneModeViewModel,
connectivityConstants, connectivityConstants,
context, context,
logger,
tableLogBuffer, tableLogBuffer,
interactor, interactor,
scope, scope,

View File

@@ -25,7 +25,6 @@ import com.android.systemui.statusbar.pipeline.airplane.domain.interactor.Airpla
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModel
import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl import com.android.systemui.statusbar.pipeline.airplane.ui.viewmodel.AirplaneModeViewModelImpl
import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants import com.android.systemui.statusbar.pipeline.shared.ConnectivityConstants
import com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger
import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot import com.android.systemui.statusbar.pipeline.shared.data.model.ConnectivitySlot
import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel
import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository import com.android.systemui.statusbar.pipeline.shared.data.repository.FakeConnectivityRepository
@@ -59,7 +58,6 @@ class WifiViewModelTest : SysuiTestCase() {
private lateinit var underTest: WifiViewModel private lateinit var underTest: WifiViewModel
@Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags @Mock private lateinit var statusBarPipelineFlags: StatusBarPipelineFlags
@Mock private lateinit var logger: ConnectivityPipelineLogger
@Mock private lateinit var tableLogBuffer: TableLogBuffer @Mock private lateinit var tableLogBuffer: TableLogBuffer
@Mock private lateinit var connectivityConstants: ConnectivityConstants @Mock private lateinit var connectivityConstants: ConnectivityConstants
@Mock private lateinit var wifiConstants: WifiConstants @Mock private lateinit var wifiConstants: WifiConstants
@@ -85,7 +83,7 @@ class WifiViewModelTest : SysuiTestCase() {
airplaneModeRepository, airplaneModeRepository,
connectivityRepository, connectivityRepository,
), ),
logger, tableLogBuffer,
scope, scope,
) )
@@ -478,7 +476,6 @@ class WifiViewModelTest : SysuiTestCase() {
airplaneModeViewModel, airplaneModeViewModel,
connectivityConstants, connectivityConstants,
context, context,
logger,
tableLogBuffer, tableLogBuffer,
interactor, interactor,
scope, scope,