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