Loading src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading src/java/com/android/internal/telephony/metrics/ServiceStateStats.java +39 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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(); Loading src/java/com/android/internal/telephony/metrics/SmsStats.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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() { Loading src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java +195 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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 { Loading Loading @@ -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 Loading
src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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() { Loading
src/java/com/android/internal/telephony/metrics/ServiceStateStats.java +39 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading @@ -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; Loading Loading @@ -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(); Loading Loading @@ -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(); Loading
src/java/com/android/internal/telephony/metrics/SmsStats.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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() { Loading
src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java +1 −1 Original line number Original line Diff line number Diff line Loading @@ -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; Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java +195 −2 Original line number Original line Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading Loading @@ -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 { Loading Loading @@ -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