Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2a26eba4 authored by Doris Ling's avatar Doris Ling
Browse files

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
parent 45434d2d
Loading
Loading
Loading
Loading
+14 −4
Original line number Original line Diff line number Diff line
@@ -36,10 +36,12 @@ public class NetworkCycleDataForUidLoader extends


    private final List<NetworkCycleDataForUid> mData;
    private final List<NetworkCycleDataForUid> mData;
    private final int mUid;
    private final int mUid;
    private final boolean mRetrieveDetail;


    private NetworkCycleDataForUidLoader(Builder builder) {
    private NetworkCycleDataForUidLoader(Builder builder) {
        super(builder);
        super(builder);
        mUid = builder.mUid;
        mUid = builder.mUid;
        mRetrieveDetail = builder.mRetrieveDetail;
        mData = new ArrayList<NetworkCycleDataForUid>();
        mData = new ArrayList<NetworkCycleDataForUid>();
    }
    }


@@ -50,13 +52,15 @@ public class NetworkCycleDataForUidLoader extends
                mNetworkType, mSubId, start, end, mUid);
                mNetworkType, mSubId, start, end, mUid);
            final long total = getTotalUsage(stats);
            final long total = getTotalUsage(stats);
            if (total > 0L) {
            if (total > 0L) {
                final long foreground = getForegroundUsage(start, end);
                final NetworkCycleDataForUid.Builder builder = new NetworkCycleDataForUid.Builder();
                final NetworkCycleDataForUid.Builder builder = new NetworkCycleDataForUid.Builder();
                builder.setBackgroundUsage(total - foreground)
                builder.setStartTime(start)
                    .setForegroundUsage(foreground)
                    .setStartTime(start)
                    .setEndTime(end)
                    .setEndTime(end)
                    .setTotalUsage(total);
                    .setTotalUsage(total);
                if (mRetrieveDetail) {
                    final long foreground = getForegroundUsage(start, end);
                    builder.setBackgroundUsage(total - foreground)
                        .setForegroundUsage(foreground);
                }
                mData.add(builder.build());
                mData.add(builder.build());
            }
            }
        } catch (Exception e) {
        } catch (Exception e) {
@@ -88,6 +92,7 @@ public class NetworkCycleDataForUidLoader extends
            extends NetworkCycleDataLoader.Builder<T> {
            extends NetworkCycleDataLoader.Builder<T> {


        private int mUid;
        private int mUid;
        private boolean mRetrieveDetail = true;


        public Builder(Context context) {
        public Builder(Context context) {
            super(context);
            super(context);
@@ -97,6 +102,11 @@ public class NetworkCycleDataForUidLoader extends
            mUid = uid;
            mUid = uid;
            return this;
            return this;
        }
        }

        public Builder<T> setRetrieveDetail(boolean retrieveDetail) {
            mRetrieveDetail = retrieveDetail;
            return this;
        }
    }
    }


}
}
+30 −13
Original line number Original line Diff line number Diff line
@@ -22,6 +22,7 @@ import static android.net.NetworkStatsHistory.FIELD_TX_BYTES;
import android.app.usage.NetworkStats;
import android.app.usage.NetworkStats;
import android.app.usage.NetworkStatsManager;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
import android.net.INetworkStatsSession;
import android.net.NetworkPolicy;
import android.net.NetworkPolicy;
@@ -34,6 +35,8 @@ import android.os.ServiceManager;
import android.text.format.DateUtils;
import android.text.format.DateUtils;
import android.util.Pair;
import android.util.Pair;


import com.android.settingslib.NetworkPolicyEditor;

import java.time.ZonedDateTime;
import java.time.ZonedDateTime;
import java.util.Iterator;
import java.util.Iterator;


@@ -55,7 +58,6 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {


    protected NetworkCycleDataLoader(Builder<?> builder) {
    protected NetworkCycleDataLoader(Builder<?> builder) {
        super(builder.mContext);
        super(builder.mContext);
        mPolicy = builder.mPolicy;
        mSubId = builder.mSubId;
        mSubId = builder.mSubId;
        mNetworkType = builder.mNetworkType;
        mNetworkType = builder.mNetworkType;
        mNetworkTemplate = builder.mNetworkTemplate;
        mNetworkTemplate = builder.mNetworkTemplate;
@@ -63,6 +65,10 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
            builder.mContext.getSystemService(Context.NETWORK_STATS_SERVICE);
            builder.mContext.getSystemService(Context.NETWORK_STATS_SERVICE);
        mNetworkStatsService = INetworkStatsService.Stub.asInterface(
        mNetworkStatsService = INetworkStatsService.Stub.asInterface(
            ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
            ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
        final NetworkPolicyEditor policyEditor =
            new NetworkPolicyEditor(NetworkPolicyManager.from(builder.mContext));
        policyEditor.read();
        mPolicy = policyEditor.getPolicy(mNetworkTemplate);
    }
    }


    @Override
    @Override
@@ -115,7 +121,8 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {


            long cycleEnd = historyEnd;
            long cycleEnd = historyEnd;
            while (cycleEnd > historyStart) {
            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);
                recordUsage(cycleStart, cycleEnd);
                cycleEnd = cycleStart;
                cycleEnd = cycleStart;
            }
            }
@@ -154,7 +161,6 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {


    public static abstract class Builder<T extends NetworkCycleDataLoader> {
    public static abstract class Builder<T extends NetworkCycleDataLoader> {
        private final Context mContext;
        private final Context mContext;
        private NetworkPolicy mPolicy;
        private String mSubId;
        private String mSubId;
        private int mNetworkType;
        private int mNetworkType;
        private NetworkTemplate mNetworkTemplate;
        private NetworkTemplate mNetworkTemplate;
@@ -163,27 +169,38 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
            mContext = context;
            mContext = context;
        }
        }


        public Builder<T> setNetworkPolicy(NetworkPolicy policy) {
            mPolicy = policy;
            return this;
        }

        public Builder<T> setSubscriberId(String subId) {
        public Builder<T> setSubscriberId(String subId) {
            mSubId = subId;
            mSubId = subId;
            return this;
            return this;
        }
        }


        public Builder<T> setNetworkType(int networkType) {
            mNetworkType = networkType;
            return this;
        }

        public Builder<T> setNetworkTemplate(NetworkTemplate template) {
        public Builder<T> setNetworkTemplate(NetworkTemplate template) {
            mNetworkTemplate = template;
            mNetworkTemplate = template;
            setNetworkType();
            return this;
            return this;
        }
        }


        public abstract T build();
        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;
                }
            }
        }
    }
    }


}
}
+8 −1
Original line number Original line Diff line number Diff line
@@ -22,6 +22,8 @@ import static org.mockito.Mockito.when;
import android.app.usage.NetworkStatsManager;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.os.RemoteException;
import android.os.RemoteException;
import android.text.format.DateUtils;
import android.text.format.DateUtils;


@@ -39,6 +41,8 @@ public class NetworkCycleChartDataLoaderTest {
    @Mock
    @Mock
    private NetworkStatsManager mNetworkStatsManager;
    private NetworkStatsManager mNetworkStatsManager;
    @Mock
    @Mock
    private NetworkPolicyManager mNetworkPolicyManager;
    @Mock
    private Context mContext;
    private Context mContext;


    private NetworkCycleChartDataLoader mLoader;
    private NetworkCycleChartDataLoader mLoader;
@@ -48,6 +52,9 @@ public class NetworkCycleChartDataLoaderTest {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE))
        when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE))
            .thenReturn(mNetworkStatsManager);
            .thenReturn(mNetworkStatsManager);
        when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE))
            .thenReturn(mNetworkPolicyManager);
        when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]);
    }
    }


    @Test
    @Test
@@ -57,7 +64,7 @@ public class NetworkCycleChartDataLoaderTest {
        final int networkType = ConnectivityManager.TYPE_MOBILE;
        final int networkType = ConnectivityManager.TYPE_MOBILE;
        final String subId = "TestSubscriber";
        final String subId = "TestSubscriber";
        mLoader = NetworkCycleChartDataLoader.builder(mContext)
        mLoader = NetworkCycleChartDataLoader.builder(mContext)
            .setNetworkType(networkType).setSubscriberId(subId).build();
            .setSubscriberId(subId).build();


        mLoader.recordUsage(start, end);
        mLoader.recordUsage(start, end);


+36 −3
Original line number Original line Diff line number Diff line
@@ -16,12 +16,21 @@


package com.android.settingslib.net;
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.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import android.app.usage.NetworkStatsManager;
import android.app.usage.NetworkStatsManager;
import android.content.Context;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.ConnectivityManager;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.text.format.DateUtils;
import android.text.format.DateUtils;


import com.android.settingslib.SettingsLibRobolectricTestRunner;
import com.android.settingslib.SettingsLibRobolectricTestRunner;
@@ -38,6 +47,8 @@ public class NetworkCycleDataForUidLoaderTest {
    @Mock
    @Mock
    private NetworkStatsManager mNetworkStatsManager;
    private NetworkStatsManager mNetworkStatsManager;
    @Mock
    @Mock
    private NetworkPolicyManager mNetworkPolicyManager;
    @Mock
    private Context mContext;
    private Context mContext;


    private NetworkCycleDataForUidLoader mLoader;
    private NetworkCycleDataForUidLoader mLoader;
@@ -47,20 +58,42 @@ public class NetworkCycleDataForUidLoaderTest {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE))
        when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE))
            .thenReturn(mNetworkStatsManager);
            .thenReturn(mNetworkStatsManager);
        when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE))
            .thenReturn(mNetworkPolicyManager);
        when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]);
    }
    }


    @Test
    @Test
    public void recordUsage_shouldQueryNetworkDetailsForUid() {
    public void recordUsage_shouldQueryNetworkDetailsForUidAndForegroundState() {
        final long end = System.currentTimeMillis();
        final long end = System.currentTimeMillis();
        final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
        final long start = end - (DateUtils.WEEK_IN_MILLIS * 4);
        final int networkType = ConnectivityManager.TYPE_MOBILE;
        final int networkType = ConnectivityManager.TYPE_MOBILE;
        final String subId = "TestSubscriber";
        final String subId = "TestSubscriber";
        final int uid = 1;
        final int uid = 1;
        mLoader = NetworkCycleDataForUidLoader.builder(mContext)
        mLoader = spy(NetworkCycleDataForUidLoader.builder(mContext)
            .setUid(uid).setNetworkType(networkType).setSubscriberId(subId).build();
            .setUid(uid).setSubscriberId(subId).build());
        doReturn(1024L).when(mLoader).getTotalUsage(any());


        mLoader.recordUsage(start, end);
        mLoader.recordUsage(start, end);


        verify(mNetworkStatsManager).queryDetailsForUid(networkType, subId, start, end, uid);
        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);
    }
    }
}
}
+6 −3
Original line number Original line Diff line number Diff line
@@ -30,6 +30,7 @@ import android.net.ConnectivityManager;
import android.net.INetworkStatsService;
import android.net.INetworkStatsService;
import android.net.INetworkStatsSession;
import android.net.INetworkStatsSession;
import android.net.NetworkPolicy;
import android.net.NetworkPolicy;
import android.net.NetworkPolicyManager;
import android.net.NetworkStatsHistory;
import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate;
import android.net.NetworkTemplate;
import android.os.RemoteException;
import android.os.RemoteException;
@@ -55,6 +56,8 @@ public class NetworkCycleDataLoaderTest {
    @Mock
    @Mock
    private NetworkStatsManager mNetworkStatsManager;
    private NetworkStatsManager mNetworkStatsManager;
    @Mock
    @Mock
    private NetworkPolicyManager mNetworkPolicyManager;
    @Mock
    private Context mContext;
    private Context mContext;
    @Mock
    @Mock
    private NetworkPolicy mPolicy;
    private NetworkPolicy mPolicy;
@@ -62,9 +65,6 @@ public class NetworkCycleDataLoaderTest {
    private Iterator<Range<ZonedDateTime>> mIterator;
    private Iterator<Range<ZonedDateTime>> mIterator;
    @Mock
    @Mock
    private INetworkStatsService mNetworkStatsService;
    private INetworkStatsService mNetworkStatsService;
    @Mock
    private NetworkCycleDataLoader.Builder mBuilder;



    private NetworkCycleDataTestLoader mLoader;
    private NetworkCycleDataTestLoader mLoader;


@@ -73,7 +73,10 @@ public class NetworkCycleDataLoaderTest {
        MockitoAnnotations.initMocks(this);
        MockitoAnnotations.initMocks(this);
        when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE))
        when(mContext.getSystemService(Context.NETWORK_STATS_SERVICE))
            .thenReturn(mNetworkStatsManager);
            .thenReturn(mNetworkStatsManager);
        when(mContext.getSystemService(Context.NETWORK_POLICY_SERVICE))
            .thenReturn(mNetworkPolicyManager);
        when(mPolicy.cycleIterator()).thenReturn(mIterator);
        when(mPolicy.cycleIterator()).thenReturn(mIterator);
        when(mNetworkPolicyManager.getNetworkPolicies()).thenReturn(new NetworkPolicy[0]);
    }
    }


    @Test
    @Test