Loading packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -492,6 +492,16 @@ flag { bug: "310715220" } flag { name: "status_bar_switch_to_spn_from_data_spn" namespace: "systemui" description: "Fix usage of the SPN broadcast extras" bug: "350812372" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "haptic_volume_slider" namespace: "systemui" Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt +5 −3 Original line number Diff line number Diff line Loading @@ -198,7 +198,8 @@ constructor( fun logServiceProvidersUpdatedBroadcast(intent: Intent) { val showSpn = intent.getBooleanExtra(TelephonyManager.EXTRA_SHOW_SPN, false) val spn = intent.getStringExtra(TelephonyManager.EXTRA_DATA_SPN) val spn = intent.getStringExtra(TelephonyManager.EXTRA_SPN) val dataSpn = intent.getStringExtra(TelephonyManager.EXTRA_DATA_SPN) val showPlmn = intent.getBooleanExtra(TelephonyManager.EXTRA_SHOW_PLMN, false) val plmn = intent.getStringExtra(TelephonyManager.EXTRA_PLMN) Loading @@ -208,12 +209,13 @@ constructor( { bool1 = showSpn str1 = spn str2 = dataSpn bool2 = showPlmn str2 = plmn str3 = plmn }, { "Intent: ACTION_SERVICE_PROVIDERS_UPDATED." + " showSpn=$bool1 spn=$str1 showPlmn=$bool2 plmn=$str2" " showSpn=$bool1 spn=$str1 dataSpn=$str2 showPlmn=$bool2 plmn=$str3" } ) } Loading packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/model/NetworkNameModel.kt +9 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.telephony.TelephonyManager.EXTRA_DATA_SPN import android.telephony.TelephonyManager.EXTRA_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_SPN import android.telephony.TelephonyManager.EXTRA_SPN import com.android.systemui.Flags.statusBarSwitchToSpnFromDataSpn import com.android.systemui.log.table.Diffable import com.android.systemui.log.table.TableRowLogger Loading Loading @@ -96,7 +98,13 @@ sealed interface NetworkNameModel : Diffable<NetworkNameModel> { fun Intent.toNetworkNameModel(separator: String): NetworkNameModel? { val showSpn = getBooleanExtra(EXTRA_SHOW_SPN, false) val spn = getStringExtra(EXTRA_DATA_SPN) val spn = if (statusBarSwitchToSpnFromDataSpn()) { getStringExtra(EXTRA_SPN) } else { getStringExtra(EXTRA_DATA_SPN) } val showPlmn = getBooleanExtra(EXTRA_SHOW_PLMN, false) val plmn = getStringExtra(EXTRA_PLMN) Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt +258 −16 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context import android.content.Intent import android.net.ConnectivityManager import android.net.ConnectivityManager.NetworkCallback import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WLAN import android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WWAN Loading Loading @@ -59,6 +60,7 @@ import android.telephony.TelephonyManager.DATA_UNKNOWN import android.telephony.TelephonyManager.ERI_OFF import android.telephony.TelephonyManager.ERI_ON import android.telephony.TelephonyManager.EXTRA_CARRIER_ID import android.telephony.TelephonyManager.EXTRA_DATA_SPN import android.telephony.TelephonyManager.EXTRA_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_SPN Loading @@ -69,6 +71,7 @@ import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.settingslib.mobile.MobileMappings import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.FakeFeatureFlagsClassic Loading @@ -85,7 +88,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionMod import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfigTest.Companion.configWithOverride import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfigTest.Companion.createTestConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.toNetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileTelephonyHelpers.signalStrength Loading @@ -93,8 +95,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.Mobil import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.withArgCaptor Loading @@ -112,6 +112,8 @@ import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor @Suppress("EXPERIMENTAL_IS_NOT_ENABLED") @OptIn(ExperimentalCoroutinesApi::class) Loading Loading @@ -807,6 +809,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usesBroadcastInfo_returnsDerived() = testScope.runTest { var latest: NetworkNameModel? = null Loading @@ -815,14 +818,34 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) // spnIntent() sets all values to true and test strings assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) job.cancel() } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usesBroadcastInfo_returnsDerived_flagOff() = testScope.runTest { var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) // spnIntent() sets all values to true and test strings assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) job.cancel() } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastNotForThisSubId_keepsOldValue() = testScope.runTest { var latest: NetworkNameModel? = null Loading @@ -831,22 +854,48 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) // WHEN an intent with a different subId is sent val wrongSubIntent = spnIntent(subId = 101) captor.lastValue.onReceive(context, wrongSubIntent) // THEN the previous intent's name is still used assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) job.cancel() } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastNotForThisSubId_keepsOldValue_flagOff() = testScope.runTest { var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) // WHEN an intent with a different subId is sent val wrongSubIntent = spnIntent(subId = 101) captor.value!!.onReceive(context, wrongSubIntent) captor.lastValue.onReceive(context, wrongSubIntent) // THEN the previous intent's name is still used assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) job.cancel() } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastHasNoData_updatesToDefault() = testScope.runTest { var latest: NetworkNameModel? = null Loading @@ -855,9 +904,9 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) val intentWithoutInfo = spnIntent( Loading @@ -865,7 +914,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { showPlmn = false, ) captor.value!!.onReceive(context, intentWithoutInfo) captor.lastValue.onReceive(context, intentWithoutInfo) assertThat(latest).isEqualTo(DEFAULT_NAME_MODEL) Loading @@ -873,6 +922,34 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastHasNoData_updatesToDefault_flagOff() = testScope.runTest { var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) val intentWithoutInfo = spnIntent( showSpn = false, showPlmn = false, ) captor.lastValue.onReceive(context, intentWithoutInfo) assertThat(latest).isEqualTo(DEFAULT_NAME_MODEL) job.cancel() } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usingEagerStrategy_retainsNameBetweenSubscribers() = testScope.runTest { // Use the [StateFlow.value] getter so we can prove that the collection happens Loading @@ -884,10 +961,172 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) // The value is still there despite no active subscribers assertThat(underTest.networkName.value) .isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usingEagerStrategy_retainsNameBetweenSubscribers_flagOff() = testScope.runTest { // Use the [StateFlow.value] getter so we can prove that the collection happens // even when there is no [Job] // Starts out default assertThat(underTest.networkName.value).isEqualTo(DEFAULT_NAME_MODEL) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) // The value is still there despite no active subscribers assertThat(underTest.networkName.value).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(underTest.networkName.value) .isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_allFieldsSet_doesNotUseDataSpn() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_allFieldsSet_flagOff() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNotNull_showSpn_spnNull_dataSpnNotNull() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = null, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNotNull_showSpn_spnNull_dataSpnNotNull_flagOff() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = null, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) } @Test fun networkName_showPlmn_noShowSPN() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = false, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN")) } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNull_showSpn() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = null, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$SPN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNull_showSpn_flagOff() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = null, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$DATA_SPN")) } @Test Loading Loading @@ -1128,14 +1367,16 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { private fun spnIntent( subId: Int = SUB_1_ID, showSpn: Boolean = true, spn: String = SPN, spn: String? = SPN, dataSpn: String? = DATA_SPN, showPlmn: Boolean = true, plmn: String = PLMN, plmn: String? = PLMN, ): Intent = Intent(TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED).apply { putExtra(EXTRA_SUBSCRIPTION_INDEX, subId) putExtra(EXTRA_SHOW_SPN, showSpn) putExtra(EXTRA_SPN, spn) putExtra(EXTRA_DATA_SPN, dataSpn) putExtra(EXTRA_SHOW_PLMN, showPlmn) putExtra(EXTRA_PLMN, plmn) } Loading @@ -1148,6 +1389,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { private const val SEP = "-" private const val SPN = "testSpn" private const val DATA_SPN = "testDataSpn" private const val PLMN = "testPlmn" } } Loading
packages/SystemUI/aconfig/systemui.aconfig +10 −0 Original line number Diff line number Diff line Loading @@ -492,6 +492,16 @@ flag { bug: "310715220" } flag { name: "status_bar_switch_to_spn_from_data_spn" namespace: "systemui" description: "Fix usage of the SPN broadcast extras" bug: "350812372" metadata { purpose: PURPOSE_BUGFIX } } flag { name: "haptic_volume_slider" namespace: "systemui" Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/MobileInputLogger.kt +5 −3 Original line number Diff line number Diff line Loading @@ -198,7 +198,8 @@ constructor( fun logServiceProvidersUpdatedBroadcast(intent: Intent) { val showSpn = intent.getBooleanExtra(TelephonyManager.EXTRA_SHOW_SPN, false) val spn = intent.getStringExtra(TelephonyManager.EXTRA_DATA_SPN) val spn = intent.getStringExtra(TelephonyManager.EXTRA_SPN) val dataSpn = intent.getStringExtra(TelephonyManager.EXTRA_DATA_SPN) val showPlmn = intent.getBooleanExtra(TelephonyManager.EXTRA_SHOW_PLMN, false) val plmn = intent.getStringExtra(TelephonyManager.EXTRA_PLMN) Loading @@ -208,12 +209,13 @@ constructor( { bool1 = showSpn str1 = spn str2 = dataSpn bool2 = showPlmn str2 = plmn str3 = plmn }, { "Intent: ACTION_SERVICE_PROVIDERS_UPDATED." + " showSpn=$bool1 spn=$str1 showPlmn=$bool2 plmn=$str2" " showSpn=$bool1 spn=$str1 dataSpn=$str2 showPlmn=$bool2 plmn=$str3" } ) } Loading
packages/SystemUI/src/com/android/systemui/statusbar/pipeline/mobile/data/model/NetworkNameModel.kt +9 −1 Original line number Diff line number Diff line Loading @@ -21,6 +21,8 @@ import android.telephony.TelephonyManager.EXTRA_DATA_SPN import android.telephony.TelephonyManager.EXTRA_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_SPN import android.telephony.TelephonyManager.EXTRA_SPN import com.android.systemui.Flags.statusBarSwitchToSpnFromDataSpn import com.android.systemui.log.table.Diffable import com.android.systemui.log.table.TableRowLogger Loading Loading @@ -96,7 +98,13 @@ sealed interface NetworkNameModel : Diffable<NetworkNameModel> { fun Intent.toNetworkNameModel(separator: String): NetworkNameModel? { val showSpn = getBooleanExtra(EXTRA_SHOW_SPN, false) val spn = getStringExtra(EXTRA_DATA_SPN) val spn = if (statusBarSwitchToSpnFromDataSpn()) { getStringExtra(EXTRA_SPN) } else { getStringExtra(EXTRA_DATA_SPN) } val showPlmn = getBooleanExtra(EXTRA_SHOW_PLMN, false) val plmn = getStringExtra(EXTRA_PLMN) Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionRepositoryTest.kt +258 −16 Original line number Diff line number Diff line Loading @@ -21,6 +21,7 @@ import android.content.Context import android.content.Intent import android.net.ConnectivityManager import android.net.ConnectivityManager.NetworkCallback import android.platform.test.annotations.DisableFlags import android.platform.test.annotations.EnableFlags import android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WLAN import android.telephony.AccessNetworkConstants.TRANSPORT_TYPE_WWAN Loading Loading @@ -59,6 +60,7 @@ import android.telephony.TelephonyManager.DATA_UNKNOWN import android.telephony.TelephonyManager.ERI_OFF import android.telephony.TelephonyManager.ERI_ON import android.telephony.TelephonyManager.EXTRA_CARRIER_ID import android.telephony.TelephonyManager.EXTRA_DATA_SPN import android.telephony.TelephonyManager.EXTRA_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_PLMN import android.telephony.TelephonyManager.EXTRA_SHOW_SPN Loading @@ -69,6 +71,7 @@ import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.SmallTest import com.android.settingslib.mobile.MobileMappings import com.android.systemui.Flags import com.android.systemui.SysuiTestCase import com.android.systemui.coroutines.collectLastValue import com.android.systemui.flags.FakeFeatureFlagsClassic Loading @@ -85,7 +88,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.model.SubscriptionMod import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfigTest.Companion.configWithOverride import com.android.systemui.statusbar.pipeline.mobile.data.model.SystemUiCarrierConfigTest.Companion.createTestConfig import com.android.systemui.statusbar.pipeline.mobile.data.model.toNetworkNameModel import com.android.systemui.statusbar.pipeline.mobile.data.repository.FakeMobileConnectionsRepository import com.android.systemui.statusbar.pipeline.mobile.data.repository.MobileConnectionRepository.Companion.DEFAULT_NUM_LEVELS import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.MobileTelephonyHelpers.signalStrength Loading @@ -93,8 +95,6 @@ import com.android.systemui.statusbar.pipeline.mobile.data.repository.prod.Mobil import com.android.systemui.statusbar.pipeline.mobile.util.FakeMobileMappingsProxy import com.android.systemui.statusbar.pipeline.shared.data.model.DataActivityModel import com.android.systemui.statusbar.pipeline.shared.data.model.toMobileDataActivityModel import com.android.systemui.util.mockito.any import com.android.systemui.util.mockito.argumentCaptor import com.android.systemui.util.mockito.mock import com.android.systemui.util.mockito.whenever import com.android.systemui.util.mockito.withArgCaptor Loading @@ -112,6 +112,8 @@ import org.junit.runner.RunWith import org.mockito.Mock import org.mockito.Mockito.verify import org.mockito.MockitoAnnotations import org.mockito.kotlin.any import org.mockito.kotlin.argumentCaptor @Suppress("EXPERIMENTAL_IS_NOT_ENABLED") @OptIn(ExperimentalCoroutinesApi::class) Loading Loading @@ -807,6 +809,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usesBroadcastInfo_returnsDerived() = testScope.runTest { var latest: NetworkNameModel? = null Loading @@ -815,14 +818,34 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) // spnIntent() sets all values to true and test strings assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) job.cancel() } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usesBroadcastInfo_returnsDerived_flagOff() = testScope.runTest { var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) // spnIntent() sets all values to true and test strings assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) job.cancel() } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastNotForThisSubId_keepsOldValue() = testScope.runTest { var latest: NetworkNameModel? = null Loading @@ -831,22 +854,48 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) // WHEN an intent with a different subId is sent val wrongSubIntent = spnIntent(subId = 101) captor.lastValue.onReceive(context, wrongSubIntent) // THEN the previous intent's name is still used assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) job.cancel() } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastNotForThisSubId_keepsOldValue_flagOff() = testScope.runTest { var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) // WHEN an intent with a different subId is sent val wrongSubIntent = spnIntent(subId = 101) captor.value!!.onReceive(context, wrongSubIntent) captor.lastValue.onReceive(context, wrongSubIntent) // THEN the previous intent's name is still used assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) job.cancel() } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastHasNoData_updatesToDefault() = testScope.runTest { var latest: NetworkNameModel? = null Loading @@ -855,9 +904,9 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) val intentWithoutInfo = spnIntent( Loading @@ -865,7 +914,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { showPlmn = false, ) captor.value!!.onReceive(context, intentWithoutInfo) captor.lastValue.onReceive(context, intentWithoutInfo) assertThat(latest).isEqualTo(DEFAULT_NAME_MODEL) Loading @@ -873,6 +922,34 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_broadcastHasNoData_updatesToDefault_flagOff() = testScope.runTest { var latest: NetworkNameModel? = null val job = underTest.networkName.onEach { latest = it }.launchIn(this) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) val intentWithoutInfo = spnIntent( showSpn = false, showPlmn = false, ) captor.lastValue.onReceive(context, intentWithoutInfo) assertThat(latest).isEqualTo(DEFAULT_NAME_MODEL) job.cancel() } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usingEagerStrategy_retainsNameBetweenSubscribers() = testScope.runTest { // Use the [StateFlow.value] getter so we can prove that the collection happens Loading @@ -884,10 +961,172 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.value!!.onReceive(context, intent) captor.lastValue.onReceive(context, intent) // The value is still there despite no active subscribers assertThat(underTest.networkName.value) .isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_usingEagerStrategy_retainsNameBetweenSubscribers_flagOff() = testScope.runTest { // Use the [StateFlow.value] getter so we can prove that the collection happens // even when there is no [Job] // Starts out default assertThat(underTest.networkName.value).isEqualTo(DEFAULT_NAME_MODEL) val intent = spnIntent() val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) captor.lastValue.onReceive(context, intent) // The value is still there despite no active subscribers assertThat(underTest.networkName.value).isEqualTo(intent.toNetworkNameModel(SEP)) assertThat(underTest.networkName.value) .isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_allFieldsSet_doesNotUseDataSpn() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$SPN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_allFieldsSet_flagOff() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNotNull_showSpn_spnNull_dataSpnNotNull() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = null, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNotNull_showSpn_spnNull_dataSpnNotNull_flagOff() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = null, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN$SEP$DATA_SPN")) } @Test fun networkName_showPlmn_noShowSPN() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = false, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = PLMN, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$PLMN")) } @Test @EnableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNull_showSpn() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = null, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$SPN")) } @Test @DisableFlags(Flags.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN) fun networkName_showPlmn_plmnNull_showSpn_flagOff() = testScope.runTest { val latest by collectLastValue(underTest.networkName) val captor = argumentCaptor<BroadcastReceiver>() verify(context).registerReceiver(captor.capture(), any()) val intent = spnIntent( subId = SUB_1_ID, showSpn = true, spn = SPN, dataSpn = DATA_SPN, showPlmn = true, plmn = null, ) captor.lastValue.onReceive(context, intent) assertThat(latest).isEqualTo(NetworkNameModel.IntentDerived("$DATA_SPN")) } @Test Loading Loading @@ -1128,14 +1367,16 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { private fun spnIntent( subId: Int = SUB_1_ID, showSpn: Boolean = true, spn: String = SPN, spn: String? = SPN, dataSpn: String? = DATA_SPN, showPlmn: Boolean = true, plmn: String = PLMN, plmn: String? = PLMN, ): Intent = Intent(TelephonyManager.ACTION_SERVICE_PROVIDERS_UPDATED).apply { putExtra(EXTRA_SUBSCRIPTION_INDEX, subId) putExtra(EXTRA_SHOW_SPN, showSpn) putExtra(EXTRA_SPN, spn) putExtra(EXTRA_DATA_SPN, dataSpn) putExtra(EXTRA_SHOW_PLMN, showPlmn) putExtra(EXTRA_PLMN, plmn) } Loading @@ -1148,6 +1389,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() { private const val SEP = "-" private const val SPN = "testSpn" private const val DATA_SPN = "testDataSpn" private const val PLMN = "testPlmn" } }