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

Commit a04548dd authored by Treehugger Robot's avatar Treehugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes Ia2ca5790,I48b0a6d9 into main

* changes:
  [Mobile] Move from DATA_SPN to SPN for networkName
  [Mobile] Bugfix flag for SPN update
parents bbfda47b 56555f63
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -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"
+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
@@ -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
@@ -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
@@ -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
@@ -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)
@@ -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
@@ -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
@@ -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
@@ -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(
@@ -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)

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