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:
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user