summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--proto/src/persist_atoms.proto3
-rw-r--r--src/java/com/android/internal/telephony/metrics/DataCallSessionStats.java6
-rw-r--r--src/java/com/android/internal/telephony/metrics/MetricsCollector.java9
-rw-r--r--src/java/com/android/internal/telephony/metrics/PersistAtomsStorage.java3
-rw-r--r--src/java/com/android/internal/telephony/metrics/ServiceStateStats.java6
-rw-r--r--src/java/com/android/internal/telephony/metrics/VoiceCallSessionStats.java7
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/metrics/DataCallSessionStatsTest.java47
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/metrics/ServiceStateStatsTest.java37
-rw-r--r--tests/telephonytests/src/com/android/internal/telephony/metrics/VoiceCallSessionStatsTest.java34
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(