Loading src/java/com/android/internal/telephony/data/DataEvaluation.java +4 −0 Original line number Diff line number Diff line Loading @@ -329,6 +329,10 @@ public class DataEvaluation { * The network request is restricted (i.e. Only privilege apps can access the network.) */ RESTRICTED_REQUEST, /** * SUPL is allowed while emergency call is ongoing. */ EMERGENCY_SUPL, /** * Data is allowed because the network request is for emergency. This should be always at * the bottom (i.e. highest priority) Loading src/java/com/android/internal/telephony/data/DataNetwork.java +11 −5 Original line number Diff line number Diff line Loading @@ -1740,16 +1740,22 @@ public class DataNetwork extends StateMachine { if (mDataAllowedReason == DataAllowedReason.RESTRICTED_REQUEST) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); } else if (mDataAllowedReason == DataAllowedReason.UNMETERED_USAGE || mDataAllowedReason == DataAllowedReason.MMS_REQUEST) { || mDataAllowedReason == DataAllowedReason.MMS_REQUEST || mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL) { // If data is allowed due to unmetered usage, or MMS always-allowed, we need to // remove unrelated-but-metered capabilities. for (int capability : meteredCapabilities) { // 1. If it's unmetered usage, remove all metered capabilities. // 2. if it's MMS always-allowed, then remove all metered capabilities but MMS. if (capability != NetworkCapabilities.NET_CAPABILITY_MMS || mDataAllowedReason != DataAllowedReason.MMS_REQUEST) { builder.removeCapability(capability); // 2. If it's MMS always-allowed, then remove all metered capabilities but MMS. // 3/ If it's for emergency SUPL, then remove all metered capabilities but SUPL. if ((capability == NetworkCapabilities.NET_CAPABILITY_MMS && mDataAllowedReason == DataAllowedReason.MMS_REQUEST) || (capability == NetworkCapabilities.NET_CAPABILITY_SUPL && mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL)) { // Not removing the capability for special uses. continue; } builder.removeCapability(capability); } } } Loading src/java/com/android/internal/telephony/data/DataNetworkController.java +21 −16 Original line number Diff line number Diff line Loading @@ -1359,19 +1359,22 @@ public class DataNetworkController extends Handler { evaluation.addDataAllowedReason(DataAllowedReason.MMS_REQUEST); } } else if (!evaluation.containsHardDisallowedReasons()) { // Check if request is unmetered (WiFi or unmetered APN) if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { if ((mPhone.isInEmergencyCall() || mPhone.isInEcm()) && networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) { // 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. evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // Check if request is unmetered (WiFi or unmetered APN). evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { if (!networkRequest.isMeteredRequest()) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } } // Check if request is restricted if (!networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) { evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } } // Check if there is any compatible data profile Loading Loading @@ -1600,9 +1603,17 @@ public class DataNetworkController extends Handler { // If there are reasons we should tear down the network, check if those are hard reasons // or soft reasons. In some scenarios, we can make exceptions if they are soft // disallowed reasons. if ((mPhone.isInEmergencyCall() || mPhone.isInEcm()) && dataNetwork.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_SUPL)) { // 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 evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } else if (dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // Check if request is unmetered (WiFi or unmetered APN) if (dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } else { boolean unmeteredNetwork = !mDataConfigManager.isAnyMeteredCapability( Loading @@ -1612,12 +1623,6 @@ public class DataNetworkController extends Handler { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } } // Check if request is restricted if (!dataNetwork.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) { evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } } log("Evaluated " + dataNetwork + ", " + evaluation.toString()); Loading tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -2094,4 +2094,23 @@ public class DataNetworkControllerTest extends TelephonyTest { assertThat(reasons).containsExactly(DataDisallowedReason.NOT_IN_SERVICE, DataDisallowedReason.NO_SUITABLE_DATA_PROFILE); } @Test public void testEmergencySuplDataDisabled() throws Exception { // Data disabled mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled( TelephonyManager.DATA_ENABLED_REASON_USER, false); processAllMessages(); doReturn(true).when(mPhone).isInEmergencyCall(); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_SUPL)); processAllMessages(); // Make sure SUPL is the only capability advertised, but not internet or MMS. verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_SUPL); verifyConnectedNetworkHasDataProfile(mGeneralPurposeDataProfile); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_MMS); } } Loading
src/java/com/android/internal/telephony/data/DataEvaluation.java +4 −0 Original line number Diff line number Diff line Loading @@ -329,6 +329,10 @@ public class DataEvaluation { * The network request is restricted (i.e. Only privilege apps can access the network.) */ RESTRICTED_REQUEST, /** * SUPL is allowed while emergency call is ongoing. */ EMERGENCY_SUPL, /** * Data is allowed because the network request is for emergency. This should be always at * the bottom (i.e. highest priority) Loading
src/java/com/android/internal/telephony/data/DataNetwork.java +11 −5 Original line number Diff line number Diff line Loading @@ -1740,16 +1740,22 @@ public class DataNetwork extends StateMachine { if (mDataAllowedReason == DataAllowedReason.RESTRICTED_REQUEST) { builder.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); } else if (mDataAllowedReason == DataAllowedReason.UNMETERED_USAGE || mDataAllowedReason == DataAllowedReason.MMS_REQUEST) { || mDataAllowedReason == DataAllowedReason.MMS_REQUEST || mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL) { // If data is allowed due to unmetered usage, or MMS always-allowed, we need to // remove unrelated-but-metered capabilities. for (int capability : meteredCapabilities) { // 1. If it's unmetered usage, remove all metered capabilities. // 2. if it's MMS always-allowed, then remove all metered capabilities but MMS. if (capability != NetworkCapabilities.NET_CAPABILITY_MMS || mDataAllowedReason != DataAllowedReason.MMS_REQUEST) { builder.removeCapability(capability); // 2. If it's MMS always-allowed, then remove all metered capabilities but MMS. // 3/ If it's for emergency SUPL, then remove all metered capabilities but SUPL. if ((capability == NetworkCapabilities.NET_CAPABILITY_MMS && mDataAllowedReason == DataAllowedReason.MMS_REQUEST) || (capability == NetworkCapabilities.NET_CAPABILITY_SUPL && mDataAllowedReason == DataAllowedReason.EMERGENCY_SUPL)) { // Not removing the capability for special uses. continue; } builder.removeCapability(capability); } } } Loading
src/java/com/android/internal/telephony/data/DataNetworkController.java +21 −16 Original line number Diff line number Diff line Loading @@ -1359,19 +1359,22 @@ public class DataNetworkController extends Handler { evaluation.addDataAllowedReason(DataAllowedReason.MMS_REQUEST); } } else if (!evaluation.containsHardDisallowedReasons()) { // Check if request is unmetered (WiFi or unmetered APN) if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { if ((mPhone.isInEmergencyCall() || mPhone.isInEcm()) && networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_SUPL)) { // 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. evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // Check if request is unmetered (WiFi or unmetered APN). evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } else if (transport == AccessNetworkConstants.TRANSPORT_TYPE_WWAN) { if (!networkRequest.isMeteredRequest()) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } } // Check if request is restricted if (!networkRequest.hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) { evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } } // Check if there is any compatible data profile Loading Loading @@ -1600,9 +1603,17 @@ public class DataNetworkController extends Handler { // If there are reasons we should tear down the network, check if those are hard reasons // or soft reasons. In some scenarios, we can make exceptions if they are soft // disallowed reasons. if ((mPhone.isInEmergencyCall() || mPhone.isInEcm()) && dataNetwork.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_SUPL)) { // 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 evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } else if (dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { // Check if request is unmetered (WiFi or unmetered APN) if (dataNetwork.getTransport() == AccessNetworkConstants.TRANSPORT_TYPE_WLAN) { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } else { boolean unmeteredNetwork = !mDataConfigManager.isAnyMeteredCapability( Loading @@ -1612,12 +1623,6 @@ public class DataNetworkController extends Handler { evaluation.addDataAllowedReason(DataAllowedReason.UNMETERED_USAGE); } } // Check if request is restricted if (!dataNetwork.getNetworkCapabilities().hasCapability( NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)) { evaluation.addDataAllowedReason(DataAllowedReason.RESTRICTED_REQUEST); } } log("Evaluated " + dataNetwork + ", " + evaluation.toString()); Loading
tests/telephonytests/src/com/android/internal/telephony/data/DataNetworkControllerTest.java +19 −0 Original line number Diff line number Diff line Loading @@ -2094,4 +2094,23 @@ public class DataNetworkControllerTest extends TelephonyTest { assertThat(reasons).containsExactly(DataDisallowedReason.NOT_IN_SERVICE, DataDisallowedReason.NO_SUITABLE_DATA_PROFILE); } @Test public void testEmergencySuplDataDisabled() throws Exception { // Data disabled mDataNetworkControllerUT.getDataSettingsManager().setDataEnabled( TelephonyManager.DATA_ENABLED_REASON_USER, false); processAllMessages(); doReturn(true).when(mPhone).isInEmergencyCall(); mDataNetworkControllerUT.addNetworkRequest( createNetworkRequest(NetworkCapabilities.NET_CAPABILITY_SUPL)); processAllMessages(); // Make sure SUPL is the only capability advertised, but not internet or MMS. verifyConnectedNetworkHasCapabilities(NetworkCapabilities.NET_CAPABILITY_SUPL); verifyConnectedNetworkHasDataProfile(mGeneralPurposeDataProfile); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); verifyNoConnectedNetworkHasCapability(NetworkCapabilities.NET_CAPABILITY_MMS); } }