Merge "Add satellite access controller atom into metrics" into main
diff --git a/proto/src/persist_atoms.proto b/proto/src/persist_atoms.proto
index b7c7d9b..48e7b0d 100644
--- a/proto/src/persist_atoms.proto
+++ b/proto/src/persist_atoms.proto
@@ -350,6 +350,7 @@
optional int32 count = 15;
optional bool is_managed_profile = 16;
optional bool is_ntn = 17;
+ optional bool is_emergency = 18;
// Internal use only
optional int32 hashCode = 10001;
diff --git a/src/java/com/android/internal/telephony/InboundSmsHandler.java b/src/java/com/android/internal/telephony/InboundSmsHandler.java
index 03d56ed..49d1adc 100644
--- a/src/java/com/android/internal/telephony/InboundSmsHandler.java
+++ b/src/java/com/android/internal/telephony/InboundSmsHandler.java
@@ -747,7 +747,9 @@
// data will be tracked when the message is processed (processMessagePart).
if (result != Intents.RESULT_SMS_HANDLED && result != Activity.RESULT_OK) {
mMetrics.writeIncomingSmsError(mPhone.getPhoneId(), is3gpp2(), smsSource, result);
- mPhone.getSmsStats().onIncomingSmsError(is3gpp2(), smsSource, result);
+ mPhone.getSmsStats().onIncomingSmsError(is3gpp2(), smsSource, result,
+ TelephonyManager.from(mContext)
+ .isEmergencyNumber(smsb.getOriginatingAddress()));
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
@@ -1020,7 +1022,8 @@
+ (pduList.size() == 0 ? "pduList.size() == 0" : "pduList.contains(null)");
logeWithLocalLog(errorMsg, tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsError(
- is3gpp2(), tracker.getSource(), RESULT_SMS_NULL_PDU);
+ is3gpp2(), tracker.getSource(), RESULT_SMS_NULL_PDU,
+ TelephonyManager.from(mContext).isEmergencyNumber(tracker.getAddress()));
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
@@ -1049,7 +1052,9 @@
SmsConstants.FORMAT_3GPP, timestamps, false,
tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsWapPush(tracker.getSource(),
- messageCount, RESULT_SMS_NULL_MESSAGE, tracker.getMessageId());
+ messageCount, RESULT_SMS_NULL_MESSAGE, tracker.getMessageId(),
+ TelephonyManager.from(mContext)
+ .isEmergencyNumber(tracker.getAddress()));
return false;
}
}
@@ -1084,7 +1089,8 @@
mMetrics.writeIncomingWapPush(mPhone.getPhoneId(), tracker.getSource(),
format, timestamps, wapPushResult, tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsWapPush(tracker.getSource(), messageCount,
- result, tracker.getMessageId());
+ result, tracker.getMessageId(), TelephonyManager.from(mContext)
+ .isEmergencyNumber(tracker.getAddress()));
// result is Activity.RESULT_OK if an ordered broadcast was sent
if (result == Activity.RESULT_OK) {
return true;
@@ -1104,10 +1110,11 @@
mMetrics.writeIncomingSmsSession(mPhone.getPhoneId(), tracker.getSource(),
format, timestamps, block, tracker.getMessageId());
mPhone.getSmsStats().onIncomingSmsSuccess(is3gpp2(), tracker.getSource(),
- messageCount, block, tracker.getMessageId());
+ messageCount, block, tracker.getMessageId(),
+ TelephonyManager.from(mContext).isEmergencyNumber(tracker.getAddress()));
CarrierRoamingSatelliteSessionStats sessionStats =
CarrierRoamingSatelliteSessionStats.getInstance(mPhone.getSubId());
- sessionStats.onIncomingSms();
+ sessionStats.onIncomingSms(mPhone.getSubId());
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
diff --git a/src/java/com/android/internal/telephony/SMSDispatcher.java b/src/java/com/android/internal/telephony/SMSDispatcher.java
index 70bddd1..8764e02 100644
--- a/src/java/com/android/internal/telephony/SMSDispatcher.java
+++ b/src/java/com/android/internal/telephony/SMSDispatcher.java
@@ -89,7 +89,6 @@
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
import com.android.internal.telephony.cdma.sms.UserData;
-import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.uicc.IccRecords;
@@ -1067,9 +1066,6 @@
tracker.isFromDefaultSmsApplication(mContext),
tracker.getInterval(),
mTelephonyManager.isEmergencyNumber(tracker.mDestAddress));
- CarrierRoamingSatelliteSessionStats sessionStats =
- CarrierRoamingSatelliteSessionStats.getInstance(mPhone.getSubId());
- sessionStats.onOutgoingSms();
if (mPhone != null) {
TelephonyAnalytics telephonyAnalytics = mPhone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
diff --git a/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java b/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java
index 7fc499e..077ee0b 100644
--- a/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java
+++ b/src/java/com/android/internal/telephony/SmsBroadcastUndelivered.java
@@ -30,6 +30,7 @@
import android.os.UserManager;
import android.telephony.CarrierConfigManager;
import android.telephony.SubscriptionManager;
+import android.telephony.TelephonyManager;
import com.android.internal.telephony.analytics.TelephonyAnalytics;
import com.android.internal.telephony.analytics.TelephonyAnalytics.SmsMmsAnalytics;
@@ -243,7 +244,8 @@
message.mMessageCount);
if (phone != null) {
phone.getSmsStats().onDroppedIncomingMultipartSms(message.mIs3gpp2, rows,
- message.mMessageCount);
+ message.mMessageCount, TelephonyManager.from(context)
+ .isEmergencyNumber(message.mAddress));
TelephonyAnalytics telephonyAnalytics = phone.getTelephonyAnalytics();
if (telephonyAnalytics != null) {
SmsMmsAnalytics smsMmsAnalytics =
diff --git a/src/java/com/android/internal/telephony/data/DataConfigManager.java b/src/java/com/android/internal/telephony/data/DataConfigManager.java
index 4177cc4..20761e2 100644
--- a/src/java/com/android/internal/telephony/data/DataConfigManager.java
+++ b/src/java/com/android/internal/telephony/data/DataConfigManager.java
@@ -714,8 +714,7 @@
/**
* Update the voice over PS related config from the carrier config.
*/
- private void updateVopsConfig() {
- synchronized (this) {
+ private synchronized void updateVopsConfig() {
mShouldKeepNetworkUpInNonVops = mCarrierConfig.getBoolean(CarrierConfigManager
.Ims.KEY_KEEP_PDN_UP_IN_NO_VOPS_BOOL);
int[] allowedNetworkTypes = mCarrierConfig.getIntArray(
@@ -723,7 +722,6 @@
if (allowedNetworkTypes != null) {
Arrays.stream(allowedNetworkTypes).forEach(mEnabledVopsNetworkTypesInNonVops::add);
}
- }
}
/**
@@ -886,6 +884,14 @@
}
/**
+ * @return What kind of traffic is supported on an unrestricted satellite network.
+ */
+ @CarrierConfigManager.SATELLITE_DATA_SUPPORT_MODE
+ public int getSatelliteDataSupportMode() {
+ return mCarrierConfig.getInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT);
+ }
+
+ /**
* @return Whether data throttling should be reset when the TAC changes from the carrier config.
*/
public boolean shouldResetDataThrottlingWhenTacChanges() {
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index 57d242b..8369874 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -2445,6 +2445,7 @@
}
// Always start with not-restricted, and then remove if needed.
+ // By default, NET_CAPABILITY_NOT_RESTRICTED and NET_CAPABILITY_NOT_CONSTRAINED are included
builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
// When data is disabled, or data roaming is disabled and the device is roaming, we need
@@ -2483,11 +2484,6 @@
builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
}
- // mark the network as restricted when service state is non-terrestrial(satellite network)
- if (mFlags.satelliteInternet() && mIsSatellite) {
- builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
- }
-
// Check if the feature force MMS on IWLAN is enabled. When the feature is enabled, MMS
// will be attempted on IWLAN if possible, even if existing cellular networks already
// supports IWLAN.
@@ -2529,6 +2525,23 @@
builder.setLinkDownstreamBandwidthKbps(mNetworkBandwidth.downlinkBandwidthKbps);
builder.setLinkUpstreamBandwidthKbps(mNetworkBandwidth.uplinkBandwidthKbps);
+ // Configure the network as restricted/constrained for unrestricted satellite network.
+ if (mFlags.satelliteInternet() && mIsSatellite && builder.build()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
+ switch (mDataConfigManager.getSatelliteDataSupportMode()) {
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED
+ -> builder.removeCapability(
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED -> {
+ try {
+ builder.removeCapability(DataUtils
+ .NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ } catch (Exception ignored) { }
+ }
+ // default case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL
+ }
+ }
+
NetworkCapabilities nc = builder.build();
if (mNetworkCapabilities == null || mNetworkAgent == null) {
// This is the first time when network capabilities is created. The agent is not created
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index 008da14..30172db 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -1947,22 +1947,12 @@
// If the network is satellite, then the network must be restricted.
if (mFeatureFlags.satelliteInternet()) {
// The IWLAN data network should remain intact even when satellite is connected.
- if (dataNetwork.getTransport() != AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
- // On satellite, every data network needs to be restricted.
- if (mServiceState.isUsingNonTerrestrialNetwork()
- && dataNetwork.getNetworkCapabilities()
- .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- evaluation.addDataDisallowedReason(
- DataDisallowedReason.DATA_NETWORK_TRANSPORT_NOT_ALLOWED);
- }
-
- // Check if the transport is compatible with the network
- if (mServiceState.isUsingNonTerrestrialNetwork() != dataNetwork.isSatellite()) {
- // Since we don't support satellite/cellular network handover, we should always
- // tear down the network when transport changes.
- evaluation.addDataDisallowedReason(
- DataDisallowedReason.DATA_NETWORK_TRANSPORT_NOT_ALLOWED);
- }
+ if (dataNetwork.getTransport() != AccessNetworkConstants.TRANSPORT_TYPE_WLAN
+ && mServiceState.isUsingNonTerrestrialNetwork() != dataNetwork.isSatellite()) {
+ // Since we don't support satellite/cellular network handover, we should always
+ // tear down the network when transport changes.
+ evaluation.addDataDisallowedReason(
+ DataDisallowedReason.DATA_NETWORK_TRANSPORT_NOT_ALLOWED);
}
}
@@ -2171,11 +2161,24 @@
return true;
}
- // When the device is on satellite, only restricted network request can request network.
- if (mServiceState.isUsingNonTerrestrialNetwork()
- && networkRequest.hasCapability(
- NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- return false;
+ // When the device is on satellite, only restricted/constrained network request can request
+ // network.
+ if (mServiceState.isUsingNonTerrestrialNetwork() && networkRequest.hasCapability(
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
+ switch (mDataConfigManager.getSatelliteDataSupportMode()) {
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED -> {
+ return false;
+ }
+ case CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED -> {
+ try {
+ if (networkRequest.hasCapability(DataUtils
+ .NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)) {
+ return false;
+ }
+ } catch (Exception ignored) { }
+ }
+ // default case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL
+ }
}
// If the network request does not specify cellular or satellite, then it can be
diff --git a/src/java/com/android/internal/telephony/data/DataUtils.java b/src/java/com/android/internal/telephony/data/DataUtils.java
index 8b95913..20da97f 100644
--- a/src/java/com/android/internal/telephony/data/DataUtils.java
+++ b/src/java/com/android/internal/telephony/data/DataUtils.java
@@ -59,6 +59,7 @@
* This class contains all the utility methods used by telephony data stack.
*/
public class DataUtils {
+ public static final int NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED = 37;
/** The time format for converting time to readable string. */
private static final SimpleDateFormat TIME_FORMAT =
new SimpleDateFormat("HH:mm:ss.SSS", Locale.US);
@@ -165,6 +166,7 @@
case NetworkCapabilities.NET_CAPABILITY_MMTEL -> "MMTEL";
case NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_LATENCY -> "PRIORITIZE_LATENCY";
case NetworkCapabilities.NET_CAPABILITY_PRIORITIZE_BANDWIDTH -> "PRIORITIZE_BANDWIDTH";
+ case NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED -> "NOT_BANDWIDTH_CONSTRAINED";
default -> {
loge("Unknown network capability(" + netCap + ")");
yield "Unknown(" + netCap + ")";
diff --git a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
index 0521406..a83cd06 100644
--- a/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
+++ b/src/java/com/android/internal/telephony/metrics/MetricsCollector.java
@@ -1170,7 +1170,8 @@
sms.messageId,
sms.count,
sms.isManagedProfile,
- sms.isNtn);
+ sms.isNtn,
+ sms.isEmergency);
}
private static StatsEvent buildStatsEvent(OutgoingSms sms) {
diff --git a/src/java/com/android/internal/telephony/metrics/SmsStats.java b/src/java/com/android/internal/telephony/metrics/SmsStats.java
index 6f9a764..b62114c 100644
--- a/src/java/com/android/internal/telephony/metrics/SmsStats.java
+++ b/src/java/com/android/internal/telephony/metrics/SmsStats.java
@@ -61,6 +61,7 @@
import com.android.internal.telephony.nano.PersistAtomsProto.IncomingSms;
import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingShortCodeSms;
import com.android.internal.telephony.nano.PersistAtomsProto.OutgoingSms;
+import com.android.internal.telephony.satellite.metrics.CarrierRoamingSatelliteSessionStats;
import com.android.telephony.Rlog;
import java.util.Objects;
@@ -88,8 +89,9 @@
}
/** Create a new atom when multi-part incoming SMS is dropped due to missing parts. */
- public void onDroppedIncomingMultipartSms(boolean is3gpp2, int receivedCount, int totalCount) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, SOURCE_NOT_INJECTED);
+ public void onDroppedIncomingMultipartSms(boolean is3gpp2, int receivedCount, int totalCount,
+ boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, SOURCE_NOT_INJECTED, isEmergency);
// Keep SMS tech as unknown because it's possible that it changed overtime and is not
// necessarily the current one. Similarly mark the RAT as unknown.
proto.smsTech = INCOMING_SMS__SMS_TECH__SMS_TECH_UNKNOWN;
@@ -103,21 +105,21 @@
/** Create a new atom when an SMS for the voicemail indicator is received. */
public void onIncomingSmsVoicemail(boolean is3gpp2,
@InboundSmsHandler.SmsSource int smsSource) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource);
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource, false);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_VOICEMAIL_INDICATION;
mAtomsStorage.addIncomingSms(proto);
}
/** Create a new atom when an SMS of type zero is received. */
public void onIncomingSmsTypeZero(@InboundSmsHandler.SmsSource int smsSource) {
- IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource);
+ IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource, false);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_ZERO;
mAtomsStorage.addIncomingSms(proto);
}
/** Create a new atom when an SMS-PP for the SIM card is received. */
public void onIncomingSmsPP(@InboundSmsHandler.SmsSource int smsSource, boolean success) {
- IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource);
+ IncomingSms proto = getIncomingDefaultProto(false /* is3gpp2 */, smsSource, false);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_SMS_PP;
proto.error = getIncomingSmsError(success);
mAtomsStorage.addIncomingSms(proto);
@@ -126,8 +128,8 @@
/** Create a new atom when an SMS is received successfully. */
public void onIncomingSmsSuccess(boolean is3gpp2,
@InboundSmsHandler.SmsSource int smsSource, int messageCount,
- boolean blocked, long messageId) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource);
+ boolean blocked, long messageId, boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource, isEmergency);
proto.totalParts = messageCount;
proto.receivedParts = messageCount;
proto.blocked = blocked;
@@ -137,16 +139,16 @@
/** Create a new atom when an incoming SMS has an error. */
public void onIncomingSmsError(boolean is3gpp2,
- @InboundSmsHandler.SmsSource int smsSource, int result) {
- IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource);
+ @InboundSmsHandler.SmsSource int smsSource, int result, boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(is3gpp2, smsSource, isEmergency);
proto.error = getIncomingSmsError(result);
mAtomsStorage.addIncomingSms(proto);
}
/** Create a new atom when an incoming WAP_PUSH SMS is received. */
public void onIncomingSmsWapPush(@InboundSmsHandler.SmsSource int smsSource,
- int messageCount, int result, long messageId) {
- IncomingSms proto = getIncomingDefaultProto(false, smsSource);
+ int messageCount, int result, long messageId, boolean isEmergency) {
+ IncomingSms proto = getIncomingDefaultProto(false, smsSource, isEmergency);
proto.smsType = INCOMING_SMS__SMS_TYPE__SMS_TYPE_WAP_PUSH;
proto.totalParts = messageCount;
proto.receivedParts = messageCount;
@@ -202,6 +204,9 @@
proto.networkErrorCode = networkErrorCode;
mAtomsStorage.addOutgoingSms(proto);
+ CarrierRoamingSatelliteSessionStats sessionStats =
+ CarrierRoamingSatelliteSessionStats.getInstance(mPhone.getSubId());
+ sessionStats.onOutgoingSms(mPhone.getSubId());
}
/** Create a new atom when user attempted to send an outgoing short code sms. */
@@ -215,7 +220,7 @@
/** Creates a proto for a normal single-part {@code IncomingSms} with default values. */
private IncomingSms getIncomingDefaultProto(boolean is3gpp2,
- @InboundSmsHandler.SmsSource int smsSource) {
+ @InboundSmsHandler.SmsSource int smsSource, boolean isEmergency) {
IncomingSms proto = new IncomingSms();
proto.smsFormat = getSmsFormat(is3gpp2);
proto.smsTech = getSmsTech(smsSource, is3gpp2);
@@ -236,6 +241,7 @@
proto.count = 1;
proto.isManagedProfile = mPhone.isManagedProfile();
proto.isNtn = isNonTerrestrialNetwork();
+ proto.isEmergency = isEmergency;
return proto;
}
diff --git a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
index 3984a5f..c4667e8 100644
--- a/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
+++ b/src/java/com/android/internal/telephony/satellite/DatagramDispatcher.java
@@ -124,6 +124,16 @@
}
/**
+ * @return The singleton instance of DatagramDispatcher.
+ */
+ public static DatagramDispatcher getInstance() {
+ if (sInstance == null) {
+ loge("DatagramDispatcher was not yet initialized.");
+ }
+ return sInstance;
+ }
+
+ /**
* Create a DatagramDispatcher to send satellite datagrams.
*
* @param context The Context for the DatagramDispatcher.
@@ -275,39 +285,31 @@
mPendingNonEmergencyDatagramsMap.remove(argument.datagramId);
}
- if (error == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
+ if (error == SATELLITE_RESULT_SUCCESS) {
// Update send status for current datagram
mDatagramController.updateSendStatus(argument.subId, argument.datagramType,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_SUCCESS,
getPendingDatagramCount(), error);
startWaitForSimulatedPollDatagramsDelayTimer(request);
- if (getPendingDatagramCount() > 0) {
- // Send response for current datagram
- argument.callback.accept(error);
- // Send pending datagrams
- sendPendingDatagrams();
- } else {
- mDatagramController.updateSendStatus(argument.subId,
- argument.datagramType,
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0,
- SatelliteManager.SATELLITE_RESULT_SUCCESS);
- // Send response for current datagram
- argument.callback.accept(error);
- }
} else {
// Update send status
mDatagramController.updateSendStatus(argument.subId, argument.datagramType,
SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_SEND_FAILED,
getPendingDatagramCount(), error);
- mDatagramController.updateSendStatus(argument.subId, argument.datagramType,
- SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE,
- 0, SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ }
+
+ if (getPendingDatagramCount() > 0) {
// Send response for current datagram
- // after updating datagram transfer state internally.
argument.callback.accept(error);
- // Abort sending all the pending datagrams
- abortSendingPendingDatagrams(argument.subId,
- SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
+ // Send pending datagrams
+ sendPendingDatagrams();
+ } else {
+ mDatagramController.updateSendStatus(argument.subId,
+ argument.datagramType,
+ SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE, 0,
+ SatelliteManager.SATELLITE_RESULT_SUCCESS);
+ // Send response for current datagram
+ argument.callback.accept(error);
}
}
break;
@@ -578,6 +580,22 @@
}
}
+ /** Return pending user messages count */
+ public int getPendingUserMessagesCount() {
+ synchronized (mLock) {
+ int pendingUserMessagesCount = 0;
+ for (Entry<Long, SendSatelliteDatagramArgument> entry :
+ mPendingNonEmergencyDatagramsMap.entrySet()) {
+ SendSatelliteDatagramArgument argument = entry.getValue();
+ if (argument.datagramType != SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ pendingUserMessagesCount += 1;
+ }
+ }
+ pendingUserMessagesCount += mPendingEmergencyDatagramsMap.size();
+ return pendingUserMessagesCount;
+ }
+ }
+
/**
* Posts the specified command to be executed on the main thread and returns immediately.
*
@@ -608,11 +626,12 @@
if (resultCode == SatelliteManager.SATELLITE_RESULT_SUCCESS) {
mControllerMetricsStats.reportOutgoingDatagramSuccessCount(argument.datagramType,
mIsDemoMode);
- mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram();
+ mSessionMetricsStats.addCountOfSuccessfulOutgoingDatagram(argument.datagramType);
} else {
mControllerMetricsStats.reportOutgoingDatagramFailCount(argument.datagramType,
mIsDemoMode);
- mSessionMetricsStats.addCountOfFailedOutgoingDatagram();
+ mSessionMetricsStats.addCountOfFailedOutgoingDatagram(argument.datagramType,
+ resultCode);
}
}
@@ -817,8 +836,7 @@
}
// Abort sending all the pending datagrams
- abortSendingPendingDatagrams(argument.subId,
- SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
+ abortSendingPendingDatagrams(argument.subId, SATELLITE_RESULT_MODEM_TIMEOUT);
}
}
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 9cc342a..3a63ac3 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -2912,6 +2912,20 @@
}
/**
+ * Request to get the {@link SatelliteSessionStats} of the satellite service.
+ *
+ * @param subId The subId of the subscription to the satellite session stats for.
+ * @param result The result receiver that returns the {@link SatelliteSessionStats}
+ * if the request is successful or an error code if the request failed.
+ */
+ public void requestSatelliteSessionStats(int subId, @NonNull ResultReceiver result) {
+ if (!mFeatureFlags.oemEnabledSatelliteFlag()) {
+ return;
+ }
+ mSessionMetricsStats.requestSatelliteSessionStats(subId, result);
+ }
+
+ /**
* Get the carrier-enabled emergency call wait for connection timeout millis
*/
public long getCarrierEmergencyCallWaitForConnectionTimeoutMillis() {
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
index 8a26fd2..9f025db 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteModemInterface.java
@@ -187,6 +187,11 @@
mSatelliteSupportedStateChangedRegistrants.notifyResult(supported);
}
+ @Override
+ public void onRegistrationFailure(int causeCode) {
+ // TO-DO notify registrants
+ }
+
private boolean notifyResultIfExpectedListener() {
// Demo listener should notify results only during demo mode
// Vendor listener should notify result only during real mode
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java b/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java
index 4ed4a98..0f88bd5 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/CarrierRoamingSatelliteSessionStats.java
@@ -42,6 +42,7 @@
private int mCountOfOutgoingSms;
private int mCountOfIncomingMms;
private int mCountOfOutgoingMms;
+ private long mIncomingMessageId;
private int mSessionStartTimeSec;
private List<Long> mConnectionStartTimeList;
@@ -49,8 +50,8 @@
private List<Integer> mRsrpList;
private List<Integer> mRssnrList;
- public CarrierRoamingSatelliteSessionStats() {
- logd("Create new CarrierRoamingSatelliteSessionStats.");
+ public CarrierRoamingSatelliteSessionStats(int subId) {
+ logd("Create new CarrierRoamingSatelliteSessionStats. subId=" + subId);
initializeParams();
}
@@ -59,7 +60,7 @@
synchronized (sCarrierRoamingSatelliteSessionStats) {
if (sCarrierRoamingSatelliteSessionStats.get(subId) == null) {
sCarrierRoamingSatelliteSessionStats.put(subId,
- new CarrierRoamingSatelliteSessionStats());
+ new CarrierRoamingSatelliteSessionStats(subId));
}
return sCarrierRoamingSatelliteSessionStats.get(subId);
}
@@ -107,15 +108,41 @@
}
/** Log incoming sms success case */
- public void onIncomingSms() {
+ public void onIncomingSms(int subId) {
+ if (!isNtnConnected()) {
+ return;
+ }
mCountOfIncomingSms += 1;
- logd("onIncomingSms: mCountOfIncomingSms=" + mCountOfIncomingSms);
+ logd("onIncomingSms: subId=" + subId + ", count=" + mCountOfIncomingSms);
}
/** Log outgoing sms success case */
- public void onOutgoingSms() {
+ public void onOutgoingSms(int subId) {
+ if (!isNtnConnected()) {
+ return;
+ }
mCountOfOutgoingSms += 1;
- logd("onOutgoingSms: mCountOfOutgoingSms=" + mCountOfOutgoingSms);
+ logd("onOutgoingSms: subId=" + subId + ", count=" + mCountOfOutgoingSms);
+ }
+
+ /** Log incoming or outgoing mms success case */
+ public void onMms(boolean isIncomingMms, long messageId) {
+ if (!isNtnConnected()) {
+ return;
+ }
+ if (isIncomingMms) {
+ mIncomingMessageId = messageId;
+ mCountOfIncomingMms += 1;
+ logd("onMms: messageId=" + messageId + ", countOfIncomingMms=" + mCountOfIncomingMms);
+ } else {
+ if (mIncomingMessageId == messageId) {
+ logd("onMms: NotifyResponse ignore it.");
+ mIncomingMessageId = 0;
+ return;
+ }
+ mCountOfOutgoingMms += 1;
+ logd("onMms: countOfOutgoingMms=" + mCountOfOutgoingMms);
+ }
}
private void reportMetrics() {
@@ -165,12 +192,14 @@
mCountOfOutgoingSms = 0;
mCountOfIncomingMms = 0;
mCountOfOutgoingMms = 0;
+ mIncomingMessageId = 0;
mSessionStartTimeSec = 0;
mConnectionStartTimeList = new ArrayList<>();
mConnectionEndTimeList = new ArrayList<>();
mRsrpList = new ArrayList<>();
mRssnrList = new ArrayList<>();
+ logd("initializeParams");
}
private CellSignalStrengthLte getCellSignalStrengthLte(Phone phone) {
@@ -259,6 +288,10 @@
return System.currentTimeMillis();
}
+ private boolean isNtnConnected() {
+ return mSessionStartTimeSec != 0;
+ }
+
private void logd(@NonNull String log) {
Log.d(TAG, log);
}
diff --git a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
index 73ede60..65181c0 100644
--- a/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
+++ b/src/java/com/android/internal/telephony/satellite/metrics/SessionMetricsStats.java
@@ -17,13 +17,18 @@
package com.android.internal.telephony.satellite.metrics;
import static android.telephony.satellite.NtnSignalStrength.NTN_SIGNAL_STRENGTH_NONE;
+import static android.telephony.satellite.SatelliteManager.SATELLITE_RESULT_SUCCESS;
import android.annotation.NonNull;
+import android.os.Bundle;
+import android.os.ResultReceiver;
import android.telephony.satellite.NtnSignalStrength;
import android.telephony.satellite.SatelliteManager;
+import android.telephony.satellite.SatelliteSessionStats;
import android.util.Log;
import com.android.internal.telephony.metrics.SatelliteStats;
+import com.android.internal.telephony.satellite.DatagramDispatcher;
/**
* Stats to log to satellite session metrics
@@ -41,6 +46,8 @@
private int mSessionDurationSec;
private int mCountOfSuccessfulOutgoingDatagram;
private int mCountOfFailedOutgoingDatagram;
+ private int mCountOfTimedOutUserMessagesWaitingForConnection;
+ private int mCountOfTimedOutUserMessagesWaitingForAck;
private int mCountOfSuccessfulIncomingDatagram;
private int mCountOfIncomingDatagramFailed;
private boolean mIsDemoMode;
@@ -111,7 +118,13 @@
}
/** Increase the count of successful outgoing datagram transmission. */
- public SessionMetricsStats addCountOfSuccessfulOutgoingDatagram() {
+ public SessionMetricsStats addCountOfSuccessfulOutgoingDatagram(
+ @NonNull @SatelliteManager.DatagramType int datagramType) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
mCountOfSuccessfulOutgoingDatagram++;
logd("addCountOfSuccessfulOutgoingDatagram: current count="
+ mCountOfSuccessfulOutgoingDatagram);
@@ -119,9 +132,51 @@
}
/** Increase the count of failed outgoing datagram transmission. */
- public SessionMetricsStats addCountOfFailedOutgoingDatagram() {
+ public SessionMetricsStats addCountOfFailedOutgoingDatagram(
+ @NonNull @SatelliteManager.DatagramType int datagramType,
+ @NonNull @SatelliteManager.SatelliteResult int resultCode) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
mCountOfFailedOutgoingDatagram++;
logd("addCountOfFailedOutgoingDatagram: current count=" + mCountOfFailedOutgoingDatagram);
+
+ if (resultCode == SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE) {
+ addCountOfTimedOutUserMessagesWaitingForConnection(datagramType);
+ } else if (resultCode == SatelliteManager.SATELLITE_RESULT_MODEM_TIMEOUT) {
+ addCountOfTimedOutUserMessagesWaitingForAck(datagramType);
+ }
+
+ return this;
+ }
+
+ /** Increase the count of user messages that timed out waiting for connection. */
+ private SessionMetricsStats addCountOfTimedOutUserMessagesWaitingForConnection(
+ @NonNull @SatelliteManager.DatagramType int datagramType) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
+ mCountOfTimedOutUserMessagesWaitingForConnection++;
+ logd("addCountOfTimedOutUserMessagesWaitingForConnection: current count="
+ + mCountOfTimedOutUserMessagesWaitingForConnection);
+ return this;
+ }
+
+ /** Increase the count of user messages that timed out waiting for ack. */
+ private SessionMetricsStats addCountOfTimedOutUserMessagesWaitingForAck(
+ @NonNull @SatelliteManager.DatagramType int datagramType) {
+ if (datagramType == SatelliteManager.DATAGRAM_TYPE_KEEP_ALIVE) {
+ // Ignore KEEP_ALIVE messages
+ return this;
+ }
+
+ mCountOfTimedOutUserMessagesWaitingForAck++;
+ logd("addCountOfTimedOutUserMessagesWaitingForAck: current count="
+ + mCountOfTimedOutUserMessagesWaitingForAck);
return this;
}
@@ -180,6 +235,23 @@
initializeSessionMetricsParam();
}
+ /** Returns {@link SatelliteSessionStats} of the satellite service. */
+ public void requestSatelliteSessionStats(int subId, @NonNull ResultReceiver result) {
+ Bundle bundle = new Bundle();
+ SatelliteSessionStats sessionStats = new SatelliteSessionStats.Builder()
+ .setCountOfSuccessfulUserMessages(mCountOfSuccessfulOutgoingDatagram)
+ .setCountOfUnsuccessfulUserMessages(mCountOfFailedOutgoingDatagram)
+ .setCountOfTimedOutUserMessagesWaitingForConnection(
+ mCountOfTimedOutUserMessagesWaitingForConnection)
+ .setCountOfTimedOutUserMessagesWaitingForAck(
+ mCountOfTimedOutUserMessagesWaitingForAck)
+ .setCountOfUserMessagesInQueueToBeSent(
+ DatagramDispatcher.getInstance().getPendingUserMessagesCount())
+ .build();
+ bundle.putParcelable(SatelliteManager.KEY_SESSION_STATS, sessionStats);
+ result.send(SATELLITE_RESULT_SUCCESS, bundle);
+ }
+
/** Returns the processing time for satellite session initialization. */
public long getSessionInitializationProcessingTimeMillis() {
return mInitializationProcessingTimeMillis;
@@ -199,6 +271,8 @@
mSessionDurationSec = 0;
mCountOfSuccessfulOutgoingDatagram = 0;
mCountOfFailedOutgoingDatagram = 0;
+ mCountOfTimedOutUserMessagesWaitingForConnection = 0;
+ mCountOfTimedOutUserMessagesWaitingForAck = 0;
mCountOfSuccessfulIncomingDatagram = 0;
mCountOfIncomingDatagramFailed = 0;
mIsDemoMode = false;
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
index 9d1c05e..60dcb59 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -5052,18 +5052,84 @@
@Test
public void testNonTerrestrialNetwork() throws Exception {
+ TelephonyNetworkRequest request;
mIsNonTerrestrialNetwork = true;
serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
- mDataNetworkControllerUT.addNetworkRequest(
- createNetworkRequest(false, NetworkCapabilities.NET_CAPABILITY_RCS));
+ // By default, Test only support restricted network, regardless whether constrained.
+ // Verify not_restricted network not supported.
+ request = createNetworkRequest(false, NetworkCapabilities.NET_CAPABILITY_RCS);
+ mDataNetworkControllerUT.addNetworkRequest(request);
processAllMessages();
verifyAllDataDisconnected();
+ mDataNetworkControllerUT.removeNetworkRequest(request);
- mDataNetworkControllerUT.addNetworkRequest(
- createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_RCS));
+ // Verify restricted network is supported.
+ request = createNetworkRequest(true, NetworkCapabilities.NET_CAPABILITY_RCS);
+ mDataNetworkControllerUT.addNetworkRequest(request);
processAllMessages();
verifyConnectedNetworkHasDataProfile(mNtnDataProfile);
+ mDataNetworkControllerUT.removeNetworkRequest(request);
+ getDataNetworks().get(0).tearDown(DataNetwork
+ .TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED);
+
+ // Test constrained network is supported, regardless whether it's restricted
+ processAllFutureMessages();
+ verifyAllDataDisconnected();
+ mCarrierConfig.putInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
+ CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED);
+ carrierConfigChanged();
+ // Verify not_restricted, not_constrained network not supported.
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
+ try {
+ netCaps.addCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ } catch (Exception ignored) { }
+ request = new TelephonyNetworkRequest(new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
+
+ mDataNetworkControllerUT.addNetworkRequest(request);
+ processAllMessages();
+ verifyAllDataDisconnected();
+ mDataNetworkControllerUT.removeNetworkRequest(request);
+
+ // Verify restricted, not_constrained network is supported.
+ netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+ try {
+ netCaps.addCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ } catch (Exception ignored) { }
+ request = new TelephonyNetworkRequest(new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags);
+ mDataNetworkControllerUT.addNetworkRequest(request);
+ processAllMessages();
+ verifyConnectedNetworkHasDataProfile(mNtnDataProfile);
+ mDataNetworkControllerUT.removeNetworkRequest(request);
+ getDataNetworks().get(0).tearDown(DataNetwork
+ .TEAR_DOWN_REASON_CONNECTIVITY_SERVICE_UNWANTED);
+
+ // TODO(enable after NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED become a default cap)
+ // Test not constrained network supported
+// processAllFutureMessages();
+// verifyAllDataDisconnected();
+// mCarrierConfig.putInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
+// CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL);
+// carrierConfigChanged();
+//
+// netCaps = new NetworkCapabilities();
+// netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_RCS);
+// try {
+// netCaps.addCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+// } catch (Exception ignored) {}
+// mDataNetworkControllerUT.addNetworkRequest(
+// new TelephonyNetworkRequest(new NetworkRequest(netCaps,
+// ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+// NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags));
+// processAllMessages();
+// verifyConnectedNetworkHasDataProfile(mNtnDataProfile);
}
@Test
diff --git a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
index d5a52ea..7795e42 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -53,6 +53,7 @@
import android.telephony.AccessNetworkConstants.TransportType;
import android.telephony.Annotation;
import android.telephony.Annotation.DataFailureCause;
+import android.telephony.CarrierConfigManager;
import android.telephony.DataFailCause;
import android.telephony.DataSpecificRegistrationInfo;
import android.telephony.LteVopsSupportInfo;
@@ -333,33 +334,40 @@
private void serviceStateChanged(@Annotation.NetworkType int networkType,
@NetworkRegistrationInfo.RegistrationState int regState,
DataSpecificRegistrationInfo dsri, boolean isNtn) {
- ServiceState ss = new ServiceState();
- ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ doReturn(isNtn).when(mServiceState).isUsingNonTerrestrialNetwork();
+
+ doReturn(new NetworkRegistrationInfo.Builder()
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
.setAccessNetworkTechnology(networkType)
.setRegistrationState(regState)
.setDomain(NetworkRegistrationInfo.DOMAIN_PS)
.setDataSpecificInfo(dsri)
.setIsNonTerrestrialNetwork(isNtn)
- .build());
+ .build()).when(mServiceState)
+ .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
- ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ doReturn(new NetworkRegistrationInfo.Builder()
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WLAN)
.setAccessNetworkTechnology(TelephonyManager.NETWORK_TYPE_IWLAN)
.setRegistrationState(NetworkRegistrationInfo.REGISTRATION_STATE_HOME)
.setDomain(NetworkRegistrationInfo.DOMAIN_PS)
- .build());
+ .build()).when(mServiceState)
+ .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_PS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WLAN);
- ss.addNetworkRegistrationInfo(new NetworkRegistrationInfo.Builder()
+ doReturn(new NetworkRegistrationInfo.Builder()
.setTransportType(AccessNetworkConstants.TRANSPORT_TYPE_WWAN)
.setAccessNetworkTechnology(networkType)
.setRegistrationState(regState)
.setDomain(NetworkRegistrationInfo.DOMAIN_CS)
- .build());
- ss.setDataRoamingFromRegistration(regState
- == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING);
- doReturn(ss).when(mSST).getServiceState();
- doReturn(ss).when(mPhone).getServiceState();
+ .build()).when(mServiceState)
+ .getNetworkRegistrationInfo(NetworkRegistrationInfo.DOMAIN_CS,
+ AccessNetworkConstants.TRANSPORT_TYPE_WWAN);
+
+ boolean isRoaming = regState == NetworkRegistrationInfo.REGISTRATION_STATE_ROAMING;
+ doReturn(isRoaming).when(mServiceState).getDataRoamingFromRegistration();
+ doReturn(isRoaming).when(mServiceState).getDataRoaming();
if (mDataNetworkUT != null) {
mDataNetworkUT.obtainMessage(9/*EVENT_SERVICE_STATE_CHANGED*/).sendToTarget();
@@ -420,6 +428,8 @@
doReturn(Set.of(NetworkCapabilities.NET_CAPABILITY_IMS,
NetworkCapabilities.NET_CAPABILITY_EIMS, NetworkCapabilities.NET_CAPABILITY_XCAP))
.when(mDataConfigManager).getForcedCellularTransportCapabilities();
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED)
+ .when(mDataConfigManager).getSatelliteDataSupportMode();
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
doReturn(true).when(mFeatureFlags).satelliteInternet();
@@ -2373,6 +2383,7 @@
}
private void setupNonTerrestrialDataNetwork() {
+ doReturn(true).when(mServiceState).isUsingNonTerrestrialNetwork();
NetworkRequestList networkRequestList = new NetworkRequestList();
networkRequestList.add(new TelephonyNetworkRequest(new NetworkRequest.Builder()
@@ -2387,6 +2398,8 @@
AccessNetworkConstants.TRANSPORT_TYPE_WWAN,
DataAllowedReason.NORMAL, mDataNetworkCallback);
processAllMessages();
+
+ assertThat(mDataNetworkUT.isSatellite()).isTrue();
}
private void setupTerrestrialDataNetwork() {
@@ -2509,6 +2522,42 @@
}
@Test
+ public void testUnrestrictedSatelliteNetworkCapabilities() {
+ setupNonTerrestrialDataNetwork();
+ assertThat(mDataNetworkUT.isSatellite()).isTrue();
+
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isFalse();
+
+ // Test constrained traffic
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED)
+ .when(mDataConfigManager).getSatelliteDataSupportMode();
+ mDataNetworkUT.sendMessage(22/*EVENT_VOICE_CALL_STARTED*/); // update network capabilities
+ processAllMessages();
+
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isTrue();
+ try {
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)).isFalse();
+ } catch (Exception ignored) { }
+
+ // Test not constrained traffic
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL)
+ .when(mDataConfigManager).getSatelliteDataSupportMode();
+ mDataNetworkUT.sendMessage(22/*EVENT_VOICE_CALL_STARTED*/); // update network capabilities
+ processAllMessages();
+
+ assertThat(mDataNetworkUT.getNetworkCapabilities()
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)).isTrue();
+ // TODO(enable after NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED become a default cap)
+// try {
+// assertThat(mDataNetworkUT.getNetworkCapabilities()
+// .hasCapability(DataUtils.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)).isTrue();
+// } catch (Exception ignored) {}
+ }
+
+ @Test
public void testIsTransportSatelliteSupportNonImsNonTerrestrialNetwork() throws Exception {
// Service state at Non-terrestrial network
serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
diff --git a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
index 7d0d2e5..8ee3a37 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/metrics/PersistAtomsStorageTest.java
@@ -1033,6 +1033,7 @@
mIncomingSms1.count = 1;
mIncomingSms1.isManagedProfile = false;
mIncomingSms1.isNtn = false;
+ mIncomingSms1.isEmergency = true;
mIncomingSms2 = new IncomingSms();
mIncomingSms2.smsFormat = INCOMING_SMS__SMS_FORMAT__SMS_FORMAT_3GPP2;
@@ -1052,6 +1053,7 @@
mIncomingSms2.count = 2;
mIncomingSms2.isManagedProfile = true;
mIncomingSms2.isNtn = true;
+ mIncomingSms2.isEmergency = true;
mIncomingSms = new IncomingSms[] {mIncomingSms1, mIncomingSms2};
@@ -6106,7 +6108,8 @@
&& incomingSms.carrierId == expectedIncomingSms.carrierId
&& incomingSms.messageId == expectedIncomingSms.messageId
&& incomingSms.isManagedProfile == expectedIncomingSms.isManagedProfile
- && incomingSms.isNtn == expectedIncomingSms.isNtn) {
+ && incomingSms.isNtn == expectedIncomingSms.isNtn
+ && incomingSms.isEmergency == expectedIncomingSms.isEmergency) {
actualCount = incomingSms.count;
}
}
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
index dba288e..1bb45b8 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/DatagramDispatcherTest.java
@@ -238,7 +238,8 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
verifyNoMoreInteractions(mMockDatagramController);
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(eq(datagramType));
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
@@ -279,7 +280,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_NOT_REACHABLE);
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
mResultListener.clear();
mDatagramDispatcherUT.onSatelliteModemStateChanged(
@@ -311,7 +313,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_REQUEST_ABORTED);
assertFalse(mDatagramDispatcherUT.isDatagramWaitForConnectedStateTimerStarted());
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
}
}
@@ -372,7 +375,8 @@
verify(mMockSatelliteModemInterface, times(1)).sendSatelliteDatagram(
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(anyInt());
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
clearInvocations(mMockSessionMetricsStats);
@@ -406,7 +410,8 @@
any(SatelliteDatagram.class), anyBoolean(), anyBoolean(), any(Message.class));
verify(mMockSatelliteModemInterface).abortSendingSatelliteDatagrams(any(Message.class));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_MODEM_TIMEOUT);
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
clearInvocations(mMockSatelliteModemInterface);
clearInvocations(mMockDatagramController);
@@ -453,7 +458,8 @@
assertThat(mResultListener.peek()).isEqualTo(
SatelliteManager.SATELLITE_RESULT_SERVICE_ERROR);
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
}
@Test
@@ -494,7 +500,8 @@
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
assertThat(mResultListener.peek()).isEqualTo(SATELLITE_RESULT_SUCCESS);
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(eq(datagramType));
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
}
@@ -542,7 +549,8 @@
verify(mMockDatagramController, never()).pollPendingSatelliteDatagrams(anyInt(), any());
verify(mMockDatagramController, never()).pushDemoModeDatagram(
anyInt(), any(SatelliteDatagram.class));
- verify(mMockSessionMetricsStats, times(1)).addCountOfFailedOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfFailedOutgoingDatagram(anyInt(), anyInt());
}
mDatagramDispatcherUT.setDemoMode(false);
@@ -587,7 +595,8 @@
.updateSendStatus(eq(SUB_ID), eq(DATAGRAM_TYPE2),
eq(SatelliteManager.SATELLITE_DATAGRAM_TRANSFER_STATE_IDLE), eq(0),
eq(SATELLITE_RESULT_SUCCESS));
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(eq(DATAGRAM_TYPE2));
mDatagramDispatcherUT.setDemoMode(false);
mDatagramDispatcherUT.setDeviceAlignedWithSatellite(false);
@@ -699,7 +708,8 @@
verify(mMockDatagramController).pushDemoModeDatagram(
anyInt(), any(SatelliteDatagram.class));
verify(mMockDatagramController).pollPendingSatelliteDatagrams(anyInt(), any());
- verify(mMockSessionMetricsStats, times(1)).addCountOfSuccessfulOutgoingDatagram();
+ verify(mMockSessionMetricsStats, times(1))
+ .addCountOfSuccessfulOutgoingDatagram(anyInt());
// Test when overlay config config_send_satellite_datagram_to_modem_in_demo_mode is
// false