diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt index f85a1213e9287..9cdff96dc7d97 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractor.kt @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.pipeline.mobile.domain.interactor import android.telephony.CarrierConfigManager import com.android.settingslib.SignalIcon.MobileIconGroup +import com.android.settingslib.mobile.TelephonyIcons.NOT_DEFAULT_DATA import com.android.systemui.dagger.qualifiers.Application import com.android.systemui.log.table.TableLogBuffer import com.android.systemui.statusbar.pipeline.mobile.data.model.DataConnectionState.Connected @@ -121,6 +122,7 @@ class MobileIconInteractorImpl( defaultMobileConnectivity: StateFlow, defaultMobileIconMapping: StateFlow>, defaultMobileIconGroup: StateFlow, + defaultDataSubId: StateFlow, override val isDefaultConnectionFailed: StateFlow, connectionRepository: MobileConnectionRepository, ) : MobileIconInteractor { @@ -134,6 +136,15 @@ class MobileIconInteractorImpl( override val isDataEnabled: StateFlow = connectionRepository.dataEnabled + private val isDefault = + defaultDataSubId + .mapLatest { connectionRepository.subId == it } + .stateIn( + scope, + SharingStarted.WhileSubscribed(), + connectionRepository.subId == defaultDataSubId.value + ) + override val isDefaultDataEnabled = defaultSubscriptionHasDataEnabled override val networkName = @@ -158,7 +169,12 @@ class MobileIconInteractorImpl( connectionInfo, defaultMobileIconMapping, defaultMobileIconGroup, - ) { info, mapping, defaultGroup -> + isDefault, + ) { info, mapping, defaultGroup, isDefault -> + if (!isDefault) { + return@combine NOT_DEFAULT_DATA + } + when (info.resolvedNetworkType) { is ResolvedNetworkType.CarrierMergedNetworkType -> info.resolvedNetworkType.iconGroupOverride 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 b289315adb881..9ae38e973bd07 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 @@ -66,6 +66,9 @@ interface MobileIconsInteractor { /** True if the CDMA level should be preferred over the primary level. */ val alwaysUseCdmaLevel: StateFlow + /** Tracks the subscriptionId set as the default for data connections */ + val defaultDataSubId: StateFlow + /** * The connectivity of the default mobile network. Note that this can differ from what is * reported from [MobileConnectionsRepository] in some cases. E.g., when the active subscription @@ -166,6 +169,8 @@ constructor( } } + override val defaultDataSubId = mobileConnectionsRepo.defaultDataSubId + /** * Copied from the old pipeline. We maintain a 2s period of time where we will keep the * validated bit from the old active network (A) while data is changing to the new one (B). @@ -262,6 +267,7 @@ constructor( defaultMobileNetworkConnectivity, defaultMobileIconMapping, defaultMobileIconGroup, + defaultDataSubId, isDefaultConnectionFailed, mobileConnectionsRepo.getRepoForSubId(subId), ) diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt index e57ad768ec8a9..172755cb8d615 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/FakeMobileIconsInteractor.kt @@ -60,6 +60,7 @@ class FakeMobileIconsInteractor( override val alwaysShowDataRatIcon = MutableStateFlow(false) override val alwaysUseCdmaLevel = MutableStateFlow(false) + override val defaultDataSubId = MutableStateFlow(DEFAULT_DATA_SUB_ID) override val defaultMobileNetworkConnectivity = MutableStateFlow(MobileConnectivityModel()) @@ -80,6 +81,8 @@ class FakeMobileIconsInteractor( companion object { val DEFAULT_ICON = TelephonyIcons.G + const val DEFAULT_DATA_SUB_ID = 1 + // Use [MobileMappings] to define some simple definitions const val THREE_G = NETWORK_TYPE_GSM const val LTE = NETWORK_TYPE_LTE diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt index a774ffeb997a2..c42aba5a7dd9d 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/domain/interactor/MobileIconInteractorTest.kt @@ -64,6 +64,7 @@ class MobileIconInteractorTest : SysuiTestCase() { mobileIconsInteractor.defaultMobileNetworkConnectivity, mobileIconsInteractor.defaultMobileIconMapping, mobileIconsInteractor.defaultMobileIconGroup, + mobileIconsInteractor.defaultDataSubId, mobileIconsInteractor.isDefaultConnectionFailed, connectionRepository, ) @@ -289,6 +290,30 @@ class MobileIconInteractorTest : SysuiTestCase() { job.cancel() } + @Test + fun `icon group - checks default data`() = + runBlocking(IMMEDIATE) { + mobileIconsInteractor.defaultDataSubId.value = SUB_1_ID + connectionRepository.setConnectionInfo( + MobileConnectionModel( + resolvedNetworkType = DefaultNetworkType(mobileMappingsProxy.toIconKey(THREE_G)) + ), + ) + + var latest: MobileIconGroup? = null + val job = underTest.networkTypeIconGroup.onEach { latest = it }.launchIn(this) + + assertThat(latest).isEqualTo(TelephonyIcons.THREE_G) + + // Default data sub id changes to something else + mobileIconsInteractor.defaultDataSubId.value = 123 + yield() + + assertThat(latest).isEqualTo(TelephonyIcons.NOT_DEFAULT_DATA) + + job.cancel() + } + @Test fun alwaysShowDataRatIcon_matchesParent() = runBlocking(IMMEDIATE) {