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

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

Merge "Allow querying for multiple uids in NetworkCycleDataForUidLoader."

parents c03701d3 e6854876
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);
    }

}