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

Commit d5876bc4 authored by Lorenzo Colitti's avatar Lorenzo Colitti
Browse files

Add getDefaultNetwork to the NetworkStats public API.

This allows an app using the public API to know whether the
traffic in a particular bucket was on the default network
(i.e., the network was selected by the system), or not (i.e.,
the network was selected by the app).

Bug: 35142602
Test: builds, boots
Test: added coverage to NetworkUsageStatsTest CTS test, still passes
Change-Id: I9f6669908fa119743b9c0aa0c31a03e5ebafa7db
Merged-In: I9f6669908fa119743b9c0aa0c31a03e5ebafa7db
parent bf996dd4
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -6949,6 +6949,7 @@ package android.app.usage {
  public static class NetworkStats.Bucket {
    ctor public NetworkStats.Bucket();
    method public int getDefaultNetwork();
    method public long getEndTimeStamp();
    method public int getMetered();
    method public int getRoaming();
@@ -6960,6 +6961,9 @@ package android.app.usage {
    method public long getTxBytes();
    method public long getTxPackets();
    method public int getUid();
    field public static final int DEFAULT_NETWORK_ALL = -1; // 0xffffffff
    field public static final int DEFAULT_NETWORK_NO = 1; // 0x1
    field public static final int DEFAULT_NETWORK_YES = 2; // 0x2
    field public static final int METERED_ALL = -1; // 0xffffffff
    field public static final int METERED_NO = 1; // 0x1
    field public static final int METERED_YES = 2; // 0x2
+52 −0
Original line number Diff line number Diff line
@@ -215,6 +215,30 @@ public final class NetworkStats implements AutoCloseable {
         */
        public static final int ROAMING_YES = 0x2;

        /** @hide */
        @IntDef(prefix = { "DEFAULT_NETWORK_" }, value = {
                DEFAULT_NETWORK_ALL,
                DEFAULT_NETWORK_NO,
                DEFAULT_NETWORK_YES
        })
        @Retention(RetentionPolicy.SOURCE)
        public @interface DefaultNetwork {}

        /**
         * Combined usage for this network regardless of whether it was the active default network.
         */
        public static final int DEFAULT_NETWORK_ALL = -1;

        /**
         * Usage that occurs while this network is not the active default network.
         */
        public static final int DEFAULT_NETWORK_NO = 0x1;

        /**
         * Usage that occurs while this network is the active default network.
         */
        public static final int DEFAULT_NETWORK_YES = 0x2;

        /**
         * Special TAG value for total data across all tags
         */
@@ -223,6 +247,7 @@ public final class NetworkStats implements AutoCloseable {
        private int mUid;
        private int mTag;
        private int mState;
        private int mDefaultNetwork;
        private int mMetered;
        private int mRoaming;
        private long mBeginTimeStamp;
@@ -274,6 +299,15 @@ public final class NetworkStats implements AutoCloseable {
            return 0;
        }

        private static @DefaultNetwork int convertDefaultNetwork(int defaultNetwork) {
            switch (defaultNetwork) {
                case android.net.NetworkStats.DEFAULT_NETWORK_ALL : return DEFAULT_NETWORK_ALL;
                case android.net.NetworkStats.DEFAULT_NETWORK_NO: return DEFAULT_NETWORK_NO;
                case android.net.NetworkStats.DEFAULT_NETWORK_YES: return DEFAULT_NETWORK_YES;
            }
            return 0;
        }

        public Bucket() {
        }

@@ -338,6 +372,21 @@ public final class NetworkStats implements AutoCloseable {
            return mRoaming;
        }

        /**
         * Default network state. One of the following values:<p/>
         * <ul>
         * <li>{@link #DEFAULT_NETWORK_ALL}</li>
         * <li>{@link #DEFAULT_NETWORK_NO}</li>
         * <li>{@link #DEFAULT_NETWORK_YES}</li>
         * </ul>
         * <p>Indicates whether the network usage occurred on the system default network for this
         * type of traffic, or whether the application chose to send this traffic on a network that
         * was not the one selected by the system.
         */
        public @DefaultNetwork int getDefaultNetwork() {
            return mDefaultNetwork;
        }

        /**
         * Start timestamp of the bucket's time interval. Defined in terms of "Unix time", see
         * {@link java.lang.System#currentTimeMillis}.
@@ -539,6 +588,8 @@ public final class NetworkStats implements AutoCloseable {
        bucketOut.mUid = Bucket.convertUid(mRecycledSummaryEntry.uid);
        bucketOut.mTag = Bucket.convertTag(mRecycledSummaryEntry.tag);
        bucketOut.mState = Bucket.convertState(mRecycledSummaryEntry.set);
        bucketOut.mDefaultNetwork = Bucket.convertDefaultNetwork(
                mRecycledSummaryEntry.defaultNetwork);
        bucketOut.mMetered = Bucket.convertMetered(mRecycledSummaryEntry.metered);
        bucketOut.mRoaming = Bucket.convertRoaming(mRecycledSummaryEntry.roaming);
        bucketOut.mBeginTimeStamp = mStartTimeStamp;
@@ -588,6 +639,7 @@ public final class NetworkStats implements AutoCloseable {
                bucketOut.mUid = Bucket.convertUid(getUid());
                bucketOut.mTag = Bucket.convertTag(mTag);
                bucketOut.mState = Bucket.STATE_ALL;
                bucketOut.mDefaultNetwork = Bucket.DEFAULT_NETWORK_ALL;
                bucketOut.mMetered = Bucket.METERED_ALL;
                bucketOut.mRoaming = Bucket.ROAMING_ALL;
                bucketOut.mBeginTimeStamp = mRecycledHistoryEntry.bucketStart;
+20 −15
Original line number Diff line number Diff line
@@ -60,10 +60,11 @@ import android.util.Log;
 * {@link #queryDetailsForUid} <p />
 * {@link #queryDetails} <p />
 * These queries do not aggregate over time but do aggregate over state, metered and roaming.
 * Therefore there can be multiple buckets for a particular key but all Bucket's state is going to
 * be {@link NetworkStats.Bucket#STATE_ALL}, all Bucket's metered is going to be
 * {@link NetworkStats.Bucket#METERED_ALL}, and all Bucket's roaming is going to be
 * {@link NetworkStats.Bucket#ROAMING_ALL}.
 * Therefore there can be multiple buckets for a particular key. However, all Buckets will have
 * {@code state} {@link NetworkStats.Bucket#STATE_ALL},
 * {@code defaultNetwork} {@link NetworkStats.Bucket#DEFAULT_NETWORK_ALL},
 * {@code metered } {@link NetworkStats.Bucket#METERED_ALL},
 * {@code roaming} {@link NetworkStats.Bucket#ROAMING_ALL}.
 * <p />
 * <b>NOTE:</b> Calling {@link #querySummaryForDevice} or accessing stats for apps other than the
 * calling app requires the permission {@link android.Manifest.permission#PACKAGE_USAGE_STATS},
@@ -136,7 +137,9 @@ public class NetworkStatsManager {
     * roaming. This means the bucket's start and end timestamp are going to be the same as the
     * 'startTime' and 'endTime' parameters. State is going to be
     * {@link NetworkStats.Bucket#STATE_ALL}, uid {@link NetworkStats.Bucket#UID_ALL},
     * tag {@link NetworkStats.Bucket#TAG_NONE}, metered {@link NetworkStats.Bucket#METERED_ALL},
     * tag {@link NetworkStats.Bucket#TAG_NONE},
     * default network {@link NetworkStats.Bucket#DEFAULT_NETWORK_ALL},
     * metered {@link NetworkStats.Bucket#METERED_ALL},
     * and roaming {@link NetworkStats.Bucket#ROAMING_ALL}.
     *
     * @param networkType As defined in {@link ConnectivityManager}, e.g.
@@ -209,10 +212,10 @@ public class NetworkStatsManager {
    /**
     * Query network usage statistics summaries. Result filtered to include only uids belonging to
     * calling user. Result is aggregated over time, hence all buckets will have the same start and
     * end timestamps. Not aggregated over state, uid, metered, or roaming. This means buckets'
     * start and end timestamps are going to be the same as the 'startTime' and 'endTime'
     * parameters. State, uid, metered, and roaming are going to vary, and tag is going to be the
     * same.
     * end timestamps. Not aggregated over state, uid, default network, metered, or roaming. This
     * means buckets' start and end timestamps are going to be the same as the 'startTime' and
     * 'endTime' parameters. State, uid, metered, and roaming are going to vary, and tag is going to
     * be the same.
     *
     * @param networkType As defined in {@link ConnectivityManager}, e.g.
     *            {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI}
@@ -258,9 +261,10 @@ public class NetworkStatsManager {
     * belonging to calling user. Result is aggregated over state but not aggregated over time.
     * This means buckets' start and end timestamps are going to be between 'startTime' and
     * 'endTime' parameters. State is going to be {@link NetworkStats.Bucket#STATE_ALL}, uid the
     * same as the 'uid' parameter and tag the same as 'tag' parameter. metered is going to be
     * {@link NetworkStats.Bucket#METERED_ALL}, and roaming is going to be
     * {@link NetworkStats.Bucket#ROAMING_ALL}.
     * same as the 'uid' parameter and tag the same as 'tag' parameter.
     * defaultNetwork is going to be {@link NetworkStats.Bucket#DEFAULT_NETWORK_ALL},
     * metered is going to be {@link NetworkStats.Bucket#METERED_ALL}, and
     * roaming is going to be {@link NetworkStats.Bucket#ROAMING_ALL}.
     * <p>Only includes buckets that atomically occur in the inclusive time range. Doesn't
     * interpolate across partial buckets. Since bucket length is in the order of hours, this
     * method cannot be used to measure data usage on a fine grained time scale.
@@ -301,9 +305,10 @@ public class NetworkStatsManager {
     * metered, nor roaming. This means buckets' start and end timestamps are going to be between
     * 'startTime' and 'endTime' parameters. State is going to be
     * {@link NetworkStats.Bucket#STATE_ALL}, uid will vary,
     * tag {@link NetworkStats.Bucket#TAG_NONE}, metered is going to be
     * {@link NetworkStats.Bucket#METERED_ALL}, and roaming is going to be
     * {@link NetworkStats.Bucket#ROAMING_ALL}.
     * tag {@link NetworkStats.Bucket#TAG_NONE},
     * default network is going to be {@link NetworkStats.Bucket#DEFAULT_NETWORK_ALL},
     * metered is going to be {@link NetworkStats.Bucket#METERED_ALL},
     * and roaming is going to be {@link NetworkStats.Bucket#ROAMING_ALL}.
     * <p>Only includes buckets that atomically occur in the inclusive time range. Doesn't
     * interpolate across partial buckets. Since bucket length is in the order of hours, this
     * method cannot be used to measure data usage on a fine grained time scale.