Merge "[SB Refactor] Add logging to the mobile adapter and interactor." into tm-qpr-dev am: 5c906402b9

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/21147320

Change-Id: I7249d0b0ba9ef28c975f18ec4d17953688dd00d8
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Caitlin Shkuratov
2023-01-31 20:58:17 +00:00
committed by Automerger Merge Worker
4 changed files with 63 additions and 4 deletions

View File

@@ -28,6 +28,7 @@ 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.util.CarrierConfigTracker import com.android.systemui.util.CarrierConfigTracker
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@@ -37,10 +38,12 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.combine
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filter
import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flatMapLatest
import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.transformLatest import kotlinx.coroutines.flow.transformLatest
@@ -100,6 +103,7 @@ class MobileIconsInteractorImpl
constructor( constructor(
private val mobileConnectionsRepo: MobileConnectionsRepository, private val mobileConnectionsRepo: MobileConnectionsRepository,
private val carrierConfigTracker: CarrierConfigTracker, private val carrierConfigTracker: CarrierConfigTracker,
private val logger: ConnectivityPipelineLogger,
userSetupRepo: UserSetupRepository, userSetupRepo: UserSetupRepository,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
) : MobileIconsInteractor { ) : MobileIconsInteractor {
@@ -168,6 +172,8 @@ constructor(
} }
} }
} }
.distinctUntilChanged()
.onEach { logger.logFilteredSubscriptionsChanged(it) }
override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId

View File

@@ -23,6 +23,8 @@ 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.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 javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.ExperimentalCoroutinesApi
@@ -30,7 +32,9 @@ import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.distinctUntilChanged
import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -51,13 +55,17 @@ 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,
@Application private val scope: CoroutineScope, @Application private val scope: CoroutineScope,
private val statusBarPipelineFlags: StatusBarPipelineFlags, private val statusBarPipelineFlags: StatusBarPipelineFlags,
) : CoreStartable { ) : CoreStartable {
private val mobileSubIds: Flow<List<Int>> = private val mobileSubIds: Flow<List<Int>> =
interactor.filteredSubscriptions.mapLatest { subscriptions -> interactor.filteredSubscriptions
.mapLatest { subscriptions ->
subscriptions.map { subscriptionModel -> subscriptionModel.subscriptionId } subscriptions.map { subscriptionModel -> subscriptionModel.subscriptionId }
} }
.distinctUntilChanged()
.onEach { logger.logUiAdapterSubIdsUpdated(it) }
/** /**
* We expose the list of tracked subscriptions as a flow of a list of ints, where each int is * We expose the list of tracked subscriptions as a flow of a list of ints, where each int is
@@ -72,6 +80,9 @@ constructor(
/** In order to keep the logs tame, we will reuse the same top-level mobile icons view model */ /** In order to keep the logs tame, we will reuse the same top-level mobile icons view model */
val mobileIconsViewModel = iconsViewModelFactory.create(mobileSubIdsState) val mobileIconsViewModel = iconsViewModelFactory.create(mobileSubIdsState)
private var isCollecting: Boolean = false
private var lastValue: List<Int>? = null
override fun start() { override fun start() {
// Only notify the icon controller if we want to *render* the new icons. // Only notify the icon controller if we want to *render* the new icons.
// Note that this flow may still run if // Note that this flow may still run if
@@ -79,8 +90,18 @@ constructor(
// get the logging data without rendering. // get the logging data without rendering.
if (statusBarPipelineFlags.useNewMobileIcons()) { if (statusBarPipelineFlags.useNewMobileIcons()) {
scope.launch { scope.launch {
mobileSubIds.collectLatest { iconController.setNewMobileIconSubIds(it) } isCollecting = true
mobileSubIds.collectLatest {
logger.logUiAdapterSubIdsSentToIconController(it)
lastValue = it
iconController.setNewMobileIconSubIds(it)
} }
} }
} }
}
override fun dump(pw: PrintWriter, args: Array<out String>) {
pw.println("isCollecting=$isCollecting")
pw.println("Last values sent to icon controller: $lastValue")
}
} }

View File

@@ -25,6 +25,7 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.log.dagger.StatusBarConnectivityLog import com.android.systemui.log.dagger.StatusBarConnectivityLog
import com.android.systemui.plugins.log.LogBuffer import com.android.systemui.plugins.log.LogBuffer
import com.android.systemui.plugins.log.LogLevel 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 com.android.systemui.statusbar.pipeline.shared.ConnectivityPipelineLogger.Companion.toString
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
@@ -201,6 +202,35 @@ constructor(
) )
} }
// TODO(b/238425913): We should split this class into mobile-specific and wifi-specific loggers.
fun logFilteredSubscriptionsChanged(subs: List<SubscriptionModel>) {
buffer.log(
SB_LOGGING_TAG,
LogLevel.INFO,
{ str1 = subs.toString() },
{ "Filtered subscriptions updated: $str1" },
)
}
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" },
)
}
companion object { companion object {
const val SB_LOGGING_TAG = "SbConnectivity" const val SB_LOGGING_TAG = "SbConnectivity"

View File

@@ -28,6 +28,7 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobile
import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeUserSetupRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeUserSetupRepository
import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy
import com.android.systemui.util.CarrierConfigTracker import com.android.systemui.util.CarrierConfigTracker
import com.android.systemui.util.mockito.mock
import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.whenever
import com.android.systemui.util.time.FakeSystemClock import com.android.systemui.util.time.FakeSystemClock
import com.google.common.truth.Truth.assertThat import com.google.common.truth.Truth.assertThat
@@ -77,6 +78,7 @@ class MobileIconsInteractorTest : SysuiTestCase() {
MobileIconsInteractorImpl( MobileIconsInteractorImpl(
connectionsRepository, connectionsRepository,
carrierConfigTracker, carrierConfigTracker,
logger = mock(),
userSetupRepository, userSetupRepository,
testScope.backgroundScope, testScope.backgroundScope,
) )