Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt +6 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 { Loading Loading @@ -168,6 +172,8 @@ constructor( } } } .distinctUntilChanged() .onEach { logger.logFilteredSubscriptionsChanged(it) } override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt +25 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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<List<Int>> = interactor.filteredSubscriptions.mapLatest { subscriptions -> 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 Loading @@ -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<Int>? = 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 Loading @@ -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<out String>) { pw.println("isCollecting=$isCollecting") pw.println("Last values sent to icon controller: $lastValue") } } packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt +30 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { const val SB_LOGGING_TAG = "SbConnectivity" Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -77,6 +78,7 @@ class MobileIconsInteractorTest : SysuiTestCase() { MobileIconsInteractorImpl( connectionsRepository, carrierConfigTracker, logger = mock(), userSetupRepository, testScope.backgroundScope, ) Loading Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractor.kt +6 −0 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading Loading @@ -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 { Loading Loading @@ -168,6 +172,8 @@ constructor( } } } .distinctUntilChanged() .onEach { logger.logFilteredSubscriptionsChanged(it) } override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/ui/MobileUiAdapter.kt +25 −4 Original line number Diff line number Diff line Loading @@ -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 Loading @@ -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 Loading @@ -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<List<Int>> = interactor.filteredSubscriptions.mapLatest { subscriptions -> 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 Loading @@ -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<Int>? = 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 Loading @@ -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<out String>) { pw.println("isCollecting=$isCollecting") pw.println("Last values sent to icon controller: $lastValue") } }
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/shared/ConnectivityPipelineLogger.kt +30 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 { const val SB_LOGGING_TAG = "SbConnectivity" Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconsInteractorTest.kt +2 −0 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -77,6 +78,7 @@ class MobileIconsInteractorTest : SysuiTestCase() { MobileIconsInteractorImpl( connectionsRepository, carrierConfigTracker, logger = mock(), userSetupRepository, testScope.backgroundScope, ) Loading