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

Commit 30c0525a authored by Chi Zhang's avatar Chi Zhang
Browse files

Use new API to provide true roaming state.

Bug: 274972665
Test: build && atest
Change-Id: I69ad218fdf62a97e1e64d1bf6080b700457245c4
parent d6995b36
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.NetworkType;
import android.telephony.DataFailCause;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
@@ -319,7 +320,7 @@ public class DataCallSessionStats {
        ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
        ServiceState serviceState =
                serviceStateTracker != null ? serviceStateTracker.getServiceState() : null;
        return serviceState != null && serviceState.getRoaming();
        return ServiceStateStats.isNetworkRoaming(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
    }

    private boolean getIsOpportunistic() {
+39 −2
Original line number Diff line number Diff line
@@ -15,6 +15,7 @@
 */

package com.android.internal.telephony.metrics;

import static android.telephony.TelephonyManager.DATA_CONNECTED;

import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
@@ -29,6 +30,7 @@ import android.telephony.AccessNetworkUtils;
import android.telephony.Annotation.NetworkType;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.ServiceState.RoamingType;
import android.telephony.TelephonyManager;

import com.android.internal.annotations.VisibleForTesting;
@@ -114,8 +116,10 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
            CellularServiceState newState = new CellularServiceState();
            newState.voiceRat = getVoiceRat(mPhone, serviceState);
            newState.dataRat = getRat(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
            newState.voiceRoamingType = serviceState.getVoiceRoamingType();
            newState.dataRoamingType = serviceState.getDataRoamingType();
            newState.voiceRoamingType =
                    getNetworkRoamingState(serviceState, NetworkRegistrationInfo.DOMAIN_CS);
            newState.dataRoamingType =
                    getNetworkRoamingState(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
            newState.isEndc = isEndc(serviceState);
            newState.simSlotIndex = mPhone.getPhoneId();
            newState.isMultiSim = SimSlotState.isMultiSim();
@@ -380,6 +384,39 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
        addServiceState(lastState, now);
    }

    private static @RoamingType int getNetworkRoamingState(
            ServiceState ss, @NetworkRegistrationInfo.Domain int domain) {
        final NetworkRegistrationInfo nri =
                ss.getNetworkRegistrationInfo(domain, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        if (nri == null) {
            // No registration for domain
            return ServiceState.ROAMING_TYPE_NOT_ROAMING;
        }
        @RoamingType int roamingType = nri.getRoamingType();
        if (nri.isNetworkRoaming() && roamingType == ServiceState.ROAMING_TYPE_NOT_ROAMING) {
            // Roaming is overridden, exact roaming type unknown.
            return ServiceState.ROAMING_TYPE_UNKNOWN;
        }
        return roamingType;
    }

    /** Determines whether device is roaming, bypassing carrier overrides. */
    public static boolean isNetworkRoaming(
            ServiceState ss, @NetworkRegistrationInfo.Domain int domain) {
        if (ss == null) {
            return false;
        }
        final NetworkRegistrationInfo nri =
                ss.getNetworkRegistrationInfo(domain, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        return nri != null && nri.isNetworkRoaming();
    }

    /** Determines whether device is roaming in any domain, bypassing carrier overrides. */
    public static boolean isNetworkRoaming(ServiceState ss) {
        return isNetworkRoaming(ss, NetworkRegistrationInfo.DOMAIN_CS)
                || isNetworkRoaming(ss, NetworkRegistrationInfo.DOMAIN_PS);
    }

    @VisibleForTesting
    protected long getTimeMillis() {
        return SystemClock.elapsedRealtime();
+1 −1
Original line number Diff line number Diff line
@@ -386,7 +386,7 @@ public class SmsStats {

    private boolean getIsRoaming() {
        ServiceState serviceState = getServiceState();
        return serviceState != null ? serviceState.getRoaming() : false;
        return ServiceStateStats.isNetworkRoaming(serviceState);
    }

    private int getCarrierId() {
+1 −1
Original line number Diff line number Diff line
@@ -449,7 +449,7 @@ public class VoiceCallSessionStats {
        proto.srvccCancellationCount = 0L;
        proto.rttEnabled = false;
        proto.isEmergency = conn.isEmergencyCall() || conn.isNetworkIdentifiedEmergencyCall();
        proto.isRoaming = serviceState != null ? serviceState.getVoiceRoaming() : false;
        proto.isRoaming = ServiceStateStats.isNetworkRoaming(serviceState);
        proto.isMultiparty = conn.isMultiparty();
        proto.lastKnownRat = rat;

+195 −2
Original line number Diff line number Diff line
@@ -30,6 +30,7 @@ import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
@@ -750,11 +751,31 @@ public class ServiceStateStatsTest extends TelephonyTest {
        mockWwanPsRat(TelephonyManager.NETWORK_TYPE_UMTS);
        mockWwanCsRat(TelephonyManager.NETWORK_TYPE_UMTS);
        doReturn(TelephonyManager.NETWORK_TYPE_UNKNOWN).when(mImsStats).getImsVoiceRadioTech();
        doReturn(ServiceState.ROAMING_TYPE_INTERNATIONAL).when(mServiceState).getVoiceRoamingType();
        NetworkRegistrationInfo voiceNri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING)
                .build();
        voiceNri.setRoamingType(ServiceState.ROAMING_TYPE_INTERNATIONAL);
        doReturn(voiceNri)
                .when(mServiceState)
                .getNetworkRegistrationInfo(
                        NetworkRegistrationInfo.DOMAIN_CS,
                        AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        mServiceStateStats.onServiceStateChanged(mServiceState);
        mServiceStateStats.incTimeMillis(200L);
        // Voice and data roaming
        doReturn(ServiceState.ROAMING_TYPE_INTERNATIONAL).when(mServiceState).getDataRoamingType();
        NetworkRegistrationInfo dataNri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING)
                .build();
        dataNri.setRoamingType(ServiceState.ROAMING_TYPE_INTERNATIONAL);
        doReturn(dataNri)
                .when(mServiceState)
                .getNetworkRegistrationInfo(
                        NetworkRegistrationInfo.DOMAIN_PS,
                        AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        mServiceStateStats.onServiceStateChanged(mServiceState);
        mServiceStateStats.incTimeMillis(400L);

@@ -815,6 +836,74 @@ public class ServiceStateStatsTest extends TelephonyTest {
        verifyNoMoreInteractions(mPersistAtomsStorage);
    }

    @Test
    @SmallTest
    public void onServiceStateChanged_roamingWithOverride() throws Exception {
        // Using default service state for LTE

        mServiceStateStats.onServiceStateChanged(mServiceState);
        mServiceStateStats.incTimeMillis(100L);
        // Voice roaming
        doReturn(TelephonyManager.NETWORK_TYPE_UMTS).when(mServiceState).getVoiceNetworkType();
        doReturn(TelephonyManager.NETWORK_TYPE_UMTS).when(mServiceState).getDataNetworkType();
        NetworkRegistrationInfo roamingNri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING)
                .build();
        roamingNri.setRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING);
        doReturn(roamingNri).when(mServiceState)
                .getNetworkRegistrationInfo(
                        anyInt(), eq(AccessNetworkConstants.TRANSPORT_TYPE_WWAN));
        doReturn(TelephonyManager.NETWORK_TYPE_UNKNOWN).when(mImsStats).getImsVoiceRadioTech();
        mServiceStateStats.onServiceStateChanged(mServiceState);
        mServiceStateStats.incTimeMillis(400L);

        // There should be 2 service states and 1 data service switch (LTE to UMTS)
        mServiceStateStats.conclude();
        ArgumentCaptor<CellularServiceState> serviceStateCaptor =
                ArgumentCaptor.forClass(CellularServiceState.class);
        ArgumentCaptor<CellularDataServiceSwitch> serviceSwitchCaptor =
                ArgumentCaptor.forClass(CellularDataServiceSwitch.class);
        verify(mPersistAtomsStorage, times(2))
                .addCellularServiceStateAndCellularDataServiceSwitch(
                        serviceStateCaptor.capture(), serviceSwitchCaptor.capture());
        CellularServiceState state = serviceStateCaptor.getAllValues().get(0);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, state.voiceRat);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, state.dataRat);
        assertEquals(ServiceState.ROAMING_TYPE_NOT_ROAMING, state.voiceRoamingType);
        assertEquals(ServiceState.ROAMING_TYPE_NOT_ROAMING, state.dataRoamingType);
        assertFalse(state.isEndc);
        assertEquals(0, state.simSlotIndex);
        assertFalse(state.isMultiSim);
        assertEquals(CARRIER1_ID, state.carrierId);
        assertEquals(100L, state.totalTimeMillis);
        assertEquals(false, state.isEmergencyOnly);
        assertEquals(true, state.isInternetPdnUp);
        state = serviceStateCaptor.getAllValues().get(1);
        assertEquals(TelephonyManager.NETWORK_TYPE_UMTS, state.voiceRat);
        assertEquals(TelephonyManager.NETWORK_TYPE_UMTS, state.dataRat);
        // Atom should show roaming, despite type being unknown
        assertEquals(ServiceState.ROAMING_TYPE_UNKNOWN, state.voiceRoamingType);
        assertEquals(ServiceState.ROAMING_TYPE_UNKNOWN, state.dataRoamingType);
        assertFalse(state.isEndc);
        assertEquals(0, state.simSlotIndex);
        assertFalse(state.isMultiSim);
        assertEquals(CARRIER1_ID, state.carrierId);
        assertEquals(400L, state.totalTimeMillis);
        assertEquals(false, state.isEmergencyOnly);
        assertEquals(true, state.isInternetPdnUp);
        CellularDataServiceSwitch serviceSwitch = serviceSwitchCaptor.getAllValues().get(0);
        assertEquals(TelephonyManager.NETWORK_TYPE_LTE, serviceSwitch.ratFrom);
        assertEquals(TelephonyManager.NETWORK_TYPE_UMTS, serviceSwitch.ratTo);
        assertEquals(0, serviceSwitch.simSlotIndex);
        assertFalse(serviceSwitch.isMultiSim);
        assertEquals(CARRIER1_ID, serviceSwitch.carrierId);
        assertEquals(1, serviceSwitch.switchCount);
        assertNull(serviceSwitchCaptor.getAllValues().get(1)); // produced by conclude()
        verifyNoMoreInteractions(mPersistAtomsStorage);
    }

    @Test
    @SmallTest
    public void onServiceStateChanged_dualSim() throws Exception {
@@ -1036,6 +1125,110 @@ public class ServiceStateStatsTest extends TelephonyTest {
        verifyNoMoreInteractions(mPersistAtomsStorage);
    }

    @Test
    @SmallTest
    public void isNetworkRoaming_nullServiceState() throws Exception {
        boolean result = ServiceStateStats.isNetworkRoaming(null);

        assertEquals(false, result);
    }

    @Test
    @SmallTest
    public void isNetworkRoaming_notRoaming() throws Exception {
        NetworkRegistrationInfo nri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
                .build();
        nri.setRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING);
        doReturn(nri).when(mServiceState).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        doReturn(nri).when(mServiceState).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        boolean result = ServiceStateStats.isNetworkRoaming(mServiceState);
        boolean resultCs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_CS);
        boolean resultPs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_PS);

        assertEquals(false, result);
        assertEquals(false, resultCs);
        assertEquals(false, resultPs);
    }

    @Test
    @SmallTest
    public void isNetworkRoaming_csRoaming() throws Exception {
        NetworkRegistrationInfo roamingNri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING)
                .build();
        roamingNri.setRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING);
        doReturn(roamingNri).when(mServiceState).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        boolean result = ServiceStateStats.isNetworkRoaming(mServiceState);
        boolean resultCs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_CS);
        boolean resultPs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_PS);

        assertEquals(true, result);
        assertEquals(true, resultCs);
        assertEquals(false, resultPs);
    }

    @Test
    @SmallTest
    public void isNetworkRoaming_psRoaming() throws Exception {
        NetworkRegistrationInfo roamingNri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING)
                .build();
        roamingNri.setRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING);
        doReturn(roamingNri).when(mServiceState).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        boolean result = ServiceStateStats.isNetworkRoaming(mServiceState);
        boolean resultCs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_CS);
        boolean resultPs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_PS);

        assertEquals(true, result);
        assertEquals(false, resultCs);
        assertEquals(true, resultPs);
    }

    @Test
    @SmallTest
    public void isNetworkRoaming_bothRoaming() throws Exception {
        NetworkRegistrationInfo roamingNri = new NetworkRegistrationInfo.Builder()
                .setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_UMTS)
                // This sets mNetworkRegistrationState
                .setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING)
                .build();
        roamingNri.setRoamingType(ServiceState.ROAMING_TYPE_NOT_ROAMING);
        doReturn(roamingNri).when(mServiceState).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_CS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
        doReturn(roamingNri).when(mServiceState).getNetworkRegistrationInfo(
                NetworkRegistrationInfo.DOMAIN_PS, AccessNetworkConstants.TRANSPORT_TYPE_WWAN);

        boolean result = ServiceStateStats.isNetworkRoaming(mServiceState);
        boolean resultCs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_CS);
        boolean resultPs = ServiceStateStats.isNetworkRoaming(
                mServiceState, NetworkRegistrationInfo.DOMAIN_PS);

        assertEquals(true, result);
        assertEquals(true, resultCs);
        assertEquals(true, resultPs);
    }

    private void mockWwanPsRat(@NetworkType int rat) {
        mockWwanRat(
                NetworkRegistrationInfo.DOMAIN_PS,
Loading