Loading src/java/com/android/internal/telephony/dataconnection/DataConnection.java +30 −16 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.telephony.Annotation.ApnType; import android.telephony.Annotation.DataFailureCause; import android.telephony.Annotation.DataState; import android.telephony.Annotation.NetworkType; import android.telephony.AnomalyReporter; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.NetworkRegistrationInfo; Loading Loading @@ -108,6 +109,7 @@ import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; Loading Loading @@ -1611,11 +1613,15 @@ public class DataConnection extends StateMachine { } } // 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. result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !ApnSettingUtils.isMetered(mApnSetting, mPhone)); // Mark NOT_METERED in the following cases: // 1. All APNs in the APN settings are unmetered. // 2. The non-restricted data is intended for unmetered use only. if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || !ApnSettingUtils.isMetered(mApnSetting, mPhone)) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } if (result.deduceRestrictedCapability()) { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); Loading @@ -1637,19 +1643,27 @@ 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); } // 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. if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || mUnmeteredOverride || (mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); result.setCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED, mUnmeteredOverride); if (mUnmeteredOverride && result.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && (mPhone.getRadioAccessFamily() & TelephonyManager.NETWORK_TYPE_BITMASK_NR) == 0) { String message = "Unexpected TEMPORARILY_NOT_METERED on devices not supporting NR."; loge(message); // Using fixed UUID to avoid duplicate bugreport notification AnomalyReporter.reportAnomaly( UUID.fromString("9151f0fc-01df-4afb-b744-9c4529055248"), message); } result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED, !mIsSuspended); Loading tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +3 −5 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ 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 @@ -610,7 +609,6 @@ public class DataConnectionTest extends TelephonyTest { testConnectEvent(); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); } @Test Loading @@ -634,18 +632,18 @@ public class DataConnectionTest extends TelephonyTest { new String[] { "default" }); testConnectEvent(); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, SUBSCRIPTION_OVERRIDE_UNMETERED); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, 0); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); } Loading Loading
src/java/com/android/internal/telephony/dataconnection/DataConnection.java +30 −16 Original line number Diff line number Diff line Loading @@ -52,6 +52,7 @@ import android.telephony.Annotation.ApnType; import android.telephony.Annotation.DataFailureCause; import android.telephony.Annotation.DataState; import android.telephony.Annotation.NetworkType; import android.telephony.AnomalyReporter; import android.telephony.CarrierConfigManager; import android.telephony.DataFailCause; import android.telephony.NetworkRegistrationInfo; Loading Loading @@ -108,6 +109,7 @@ import java.util.Collection; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; Loading Loading @@ -1611,11 +1613,15 @@ public class DataConnection extends StateMachine { } } // 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. result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED, !ApnSettingUtils.isMetered(mApnSetting, mPhone)); // Mark NOT_METERED in the following cases: // 1. All APNs in the APN settings are unmetered. // 2. The non-restricted data is intended for unmetered use only. if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || !ApnSettingUtils.isMetered(mApnSetting, mPhone)) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_METERED); } if (result.deduceRestrictedCapability()) { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); Loading @@ -1637,19 +1643,27 @@ 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); } // 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. if ((mUnmeteredUseOnly && !mRestrictedNetworkOverride) || mUnmeteredOverride || (mSubscriptionOverride & SUBSCRIPTION_OVERRIDE_UNMETERED) != 0) { result.addCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); } else { result.removeCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED); result.setCapability(NetworkCapabilities.NET_CAPABILITY_TEMPORARILY_NOT_METERED, mUnmeteredOverride); if (mUnmeteredOverride && result.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET) && (mPhone.getRadioAccessFamily() & TelephonyManager.NETWORK_TYPE_BITMASK_NR) == 0) { String message = "Unexpected TEMPORARILY_NOT_METERED on devices not supporting NR."; loge(message); // Using fixed UUID to avoid duplicate bugreport notification AnomalyReporter.reportAnomaly( UUID.fromString("9151f0fc-01df-4afb-b744-9c4529055248"), message); } result.setCapability(NetworkCapabilities.NET_CAPABILITY_NOT_SUSPENDED, !mIsSuspended); Loading
tests/telephonytests/src/com/android/internal/telephony/dataconnection/DataConnectionTest.java +3 −5 Original line number Diff line number Diff line Loading @@ -18,7 +18,6 @@ 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 @@ -610,7 +609,6 @@ public class DataConnectionTest extends TelephonyTest { testConnectEvent(); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); } @Test Loading @@ -634,18 +632,18 @@ public class DataConnectionTest extends TelephonyTest { new String[] { "default" }); testConnectEvent(); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, SUBSCRIPTION_OVERRIDE_UNMETERED); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); mDc.onSubscriptionOverride(SUBSCRIPTION_OVERRIDE_UNMETERED, 0); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_TEMPORARILY_NOT_METERED)); assertFalse(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_METERED)); assertTrue(getNetworkCapabilities().hasCapability(NET_CAPABILITY_NOT_CONGESTED)); } Loading