Satellite Data Support changes
- Mark satellite data support mode appropriately based on
carrier config and satellite entitlement provisioning information.
- Allow satellite data with constrained and unconstrained connection,
only when available services is provisioned with data service type
thru entitlement or carrier config.
- Add Data services availability check.
Flag: com.android.internal.telephony.flags.data_service_check
Bug: 381338283
Test: m and atest
Test: Device test at b/381338283 and b/393053859
Change-Id: Ica52560577c6e8ea92dec06e43d3ee62e7370ffd
diff --git a/flags/data.aconfig b/flags/data.aconfig
index 1993b90..ebd1e9a 100644
--- a/flags/data.aconfig
+++ b/flags/data.aconfig
@@ -140,3 +140,14 @@
purpose: PURPOSE_BUGFIX
}
}
+
+# OWNER=nagendranb TARGET=25Q2
+flag {
+ name: "data_service_check"
+ namespace: "telephony"
+ description: "Support data service check based on nri available services."
+ bug:"381338283"
+ metadata {
+ purpose: PURPOSE_BUGFIX
+ }
+}
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index ed76bda..29a968d 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -105,6 +105,7 @@
import com.android.internal.telephony.metrics.DataCallSessionStats;
import com.android.internal.telephony.metrics.DataNetworkValidationStats;
import com.android.internal.telephony.metrics.TelephonyMetrics;
+import com.android.internal.telephony.satellite.SatelliteController;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.FunctionalUtils;
import com.android.internal.util.IState;
@@ -2572,7 +2573,16 @@
// 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()) {
+
+ int dataPolicy;
+ if (mFlags.dataServiceCheck()) {
+ final SatelliteController satelliteController = SatelliteController.getInstance();
+ dataPolicy = satelliteController.getSatelliteDataServicePolicyForPlmn(mSubId,
+ mPhone.getServiceState().getOperatorNumeric());
+ } else {
+ dataPolicy = mDataConfigManager.getSatelliteDataSupportMode();
+ }
+ switch (dataPolicy) {
case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED
-> builder.removeCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index 3fa6b79..db6c8c4 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -111,6 +111,7 @@
import com.android.internal.telephony.data.LinkBandwidthEstimator.LinkBandwidthEstimatorCallback;
import com.android.internal.telephony.flags.FeatureFlags;
import com.android.internal.telephony.ims.ImsResolver;
+import com.android.internal.telephony.satellite.SatelliteController;
import com.android.internal.telephony.subscription.SubscriptionInfoInternal;
import com.android.internal.telephony.subscription.SubscriptionManagerService;
import com.android.internal.telephony.util.TelephonyUtils;
@@ -1646,6 +1647,10 @@
evaluation.addDataDisallowedReason(DataDisallowedReason.DATA_CONFIG_NOT_READY);
}
+ if (mFeatureFlags.dataServiceCheck() && !isDataServiceSupported(transport)) {
+ evaluation.addDataDisallowedReason(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
+ }
+
// Check CS call state and see if concurrent voice/data is allowed.
if (hasCalling() && mPhone.getCallTracker().getState() != PhoneConstants.State.IDLE
&& !mPhone.getServiceStateTracker().isConcurrentVoiceAndDataAllowed()) {
@@ -1979,6 +1984,11 @@
evaluation.addDataDisallowedReason(DataDisallowedReason.CDMA_EMERGENCY_CALLBACK_MODE);
}
+ if (mFeatureFlags.dataServiceCheck()
+ && !isDataServiceSupported(dataNetwork.getTransport())) {
+ evaluation.addDataDisallowedReason(DataDisallowedReason.SERVICE_OPTION_NOT_SUPPORTED);
+ }
+
// 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.
@@ -2176,6 +2186,21 @@
}
/**
+ * Check if the available services support data service.
+ * {@link NetworkRegistrationInfo#SERVICE_TYPE_DATA} service or not.
+ *
+ * @param transport The preferred transport type for the request. The transport here is
+ * WWAN/WLAN.
+ * @return {@code true} if data services is supported, otherwise {@code false}.
+ */
+ private boolean isDataServiceSupported(@TransportType int transport) {
+ NetworkRegistrationInfo nri = mServiceState.getNetworkRegistrationInfo(
+ NetworkRegistrationInfo.DOMAIN_PS, transport);
+ return nri != null && nri.getAvailableServices().contains(
+ NetworkRegistrationInfo.SERVICE_TYPE_DATA);
+ }
+
+ /**
* Check if the transport from connectivity service can satisfy the network request. Note the
* transport here is connectivity service's transport (Wifi, cellular, satellite, etc..), not
* the widely used {@link AccessNetworkConstants#TRANSPORT_TYPE_WLAN WLAN},
@@ -2196,11 +2221,20 @@
return true;
}
- // When the device is on satellite, only restricted/constrained network request can request
- // network.
+ // When the device is on satellite, allow network request without bandwidth not constrained
+ // to enable data connection with constrained network.
if (mServiceState.isUsingNonTerrestrialNetwork() && networkRequest.hasCapability(
NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- switch (mDataConfigManager.getSatelliteDataSupportMode()) {
+
+ int dataPolicy;
+ if (mFeatureFlags.dataServiceCheck()) {
+ final SatelliteController satelliteController = SatelliteController.getInstance();
+ dataPolicy = satelliteController.getSatelliteDataServicePolicyForPlmn(mSubId,
+ mPhone.getServiceState().getOperatorNumeric());
+ } else {
+ dataPolicy = mDataConfigManager.getSatelliteDataSupportMode();
+ }
+ switch (dataPolicy) {
case CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED -> {
return false;
}
@@ -2381,7 +2415,7 @@
// Matching the rules by the configured order. Bail out if find first matching rule.
for (HandoverRule rule : handoverRules) {
- // Check if the rule is only for roaming and we are not roaming.
+ // Check if the rule is only for roaming and we are not aroaming.
if (rule.isOnlyForRoaming && !isRoaming) {
// If the rule is for roaming only, and the device is not roaming, then bypass
// this rule.
diff --git a/src/java/com/android/internal/telephony/satellite/SatelliteController.java b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
index 03adf63..9a9f686 100644
--- a/src/java/com/android/internal/telephony/satellite/SatelliteController.java
+++ b/src/java/com/android/internal/telephony/satellite/SatelliteController.java
@@ -8761,9 +8761,24 @@
}
/**
+ * Check if the available satellite services support
+ * {@link NetworkRegistrationInfo#SERVICE_TYPE_DATA} service or not.
+ *
+ * @return {@code true} if data services is supported, otherwise {@code false}.
+ */
+ private boolean isSatelliteDataServicesAllowed(int subId, String plmn) {
+ // validate is available services support data, for satellite internet bringup
+ List<Integer> availableServices = getSupportedSatelliteServicesForPlmn(subId, plmn);
+ return availableServices.stream().anyMatch(num -> num
+ == NetworkRegistrationInfo.SERVICE_TYPE_DATA);
+ }
+
+ /**
* Method to return the current satellite data service policy supported mode for the registered
* plmn based on entitlement provisioning information. Note: If no information at
- * provisioning is supported this is overridden with operator carrier config information.
+ * provisioning is supported this is overridden with operator carrier config information
+ * if available satellite services support data else data service policy is marked as
+ * restricted.
*
* @param subId current subscription id
* @param plmn current registered plmn information
@@ -8782,8 +8797,13 @@
return dataServicePolicy.get(plmn);
}
}
+
+ if (isSatelliteDataServicesAllowed(subId, plmn)) {
+ return getCarrierSatelliteDataSupportedModeFromConfig(subId);
+ }
}
- return getCarrierSatelliteDataSupportedModeFromConfig(subId);
+
+ return CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED;
}
/**
diff --git a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
index 6517b15..ef1f019 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/TelephonyTest.java
@@ -582,6 +582,7 @@
doReturn(true).when(mFeatureFlags).minimalTelephonyCdmCheck();
doReturn(true).when(mFeatureFlags).hsumBroadcast();
doReturn(true).when(mFeatureFlags).hsumPackageManager();
+ doReturn(true).when(mFeatureFlags).dataServiceCheck();
TelephonyManager.disableServiceHandleCaching();
PropertyInvalidatedCache.disableForTestMode();
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 2f9ae24..4575701 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -186,6 +186,7 @@
private LinkBandwidthEstimatorCallback mLinkBandwidthEstimatorCallback;
private boolean mIsNonTerrestrialNetwork = false;
+ private ArrayList<Integer> mCarrierSupportedSatelliteServices = new ArrayList<>();
private final DataProfile mGeneralPurposeDataProfile = new DataProfile.Builder()
.setApnSetting(new ApnSetting.Builder()
@@ -691,6 +692,7 @@
.setDomain(NetworkRegistrationInfo.DOMAIN_PS)
.setDataSpecificInfo(dsri)
.setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork)
+ .setAvailableServices(mCarrierSupportedSatelliteServices)
.setEmergencyOnly(isEmergencyOnly)
.build());
@@ -700,6 +702,7 @@
.setRegistrationState(iwlanRegState)
.setDomain(NetworkRegistrationInfo.DOMAIN_PS)
.setIsNonTerrestrialNetwork(mIsNonTerrestrialNetwork)
+ .setAvailableServices(mCarrierSupportedSatelliteServices)
.setEmergencyOnly(isEmergencyOnly)
.build());
@@ -891,6 +894,7 @@
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
doReturn(true).when(mFeatureFlags).satelliteInternet();
doReturn(true).when(mFeatureFlags).incallHandoverPolicy();
+
when(mContext.getPackageManager()).thenReturn(mMockPackageManager);
doReturn(true).when(mMockPackageManager).hasSystemFeature(anyString());
@@ -1119,6 +1123,12 @@
processAllMessages();
Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), any());
+ mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_DATA);
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
logd("DataNetworkControllerTest -Setup!");
}
@@ -2108,11 +2118,11 @@
verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
- // Setup satellite data support mode serve all network requests
- mCarrierConfig.putInt(
- CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
- CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL);
- carrierConfigChanged();
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), any());
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
processAllMessages();
// Verify internet is connected
@@ -2121,6 +2131,7 @@
// reset satellite network and roaming registration
mIsNonTerrestrialNetwork = false;
+ mCarrierSupportedSatelliteServices.clear();
serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
}
@@ -5826,4 +5837,219 @@
processAllMessages();
assertThat(request.getState()).isEqualTo(TelephonyNetworkRequest.REQUEST_STATE_UNSATISFIED);
}
+
+ @Test
+ public void testNotRestrictedDataConnectionRequest_WithoutDataServiceSupport()
+ throws Exception {
+ mCarrierSupportedSatelliteServices.clear();
+ mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Not Restricted
+ mDataNetworkControllerUT.addNetworkRequest(
+ createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is not connected
+ verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
+
+ @Test
+ public void testConnection_WithDataServiceCheckFlagDisabled_WithoutDataServiceSupport()
+ throws Exception {
+ doReturn(false).when(mFeatureFlags).dataServiceCheck();
+ mCarrierSupportedSatelliteServices.clear();
+ mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Not Restricted
+ mDataNetworkControllerUT.addNetworkRequest(
+ createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is connected
+ verifyInternetConnected();
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
+
+ @Test
+ public void testRestrictedDataConnectionRequest_WithoutDataServiceSupport()
+ throws Exception {
+ mCarrierSupportedSatelliteServices.clear();
+ mCarrierSupportedSatelliteServices.add(NetworkRegistrationInfo.SERVICE_TYPE_VOICE);
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Restricted
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+ mDataNetworkControllerUT.addNetworkRequest(new TelephonyNetworkRequest(
+ new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is not connected
+ verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
+
+ @Test
+ public void testNotRestrictedNetworkRequest_WithRestrictedDataPolicySupportMode()
+ throws Exception {
+ // set up satellite network and register data roaming
+ mIsNonTerrestrialNetwork = true;
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Not Restricted
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), any());
+ mDataNetworkControllerUT.addNetworkRequest(
+ createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_INTERNET));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is not connected
+ verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mIsNonTerrestrialNetwork = false;
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
+
+ @Test
+ public void testBandwidthConstrainedNetworkRequest_WithConstrainedDataPolicySupportMode()
+ throws Exception {
+ // set up satellite network and register data roaming
+ mIsNonTerrestrialNetwork = true;
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Not Restricted
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), any());
+ // Set network request transport as satellite in satellite network
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE);
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ mDataNetworkControllerUT.addNetworkRequest(new TelephonyNetworkRequest(
+ new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is connected
+ verifyInternetConnected();
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mIsNonTerrestrialNetwork = false;
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
+
+ @Test
+ public void testBandwidthNotConstrainedNetworkRequest_WithConstrainedDataPolicySupportMode()
+ throws Exception {
+ // set up satellite network
+ mIsNonTerrestrialNetwork = true;
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Not Restricted
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), any());
+ // Set network request transport as satellite in satellite network
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE);
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ mDataNetworkControllerUT.addNetworkRequest(new TelephonyNetworkRequest(
+ new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is not connected
+ verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mIsNonTerrestrialNetwork = false;
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
+
+ @Test
+ public void testWithDataServiceCheckFlagDisabled_DataPolicySupportMode()
+ throws Exception {
+ doReturn(false).when(mFeatureFlags).dataServiceCheck();
+ // set up satellite network and register data roaming
+ mIsNonTerrestrialNetwork = true;
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+
+ // Set network request transport with Internet capability + Not Restricted
+ mCarrierConfig.putInt(CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
+ CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED);
+ carrierConfigChanged();
+ // Set network request transport as satellite in satellite network
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addTransportType(NetworkCapabilities.TRANSPORT_SATELLITE);
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED);
+ mDataNetworkControllerUT.addNetworkRequest(new TelephonyNetworkRequest(
+ new NetworkRequest(netCaps, ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId,
+ NetworkRequest.Type.REQUEST), mPhone, mFeatureFlags));
+ mDataNetworkControllerUT.obtainMessage(5 /*EVENT_REEVALUATE_UNSATISFIED_NETWORK_REQUESTS*/,
+ DataEvaluation.DataEvaluationReason.PREFERRED_TRANSPORT_CHANGED).sendToTarget();
+ processAllMessages();
+
+ // Verify internet is connected
+ verifyInternetConnected();
+ Mockito.clearInvocations(mMockedDataNetworkControllerCallback);
+
+ // reset satellite network and roaming registration
+ mIsNonTerrestrialNetwork = false;
+ mCarrierSupportedSatelliteServices.clear();
+ serviceStateChanged(TelephonyManager.NETWORK_TYPE_LTE,
+ NetworkRegistrationInfo.REGISTRATION_STATE_HOME);
+ }
}
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 f832a6b..a17efa1 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkTest.java
@@ -21,6 +21,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyInt;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Matchers.argThat;
@@ -382,6 +383,7 @@
public void setUp() throws Exception {
super.setUp(getClass().getSimpleName());
doReturn(1).when(mPhone).getSubId();
+ doReturn("12345").when(mServiceState).getOperatorNumeric();
doReturn(mImsPhone).when(mPhone).getImsPhone();
doReturn(mImsCT).when(mImsPhone).getCallTracker();
doReturn(PhoneConstants.State.IDLE).when(mImsCT).getState();
@@ -430,7 +432,8 @@
NetworkCapabilities.NET_CAPABILITY_EIMS, NetworkCapabilities.NET_CAPABILITY_XCAP))
.when(mDataConfigManager).getForcedCellularTransportCapabilities();
doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED)
- .when(mDataConfigManager).getSatelliteDataSupportMode();
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), anyString());
doReturn(true).when(mFeatureFlags).carrierEnabledSatelliteFlag();
doReturn(true).when(mFeatureFlags).satelliteInternet();
@@ -2537,6 +2540,45 @@
// Test constrained traffic
doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), anyString());
+ 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 unconstrained traffic
+ doReturn(CarrierConfigManager.SATELLITE_DATA_SUPPORT_ALL)
+ .when(mSatelliteController)
+ .getSatelliteDataServicePolicyForPlmn(anyInt(), anyString());
+ 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 testUnrestrictedSatelliteNetworkCapabilities_WithDataServiceCheckFlagDisabled() {
+ doReturn(false).when(mFeatureFlags).dataServiceCheck();
+ 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();
diff --git a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
index ea9ac26..2e88885 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/satellite/SatelliteControllerTest.java
@@ -6894,12 +6894,30 @@
entitlementPlmnList, barredPlmnList, new HashMap<>(), new HashMap<>(),
dataServicePolicyMap, new HashMap<>(), mIIntegerConsumer);
+ // when Available satellite services is not configured with data service
mCarrierConfigBundle.putInt(
CarrierConfigManager.KEY_SATELLITE_DATA_SUPPORT_MODE_INT,
SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED);
int dataSupportModeForPlmn = mSatelliteControllerUT
.getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101");
+ assertEquals(SATELLITE_DATA_SUPPORT_ONLY_RESTRICTED, dataSupportModeForPlmn);
+
+ setConfigData(new ArrayList<>());
+ PersistableBundle carrierSupportedSatelliteServicesPerProvider =
+ new PersistableBundle();
+ List<String> carrierConfigPlmnList = List.of("00101");
+ carrierSupportedSatelliteServicesPerProvider.putIntArray(
+ carrierConfigPlmnList.get(0), new int[]{2, 3, 5});
+ mCarrierConfigBundle.putPersistableBundle(CarrierConfigManager
+ .KEY_CARRIER_SUPPORTED_SATELLITE_SERVICES_PER_PROVIDER_BUNDLE,
+ carrierSupportedSatelliteServicesPerProvider);
+ invokeCarrierConfigChanged();
+
+ // when Available satellite services support data service
+ dataSupportModeForPlmn = mSatelliteControllerUT
+ .getSatelliteDataServicePolicyForPlmn(SUB_ID, "00101");
assertEquals(SATELLITE_DATA_SUPPORT_BANDWIDTH_CONSTRAINED, dataSupportModeForPlmn);
+
}
@Test