Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +19 −18 Original line number Diff line number Diff line Loading @@ -1309,6 +1309,7 @@ public class DataConnection extends StateMachine { public NetworkCapabilities getNetworkCapabilities() { NetworkCapabilities result = new NetworkCapabilities(); result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); boolean areAllApnsUnmetered = false; if (mApnSetting != null) { final String[] types = ApnSetting.getApnTypesStringFromBitmask( Loading Loading @@ -1380,14 +1381,12 @@ public class DataConnection extends StateMachine { } } // Mark NOT_METERED in the following cases, // 1. All APNs in APN settings are unmetered. // 2. The non-restricted data and is intended for unmetered use only. if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || !ApnSettingUtils.isMetered(mApnSetting, mPhone)) { // DataConnection has the immutable NOT_METERED capability only if all APNs in the // APN setting are unmetered according to carrier config METERED_APN_TYPES_STRINGS. // All other cases should use the dynamic TEMPORARILY_NOT_METERED capability instead. if (!ApnSettingUtils.isMetered(mApnSetting, mPhone)) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); areAllApnsUnmetered = true; } if (result.deduceRestrictedCapability()) { Loading @@ -1410,19 +1409,21 @@ public class DataConnection extends StateMachine { result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, !mPhone.getServiceState().getDataRoaming()); if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_CONGESTED) == 0) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED); // Override values set above when requested by policy if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_CONGESTED) != 0) { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED); } // Override set by DcTracker if (mUnmeteredOverride) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); // Mark TEMPORARILY_NOT_METERED in the following cases, // 1. The non-restricted data is intended for unmetered use only. // 2. DcTracker set an unmetered override due to network/location (eg. 5G). // 3. SubscriptionManager set an unmetered override as requested by policy. // 4. All attached APN contexts for this DataConnection are unmetered if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || mUnmeteredOverride || (mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0 || areAllApnsUnmetered) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); } final boolean suspended = Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +8 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.internal.telephony.dataconnection; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED; import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_CONGESTED; import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_UNMETERED; Loading Loading @@ -617,8 +618,8 @@ public class DataConnectionTest extends TelephonyTest { testConnectEvent(); assertFalse(getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); } @Test Loading @@ -632,8 +633,8 @@ public class DataConnectionTest extends TelephonyTest { testConnectEvent(); assertTrue(getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); } @Test Loading @@ -643,18 +644,18 @@ public class DataConnectionTest extends TelephonyTest { new String[] { "default" }); testConnectEvent(); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, SUBSCRIPTION_OVERRIDE_UNMETERED); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, 0); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); } Loading Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +19 −18 Original line number Diff line number Diff line Loading @@ -1309,6 +1309,7 @@ public class DataConnection extends StateMachine { public NetworkCapabilities getNetworkCapabilities() { NetworkCapabilities result = new NetworkCapabilities(); result.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR); boolean areAllApnsUnmetered = false; if (mApnSetting != null) { final String[] types = ApnSetting.getApnTypesStringFromBitmask( Loading Loading @@ -1380,14 +1381,12 @@ public class DataConnection extends StateMachine { } } // Mark NOT_METERED in the following cases, // 1. All APNs in APN settings are unmetered. // 2. The non-restricted data and is intended for unmetered use only. if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || !ApnSettingUtils.isMetered(mApnSetting, mPhone)) { // DataConnection has the immutable NOT_METERED capability only if all APNs in the // APN setting are unmetered according to carrier config METERED_APN_TYPES_STRINGS. // All other cases should use the dynamic TEMPORARILY_NOT_METERED capability instead. if (!ApnSettingUtils.isMetered(mApnSetting, mPhone)) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); areAllApnsUnmetered = true; } if (result.deduceRestrictedCapability()) { Loading @@ -1410,19 +1409,21 @@ public class DataConnection extends StateMachine { result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_ROAMING, !mPhone.getServiceState().getDataRoaming()); if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_CONGESTED) == 0) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED); // Override values set above when requested by policy if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } if ((mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_CONGESTED) != 0) { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED); } // Override set by DcTracker if (mUnmeteredOverride) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); // Mark TEMPORARILY_NOT_METERED in the following cases, // 1. The non-restricted data is intended for unmetered use only. // 2. DcTracker set an unmetered override due to network/location (eg. 5G). // 3. SubscriptionManager set an unmetered override as requested by policy. // 4. All attached APN contexts for this DataConnection are unmetered if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || mUnmeteredOverride || (mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0 || areAllApnsUnmetered) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); } final boolean suspended = Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +8 −7 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.internal.telephony.dataconnection; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_CONGESTED; import static android.net.NetworkCapabilities.NET_CAPABILITY_NOT_METERED; import static android.net.NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED; import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_CONGESTED; import static android.net.NetworkPolicyManager.SUBSCRIPTION_OVERRIDE_UNMETERED; Loading Loading @@ -617,8 +618,8 @@ public class DataConnectionTest extends TelephonyTest { testConnectEvent(); assertFalse(getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); } @Test Loading @@ -632,8 +633,8 @@ public class DataConnectionTest extends TelephonyTest { testConnectEvent(); assertTrue(getNetworkCapabilities() .hasCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); } @Test Loading @@ -643,18 +644,18 @@ public class DataConnectionTest extends TelephonyTest { new String[] { "default" }); testConnectEvent(); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, SUBSCRIPTION_OVERRIDE_UNMETERED); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, 0); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); } Loading