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

Commit 52f4dcaf authored by Chi Zhang's avatar Chi Zhang Committed by Android (Google) Code Review
Browse files

Merge "Use new API to provide true roaming state." into udc-qpr-dev

parents 08f28729 30c0525a
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -24,6 +24,7 @@ import android.telephony.Annotation.ApnType;
import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.DataFailureCause;
import android.telephony.Annotation.NetworkType;
import android.telephony.Annotation.NetworkType;
import android.telephony.DataFailCause;
import android.telephony.DataFailCause;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionInfo;
import android.telephony.SubscriptionManager;
import android.telephony.SubscriptionManager;
@@ -319,7 +320,7 @@ public class DataCallSessionStats {
        ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
        ServiceStateTracker serviceStateTracker = mPhone.getServiceStateTracker();
        ServiceState serviceState =
        ServiceState serviceState =
                serviceStateTracker != null ? serviceStateTracker.getServiceState() : null;
                serviceStateTracker != null ? serviceStateTracker.getServiceState() : null;
        return serviceState != null && serviceState.getRoaming();
        return ServiceStateStats.isNetworkRoaming(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
    }
    }


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


package com.android.internal.telephony.metrics;
package com.android.internal.telephony.metrics;

import static android.telephony.TelephonyManager.DATA_CONNECTED;
import static android.telephony.TelephonyManager.DATA_CONNECTED;


import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSION__BEARER_AT_END__CALL_BEARER_CS;
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.Annotation.NetworkType;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.NetworkRegistrationInfo;
import android.telephony.ServiceState;
import android.telephony.ServiceState;
import android.telephony.ServiceState.RoamingType;
import android.telephony.TelephonyManager;
import android.telephony.TelephonyManager;


import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.annotations.VisibleForTesting;
@@ -114,8 +116,10 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
            CellularServiceState newState = new CellularServiceState();
            CellularServiceState newState = new CellularServiceState();
            newState.voiceRat = getVoiceRat(mPhone, serviceState);
            newState.voiceRat = getVoiceRat(mPhone, serviceState);
            newState.dataRat = getRat(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
            newState.dataRat = getRat(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
            newState.voiceRoamingType = serviceState.getVoiceRoamingType();
            newState.voiceRoamingType =
            newState.dataRoamingType = serviceState.getDataRoamingType();
                    getNetworkRoamingState(serviceState, NetworkRegistrationInfo.DOMAIN_CS);
            newState.dataRoamingType =
                    getNetworkRoamingState(serviceState, NetworkRegistrationInfo.DOMAIN_PS);
            newState.isEndc = isEndc(serviceState);
            newState.isEndc = isEndc(serviceState);
            newState.simSlotIndex = mPhone.getPhoneId();
            newState.simSlotIndex = mPhone.getPhoneId();
            newState.isMultiSim = SimSlotState.isMultiSim();
            newState.isMultiSim = SimSlotState.isMultiSim();
@@ -380,6 +384,39 @@ public class ServiceStateStats extends DataNetworkControllerCallback {
        addServiceState(lastState, now);
        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
    @VisibleForTesting
    protected long getTimeMillis() {
    protected long getTimeMillis() {
        return SystemClock.elapsedRealtime();
        return SystemClock.elapsedRealtime();
+1 −1
Original line number Original line Diff line number Diff line
@@ -386,7 +386,7 @@ public class SmsStats {


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


    private int getCarrierId() {
    private int getCarrierId() {
+1 −1
Original line number Original line Diff line number Diff line
@@ -450,7 +450,7 @@ public class VoiceCallSessionStats {
        proto.srvccCancellationCount = 0L;
        proto.srvccCancellationCount = 0L;
        proto.rttEnabled = false;
        proto.rttEnabled = false;
        proto.isEmergency = conn.isEmergencyCall() || conn.isNetworkIdentifiedEmergencyCall();
        proto.isEmergency = conn.isEmergencyCall() || conn.isNetworkIdentifiedEmergencyCall();
        proto.isRoaming = serviceState != null ? serviceState.getVoiceRoaming() : false;
        proto.isRoaming = ServiceStateStats.isNetworkRoaming(serviceState);
        proto.isMultiparty = conn.isMultiparty();
        proto.isMultiparty = conn.isMultiparty();
        proto.lastKnownRat = rat;
        proto.lastKnownRat = rat;
        proto.videoEnabled = videoState != VideoProfile.STATE_AUDIO_ONLY ? true : false;
        proto.videoEnabled = videoState != VideoProfile.STATE_AUDIO_ONLY ? true : false;
+195 −2
Original line number Original line 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.assertNotSame;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
@@ -750,11 +751,31 @@ public class ServiceStateStatsTest extends TelephonyTest {
        mockWwanPsRat(TelephonyManager.NETWORK_TYPE_UMTS);
        mockWwanPsRat(TelephonyManager.NETWORK_TYPE_UMTS);
        mockWwanCsRat(TelephonyManager.NETWORK_TYPE_UMTS);
        mockWwanCsRat(TelephonyManager.NETWORK_TYPE_UMTS);
        doReturn(TelephonyManager.NETWORK_TYPE_UNKNOWN).when(mImsStats).getImsVoiceRadioTech();
        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.onServiceStateChanged(mServiceState);
        mServiceStateStats.incTimeMillis(200L);
        mServiceStateStats.incTimeMillis(200L);
        // Voice and data roaming
        // 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.onServiceStateChanged(mServiceState);
        mServiceStateStats.incTimeMillis(400L);
        mServiceStateStats.incTimeMillis(400L);


@@ -815,6 +836,74 @@ public class ServiceStateStatsTest extends TelephonyTest {
        verifyNoMoreInteractions(mPersistAtomsStorage);
        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
    @Test
    @SmallTest
    @SmallTest
    public void onServiceStateChanged_dualSim() throws Exception {
    public void onServiceStateChanged_dualSim() throws Exception {
@@ -1036,6 +1125,110 @@ public class ServiceStateStatsTest extends TelephonyTest {
        verifyNoMoreInteractions(mPersistAtomsStorage);
        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) {
    private void mockWwanPsRat(@NetworkType int rat) {
        mockWwanRat(
        mockWwanRat(
                NetworkRegistrationInfo.DOMAIN_PS,
                NetworkRegistrationInfo.DOMAIN_PS,
Loading