From 2a26eba429e5383c807529b8468e92dcdb41c509 Mon Sep 17 00:00:00 2001 From: Doris Ling Date: Mon, 1 Oct 2018 16:17:31 -0700 Subject: [PATCH] Add a flag to specify whether to read detail data or not. - for the app data usage summary, it only needs the total usage and don't need the foreground/background differentiation. Add a flag to indicate whether such details need to be retrieved. - removed the network type parameter from the cycle data loader. The network type can be inferred from the network template. Since we still need to pass the network template, we don't need to explicitly sets the network type. - also removed the network policy parameter, and get it inside the loader itself. Bug: 111751694 Test: make RunSettingsLibRoboTests Change-Id: I794d92f18132d163f81a357810bc74311f30dfd2 --- .../net/NetworkCycleDataForUidLoader.java | 18 ++++++-- .../net/NetworkCycleDataLoader.java | 43 +++++++++++++------ .../net/NetworkCycleChartDataLoaderTest.java | 9 +++- .../net/NetworkCycleDataForUidLoaderTest.java | 39 +++++++++++++++-- .../net/NetworkCycleDataLoaderTest.java | 9 ++-- 5 files changed, 94 insertions(+), 24 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java index 95efb4cea4910..cc970b93f6010 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataForUidLoader.java @@ -36,10 +36,12 @@ public class NetworkCycleDataForUidLoader extends private final List mData; private final int mUid; + private final boolean mRetrieveDetail; private NetworkCycleDataForUidLoader(Builder builder) { super(builder); mUid = builder.mUid; + mRetrieveDetail = builder.mRetrieveDetail; mData = new ArrayList(); } @@ -50,13 +52,15 @@ public class NetworkCycleDataForUidLoader extends mNetworkType, mSubId, start, end, mUid); final long total = getTotalUsage(stats); if (total > 0L) { - final long foreground = getForegroundUsage(start, end); final NetworkCycleDataForUid.Builder builder = new NetworkCycleDataForUid.Builder(); - builder.setBackgroundUsage(total - foreground) - .setForegroundUsage(foreground) - .setStartTime(start) + builder.setStartTime(start) .setEndTime(end) .setTotalUsage(total); + if (mRetrieveDetail) { + final long foreground = getForegroundUsage(start, end); + builder.setBackgroundUsage(total - foreground) + .setForegroundUsage(foreground); + } mData.add(builder.build()); } } catch (Exception e) { @@ -88,6 +92,7 @@ public class NetworkCycleDataForUidLoader extends extends NetworkCycleDataLoader.Builder { private int mUid; + private boolean mRetrieveDetail = true; public Builder(Context context) { super(context); @@ -97,6 +102,11 @@ public class NetworkCycleDataForUidLoader extends mUid = uid; return this; } + + public Builder setRetrieveDetail(boolean retrieveDetail) { + mRetrieveDetail = retrieveDetail; + return this; + } } } diff --git a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java index cc936d2485c5d..b1c2c3a2d2e5d 100644 --- a/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java +++ b/packages/SettingsLib/src/com/android/settingslib/net/NetworkCycleDataLoader.java @@ -22,6 +22,7 @@ import static android.net.NetworkStatsHistory.FIELD_TX_BYTES; import android.app.usage.NetworkStats; import android.app.usage.NetworkStatsManager; import android.content.Context; +import android.net.ConnectivityManager; import android.net.INetworkStatsService; import android.net.INetworkStatsSession; import android.net.NetworkPolicy; @@ -34,6 +35,8 @@ import android.os.ServiceManager; import android.text.format.DateUtils; import android.util.Pair; +import com.android.settingslib.NetworkPolicyEditor; + import java.time.ZonedDateTime; import java.util.Iterator; @@ -55,7 +58,6 @@ public abstract class NetworkCycleDataLoader extends AsyncTaskLoader { protected NetworkCycleDataLoader(Builder builder) { super(builder.mContext); - mPolicy = builder.mPolicy; mSubId = builder.mSubId; mNetworkType = builder.mNetworkType; mNetworkTemplate = builder.mNetworkTemplate; @@ -63,6 +65,10 @@ public abstract class NetworkCycleDataLoader extends AsyncTaskLoader { builder.mContext.getSystemService(Context.NETWORK_STATS_SERVICE); mNetworkStatsService = INetworkStatsService.Stub.asInterface( ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); + final NetworkPolicyEditor policyEditor = + new NetworkPolicyEditor(NetworkPolicyManager.from(builder.mContext)); + policyEditor.read(); + mPolicy = policyEditor.getPolicy(mNetworkTemplate); } @Override @@ -115,7 +121,8 @@ public abstract class NetworkCycleDataLoader extends AsyncTaskLoader { long cycleEnd = historyEnd; while (cycleEnd > historyStart) { - final long cycleStart = cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4); + final long cycleStart = Math.max( + historyStart, cycleEnd - (DateUtils.WEEK_IN_MILLIS * 4)); recordUsage(cycleStart, cycleEnd); cycleEnd = cycleStart; } @@ -154,7 +161,6 @@ public abstract class NetworkCycleDataLoader extends AsyncTaskLoader { public static abstract class Builder { private final Context mContext; - private NetworkPolicy mPolicy; private String mSubId; private int mNetworkType; private NetworkTemplate mNetworkTemplate; @@ -163,27 +169,38 @@ public abstract class NetworkCycleDataLoader extends AsyncTaskLoader { mContext = context; } - public Builder setNetworkPolicy(NetworkPolicy policy) { - mPolicy = policy; - return this; - } - public Builder setSubscriberId(String subId) { mSubId = subId; return this; } - public Builder setNetworkType(int networkType) { - mNetworkType = networkType; - return this; - } - public Builder setNetworkTemplate(NetworkTemplate template) { mNetworkTemplate = template; + setNetworkType(); return this; } public abstract T build(); + + private void setNetworkType() { + if (mNetworkTemplate != null) { + final int matchRule = mNetworkTemplate.getMatchRule(); + switch (matchRule) { + case NetworkTemplate.MATCH_MOBILE: + case NetworkTemplate.MATCH_MOBILE_WILDCARD: + mNetworkType = ConnectivityManager.TYPE_MOBILE; + break; + case NetworkTemplate.MATCH_WIFI: + mNetworkType = ConnectivityManager.TYPE_WIFI; + break; + case NetworkTemplate.MATCH_ETHERNET: + mNetworkType = ConnectivityManager.TYPE_ETHERNET; + break; + default: + mNetworkType = ConnectivityManager.TYPE_MOBILE; + } + } + } } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleChartDataLoaderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleChartDataLoaderTest.java index 3dc110d30e1ec..cad88b1f97a4d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleChartDataLoaderTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleChartDataLoaderTest.java @@ -22,6 +22,8 @@ import static org.mockito.Mockito.when; import android.app.usage.NetworkStatsManager; import android.content.Context; import android.net.ConnectivityManager; +import android.net.NetworkPolicy; +import android.net.NetworkPolicyManager; import android.os.RemoteException; import android.text.format.DateUtils; @@ -39,6 +41,8 @@ public class NetworkCycleChartDataLoaderTest { @Mock private NetworkStatsManager mNetworkStatsManager; @Mock + private NetworkPolicyManager mNetworkPolicyManager; + @Mock private Context mContext; private NetworkCycleChartDataLoader mLoader; @@ -48,6 +52,9 @@ public class NetworkCycleChartDataLoaderTest { MockitoAnnotations.initMocks(this); when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE)) .thenReturn(mNetworkStatsManager); + when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE)) + .thenReturn(mNetworkPolicyManager); + when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]); } @Test @@ -57,7 +64,7 @@ public class NetworkCycleChartDataLoaderTest { final int networkType = ConnectivityManager.TYPE_MOBILE; final String subId = "TestSubscriber"; mLoader = NetworkCycleChartDataLoader.builder(mContext) - .setNetworkType(networkType).setSubscriberId(subId).build(); + .setSubscriberId(subId).build(); mLoader.recordUsage(start, end); 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 53fe451972362..2314f272c8eac 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 @@ -16,12 +16,21 @@ package com.android.settingslib.net; +import static android.app.usage.NetworkStats.Bucket.STATE_FOREGROUND; +import static android.net.NetworkStats.TAG_NONE; + +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import android.app.usage.NetworkStatsManager; import android.content.Context; import android.net.ConnectivityManager; +import android.net.NetworkPolicy; +import android.net.NetworkPolicyManager; import android.text.format.DateUtils; import com.android.settingslib.SettingsLibRobolectricTestRunner; @@ -38,6 +47,8 @@ public class NetworkCycleDataForUidLoaderTest { @Mock private NetworkStatsManager mNetworkStatsManager; @Mock + private NetworkPolicyManager mNetworkPolicyManager; + @Mock private Context mContext; private NetworkCycleDataForUidLoader mLoader; @@ -47,20 +58,42 @@ public class NetworkCycleDataForUidLoaderTest { MockitoAnnotations.initMocks(this); when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE)) .thenReturn(mNetworkStatsManager); + when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE)) + .thenReturn(mNetworkPolicyManager); + when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]); } @Test - public void recordUsage_shouldQueryNetworkDetailsForUid() { + public void recordUsage_shouldQueryNetworkDetailsForUidAndForegroundState() { final long end = System.currentTimeMillis(); final long start = end - (DateUtils.WEEK_IN_MILLIS * 4); final int networkType = ConnectivityManager.TYPE_MOBILE; final String subId = "TestSubscriber"; final int uid = 1; - mLoader = NetworkCycleDataForUidLoader.builder(mContext) - .setUid(uid).setNetworkType(networkType).setSubscriberId(subId).build(); + mLoader = spy(NetworkCycleDataForUidLoader.builder(mContext) + .setUid(uid).setSubscriberId(subId).build()); + doReturn(1024L).when(mLoader).getTotalUsage(any()); mLoader.recordUsage(start, end); verify(mNetworkStatsManager).queryDetailsForUid(networkType, subId, start, end, uid); + verify(mNetworkStatsManager).queryDetailsForUidTagState( + networkType, subId, start, end, uid, TAG_NONE, STATE_FOREGROUND); + } + + @Test + public void recordUsage_retrieveDetailIsFalse_shouldNotQueryNetworkForegroundState() { + final long end = System.currentTimeMillis(); + final long start = end - (DateUtils.WEEK_IN_MILLIS * 4); + final int networkType = ConnectivityManager.TYPE_MOBILE; + final String subId = "TestSubscriber"; + final int uid = 1; + mLoader = spy(NetworkCycleDataForUidLoader.builder(mContext) + .setRetrieveDetail(false).setUid(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); } } diff --git a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java index be7f1bbb280f5..9d60a97f8584d 100644 --- a/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java +++ b/packages/SettingsLib/tests/robotests/src/com/android/settingslib/net/NetworkCycleDataLoaderTest.java @@ -30,6 +30,7 @@ import android.net.ConnectivityManager; import android.net.INetworkStatsService; import android.net.INetworkStatsSession; import android.net.NetworkPolicy; +import android.net.NetworkPolicyManager; import android.net.NetworkStatsHistory; import android.net.NetworkTemplate; import android.os.RemoteException; @@ -55,6 +56,8 @@ public class NetworkCycleDataLoaderTest { @Mock private NetworkStatsManager mNetworkStatsManager; @Mock + private NetworkPolicyManager mNetworkPolicyManager; + @Mock private Context mContext; @Mock private NetworkPolicy mPolicy; @@ -62,9 +65,6 @@ public class NetworkCycleDataLoaderTest { private Iterator> mIterator; @Mock private INetworkStatsService mNetworkStatsService; - @Mock - private NetworkCycleDataLoader.Builder mBuilder; - private NetworkCycleDataTestLoader mLoader; @@ -73,7 +73,10 @@ public class NetworkCycleDataLoaderTest { MockitoAnnotations.initMocks(this); when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE)) .thenReturn(mNetworkStatsManager); + when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE)) + .thenReturn(mNetworkPolicyManager); when(mPolicy.cycleIterator()).thenReturn(mIterator); + when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]); } @Test