Loading proto/src/persist_atoms.proto +1 −0 Original line number Original line Diff line number Diff line Loading @@ -383,6 +383,7 @@ message CellularServiceState { optional int32 fold_state = 12; optional int32 fold_state = 12; optional bool override_voice_service = 13; optional bool override_voice_service = 13; optional bool isDataEnabled = 14; optional bool isDataEnabled = 14; optional bool is_iwlan_cross_sim = 15; // Internal use only // Internal use only optional int64 last_used_millis = 10001; optional int64 last_used_millis = 10001; Loading src/java/com/android/internal/telephony/metrics/MetricsCollector.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -935,7 +935,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { state.isInternetPdnUp, state.isInternetPdnUp, state.foldState, state.foldState, state.overrideVoiceService, state.overrideVoiceService, state.isDataEnabled); state.isDataEnabled, state.isIwlanCrossSim); } } private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { Loading src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -1713,7 +1713,8 @@ public class PersistAtomsStorage { && state.isInternetPdnUp == key.isInternetPdnUp && state.isInternetPdnUp == key.isInternetPdnUp && state.foldState == key.foldState && state.foldState == key.foldState && state.overrideVoiceService == key.overrideVoiceService && state.overrideVoiceService == key.overrideVoiceService && state.isDataEnabled == key.isDataEnabled) { && state.isDataEnabled == key.isDataEnabled && state.isIwlanCrossSim == key.isIwlanCrossSim) { return state; return state; } } } } Loading src/java/com/android/internal/telephony/metrics/ServiceStateStats.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.ServiceState.RoamingType; import android.telephony.ServiceState.RoamingType; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; Loading Loading @@ -89,6 +90,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { CellularServiceState newServiceState = copyOf(state.mServiceState); CellularServiceState newServiceState = copyOf(state.mServiceState); newServiceState.voiceRat = newServiceState.voiceRat = getVoiceRat(mPhone, getServiceStateForPhone(mPhone)); getVoiceRat(mPhone, getServiceStateForPhone(mPhone)); newServiceState.isIwlanCrossSim = isCrossSimCallingRegistered(mPhone); return new TimestampedServiceState(newServiceState, now); return new TimestampedServiceState(newServiceState, now); }); }); addServiceState(lastState, now); addServiceState(lastState, now); Loading Loading @@ -132,6 +134,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { newState.foldState = mDeviceStateHelper.getFoldState(); newState.foldState = mDeviceStateHelper.getFoldState(); newState.overrideVoiceService = mOverrideVoiceService.get(); newState.overrideVoiceService = mOverrideVoiceService.get(); newState.isDataEnabled = mPhone.getDataSettingsManager().isDataEnabled(); newState.isDataEnabled = mPhone.getDataSettingsManager().isDataEnabled(); newState.isIwlanCrossSim = isCrossSimCallingRegistered(mPhone); TimestampedServiceState prevState = TimestampedServiceState prevState = mLastState.getAndSet(new TimestampedServiceState(newState, now)); mLastState.getAndSet(new TimestampedServiceState(newState, now)); addServiceStateAndSwitch( addServiceStateAndSwitch( Loading Loading @@ -302,6 +305,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { copy.foldState = state.foldState; copy.foldState = state.foldState; copy.overrideVoiceService = state.overrideVoiceService; copy.overrideVoiceService = state.overrideVoiceService; copy.isDataEnabled = state.isDataEnabled; copy.isDataEnabled = state.isDataEnabled; copy.isIwlanCrossSim = state.isIwlanCrossSim; return copy; return copy; } } Loading Loading @@ -360,6 +364,14 @@ public class ServiceStateStats extends DataNetworkControllerCallback { } } } } private boolean isCrossSimCallingRegistered(Phone phone) { if (phone.getImsPhone() != null) { return phone.getImsPhone().getImsRegistrationTech() == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM; } return false; } /** Returns RAT used by WWAN if WWAN is in service. */ /** Returns RAT used by WWAN if WWAN is in service. */ public static @NetworkType int getRat( public static @NetworkType int getRat( ServiceState state, @NetworkRegistrationInfo.Domain int domain) { ServiceState state, @NetworkRegistrationInfo.Domain int domain) { Loading tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java +25 −0 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.telephony.Annotation.NetworkType; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; Loading Loading @@ -399,6 +400,30 @@ public class ServiceStateStatsTest extends TelephonyTest { verifyNoMoreInteractions(mPersistAtomsStorage); verifyNoMoreInteractions(mPersistAtomsStorage); } } @Test @SmallTest public void onImsVoiceRegistrationChanged_crossSimCalling() throws Exception { mServiceStateStats.onServiceStateChanged(mServiceState); mockWwanPsRat(TelephonyManager.NETWORK_TYPE_UNKNOWN); doReturn(TelephonyManager.NETWORK_TYPE_IWLAN).when(mImsStats).getImsVoiceRadioTech(); doReturn(ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM).when(mImsPhone) .getImsRegistrationTech(); mServiceStateStats.incTimeMillis(100L); mServiceStateStats.onImsVoiceRegistrationChanged(); mServiceStateStats.incTimeMillis(200L); mServiceStateStats.conclude(); ArgumentCaptor<CellularServiceState> captor = ArgumentCaptor.forClass(CellularServiceState.class); verify(mPersistAtomsStorage, times(2)) .addCellularServiceStateAndCellularDataServiceSwitch(captor.capture(), eq(null)); CellularServiceState state = captor.getAllValues().get(1); assertEquals(200L, state.totalTimeMillis); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, state.voiceRat); assertTrue(state.isIwlanCrossSim); } @Test @Test @SmallTest @SmallTest public void onInternetDataNetworkDisconnected() throws Exception { public void onInternetDataNetworkDisconnected() throws Exception { Loading Loading
proto/src/persist_atoms.proto +1 −0 Original line number Original line Diff line number Diff line Loading @@ -383,6 +383,7 @@ message CellularServiceState { optional int32 fold_state = 12; optional int32 fold_state = 12; optional bool override_voice_service = 13; optional bool override_voice_service = 13; optional bool isDataEnabled = 14; optional bool isDataEnabled = 14; optional bool is_iwlan_cross_sim = 15; // Internal use only // Internal use only optional int64 last_used_millis = 10001; optional int64 last_used_millis = 10001; Loading
src/java/com/android/internal/telephony/metrics/MetricsCollector.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -935,7 +935,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { state.isInternetPdnUp, state.isInternetPdnUp, state.foldState, state.foldState, state.overrideVoiceService, state.overrideVoiceService, state.isDataEnabled); state.isDataEnabled, state.isIwlanCrossSim); } } private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { Loading
src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +2 −1 Original line number Original line Diff line number Diff line Loading @@ -1713,7 +1713,8 @@ public class PersistAtomsStorage { && state.isInternetPdnUp == key.isInternetPdnUp && state.isInternetPdnUp == key.isInternetPdnUp && state.foldState == key.foldState && state.foldState == key.foldState && state.overrideVoiceService == key.overrideVoiceService && state.overrideVoiceService == key.overrideVoiceService && state.isDataEnabled == key.isDataEnabled) { && state.isDataEnabled == key.isDataEnabled && state.isIwlanCrossSim == key.isIwlanCrossSim) { return state; return state; } } } } Loading
src/java/com/android/internal/telephony/metrics/ServiceStateStats.java +12 −0 Original line number Original line Diff line number Diff line Loading @@ -32,6 +32,7 @@ import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.ServiceState.RoamingType; import android.telephony.ServiceState.RoamingType; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; Loading Loading @@ -89,6 +90,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { CellularServiceState newServiceState = copyOf(state.mServiceState); CellularServiceState newServiceState = copyOf(state.mServiceState); newServiceState.voiceRat = newServiceState.voiceRat = getVoiceRat(mPhone, getServiceStateForPhone(mPhone)); getVoiceRat(mPhone, getServiceStateForPhone(mPhone)); newServiceState.isIwlanCrossSim = isCrossSimCallingRegistered(mPhone); return new TimestampedServiceState(newServiceState, now); return new TimestampedServiceState(newServiceState, now); }); }); addServiceState(lastState, now); addServiceState(lastState, now); Loading Loading @@ -132,6 +134,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { newState.foldState = mDeviceStateHelper.getFoldState(); newState.foldState = mDeviceStateHelper.getFoldState(); newState.overrideVoiceService = mOverrideVoiceService.get(); newState.overrideVoiceService = mOverrideVoiceService.get(); newState.isDataEnabled = mPhone.getDataSettingsManager().isDataEnabled(); newState.isDataEnabled = mPhone.getDataSettingsManager().isDataEnabled(); newState.isIwlanCrossSim = isCrossSimCallingRegistered(mPhone); TimestampedServiceState prevState = TimestampedServiceState prevState = mLastState.getAndSet(new TimestampedServiceState(newState, now)); mLastState.getAndSet(new TimestampedServiceState(newState, now)); addServiceStateAndSwitch( addServiceStateAndSwitch( Loading Loading @@ -302,6 +305,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { copy.foldState = state.foldState; copy.foldState = state.foldState; copy.overrideVoiceService = state.overrideVoiceService; copy.overrideVoiceService = state.overrideVoiceService; copy.isDataEnabled = state.isDataEnabled; copy.isDataEnabled = state.isDataEnabled; copy.isIwlanCrossSim = state.isIwlanCrossSim; return copy; return copy; } } Loading Loading @@ -360,6 +364,14 @@ public class ServiceStateStats extends DataNetworkControllerCallback { } } } } private boolean isCrossSimCallingRegistered(Phone phone) { if (phone.getImsPhone() != null) { return phone.getImsPhone().getImsRegistrationTech() == ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM; } return false; } /** Returns RAT used by WWAN if WWAN is in service. */ /** Returns RAT used by WWAN if WWAN is in service. */ public static @NetworkType int getRat( public static @NetworkType int getRat( ServiceState state, @NetworkRegistrationInfo.Domain int domain) { ServiceState state, @NetworkRegistrationInfo.Domain int domain) { Loading
tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java +25 −0 Original line number Original line Diff line number Diff line Loading @@ -44,6 +44,7 @@ import android.telephony.Annotation.NetworkType; import android.telephony.NetworkRegistrationInfo; import android.telephony.NetworkRegistrationInfo; import android.telephony.ServiceState; import android.telephony.ServiceState; import android.telephony.TelephonyManager; import android.telephony.TelephonyManager; import android.telephony.ims.stub.ImsRegistrationImplBase; import android.test.suitebuilder.annotation.SmallTest; import android.test.suitebuilder.annotation.SmallTest; import com.android.internal.telephony.Phone; import com.android.internal.telephony.Phone; Loading Loading @@ -399,6 +400,30 @@ public class ServiceStateStatsTest extends TelephonyTest { verifyNoMoreInteractions(mPersistAtomsStorage); verifyNoMoreInteractions(mPersistAtomsStorage); } } @Test @SmallTest public void onImsVoiceRegistrationChanged_crossSimCalling() throws Exception { mServiceStateStats.onServiceStateChanged(mServiceState); mockWwanPsRat(TelephonyManager.NETWORK_TYPE_UNKNOWN); doReturn(TelephonyManager.NETWORK_TYPE_IWLAN).when(mImsStats).getImsVoiceRadioTech(); doReturn(ImsRegistrationImplBase.REGISTRATION_TECH_CROSS_SIM).when(mImsPhone) .getImsRegistrationTech(); mServiceStateStats.incTimeMillis(100L); mServiceStateStats.onImsVoiceRegistrationChanged(); mServiceStateStats.incTimeMillis(200L); mServiceStateStats.conclude(); ArgumentCaptor<CellularServiceState> captor = ArgumentCaptor.forClass(CellularServiceState.class); verify(mPersistAtomsStorage, times(2)) .addCellularServiceStateAndCellularDataServiceSwitch(captor.capture(), eq(null)); CellularServiceState state = captor.getAllValues().get(1); assertEquals(200L, state.totalTimeMillis); assertEquals(TelephonyManager.NETWORK_TYPE_IWLAN, state.voiceRat); assertTrue(state.isIwlanCrossSim); } @Test @Test @SmallTest @SmallTest public void onInternetDataNetworkDisconnected() throws Exception { public void onInternetDataNetworkDisconnected() throws Exception { Loading