Merge "Fixed tethering allowed when data disabled"
diff --git a/src/java/com/android/internal/telephony/data/DataNetwork.java b/src/java/com/android/internal/telephony/data/DataNetwork.java
index 50800dc..4816082 100644
--- a/src/java/com/android/internal/telephony/data/DataNetwork.java
+++ b/src/java/com/android/internal/telephony/data/DataNetwork.java
@@ -3208,6 +3208,17 @@
}
/**
+ * Check if any of the attached request has the specified network capability.
+ *
+ * @param netCapability The network capability to check.
+ * @return {@code true} if at least one network request has specified network capability.
+ */
+ public boolean hasNetworkCapabilityInNetworkRequests(@NetCapability int netCapability) {
+ return mAttachedNetworkRequestList.stream().anyMatch(
+ request -> request.hasCapability(netCapability));
+ }
+
+ /**
* Convert the data tear down reason to string.
*
* @param reason Data deactivation reason.
diff --git a/src/java/com/android/internal/telephony/data/DataNetworkController.java b/src/java/com/android/internal/telephony/data/DataNetworkController.java
index 9fc9ef5..71a1218 100644
--- a/src/java/com/android/internal/telephony/data/DataNetworkController.java
+++ b/src/java/com/android/internal/telephony/data/DataNetworkController.java
@@ -1511,8 +1511,10 @@
// Check if it's SUPL during emergency call.
evaluation.addDataAllowedReason(DataAllowedReason.EMERGENCY_SUPL);
} else if (!networkRequest.hasCapability(
- NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- // Check if request is restricted.
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED) && !networkRequest
+ .hasCapability(NetworkCapabilities.NET_CAPABILITY_DUN)) {
+ // Check if request is restricted and not for tethering, which always comes with
+ // a restricted network request.
evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST);
} else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
// Check if request is unmetered (WiFi or unmetered APN).
@@ -1753,8 +1755,11 @@
// Check if it's SUPL during emergency call.
evaluation.addDataAllowedReason(DataAllowedReason.EMERGENCY_SUPL);
} else if (!dataNetwork.getNetworkCapabilities().hasCapability(
- NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) {
- // Check if request is restricted
+ NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
+ && !dataNetwork.hasNetworkCapabilityInNetworkRequests(
+ NetworkCapabilities.NET_CAPABILITY_DUN)) {
+ // Check if request is restricted and there are no DUN network requests attached to
+ // the network.
evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST);
} else if (dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) {
// Check if request is unmetered (WiFi or unmetered APN)
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 c27d075..ef825e6 100644
--- a/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
+++ b/tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java
@@ -2352,6 +2352,64 @@
}
@Test
+ public void testDataDisableTearingDownTetheringNetwork() throws Exception {
+ // User data enabled
+ mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, true, mContext.getOpPackageName());
+ processAllMessages();
+
+ // Request the restricted tethering network.
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+
+ NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST);
+
+ mDataNetworkControllerUT.addNetworkRequest(
+ new TelephonyNetworkRequest(nativeNetworkRequest, mPhone));
+ processAllMessages();
+
+ verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_DUN);
+
+ // User data disabled
+ mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, false, mContext.getOpPackageName());
+ processAllMessages();
+
+ // Everything should be disconnected.
+ verifyAllDataDisconnected();
+ }
+
+ @Test
+ public void testDataDisableNotAllowingBringingUpTetheringNetwork() throws Exception {
+ // User data disabled
+ mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled(
+ TelephonyManager.DATA_ENABLED_REASON_USER, false, mContext.getOpPackageName());
+ processAllMessages();
+
+ // Request the restricted tethering network.
+ NetworkCapabilities netCaps = new NetworkCapabilities();
+ netCaps.addCapability(NetworkCapabilities.NET_CAPABILITY_DUN);
+ netCaps.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED);
+
+ NetworkRequest nativeNetworkRequest = new NetworkRequest(netCaps,
+ ConnectivityManager.TYPE_MOBILE, ++mNetworkRequestId, NetworkRequest.Type.REQUEST);
+
+ mDataNetworkControllerUT.addNetworkRequest(
+ new TelephonyNetworkRequest(nativeNetworkRequest, mPhone));
+ processAllMessages();
+
+ // Everything should be disconnected.
+ verifyAllDataDisconnected();
+
+ // Telephony should not try to setup a data call for DUN.
+ verify(mMockedWwanDataServiceManager, never()).setupDataCall(anyInt(),
+ any(DataProfile.class), anyBoolean(), anyBoolean(), anyInt(), any(), anyInt(),
+ any(), any(), anyBoolean(), any(Message.class));
+ }
+
+ @Test
public void testNonVoPSNoIMSSetup() throws Exception {
DataSpecificRegistrationInfo dsri = new DataSpecificRegistrationInfo(8, false, true, true,
new LteVopsSupportInfo(LteVopsSupportInfo.LTE_STATUS_NOT_SUPPORTED,