diff options
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); + } + } |