diff options
9 files changed, 148 insertions, 4 deletions
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto index e54c969a7c..59b177b55a 100644 --- a/proto/src/persist_atoms.proto +++ b/proto/src/persist_atoms.proto @@ -281,6 +281,7 @@ message VoiceCallSession { optional bool is_iwlan_cross_sim_at_end = 38; optional bool is_iwlan_cross_sim_at_connected = 39; optional bool vonr_enabled = 40; + optional bool is_ntn = 41; // Internal use only optional int64 setup_begin_millis = 10001; @@ -373,6 +374,7 @@ message DataCallSession { repeated int32 handover_failure_rat = 21; optional bool is_non_dds = 22; optional bool is_iwlan_cross_sim = 23; + optional bool is_ntn = 24; } message CellularServiceState { @@ -391,6 +393,7 @@ message CellularServiceState { optional bool override_voice_service = 13; optional bool isDataEnabled = 14; optional bool is_iwlan_cross_sim = 15; + optional bool is_ntn = 16; // Internal use only optional int64 last_used_millis = 10001; diff --git a/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java index e1f6309afb..2eadf170c5 100644 --- a/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java +++ b/src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java @@ -41,6 +41,7 @@ import com.android.internal.telephony.PhoneFactory; import com.android.internal.telephony.ServiceStateTracker; import com.android.internal.telephony.data.DataNetwork; import com.android.internal.telephony.nano.PersistAtomsProto.DataCallSession; +import com.android.internal.telephony.satellite.SatelliteController; import com.android.internal.telephony.subscription.SubscriptionInfoInternal; import com.android.internal.telephony.subscription.SubscriptionManagerService; import com.android.telephony.Rlog; @@ -64,10 +65,12 @@ public class DataCallSessionStats { public static final int SIZE_LIMIT_HANDOVER_FAILURES = 15; private final DefaultNetworkMonitor mDefaultNetworkMonitor; + private final SatelliteController mSatelliteController; public DataCallSessionStats(Phone phone) { mPhone = phone; mDefaultNetworkMonitor = PhoneFactory.getMetricsCollector().getDefaultNetworkMonitor(); + mSatelliteController = SatelliteController.getInstance(); } private boolean isSystemDefaultNetworkMobile() { @@ -303,6 +306,7 @@ public class DataCallSessionStats { call.handoverFailureRat.length); copy.isNonDds = call.isNonDds; copy.isIwlanCrossSim = call.isIwlanCrossSim; + copy.isNtn = call.isNtn; return copy; } @@ -329,6 +333,8 @@ public class DataCallSessionStats { proto.handoverFailureRat = new int[0]; proto.isNonDds = false; proto.isIwlanCrossSim = false; + proto.isNtn = mSatelliteController != null + ? mSatelliteController.isInSatelliteModeForCarrierRoaming(mPhone) : false; return proto; } diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java index 456b91b610..fbdf90993e 100644 --- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java +++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java @@ -972,7 +972,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { state.foldState, state.overrideVoiceService, state.isDataEnabled, - state.isIwlanCrossSim); + state.isIwlanCrossSim, + state.isNtn); } private static StatsEvent buildStatsEvent(VoiceCallRatUsage usage) { @@ -1030,7 +1031,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { session.isIwlanCrossSimAtStart, session.isIwlanCrossSimAtEnd, session.isIwlanCrossSimAtConnected, - session.vonrEnabled); + session.vonrEnabled, + session.isNtn); } @@ -1107,7 +1109,8 @@ public class MetricsCollector implements StatsManager.StatsPullAtomCallback { dataCallSession.handoverFailureCauses, dataCallSession.handoverFailureRat, dataCallSession.isNonDds, - dataCallSession.isIwlanCrossSim); + dataCallSession.isIwlanCrossSim, + dataCallSession.isNtn); } private static StatsEvent buildStatsEvent(ImsRegistrationStats stats) { diff --git a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java index f3fe8fa333..64b9bdaf7a 100644 --- a/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java +++ b/src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java @@ -1715,7 +1715,8 @@ public class PersistAtomsStorage { && state.foldState == key.foldState && state.overrideVoiceService == key.overrideVoiceService && state.isDataEnabled == key.isDataEnabled - && state.isIwlanCrossSim == key.isIwlanCrossSim) { + && state.isIwlanCrossSim == key.isIwlanCrossSim + && state.isNtn == key.isNtn) { return state; } } diff --git a/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java b/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java index d400c2230b..ff909783af 100644 --- a/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java +++ b/src/java/com/android/internal/telephony/metrics/ServiceStateStats.java @@ -44,6 +44,7 @@ import com.android.internal.telephony.data.DataNetworkController.DataNetworkCont import com.android.internal.telephony.imsphone.ImsPhone; import com.android.internal.telephony.nano.PersistAtomsProto.CellularDataServiceSwitch; import com.android.internal.telephony.nano.PersistAtomsProto.CellularServiceState; +import com.android.internal.telephony.satellite.SatelliteController; import com.android.telephony.Rlog; import java.util.Set; @@ -61,12 +62,14 @@ public class ServiceStateStats extends DataNetworkControllerCallback { private final PersistAtomsStorage mStorage; private final DeviceStateHelper mDeviceStateHelper; private boolean mExistAnyConnectedInternetPdn; + private final SatelliteController mSatelliteController; public ServiceStateStats(Phone phone) { super(Runnable::run); mPhone = phone; mStorage = PhoneFactory.getMetricsCollector().getAtomsStorage(); mDeviceStateHelper = PhoneFactory.getMetricsCollector().getDeviceStateHelper(); + mSatelliteController = SatelliteController.getInstance(); } /** Finalizes the durations of the current service state segment. */ @@ -135,6 +138,8 @@ public class ServiceStateStats extends DataNetworkControllerCallback { newState.overrideVoiceService = mOverrideVoiceService.get(); newState.isDataEnabled = mPhone.getDataSettingsManager().isDataEnabled(); newState.isIwlanCrossSim = isCrossSimCallingRegistered(mPhone); + newState.isNtn = mSatelliteController != null + ? mSatelliteController.isInSatelliteModeForCarrierRoaming(mPhone) : false; TimestampedServiceState prevState = mLastState.getAndSet(new TimestampedServiceState(newState, now)); addServiceStateAndSwitch( @@ -306,6 +311,7 @@ public class ServiceStateStats extends DataNetworkControllerCallback { copy.overrideVoiceService = state.overrideVoiceService; copy.isDataEnabled = state.isDataEnabled; copy.isIwlanCrossSim = state.isIwlanCrossSim; + copy.isNtn = state.isNtn; return copy; } diff --git a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java index 9cf53c90c6..8be9e838b4 100644 --- a/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java +++ b/src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java @@ -75,6 +75,7 @@ import com.android.internal.telephony.imsphone.ImsPhone; import com.android.internal.telephony.imsphone.ImsPhoneConnection; import com.android.internal.telephony.nano.PersistAtomsProto.VoiceCallSession; import com.android.internal.telephony.nano.TelephonyProto.TelephonyCallSession.Event.AudioCodec; +import com.android.internal.telephony.satellite.SatelliteController; import com.android.internal.telephony.uicc.UiccController; import com.android.telephony.Rlog; @@ -171,11 +172,14 @@ public class VoiceCallSessionStats { private final VonrHelper mVonrHelper = PhoneFactory.getMetricsCollector().getVonrHelper(); + private final SatelliteController mSatelliteController; + public VoiceCallSessionStats(int phoneId, Phone phone, @NonNull FeatureFlags featureFlags) { mPhoneId = phoneId; mPhone = phone; mFlags = featureFlags; DataConnectionStateTracker.getInstance(phoneId).start(phone); + mSatelliteController = SatelliteController.getInstance(); } /* CS calls */ @@ -570,6 +574,9 @@ public class VoiceCallSessionStats { proto.vonrEnabled = mVonrHelper.getVonrEnabled(mPhone.getSubId()); } + proto.isNtn = mSatelliteController != null + ? mSatelliteController.isInSatelliteModeForCarrierRoaming(mPhone) : false; + mAtomsStorage.addVoiceCallSession(proto); // merge RAT usages to PersistPullers when the call session ends (i.e. no more active calls) diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java index d63dc3c60c..2e64c46243 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java @@ -19,7 +19,9 @@ package com.android.internal.telephony.metrics; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -308,4 +310,49 @@ public class DataCallSessionStatsTest extends TelephonyTest { assertTrue(stats.oosAtEnd); assertFalse(stats.ongoing); } + + @Test + public void testIsNtn() { + when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true); + + mDataCallSessionStats.onSetupDataCall(ApnSetting.TYPE_IMS); + mDataCallSessionStats.onSetupDataCallResponse( + mDefaultImsResponse, + TelephonyManager.NETWORK_TYPE_LTE, + ApnSetting.TYPE_IMS, + ApnSetting.PROTOCOL_IP, + DataFailCause.NONE); + + mDataCallSessionStats.setTimeMillis(60000L); + mDataCallSessionStats.conclude(); + + ArgumentCaptor<DataCallSession> callCaptor = + ArgumentCaptor.forClass(DataCallSession.class); + verify(mPersistAtomsStorage).addDataCallSession(callCaptor.capture()); + DataCallSession stats = callCaptor.getValue(); + + assertTrue(stats.isNtn); + + reset(mPersistAtomsStorage); + + when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())) + .thenReturn(false); + + mDataCallSessionStats.onSetupDataCall(ApnSetting.TYPE_IMS); + mDataCallSessionStats.onSetupDataCallResponse( + mDefaultImsResponse, + TelephonyManager.NETWORK_TYPE_LTE, + ApnSetting.TYPE_IMS, + ApnSetting.PROTOCOL_IP, + DataFailCause.NONE); + + mDataCallSessionStats.setTimeMillis(60000L); + mDataCallSessionStats.conclude(); + + + verify(mPersistAtomsStorage).addDataCallSession(callCaptor.capture()); + stats = callCaptor.getValue(); + + assertFalse(stats.isNtn); + } } diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java index 16dab440d7..27878d15c7 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java @@ -30,15 +30,20 @@ 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.any; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; +import android.platform.test.flag.junit.CheckFlagsRule; +import android.platform.test.flag.junit.DeviceFlagsValueProvider; import android.telephony.AccessNetworkConstants; import android.telephony.Annotation.NetworkType; import android.telephony.NetworkRegistrationInfo; @@ -58,6 +63,7 @@ import com.android.internal.telephony.uicc.UiccSlot; import org.junit.After; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -76,6 +82,9 @@ public class ServiceStateStatsTest extends TelephonyTest { private TestableServiceStateStats mServiceStateStats; + @Rule + public final CheckFlagsRule mCheckFlagsRule = DeviceFlagsValueProvider.createCheckFlagsRule(); + private static class TestableServiceStateStats extends ServiceStateStats { private long mTimeMillis = START_TIME_MILLIS; @@ -1324,6 +1333,34 @@ public class ServiceStateStatsTest extends TelephonyTest { verifyNoMoreInteractions(mPersistAtomsStorage); } + @Test + public void testIsNtn() { + // Using default service state for LTE + mServiceStateStats.onServiceStateChanged(mServiceState); + mServiceStateStats.incTimeMillis(100L); + mServiceStateStats.conclude(); + + ArgumentCaptor<CellularServiceState> captor = + ArgumentCaptor.forClass(CellularServiceState.class); + verify(mPersistAtomsStorage) + .addCellularServiceStateAndCellularDataServiceSwitch(captor.capture(), eq(null)); + CellularServiceState state = captor.getValue(); + assertFalse(state.isNtn); + + reset(mPersistAtomsStorage); + reset(mServiceState); + + when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true); + mServiceStateStats.onServiceStateChanged(mServiceState); + mServiceStateStats.incTimeMillis(100L); + mServiceStateStats.conclude(); + + verify(mPersistAtomsStorage) + .addCellularServiceStateAndCellularDataServiceSwitch(captor.capture(), eq(null)); + state = captor.getValue(); + assertTrue(state.isNtn); + } + private void mockWwanPsRat(@NetworkType int rat) { mockWwanRat( NetworkRegistrationInfo.DOMAIN_PS, diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java index 58cc5168e1..edc481a9ca 100644 --- a/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java +++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java @@ -34,15 +34,19 @@ import static com.android.internal.telephony.TelephonyStatsLog.VOICE_CALL_SESSIO import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertWithMessage; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.any; import static org.mockito.Mockito.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; +import static org.mockito.Mockito.when; import android.annotation.NonNull; import android.os.Looper; @@ -2753,6 +2757,36 @@ public class VoiceCallSessionStatsTest extends TelephonyTest { assertProtoEquals(expectedRatUsage, ratUsage.get()[0]); } + @Test + public void testIsNtn() { + when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())).thenReturn(true); + + mVoiceCallSessionStats0.onImsDial(mImsConnection0); + mVoiceCallSessionStats0.setTimeMillis(2200L); + mVoiceCallSessionStats0.onImsCallTerminated(mImsConnection0, + new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NETWORK_NO_LTE_COVERAGE, 0)); + + ArgumentCaptor<VoiceCallSession> callCaptor = + ArgumentCaptor.forClass(VoiceCallSession.class); + verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture()); + VoiceCallSession session = callCaptor.getValue(); + assertTrue(session.isNtn); + + reset(mPersistAtomsStorage); + reset(mServiceState); + + when(mSatelliteController.isInSatelliteModeForCarrierRoaming(any())) + .thenReturn(false); + mVoiceCallSessionStats0.onImsDial(mImsConnection0); + mVoiceCallSessionStats0.setTimeMillis(2200L); + mVoiceCallSessionStats0.onImsCallTerminated(mImsConnection0, + new ImsReasonInfo(ImsReasonInfo.CODE_LOCAL_NETWORK_NO_LTE_COVERAGE, 0)); + + verify(mPersistAtomsStorage, times(1)).addVoiceCallSession(callCaptor.capture()); + session = callCaptor.getValue(); + assertFalse(session.isNtn); + } + private AtomicReference<VoiceCallRatUsage[]> setupRatUsageCapture() { final AtomicReference<VoiceCallRatUsage[]> ratUsage = new AtomicReference<>(null); doAnswer( |