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

Commit d40b0ab7 authored by Brad Ebinger's avatar Brad Ebinger
Browse files

Update registrants when transport preference changes

Updates all DataRegStateRilRadioTechnologyChanged registrants
if there is a change that results in
ServiceState.getRilDataRadioTechnology changing even though the
Ril data rat hasnt changed per transport. This will fix the
issue where IMS ServiceState gets out of sync with SST
ServiceState.

Bug: 138465757
Test: Manual
Change-Id: Ife6fbedf3d4fd3a0cd0098a5a7a36a1566c3b981
parent 300998c7
Loading
Loading
Loading
Loading
+10 −1
Original line number Diff line number Diff line
@@ -3124,6 +3124,11 @@ public class ServiceStateTracker extends Handler {
            }
        }

        // Filter out per transport data RAT changes, only want to track changes based on
        // transport preference changes (WWAN to WLAN, for example).
        boolean hasDataTransportPreferenceChanged = !anyDataRatChanged
                && (mSS.getRilDataRadioTechnology() != mNewSS.getRilDataRadioTechnology());

        boolean hasVoiceRegStateChanged =
                mSS.getVoiceRegState() != mNewSS.getVoiceRegState();

@@ -3203,6 +3208,7 @@ public class ServiceStateTracker extends Handler {
                    + " hasDataRegStateChanged = " + hasDataRegStateChanged
                    + " hasRilVoiceRadioTechnologyChanged = " + hasRilVoiceRadioTechnologyChanged
                    + " hasRilDataRadioTechnologyChanged = " + hasRilDataRadioTechnologyChanged
                    + " hasDataTransportPreferenceChanged = " + hasDataTransportPreferenceChanged
                    + " hasChanged = " + hasChanged
                    + " hasVoiceRoamingOn = " + hasVoiceRoamingOn
                    + " hasVoiceRoamingOff = " + hasVoiceRoamingOff
@@ -3386,7 +3392,10 @@ public class ServiceStateTracker extends Handler {
            }

            if (hasDataRegStateChanged.get(transport)
                    || hasRilDataRadioTechnologyChanged.get(transport)) {
                    || hasRilDataRadioTechnologyChanged.get(transport)
                    // Update all transports if preference changed so that consumers can be notified
                    // that ServiceState#getRilDataRadioTechnology has changed.
                    || hasDataTransportPreferenceChanged) {
                notifyDataRegStateRilRadioTechnologyChanged(transport);
                mPhone.notifyDataConnection();
            }
+81 −0
Original line number Diff line number Diff line
@@ -1757,6 +1757,44 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        waitForMs(200);
    }

    private void changeRegStateWithIwlan(int state, CellIdentity cid, int voiceRat, int dataRat,
            int iwlanState, int iwlanDataRat) {
        LteVopsSupportInfo lteVopsSupportInfo =
                new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE,
                        LteVopsSupportInfo.LTE_STATUS_NOT_AVAILABLE);
        sst.mPollingContext[0] = 3;

        // PS WWAN
        NetworkRegistrationInfo dataResult = new NetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                state, dataRat, 0, false,
                null, cid, 1, false, false, false, lteVopsSupportInfo, false);
        sst.sendMessage(sst.obtainMessage(
                ServiceStateTracker.EVENT_POLL_STATE_PS_CELLULAR_REGISTRATION,
                new AsyncResult(sst.mPollingContext, dataResult, null)));
        waitForMs(200);

        // CS WWAN
        NetworkRegistrationInfo voiceResult = new NetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                state, voiceRat, 0, false,
                null, cid, false, 0, 0, 0);
        sst.sendMessage(sst.obtainMessage(
                ServiceStateTracker.EVENT_POLL_STATE_CS_CELLULAR_REGISTRATION,
                new AsyncResult(sst.mPollingContext, voiceResult, null)));
        waitForMs(200);

        // PS WLAN
        NetworkRegistrationInfo dataIwlanResult = new NetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WLAN,
                iwlanState, iwlanDataRat, 0, false,
                null, null, 1, false, false, false, lteVopsSupportInfo, false);
        sst.sendMessage(sst.obtainMessage(
                ServiceStateTracker.EVENT_POLL_STATE_PS_IWLAN_REGISTRATION,
                new AsyncResult(sst.mPollingContext, dataIwlanResult, null)));
        waitForMs(200);
    }

    // Edge and GPRS are grouped under the same family and Edge has higher rate than GPRS.
    // Expect no rat update when move from E to G.
    @Test
@@ -1929,6 +1967,49 @@ public class ServiceStateTrackerTest extends TelephonyTest {
        assertTrue(Arrays.equals(new int[0], sst.mSS.getCellBandwidths()));
    }

    /**
     * Ensure that TransportManager changes due to transport preference changes are picked up in the
     * new ServiceState when a poll event occurs. This causes ServiceState#getRilDataRadioTechnology
     * to change even though the underlying transports have not changed state.
     */
    @SmallTest
    @Test
    public void testRilDataTechnologyChangeTransportPreference() {
        when(mTransportManager.isAnyApnPreferredOnIwlan()).thenReturn(false);

        // Start state: Cell data only LTE + IWLAN
        CellIdentityLte cellIdentity =
                new CellIdentityLte(1, 1, 5, 1, 5000, "001", "01", "test", "tst");
        changeRegStateWithIwlan(
                // WWAN
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, cellIdentity,
                TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyManager.NETWORK_TYPE_LTE,
                // WLAN
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME,
                TelephonyManager.NETWORK_TYPE_IWLAN);
        assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_LTE, sst.mSS.getRilDataRadioTechnology());

        sst.registerForDataRegStateOrRatChanged(AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
                mTestHandler, EVENT_DATA_RAT_CHANGED, null);
        // transport preference change for a PDN for IWLAN occurred, no registration change, but
        // trigger unrelated poll to pick up transport preference.
        when(mTransportManager.isAnyApnPreferredOnIwlan()).thenReturn(true);
        changeRegStateWithIwlan(
                // WWAN
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME, cellIdentity,
                TelephonyManager.NETWORK_TYPE_UNKNOWN, TelephonyManager.NETWORK_TYPE_LTE,
                // WLAN
                NetworkRegistrationInfo.REGISTRATION_STATE_HOME,
                TelephonyManager.NETWORK_TYPE_IWLAN);
        // Now check to make sure a transport independent notification occurred for the registrants.
        // There will be two, one when the registration happened and another when the transport
        // preference changed.
        ArgumentCaptor<Message> messageArgumentCaptor = ArgumentCaptor.forClass(Message.class);
        verify(mTestHandler, times(2)).sendMessageAtTime(messageArgumentCaptor.capture(),
                anyLong());
        assertEquals(ServiceState.RIL_RADIO_TECHNOLOGY_IWLAN, sst.mSS.getRilDataRadioTechnology());
    }

    @Test
    public void testGetServiceProviderNameWithBrandOverride() {
        String brandOverride = "spn from brand override";