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

Commit a8061c94 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "Add explicit subscription id support to DataUsageController"

parents 84686f11 ea4cdcbc
Loading
Loading
Loading
Loading
+21 −6
Original line number Diff line number Diff line
@@ -66,6 +66,7 @@ public class DataUsageController {
    private INetworkStatsSession mSession;
    private Callback mCallback;
    private NetworkNameProvider mNetworkController;
    private int mSubscriptionId;

    public DataUsageController(Context context) {
        mContext = context;
@@ -75,12 +76,22 @@ public class DataUsageController {
                ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
        mPolicyManager = NetworkPolicyManager.from(mContext);
        mNetworkStatsManager = context.getSystemService(NetworkStatsManager.class);
        mSubscriptionId = SubscriptionManager.INVALID_SUBSCRIPTION_ID;
    }

    public void setNetworkController(NetworkNameProvider networkController) {
        mNetworkController = networkController;
    }

    /**
     * By default this class will just get data usage information for the default data subscription,
     * but this method can be called to require it to use an explicit subscription id which may be
     * different from the default one (this is useful for the case of multi-SIM devices).
     */
    public void setSubscriptionId(int subscriptionId) {
        mSubscriptionId = subscriptionId;
    }

    /**
     * Returns the default warning level in bytes.
     */
@@ -99,7 +110,7 @@ public class DataUsageController {
    }

    public DataUsageInfo getDataUsageInfo() {
        final String subscriberId = getActiveSubscriberId(mContext);
        final String subscriberId = getActiveSubscriberId();
        if (subscriberId == null) {
            return warn("no subscriber id");
        }
@@ -164,7 +175,8 @@ public class DataUsageController {
    private long getUsageLevel(NetworkTemplate template, long start, long end) {
        try {
            final Bucket bucket = mNetworkStatsManager.querySummaryForDevice(
                getNetworkType(template), getActiveSubscriberId(mContext), start, end);
                    getNetworkType(template), getActiveSubscriberId(),
                    start, end);
            if (bucket != null) {
                return bucket.getRxBytes() + bucket.getTxBytes();
            }
@@ -237,10 +249,13 @@ public class DataUsageController {
        }
    }

    private static String getActiveSubscriberId(Context context) {
        final TelephonyManager tele = TelephonyManager.from(context);
        final String actualSubscriberId = tele.getSubscriberId(
                SubscriptionManager.getDefaultDataSubscriptionId());
    private String getActiveSubscriberId() {
        final TelephonyManager tele = TelephonyManager.from(mContext);
        int subscriptionId = mSubscriptionId;
        if (subscriptionId == SubscriptionManager.INVALID_SUBSCRIPTION_ID) {
            subscriptionId = SubscriptionManager.getDefaultDataSubscriptionId();
        }
        final String actualSubscriberId = tele.getSubscriberId(subscriptionId);
        return actualSubscriberId;
    }

+39 −1
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.robolectric.RobolectricTestRunner;
import org.robolectric.shadows.ShadowSubscriptionManager;

@RunWith(RobolectricTestRunner.class)
public class DataUsageControllerTest {
@@ -73,7 +74,9 @@ public class DataUsageControllerTest {
                new NetworkStatsHistory(DateUtils.DAY_IN_MILLIS /* bucketDuration */));
        doReturn(mNetworkStatsHistory)
                .when(mSession).getHistoryForNetwork(any(NetworkTemplate.class), anyInt());
        doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(anyInt());
        final int defaultSubscriptionId = 1234;
        ShadowSubscriptionManager.setDefaultDataSubscriptionId(defaultSubscriptionId);
        doReturn(SUB_ID).when(mTelephonyManager).getSubscriberId(eq(defaultSubscriptionId));
    }

    @Test
@@ -107,4 +110,39 @@ public class DataUsageControllerTest {
        assertThat(mController.getHistoricalUsageLevel(NetworkTemplate.buildTemplateWifiWildcard()))
                .isEqualTo(receivedBytes + transmittedBytes);
    }

    @Test
    public void getDataUsageInfo_hasUsageData_shouldReturnCorrectUsageForExplicitSubId()
            throws Exception {
        // First setup a stats bucket for the default subscription / subscriber ID.
        final long defaultSubRx = 1234567L;
        final long defaultSubTx = 123456L;
        final NetworkStats.Bucket defaultSubscriberBucket = mock(NetworkStats.Bucket.class);
        when(defaultSubscriberBucket.getRxBytes()).thenReturn(defaultSubRx);
        when(defaultSubscriberBucket.getTxBytes()).thenReturn(defaultSubTx);
        when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE),
                eq(SUB_ID), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn(
                defaultSubscriberBucket);

        // Now setup a stats bucket for a different, non-default subscription / subscriber ID.
        final long nonDefaultSubRx = 7654321L;
        final long nonDefaultSubTx = 654321L;
        final NetworkStats.Bucket nonDefaultSubscriberBucket = mock(NetworkStats.Bucket.class);
        when(nonDefaultSubscriberBucket.getRxBytes()).thenReturn(nonDefaultSubRx);
        when(nonDefaultSubscriberBucket.getTxBytes()).thenReturn(nonDefaultSubTx);
        final int explictSubscriptionId = 55;
        final String subscriberId2 = "Test Subscriber 2";
        when(mNetworkStatsManager.querySummaryForDevice(eq(ConnectivityManager.TYPE_MOBILE),
                eq(subscriberId2), eq(0L)/* startTime */, anyLong() /* endTime */)).thenReturn(
                nonDefaultSubscriberBucket);
        doReturn(subscriberId2).when(mTelephonyManager).getSubscriberId(explictSubscriptionId);

        // Now verify that when we're asking for stats on the non-default subscription, we get
        // the data back for that subscription and *not* the default one.
        mController.setSubscriptionId(explictSubscriptionId);

        assertThat(mController.getHistoricalUsageLevel(
                NetworkTemplate.buildTemplateMobileAll(subscriberId2))).isEqualTo(
                nonDefaultSubRx + nonDefaultSubTx);
    }
}