summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java50
-rw-r--r--packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java25
2 files changed, 56 insertions, 19 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java
index cc970b93f601..bd9a636883c2 100644
--- a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java
+++ b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java
@@ -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;
}
diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
index d9159631e8a9..aafb46a1dbf1 100644
--- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
+++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataForUidLoaderTest.java
@@ -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);
+ }
+
}