Merge "Allow querying for multiple uids in NetworkCycleDataForUidLoader."

This commit is contained in:
TreeHugger Robot
2019-02-05 22:11:04 +00:00
committed by Android (Google) Code Review
2 changed files with 56 additions and 19 deletions

View File

@@ -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 {
final NetworkStats stats = mNetworkStatsManager.queryDetailsForUid(
mNetworkType, mSubId, start, end, mUid);
final long total = getTotalUsage(stats);
if (total > 0L) {
long totalUsage = 0L;
long totalForeground = 0L;
for (int uid : mUids) {
final NetworkStats stats = mNetworkStatsManager.queryDetailsForUid(
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;
}

View File

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