Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f333d770 authored by Sarah Chin's avatar Sarah Chin Committed by Automerger Merge Worker
Browse files

Merge "Dynamically apply capability TEMPORARILY_NOT_METERED" am: 57c12f4b

Change-Id: Iea402d8a65962226a34ccfa1d7cbb93eb7be3424
parents 88eab7da 57c12f4b
Loading
Loading
Loading
Loading
+19 −18
Original line number Diff line number Diff line
@@ -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(
@@ -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()) {
@@ -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 =
+8 −7
Original line number Diff line number Diff line
@@ -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;

@@ -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
@@ -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
@@ -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));
    }