From 9f378773d7b4053ca662b3e878be342ffb62baae Mon Sep 17 00:00:00 2001 From: Caitlin Shkuratov Date: Mon, 30 Jan 2023 21:00:35 +0000 Subject: [PATCH] [SB Refactor] Add logging to the mobile adapter and interactor. Bug: 266960478 Bug: 238425913 Test: manual: Verified the new logs appear in logcat Test: manual: Dumped MobileUiAdapter and verified it has the new information Change-Id: I34f367d853211393720bd07bf5681dfb61ded0eb --- .../interactor/MobileIconsInteractor.kt | 6 ++++ .../pipeline/mobile/ui/MobileUiAdapter.kt | 29 +++++++++++++++--- .../shared/ConnectivityPipelineLogger.kt | 30 +++++++++++++++++++ .../interactor/MobileIconsInteractorTest.kt | 2 ++ 4 files changed, 63 insertions(+), 4 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt index 9ae38e973bd07..0e4a4321bf263 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt @@ -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.MobileConnectionsRepository 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 javax.inject.Inject import kotlinx.coroutines.CoroutineScope @@ -37,10 +38,12 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.combine +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.flatMapLatest import kotlinx.coroutines.flow.flowOf import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest @@ -100,6 +103,7 @@ class MobileIconsInteractorImpl constructor( private val mobileConnectionsRepo: MobileConnectionsRepository, private val carrierConfigTracker: CarrierConfigTracker, + private val logger: ConnectivityPipelineLogger, userSetupRepo: UserSetupRepository, @Application private val scope: CoroutineScope, ) : MobileIconsInteractor { @@ -168,6 +172,8 @@ constructor( } } } + .distinctUntilChanged() + .onEach { logger.logFilteredSubscriptionsChanged(it) } override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt index 829a5cad65047..ef75713cd2f2e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt @@ -23,6 +23,8 @@ import com.android.systemui.statusbar.phone.StatusBarIconController import com.android.systemui.statusbar.pipeline.StatusBarPipelineFlags 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.shared.ConnectivityPipelineLogger +import java.io.PrintWriter import javax.inject.Inject import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.ExperimentalCoroutinesApi @@ -30,7 +32,9 @@ import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.mapLatest +import kotlinx.coroutines.flow.onEach import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.launch @@ -51,13 +55,17 @@ constructor( interactor: MobileIconsInteractor, private val iconController: StatusBarIconController, private val iconsViewModelFactory: MobileIconsViewModel.Factory, + private val logger: ConnectivityPipelineLogger, @Application private val scope: CoroutineScope, private val statusBarPipelineFlags: StatusBarPipelineFlags, ) : CoreStartable { private val mobileSubIds: Flow> = - interactor.filteredSubscriptions.mapLatest { subscriptions -> - subscriptions.map { subscriptionModel -> subscriptionModel.subscriptionId } - } + interactor.filteredSubscriptions + .mapLatest { subscriptions -> + 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 @@ -72,6 +80,9 @@ constructor( /** In order to keep the logs tame, we will reuse the same top-level mobile icons view model */ val mobileIconsViewModel = iconsViewModelFactory.create(mobileSubIdsState) + private var isCollecting: Boolean = false + private var lastValue: List? = null + override fun start() { // Only notify the icon controller if we want to *render* the new icons. // Note that this flow may still run if @@ -79,8 +90,18 @@ constructor( // get the logging data without rendering. if (statusBarPipelineFlags.useNewMobileIcons()) { 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) { + pw.println("isCollecting=$isCollecting") + pw.println("Last values sent to icon controller: $lastValue") + } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt index d3ff3573dae2a..192fa0230babf 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt @@ -25,6 +25,7 @@ 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 @@ -196,6 +197,35 @@ constructor( ) } + // TODO(b/238425913): We should split this class into mobile-specific and wifi-specific loggers. + + fun logFilteredSubscriptionsChanged(subs: List) { + buffer.log( + SB_LOGGING_TAG, + LogLevel.INFO, + { str1 = subs.toString() }, + { "Filtered subscriptions updated: $str1" }, + ) + } + + fun logUiAdapterSubIdsUpdated(subs: List) { + buffer.log( + SB_LOGGING_TAG, + LogLevel.INFO, + { str1 = subs.toString() }, + { "Sub IDs in MobileUiAdapter updated internally: $str1" }, + ) + } + + fun logUiAdapterSubIdsSentToIconController(subs: List) { + buffer.log( + SB_LOGGING_TAG, + LogLevel.INFO, + { str1 = subs.toString() }, + { "Sub IDs in MobileUiAdapter being sent to icon controller: $str1" }, + ) + } + companion object { const val SB_LOGGING_TAG = "SbConnectivity" diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt index 1b62d5cc15b5a..bd249221b6cae 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt @@ -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.util.FakeMobileMappingsProxy 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.time.FakeSystemClock import com.google.common.truth.Truth.assertThat @@ -77,6 +78,7 @@ class MobileIconsInteractorTest : SysuiTestCase() { MobileIconsInteractorImpl( connectionsRepository, carrierConfigTracker, + logger = mock(), userSetupRepository, testScope.backgroundScope, )