Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1313f16c authored by Evan Laird's avatar Evan Laird Committed by Android Build Coastguard Worker
Browse files

[Mobile] Move from DATA_SPN to SPN for networkName

The old legacy pipeline would read both values from the broadcast, and
expose them in two separate places. During migration to the new
pipeline, NetworkNameModel was incorrectly using DATA_SPN rather than
SPN, which is the name that NetworkControllerImpl _mostly_ used in the
legacy code.

There is exactly one (1) place in SystemUI that had referenced the
DATA_SPN, and that was in InternetTile.java. I suspect that we either do
not need this field, or we can add it alongside of the regular
networkName field later.

For now, the fix is very simple: migrate from EXTRA_DATA_SPN to
EXTRA_SPN when extracting a network name from the
ACTION_SERVICE_PROVIDERS_UPDATED broadcast.

Test: MobileConnectionRepositoryTest
Test: manual
Bug: 350812372
Flag: com.android.systemui.FLAG_STATUS_BAR_SWITCH_TO_SPN_FROM_DATA_SPN
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:56555f63384c08d1878a43992f0606db9cbe8a58)
Merged-In: Ia2ca5790676c71c3f7575d524f7bd19db049a471
Change-Id: Ia2ca5790676c71c3f7575d524f7bd19db049a471
parent 343d37e7
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -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)

@@ -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"
            }
        )
    }
+9 −1
Original line number Diff line number Diff line
@@ -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

@@ -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)

+258 −16
Original line number Diff line number Diff line
@@ -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
@@ -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
@@ -68,6 +70,7 @@ import android.telephony.TelephonyManager.NETWORK_TYPE_LTE
import android.telephony.TelephonyManager.NETWORK_TYPE_UNKNOWN
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
@@ -84,7 +87,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
@@ -92,8 +94,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
@@ -110,6 +110,8 @@ import org.junit.Test
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)
@@ -804,6 +806,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
@@ -812,14 +815,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
@@ -828,22 +851,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
@@ -852,9 +901,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(
@@ -862,7 +911,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
                    showPlmn = false,
                )

            captor.value!!.onReceive(context, intentWithoutInfo)
            captor.lastValue.onReceive(context, intentWithoutInfo)

            assertThat(latest).isEqualTo(DEFAULT_NAME_MODEL)

@@ -870,6 +919,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
@@ -881,10 +958,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
@@ -1125,14 +1364,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)
        }
@@ -1145,6 +1386,7 @@ class MobileConnectionRepositoryTest : SysuiTestCase() {
        private const val SEP = "-"

        private const val SPN = "testSpn"
        private const val DATA_SPN = "testDataSpn"
        private const val PLMN = "testPlmn"
    }
}