[SB Refactor] Split the wifi input logging into its own class.

Bug: 238425913
Test: all tests in pipeline.wifi
Test: `adb shell dumpsys activity service
com.android.systemui/.SystemUIService WifiInputLog` -> dumps wifi
network logs

Change-Id: I210fba0bd402dfe582d47a05394ba8e7426a2256
This commit is contained in:
Caitlin Shkuratov
2023-02-10 19:28:11 +00:00
parent 0beef1ec01
commit b48ee4cf80
12 changed files with 176 additions and 76 deletions

View File

@@ -19,8 +19,10 @@ package com.android.systemui.statusbar.pipeline.dagger
import android.net.wifi.WifiManager
import com.android.systemui.CoreStartable
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.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.AirplaneModeRepositoryImpl
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
@SysUISingleton
@WifiTableLog

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

@@ -25,7 +25,6 @@ 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
@@ -59,32 +58,6 @@ constructor(
)
}
/** 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(
@@ -103,25 +76,17 @@ constructor(
networkCapabilities: NetworkCapabilities,
isDefaultNetworkCallback: Boolean,
) {
buffer.log(
LoggerHelper.logOnCapabilitiesChanged(
buffer,
SB_LOGGING_TAG,
LogLevel.INFO,
{
bool1 = isDefaultNetworkCallback
int1 = network.getNetId()
str1 = networkCapabilities.toString()
},
{ "onCapabilitiesChanged[default=$bool1]: net=$int1 capabilities=$str1" }
network,
networkCapabilities,
isDefaultNetworkCallback,
)
}
fun logOnLost(network: Network) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{ int1 = network.getNetId() },
{ "onLost: net=$int1" }
)
LoggerHelper.logOnLost(buffer, SB_LOGGING_TAG, network)
}
fun logOnServiceStateChanged(serviceState: ServiceState, subId: Int) {

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

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

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.dagger.WifiTableLog
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.wifi.domain.interactor.WifiInteractor
import com.android.systemui.statusbar.pipeline.wifi.shared.WifiConstants
@@ -69,7 +67,6 @@ constructor(
airplaneModeViewModel: AirplaneModeViewModel,
connectivityConstants: ConnectivityConstants,
private val context: Context,
logger: ConnectivityPipelineLogger,
@WifiTableLog wifiTableLogBuffer: TableLogBuffer,
interactor: WifiInteractor,
@Application private val scope: CoroutineScope,
@@ -143,29 +140,35 @@ constructor(
)
/** 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) {
flowOf(null)
flowOf(default)
} else {
combine(interactor.activity, interactor.ssid) { activity, ssid ->
when (ssid) {
null -> null
null -> default
else -> activity
}
}
}
.distinctUntilChanged()
.logOutputChange(logger, "activity")
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = null)
.logDiffsForTable(
wifiTableLogBuffer,
columnPrefix = "VM.activity",
initialValue = default,
)
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = default)
}
private val isActivityInViewVisible: Flow<Boolean> =
activity
.map { it?.hasActivityIn == true }
.map { it.hasActivityIn }
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)
private val isActivityOutViewVisible: Flow<Boolean> =
activity
.map { it?.hasActivityOut == true }
.map { it.hasActivityOut }
.stateIn(scope, started = SharingStarted.WhileSubscribed(), initialValue = false)
private val isActivityContainerVisible: Flow<Boolean> =

View File

@@ -23,11 +23,11 @@ import com.android.systemui.SysuiTestCase
import com.android.systemui.demomode.DemoMode
import com.android.systemui.demomode.DemoModeController
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.DemoWifiRepository
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.shared.WifiInputLogger
import com.android.systemui.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.kotlinArgumentCaptor
import com.android.systemui.util.mockito.whenever
@@ -47,6 +47,7 @@ import org.mockito.Mockito
import org.mockito.MockitoAnnotations
@OptIn(ExperimentalCoroutinesApi::class)
@Suppress("EXPERIMENTAL_IS_NOT_ENABLED")
@SmallTest
class WifiRepositorySwitcherTest : SysuiTestCase() {
private lateinit var underTest: WifiRepositorySwitcher
@@ -54,7 +55,7 @@ class WifiRepositorySwitcherTest : SysuiTestCase() {
private lateinit var demoImpl: DemoWifiRepository
@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 connectivityManager: ConnectivityManager
@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.broadcast.BroadcastDispatcher
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.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.util.concurrency.FakeExecutor
import com.android.systemui.util.mockito.any
@@ -72,7 +72,7 @@ class WifiRepositoryImplTest : SysuiTestCase() {
private lateinit var underTest: WifiRepositoryImpl
@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 connectivityManager: ConnectivityManager
@Mock private lateinit var wifiManager: WifiManager

View File

@@ -100,7 +100,6 @@ class ModernStatusBarWifiViewTest : SysuiTestCase() {
airplaneModeViewModel,
connectivityConstants,
context,
logger,
tableLogBuffer,
interactor,
scope,

View File

@@ -125,7 +125,6 @@ internal class WifiViewModelIconParameterizedTest(private val testCase: TestCase
airplaneModeViewModel,
connectivityConstants,
context,
logger,
tableLogBuffer,
interactor,
scope,

View File

@@ -478,7 +478,6 @@ class WifiViewModelTest : SysuiTestCase() {
airplaneModeViewModel,
connectivityConstants,
context,
logger,
tableLogBuffer,
interactor,
scope,