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

Commit 881be607 authored by Doris Ling's avatar Doris Ling
Browse files

Add capability to query network data for specific cycles.

- add the setter to the loader builder to specify the cycles to be used
to query the network usage.

Bug: 123192721
Test: make RunSettingsLibRoboTests
Change-Id: I3b039f1d5802c530bf907944bb5c13f64f304a3b
parent ebfc162d
Loading
Loading
Loading
Loading
+33 −1
Original line number Diff line number Diff line
@@ -40,6 +40,7 @@ import androidx.loader.content.AsyncTaskLoader;
import com.android.settingslib.NetworkPolicyEditor;

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

/**
@@ -52,6 +53,7 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
    protected final int mNetworkType;
    private final NetworkPolicy mPolicy;
    private final NetworkTemplate mNetworkTemplate;
    private final ArrayList<Long> mCycles;
    @VisibleForTesting
    final INetworkStatsService mNetworkStatsService;

@@ -60,6 +62,7 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
        mSubId = builder.mSubId;
        mNetworkType = builder.mNetworkType;
        mNetworkTemplate = builder.mNetworkTemplate;
        mCycles = builder.mCycles;
        mNetworkStatsManager = (NetworkStatsManager)
            builder.mContext.getSystemService(Context.NETWORK_STATS_SERVICE);
        mNetworkStatsService = INetworkStatsService.Stub.asInterface(
@@ -77,7 +80,9 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
    }

    public D loadInBackground() {
        if (mPolicy == null) {
        if (mCycles != null && mCycles.size() > 1) {
            loadDataForSpecificCycles();
        } else if (mPolicy == null) {
            loadFourWeeksData();
        } else {
            loadPolicyData();
@@ -131,6 +136,17 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
        }
    }

    @VisibleForTesting
    void loadDataForSpecificCycles() {
        long cycleEnd = mCycles.get(0);
        final int lastCycleIndex = mCycles.size() - 1;
        for (int i = 1; i <= lastCycleIndex; i++) {
            final long cycleStart = mCycles.get(i);
            recordUsage(cycleStart, cycleEnd);
            cycleEnd = cycleStart;
        }
    }

    @VisibleForTesting
    abstract void recordUsage(long start, long end);

@@ -157,11 +173,17 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
        return bytes;
    }

    @VisibleForTesting(otherwise = VisibleForTesting.NONE)
    public ArrayList<Long> getCycles() {
        return mCycles;
    }

    public static abstract class Builder<T extends NetworkCycleDataLoader> {
        private final Context mContext;
        private String mSubId;
        private int mNetworkType;
        private NetworkTemplate mNetworkTemplate;
        private ArrayList<Long> mCycles;

        public Builder (Context context) {
            mContext = context;
@@ -178,6 +200,16 @@ public abstract class NetworkCycleDataLoader<D> extends AsyncTaskLoader<D> {
            return this;
        }

        /**
         * Sets the network cycles to be used to query the usage data.
         * @param cycles the time slots for the network cycle to be used to query the network usage.
         * @return the builder
         */
        public Builder<T> setCycles(ArrayList<Long> cycles) {
            mCycles = cycles;
            return this;
        }

        public abstract T build();
    }

+36 −0
Original line number Diff line number Diff line
@@ -46,6 +46,7 @@ import org.robolectric.RobolectricTestRunner;
import org.robolectric.util.ReflectionHelpers;

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

@@ -98,6 +99,20 @@ public class NetworkCycleDataLoaderTest {
        verify(mLoader).loadPolicyData();
    }

    @Test
    public void loadInBackground_hasCyclePeriod_shouldLoadDataForSpecificCycles() {
        mLoader = spy(new NetworkCycleDataTestLoader(mContext));
        doNothing().when(mLoader).loadDataForSpecificCycles();
        final ArrayList<Long> cycles = new ArrayList<>();
        cycles.add(67890L);
        cycles.add(12345L);
        ReflectionHelpers.setField(mLoader, "mCycles", cycles);

        mLoader.loadInBackground();

        verify(mLoader).loadDataForSpecificCycles();
    }

    @Test
    public void loadPolicyData_shouldRecordUsageFromPolicyCycle() {
        final int networkType = ConnectivityManager.TYPE_MOBILE;
@@ -139,6 +154,27 @@ public class NetworkCycleDataLoaderTest {
        verify(mLoader).recordUsage(fourWeeksAgo, now);
    }

    @Test
    public void loadDataForSpecificCycles_shouldRecordUsageForSpecifiedTime() {
        mLoader = spy(new NetworkCycleDataTestLoader(mContext));
        final long now = System.currentTimeMillis();
        final long tenDaysAgo = now - (DateUtils.DAY_IN_MILLIS * 10);
        final long twentyDaysAgo = now - (DateUtils.DAY_IN_MILLIS * 20);
        final long thirtyDaysAgo = now - (DateUtils.DAY_IN_MILLIS * 30);
        final ArrayList<Long> cycles = new ArrayList<>();
        cycles.add(now);
        cycles.add(tenDaysAgo);
        cycles.add(twentyDaysAgo);
        cycles.add(thirtyDaysAgo);
        ReflectionHelpers.setField(mLoader, "mCycles", cycles);

        mLoader.loadDataForSpecificCycles();

        verify(mLoader).recordUsage(tenDaysAgo, now);
        verify(mLoader).recordUsage(twentyDaysAgo, tenDaysAgo);
        verify(mLoader).recordUsage(thirtyDaysAgo, twentyDaysAgo);
    }

    public class NetworkCycleDataTestLoader extends NetworkCycleDataLoader<List<NetworkCycleData>> {

        private NetworkCycleDataTestLoader(Context context) {