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

Commit e6854876 authored by Doris Ling's avatar Doris Ling
Browse files

Allow querying for multiple uids in NetworkCycleDataForUidLoader.

- since we might want to get aggregated usage data for multiple uids,
change the implementation to allow adding multiple uids instead of
always querying for a single uid.

Change-Id: I26ba07042f8a0a0800e6d0ad0938da70691c3500
Fixes: 122200400
Test: make RunSettingsLibRoboTests
parent 7447f3bd
Loading
Loading
Loading
Loading
+33 −17
Original line number Diff line number Diff line
@@ -26,21 +26,23 @@ import android.util.Log;
import java.util.ArrayList;
import java.util.List;

import androidx.annotation.VisibleForTesting;

/**
 * Loader for network data usage history. It returns a list of usage data per billing cycle for a
 * specific Uid.
 * Loader for network data usage history. It returns a list of usage data per billing cycle for the
 * specific Uid(s).
 */
public class NetworkCycleDataForUidLoader extends
        NetworkCycleDataLoader<List<NetworkCycleDataForUid>> {
    private static final String TAG = "NetworkDataForUidLoader";

    private final List<NetworkCycleDataForUid> mData;
    private final int mUid;
    private final List<Integer> mUids;
    private final boolean mRetrieveDetail;

    private NetworkCycleDataForUidLoader(Builder builder) {
        super(builder);
        mUid = builder.mUid;
        mUids = builder.mUids;
        mRetrieveDetail = builder.mRetrieveDetail;
        mData = new ArrayList<NetworkCycleDataForUid>();
    }
@@ -48,18 +50,27 @@ public class NetworkCycleDataForUidLoader extends
    @Override
    void recordUsage(long start, long end) {
        try {
            long totalUsage = 0L;
            long totalForeground = 0L;
            for (int uid : mUids) {
                final NetworkStats stats = mNetworkStatsManager.queryDetailsForUid(
                mNetworkType, mSubId, start, end, mUid);
            final long total = getTotalUsage(stats);
            if (total > 0L) {
                    mNetworkType, mSubId, start, end, uid);
                final long usage = getTotalUsage(stats);
                if (usage > 0L) {
                    totalUsage += usage;
                    if (mRetrieveDetail) {
                        totalForeground += getForegroundUsage(start, end, uid);
                    }
                }
            }
            if (totalUsage > 0L) {
                final NetworkCycleDataForUid.Builder builder = new NetworkCycleDataForUid.Builder();
                builder.setStartTime(start)
                    .setEndTime(end)
                    .setTotalUsage(total);
                    .setTotalUsage(totalUsage);
                if (mRetrieveDetail) {
                    final long foreground = getForegroundUsage(start, end);
                    builder.setBackgroundUsage(total - foreground)
                        .setForegroundUsage(foreground);
                    builder.setBackgroundUsage(totalUsage - totalForeground)
                        .setForegroundUsage(totalForeground);
                }
                mData.add(builder.build());
            }
@@ -82,24 +93,29 @@ public class NetworkCycleDataForUidLoader extends
        };
    }

    private long getForegroundUsage(long start, long end) {
    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
    public List<Integer> getUids() {
        return mUids;
    }

    private long getForegroundUsage(long start, long end, int uid) {
        final NetworkStats stats = mNetworkStatsManager.queryDetailsForUidTagState(
            mNetworkType, mSubId, start, end, mUid, TAG_NONE, STATE_FOREGROUND);
            mNetworkType, mSubId, start, end, uid, TAG_NONE, STATE_FOREGROUND);
        return getTotalUsage(stats);
    }

    public static abstract class Builder<T extends NetworkCycleDataForUidLoader>
            extends NetworkCycleDataLoader.Builder<T> {

        private int mUid;
        private final List<Integer> mUids = new ArrayList<>();
        private boolean mRetrieveDetail = true;

        public Builder(Context context) {
            super(context);
        }

        public Builder<T> setUid(int uid) {
            mUid = uid;
        public Builder<T> addUid(int uid) {
            mUids.add(uid);
            return this;
        }

+23 −2
Original line number Diff line number Diff line
@@ -70,7 +70,7 @@ public class NetworkCycleDataForUidLoaderTest {
        final String subId = "TestSubscriber";
        final int uid = 1;
        mLoader = spy(NetworkCycleDataForUidLoader.builder(mContext)
            .setUid(uid).setSubscriberId(subId).build());
            .addUid(uid).setSubscriberId(subId).build());
        doReturn(1024L).when(mLoader).getTotalUsage(any());

        mLoader.recordUsage(start, end);
@@ -88,11 +88,32 @@ public class NetworkCycleDataForUidLoaderTest {
        final String subId = "TestSubscriber";
        final int uid = 1;
        mLoader = spy(NetworkCycleDataForUidLoader.builder(mContext)
            .setRetrieveDetail(false).setUid(uid).setSubscriberId(subId).build());
            .setRetrieveDetail(false).addUid(uid).setSubscriberId(subId).build());
        doReturn(1024L).when(mLoader).getTotalUsage(any());

        mLoader.recordUsage(start, end);
        verify(mNetworkStatsManager, never()).queryDetailsForUidTagState(
            networkType, subId, start, end, uid, TAG_NONE, STATE_FOREGROUND);
    }

    @Test
    public void recordUsage_multipleUids_shouldQueryNetworkDetailsForEachUid() {
        final long end = System.currentTimeMillis();
        final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
        final int networkType = ConnectivityManager.TYPE_MOBILE;
        final String subId = "TestSubscriber";
        mLoader = spy(NetworkCycleDataForUidLoader.builder(mContext)
            .addUid(1)
            .addUid(2)
            .addUid(3)
            .setSubscriberId(subId).build());
        doReturn(1024L).when(mLoader).getTotalUsage(any());

        mLoader.recordUsage(start, end);

        verify(mNetworkStatsManager).queryDetailsForUid(networkType, subId, start, end, 1);
        verify(mNetworkStatsManager).queryDetailsForUid(networkType, subId, start, end, 2);
        verify(mNetworkStatsManager).queryDetailsForUid(networkType, subId, start, end, 3);
    }

}