OSDN Git Service

Addressing API council comments on NetworkStatsManager.
authorAntonio Cansado <acansado@google.com>
Wed, 30 Mar 2016 18:37:18 +0000 (11:37 -0700)
committerAntonio Cansado <acansado@google.com>
Tue, 10 May 2016 20:24:16 +0000 (13:24 -0700)
Callbacks
 - DataUsageCallback renamed to UsageCallback
 - DataUsagePolicy removed; passing in params directly to register method
 - making it an abstract class
 - passing in (networkType, subscriberId) that reached its threshold
 - renaming onLimitReached to onThresholdReached to match existing naming
 - only monitor single network,subscriberId
 - no monitoring of specific uids; using device or user wide instead

Tags
 - only owner uid can read its tags
 - exposing only TAG_NONE to match service side

BUG: 27530098

Change-Id: I2b2664da71806868a1e937d2bf4d1f234637509b

15 files changed:
api/current.txt
api/removed.txt
api/system-current.txt
api/system-removed.txt
api/test-current.txt
api/test-removed.txt
core/java/android/app/usage/DataUsagePolicy.java
core/java/android/app/usage/NetworkStats.java
core/java/android/app/usage/NetworkStatsManager.java
core/java/android/net/DataUsageRequest.java
core/java/android/net/INetworkStatsService.aidl
services/core/java/com/android/server/net/NetworkStatsObservers.java
services/core/java/com/android/server/net/NetworkStatsService.java
services/tests/servicestests/src/com/android/server/net/NetworkStatsObserversTest.java
services/tests/servicestests/src/com/android/server/net/NetworkStatsServiceTest.java

index d380e70..e9d5c3d 100644 (file)
@@ -6417,22 +6417,6 @@ package android.app.usage {
     field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
   }
 
-  public class DataUsagePolicy {
-    field public final int networkType;
-    field public final java.lang.String[] subscriberIds;
-    field public final long thresholdInBytes;
-    field public final int[] uids;
-  }
-
-  public static class DataUsagePolicy.Builder {
-    ctor public DataUsagePolicy.Builder();
-    method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String);
-    method public android.app.usage.DataUsagePolicy.Builder addUid(int);
-    method public android.app.usage.DataUsagePolicy build();
-    method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int);
-    method public android.app.usage.DataUsagePolicy.Builder setThreshold(long);
-  }
-
   public final class NetworkStats implements java.lang.AutoCloseable {
     method public void close();
     method public boolean getNextBucket(android.app.usage.NetworkStats.Bucket);
@@ -6457,8 +6441,7 @@ package android.app.usage {
     field public static final int STATE_ALL = -1; // 0xffffffff
     field public static final int STATE_DEFAULT = 1; // 0x1
     field public static final int STATE_FOREGROUND = 2; // 0x2
-    field public static final int TAG_ALL = 0; // 0x0
-    field public static final int TAG_ANY = -1; // 0xffffffff
+    field public static final int TAG_NONE = 0; // 0x0
     field public static final int UID_ALL = -1; // 0xffffffff
     field public static final int UID_REMOVED = -4; // 0xfffffffc
     field public static final int UID_TETHERING = -5; // 0xfffffffb
@@ -6467,20 +6450,18 @@ package android.app.usage {
   public class NetworkStatsManager {
     method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws android.os.RemoteException, java.lang.SecurityException;
+    method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int);
     method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long, boolean) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long, boolean) throws android.os.RemoteException, java.lang.SecurityException;
-    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback);
-    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler);
-    method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback);
+    method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback);
+    method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+    method public void unregisterUsageCallback(android.app.usage.NetworkStatsManager.UsageCallback);
   }
 
-  public static class NetworkStatsManager.DataUsageCallback {
-    ctor public NetworkStatsManager.DataUsageCallback();
-    method public void onLimitReached();
+  public static abstract class NetworkStatsManager.UsageCallback {
+    ctor public NetworkStatsManager.UsageCallback();
+    method public abstract void onThresholdReached(int, java.lang.String);
   }
 
   public final class UsageEvents implements android.os.Parcelable {
@@ -23538,12 +23519,6 @@ package android.net {
     method public int getUid();
   }
 
-  public final class DataUsageRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.net.DataUsageRequest> CREATOR;
-  }
-
   public class DhcpInfo implements android.os.Parcelable {
     ctor public DhcpInfo();
     method public int describeContents();
index f9fce40..2673a82 100644 (file)
@@ -17,6 +17,37 @@ package android.app.admin {
 
 }
 
+package android.app.usage {
+
+  public class DataUsagePolicy {
+    field public final int networkType;
+    field public final java.lang.String[] subscriberIds;
+    field public final long thresholdInBytes;
+    field public final int[] uids;
+  }
+
+  public static class DataUsagePolicy.Builder {
+    ctor public DataUsagePolicy.Builder();
+    method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String);
+    method public android.app.usage.DataUsagePolicy.Builder addUid(int);
+    method public android.app.usage.DataUsagePolicy build();
+    method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int);
+    method public android.app.usage.DataUsagePolicy.Builder setThreshold(long);
+  }
+
+  public class NetworkStatsManager {
+    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler);
+    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+    method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback);
+  }
+
+  public static abstract class NetworkStatsManager.DataUsageCallback {
+    ctor public NetworkStatsManager.DataUsageCallback();
+    method public deprecated void onLimitReached();
+  }
+
+}
+
 package android.content {
 
   public abstract class Context {
index dbbefbf..e5c88cc 100644 (file)
@@ -6698,22 +6698,6 @@ package android.app.usage {
     field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
   }
 
-  public class DataUsagePolicy {
-    field public final int networkType;
-    field public final java.lang.String[] subscriberIds;
-    field public final long thresholdInBytes;
-    field public final int[] uids;
-  }
-
-  public static class DataUsagePolicy.Builder {
-    ctor public DataUsagePolicy.Builder();
-    method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String);
-    method public android.app.usage.DataUsagePolicy.Builder addUid(int);
-    method public android.app.usage.DataUsagePolicy build();
-    method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int);
-    method public android.app.usage.DataUsagePolicy.Builder setThreshold(long);
-  }
-
   public final class NetworkStats implements java.lang.AutoCloseable {
     method public void close();
     method public boolean getNextBucket(android.app.usage.NetworkStats.Bucket);
@@ -6738,8 +6722,7 @@ package android.app.usage {
     field public static final int STATE_ALL = -1; // 0xffffffff
     field public static final int STATE_DEFAULT = 1; // 0x1
     field public static final int STATE_FOREGROUND = 2; // 0x2
-    field public static final int TAG_ALL = 0; // 0x0
-    field public static final int TAG_ANY = -1; // 0xffffffff
+    field public static final int TAG_NONE = 0; // 0x0
     field public static final int UID_ALL = -1; // 0xffffffff
     field public static final int UID_REMOVED = -4; // 0xfffffffc
     field public static final int UID_TETHERING = -5; // 0xfffffffb
@@ -6748,20 +6731,18 @@ package android.app.usage {
   public class NetworkStatsManager {
     method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws android.os.RemoteException, java.lang.SecurityException;
+    method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int);
     method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long, boolean) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long, boolean) throws android.os.RemoteException, java.lang.SecurityException;
-    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback);
-    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler);
-    method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback);
+    method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback);
+    method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+    method public void unregisterUsageCallback(android.app.usage.NetworkStatsManager.UsageCallback);
   }
 
-  public static class NetworkStatsManager.DataUsageCallback {
-    ctor public NetworkStatsManager.DataUsageCallback();
-    method public void onLimitReached();
+  public static abstract class NetworkStatsManager.UsageCallback {
+    ctor public NetworkStatsManager.UsageCallback();
+    method public abstract void onThresholdReached(int, java.lang.String);
   }
 
   public final class UsageEvents implements android.os.Parcelable {
@@ -25364,12 +25345,6 @@ package android.net {
     method public int getUid();
   }
 
-  public final class DataUsageRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.net.DataUsageRequest> CREATOR;
-  }
-
   public class DhcpInfo implements android.os.Parcelable {
     ctor public DhcpInfo();
     method public int describeContents();
index 6897ce0..7f2c2d6 100644 (file)
@@ -15,6 +15,37 @@ package android.app.admin {
 
 }
 
+package android.app.usage {
+
+  public class DataUsagePolicy {
+    field public final int networkType;
+    field public final java.lang.String[] subscriberIds;
+    field public final long thresholdInBytes;
+    field public final int[] uids;
+  }
+
+  public static class DataUsagePolicy.Builder {
+    ctor public DataUsagePolicy.Builder();
+    method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String);
+    method public android.app.usage.DataUsagePolicy.Builder addUid(int);
+    method public android.app.usage.DataUsagePolicy build();
+    method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int);
+    method public android.app.usage.DataUsagePolicy.Builder setThreshold(long);
+  }
+
+  public class NetworkStatsManager {
+    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler);
+    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+    method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback);
+  }
+
+  public static abstract class NetworkStatsManager.DataUsageCallback {
+    ctor public NetworkStatsManager.DataUsageCallback();
+    method public deprecated void onLimitReached();
+  }
+
+}
+
 package android.content {
 
   public abstract class Context {
index acd7299..ff2a41c 100644 (file)
@@ -6422,22 +6422,6 @@ package android.app.usage {
     field public static final android.os.Parcelable.Creator<android.app.usage.ConfigurationStats> CREATOR;
   }
 
-  public class DataUsagePolicy {
-    field public final int networkType;
-    field public final java.lang.String[] subscriberIds;
-    field public final long thresholdInBytes;
-    field public final int[] uids;
-  }
-
-  public static class DataUsagePolicy.Builder {
-    ctor public DataUsagePolicy.Builder();
-    method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String);
-    method public android.app.usage.DataUsagePolicy.Builder addUid(int);
-    method public android.app.usage.DataUsagePolicy build();
-    method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int);
-    method public android.app.usage.DataUsagePolicy.Builder setThreshold(long);
-  }
-
   public final class NetworkStats implements java.lang.AutoCloseable {
     method public void close();
     method public boolean getNextBucket(android.app.usage.NetworkStats.Bucket);
@@ -6462,8 +6446,7 @@ package android.app.usage {
     field public static final int STATE_ALL = -1; // 0xffffffff
     field public static final int STATE_DEFAULT = 1; // 0x1
     field public static final int STATE_FOREGROUND = 2; // 0x2
-    field public static final int TAG_ALL = 0; // 0x0
-    field public static final int TAG_ANY = -1; // 0xffffffff
+    field public static final int TAG_NONE = 0; // 0x0
     field public static final int UID_ALL = -1; // 0xffffffff
     field public static final int UID_REMOVED = -4; // 0xfffffffc
     field public static final int UID_TETHERING = -5; // 0xfffffffb
@@ -6472,20 +6455,18 @@ package android.app.usage {
   public class NetworkStatsManager {
     method public android.app.usage.NetworkStats queryDetails(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats queryDetailsForUid(int, java.lang.String, long, long, int) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int) throws android.os.RemoteException, java.lang.SecurityException;
+    method public android.app.usage.NetworkStats queryDetailsForUidTag(int, java.lang.String, long, long, int, int);
     method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats querySummary(int, java.lang.String, long, long, boolean) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForDevice(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
     method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long) throws android.os.RemoteException, java.lang.SecurityException;
-    method public android.app.usage.NetworkStats.Bucket querySummaryForUser(int, java.lang.String, long, long, boolean) throws android.os.RemoteException, java.lang.SecurityException;
-    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback);
-    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler);
-    method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback);
+    method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback);
+    method public void registerUsageCallback(int, java.lang.String, long, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+    method public void unregisterUsageCallback(android.app.usage.NetworkStatsManager.UsageCallback);
   }
 
-  public static class NetworkStatsManager.DataUsageCallback {
-    ctor public NetworkStatsManager.DataUsageCallback();
-    method public void onLimitReached();
+  public static abstract class NetworkStatsManager.UsageCallback {
+    ctor public NetworkStatsManager.UsageCallback();
+    method public abstract void onThresholdReached(int, java.lang.String);
   }
 
   public final class UsageEvents implements android.os.Parcelable {
@@ -23607,12 +23588,6 @@ package android.net {
     method public int getUid();
   }
 
-  public final class DataUsageRequest implements android.os.Parcelable {
-    method public int describeContents();
-    method public void writeToParcel(android.os.Parcel, int);
-    field public static final android.os.Parcelable.Creator<android.net.DataUsageRequest> CREATOR;
-  }
-
   public class DhcpInfo implements android.os.Parcelable {
     ctor public DhcpInfo();
     method public int describeContents();
index f9fce40..2673a82 100644 (file)
@@ -17,6 +17,37 @@ package android.app.admin {
 
 }
 
+package android.app.usage {
+
+  public class DataUsagePolicy {
+    field public final int networkType;
+    field public final java.lang.String[] subscriberIds;
+    field public final long thresholdInBytes;
+    field public final int[] uids;
+  }
+
+  public static class DataUsagePolicy.Builder {
+    ctor public DataUsagePolicy.Builder();
+    method public android.app.usage.DataUsagePolicy.Builder addSubscriberId(java.lang.String);
+    method public android.app.usage.DataUsagePolicy.Builder addUid(int);
+    method public android.app.usage.DataUsagePolicy build();
+    method public android.app.usage.DataUsagePolicy.Builder setNetworkType(int);
+    method public android.app.usage.DataUsagePolicy.Builder setThreshold(long);
+  }
+
+  public class NetworkStatsManager {
+    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.DataUsageCallback, android.os.Handler);
+    method public void registerDataUsageCallback(android.app.usage.DataUsagePolicy, android.app.usage.NetworkStatsManager.UsageCallback, android.os.Handler);
+    method public void unregisterDataUsageCallback(android.app.usage.NetworkStatsManager.DataUsageCallback);
+  }
+
+  public static abstract class NetworkStatsManager.DataUsageCallback {
+    ctor public NetworkStatsManager.DataUsageCallback();
+    method public deprecated void onLimitReached();
+  }
+
+}
+
 package android.content {
 
   public abstract class Context {
index 5a5dcbc..ee6b60c 100644 (file)
@@ -29,6 +29,7 @@ import java.util.List;
 /**
  * Defines a policy for data usage callbacks, made through {@link DataUsagePolicy.Builder} and used
  * to be notified on data usage via {@link NetworkStatsManager#registerDataUsageCallback}.
+ * @removed
  */
 public class DataUsagePolicy {
 
index 9963eab..226aa8f 100644 (file)
@@ -193,14 +193,9 @@ public final class NetworkStats implements AutoCloseable {
         public static final int ROAMING_YES = 0x2;
 
         /**
-         * Special TAG value matching any tag.
-         */
-        public static final int TAG_ANY = android.net.NetworkStats.TAG_ALL;
-
-        /**
          * Special TAG value for total data across all tags
          */
-        public static final int TAG_ALL = android.net.NetworkStats.TAG_NONE;
+        public static final int TAG_NONE = android.net.NetworkStats.TAG_NONE;
 
         private int mUid;
         private int mTag;
@@ -232,8 +227,7 @@ public final class NetworkStats implements AutoCloseable {
 
         private static int convertTag(int tag) {
             switch (tag) {
-                case android.net.NetworkStats.TAG_ALL: return TAG_ANY;
-                case android.net.NetworkStats.TAG_NONE: return TAG_ALL;
+                case android.net.NetworkStats.TAG_NONE: return TAG_NONE;
             }
             return tag;
         }
@@ -417,9 +411,9 @@ public final class NetworkStats implements AutoCloseable {
      * Collects summary results and sets summary enumeration mode.
      * @throws RemoteException
      */
-    void startSummaryEnumeration(boolean includeTags) throws RemoteException {
+    void startSummaryEnumeration() throws RemoteException {
         mSummary = mSession.getSummaryForAllUid(mTemplate, mStartTimeStamp, mEndTimeStamp,
-                includeTags);
+                false /* includeTags */);
         mEnumerationIndex = 0;
     }
 
index 2e3aca4..4a28117 100644 (file)
@@ -106,7 +106,7 @@ public class NetworkStatsManager {
      * device. Result is a single Bucket aggregated over time, state, uid, tag and 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_ALL}
+     * {@link NetworkStats.Bucket#UID_ALL}, tag {@link NetworkStats.Bucket#TAG_NONE}
      * and roaming {@link NetworkStats.Bucket#ROAMING_ALL}.
      *
      * @param networkType As defined in {@link ConnectivityManager}, e.g.
@@ -122,8 +122,11 @@ public class NetworkStatsManager {
      */
     public Bucket querySummaryForDevice(int networkType, String subscriberId,
             long startTime, long endTime) throws SecurityException, RemoteException {
-        NetworkTemplate template = createTemplate(networkType, subscriberId);
-        if (template == null) {
+        NetworkTemplate template;
+        try {
+            template = createTemplate(networkType, subscriberId);
+        } catch (IllegalArgumentException e) {
+            if (DBG) Log.e(TAG, "Cannot create template", e);
             return null;
         }
 
@@ -136,21 +139,10 @@ public class NetworkStatsManager {
     }
 
     /**
-     * Query network usage statistics summaries aggregated across tags.
-     *
-     * #see querySummaryForUser(int, String, long, long, boolean)
-     */
-    public Bucket querySummaryForUser(int networkType, String subscriberId, long startTime,
-            long endTime) throws SecurityException, RemoteException {
-        return querySummaryForUser(networkType, subscriberId, startTime, endTime,
-            false /* includeTags */);
-    }
-
-    /**
      * Query network usage statistics summaries. Result is summarised data usage for all uids
      * belonging to calling user. Result is a single Bucket aggregated over time, state and uid.
      * 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} and uid
+     * and 'endTime' parameters, state is going to be {@link NetworkStats.Bucket#STATE_ALL} and uid
      * {@link NetworkStats.Bucket#UID_ALL}.
      *
      * @param networkType As defined in {@link ConnectivityManager}, e.g.
@@ -161,42 +153,33 @@ public class NetworkStatsManager {
      *            {@link java.lang.System#currentTimeMillis}.
      * @param endTime End of period. Defined in terms of "Unix time", see
      *            {@link java.lang.System#currentTimeMillis}.
-     * @param includeTags whether to include network tags. If {@code true}, tags will be returned
-     *            and history retention may be shorter.
      * @return Bucket object or null if permissions are insufficient or error happened during
      *         statistics collection.
      */
     public Bucket querySummaryForUser(int networkType, String subscriberId, long startTime,
-            long endTime, boolean includeTags) throws SecurityException, RemoteException {
-        NetworkTemplate template = createTemplate(networkType, subscriberId);
-        if (template == null) {
+            long endTime) throws SecurityException, RemoteException {
+        NetworkTemplate template;
+        try {
+            template = createTemplate(networkType, subscriberId);
+        } catch (IllegalArgumentException e) {
+            if (DBG) Log.e(TAG, "Cannot create template", e);
             return null;
         }
 
         NetworkStats stats;
         stats = new NetworkStats(mContext, template, startTime, endTime);
-        stats.startSummaryEnumeration(includeTags);
+        stats.startSummaryEnumeration();
 
         stats.close();
         return stats.getSummaryAggregate();
     }
 
     /**
-     * Query network usage statistics summaries aggregated across tags.
-     *
-     * #see querySummary(int, String, long, long, boolean)
-     */
-    public NetworkStats querySummary(int networkType, String subscriberId, long startTime,
-            long endTime) throws SecurityException, RemoteException {
-        return querySummary(networkType, subscriberId, startTime, endTime, false /* includeTags */);
-    }
-
-    /**
      * 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 or uid or tag. This means buckets' start and end
-     * timestamps are going to be the same as the 'startTime' and 'endTime' parameters. State,
-     * uid and tag are going to vary.
+     * end timestamps. Not aggregated over state or uid. This means buckets' start and end
+     * timestamps are going to be the same as the 'startTime' and 'endTime' parameters.
+     * State and uid 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}
@@ -206,21 +189,22 @@ public class NetworkStatsManager {
      *            {@link java.lang.System#currentTimeMillis}.
      * @param endTime End of period. Defined in terms of "Unix time", see
      *            {@link java.lang.System#currentTimeMillis}.
-     * @param includeTags whether to include network tags. If {@code true}, tags will be returned
-     *            and history retention may be shorter.
      * @return Statistics object or null if permissions are insufficient or error happened during
      *         statistics collection.
      */
     public NetworkStats querySummary(int networkType, String subscriberId, long startTime,
-            long endTime, boolean includeTags) throws SecurityException, RemoteException {
-        NetworkTemplate template = createTemplate(networkType, subscriberId);
-        if (template == null) {
+            long endTime) throws SecurityException, RemoteException {
+        NetworkTemplate template;
+        try {
+            template = createTemplate(networkType, subscriberId);
+        } catch (IllegalArgumentException e) {
+            if (DBG) Log.e(TAG, "Cannot create template", e);
             return null;
         }
 
         NetworkStats result;
         result = new NetworkStats(mContext, template, startTime, endTime);
-        result.startSummaryEnumeration(includeTags);
+        result.startSummaryEnumeration();
 
         return result;
     }
@@ -233,7 +217,7 @@ public class NetworkStatsManager {
     public NetworkStats queryDetailsForUid(int networkType, String subscriberId,
             long startTime, long endTime, int uid) throws SecurityException, RemoteException {
         return queryDetailsForUidTag(networkType, subscriberId, startTime, endTime, uid,
-            NetworkStats.Bucket.TAG_ALL);
+            NetworkStats.Bucket.TAG_NONE);
     }
 
     /**
@@ -255,22 +239,28 @@ public class NetworkStatsManager {
      * @param endTime End of period. Defined in terms of "Unix time", see
      *            {@link java.lang.System#currentTimeMillis}.
      * @param uid UID of app
-     * @param tag TAG of interest. Use {@link NetworkStats.Bucket#TAG_ANY} for any tags, use
-     *            {@link NetworkStats.Bucket#TAG_ALL} to aggregate over tags.
+     * @param tag TAG of interest. Use {@link NetworkStats.Bucket#TAG_NONE} for no tags.
      * @return Statistics object or null if permissions are insufficient or error happened during
      *         statistics collection.
      */
     public NetworkStats queryDetailsForUidTag(int networkType, String subscriberId,
-            long startTime, long endTime, int uid, int tag) throws SecurityException,
-            RemoteException {
-        NetworkTemplate template = createTemplate(networkType, subscriberId);
-        if (template == null) {
+            long startTime, long endTime, int uid, int tag) {
+        NetworkTemplate template;
+        try {
+            template = createTemplate(networkType, subscriberId);
+        } catch (IllegalArgumentException e) {
+            if (DBG) Log.e(TAG, "Cannot create template", e);
             return null;
         }
 
         NetworkStats result;
-        result = new NetworkStats(mContext, template, startTime, endTime);
-        result.startHistoryEnumeration(uid, tag);
+        try {
+            result = new NetworkStats(mContext, template, startTime, endTime);
+            result.startHistoryEnumeration(uid, tag);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag, e);
+            return null;
+        }
 
         return result;
     }
@@ -280,7 +270,7 @@ public class NetworkStatsManager {
      * calling user. Result is aggregated over state but not aggregated over time or uid. 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_ALL} and roaming is going to be
+     * tag {@link NetworkStats.Bucket#TAG_NONE} 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
@@ -299,44 +289,59 @@ public class NetworkStatsManager {
      */
     public NetworkStats queryDetails(int networkType, String subscriberId, long startTime,
             long endTime) throws SecurityException, RemoteException {
-        NetworkTemplate template = createTemplate(networkType, subscriberId);
-        if (template == null) {
+        NetworkTemplate template;
+        try {
+            template = createTemplate(networkType, subscriberId);
+        } catch (IllegalArgumentException e) {
+            if (DBG) Log.e(TAG, "Cannot create template", e);
             return null;
         }
+
         NetworkStats result;
         result = new NetworkStats(mContext, template, startTime, endTime);
         result.startUserUidEnumeration();
         return result;
     }
 
+    /** @removed */
+    public void registerDataUsageCallback(DataUsagePolicy policy, DataUsageCallback callback,
+                @Nullable Handler handler) {}
+
+    /** @removed */
+    public void registerDataUsageCallback(DataUsagePolicy policy, UsageCallback callback,
+                @Nullable Handler handler) {}
+
+    /** @removed */
+    public void unregisterDataUsageCallback(DataUsageCallback callback) {}
+
     /**
-     * Registers to receive notifications about data usage on specified networks and uids.
-     * The callbacks will continue to be called as long as the process is live or
-     * {@link #unregisterDataUsageCallback} is called.
+     * Registers to receive notifications about data usage on specified networks.
      *
-     * @param policy {@link DataUsagePolicy} describing this request.
-     * @param callback The {@link DataUsageCallback} that the system will call when data usage
-     *            has exceeded the specified threshold.
+     * #see registerUsageCallback(int, String[], long, UsageCallback, Handler)
      */
-    public void registerDataUsageCallback(DataUsagePolicy policy, DataUsageCallback callback) {
-        registerDataUsageCallback(policy, callback, null /* handler */);
+    public void registerUsageCallback(int networkType, String subscriberId, long thresholdBytes,
+            UsageCallback callback) {
+        registerUsageCallback(networkType, subscriberId, thresholdBytes, null /* handler */);
     }
 
     /**
-     * Registers to receive notifications about data usage on specified networks and uids.
-     * The callbacks will continue to be called as long as the process is live or
-     * {@link #unregisterDataUsageCallback} is called.
+     * Registers to receive notifications about data usage on specified networks.
      *
-     * @param policy {@link DataUsagePolicy} describing this request.
-     * @param callback The {@link DataUsageCallback} that the system will call when data usage
+     * <p>The callbacks will continue to be called as long as the process is live or
+     * {@link #unregisterUsageCallback} is called.
+     *
+     * @param networkType Type of network to monitor. Either
+                  {@link ConnectivityManager#TYPE_MOBILE} or {@link ConnectivityManager#TYPE_WIFI}.
+     * @param subscriberId If applicable, the subscriber id of the network interface.
+     * @param thresholdBytes Threshold in bytes to be notified on.
+     * @param callback The {@link UsageCallback} that the system will call when data usage
      *            has exceeded the specified threshold.
      * @param handler to dispatch callback events through, otherwise if {@code null} it uses
      *            the calling thread.
      */
-    public void registerDataUsageCallback(DataUsagePolicy policy, DataUsageCallback callback,
-                @Nullable Handler handler) {
-        checkNotNull(policy, "DataUsagePolicy cannot be null");
-        checkNotNull(callback, "DataUsageCallback cannot be null");
+    public void registerUsageCallback(int networkType, String subscriberId, long thresholdBytes,
+            UsageCallback callback, @Nullable Handler handler) {
+        checkNotNull(callback, "UsageCallback cannot be null");
 
         final Looper looper;
         if (handler == null) {
@@ -345,62 +350,72 @@ public class NetworkStatsManager {
             looper = handler.getLooper();
         }
 
-        if (DBG) Log.d(TAG, "registerDataUsageCallback called with " + policy);
-
-        NetworkTemplate[] templates;
-        if (policy.subscriberIds == null || policy.subscriberIds.length == 0) {
-            templates = new NetworkTemplate[1];
-            templates[0] = createTemplate(policy.networkType, null /* subscriberId */);
-        } else {
-            templates = new NetworkTemplate[policy.subscriberIds.length];
-            for (int i = 0; i < policy.subscriberIds.length; i++) {
-                templates[i] = createTemplate(policy.networkType, policy.subscriberIds[i]);
-            }
+        if (DBG) {
+            Log.d(TAG, "registerUsageCallback called with: {"
+                + " networkType=" + networkType
+                + " subscriberId=" + subscriberId
+                + " thresholdBytes=" + thresholdBytes
+                + " }");
         }
+
+        NetworkTemplate template = createTemplate(networkType, subscriberId);
         DataUsageRequest request = new DataUsageRequest(DataUsageRequest.REQUEST_ID_UNSET,
-                templates, policy.uids, policy.thresholdInBytes);
+                template, thresholdBytes);
         try {
-            CallbackHandler callbackHandler = new CallbackHandler(looper, callback);
-            callback.request = mService.registerDataUsageCallback(
+            CallbackHandler callbackHandler = new CallbackHandler(looper, networkType,
+                    subscriberId, callback);
+            callback.request = mService.registerUsageCallback(
                     mContext.getOpPackageName(), request, new Messenger(callbackHandler),
                     new Binder());
-            if (DBG) Log.d(TAG, "registerDataUsageCallback returned " + callback.request);
+            if (DBG) Log.d(TAG, "registerUsageCallback returned " + callback.request);
 
             if (callback.request == null) {
                 Log.e(TAG, "Request from callback is null; should not happen");
             }
         } catch (RemoteException e) {
             if (DBG) Log.d(TAG, "Remote exception when registering callback");
+            throw e.rethrowFromSystemServer();
         }
     }
 
     /**
      * Unregisters callbacks on data usage.
      *
-     * @param callback The {@link DataUsageCallback} used when registering.
+     * @param callback The {@link UsageCallback} used when registering.
      */
-    public void unregisterDataUsageCallback(DataUsageCallback callback) {
+    public void unregisterUsageCallback(UsageCallback callback) {
         if (callback == null || callback.request == null
                 || callback.request.requestId == DataUsageRequest.REQUEST_ID_UNSET) {
-            throw new IllegalArgumentException("Invalid DataUsageCallback");
+            throw new IllegalArgumentException("Invalid UsageCallback");
         }
         try {
-            mService.unregisterDataUsageRequest(callback.request);
+            mService.unregisterUsageRequest(callback.request);
         } catch (RemoteException e) {
             if (DBG) Log.d(TAG, "Remote exception when unregistering callback");
+            throw e.rethrowFromSystemServer();
         }
     }
 
+    /** @removed */
+    public static abstract class DataUsageCallback {
+        /** @removed */
+        @Deprecated
+        public void onLimitReached() {}
+    }
+
     /**
-     * Base class for data usage callbacks. Should be extended by applications wanting
-     * notifications.
+     * Base class for usage callbacks. Should be extended by applications wanting notifications.
      */
-    public static class DataUsageCallback {
+    public static abstract class UsageCallback {
+
         /**
-         * Called when data usage has reached the given policy threshold.
+         * Called when data usage has reached the given threshold.
          */
-        public void onLimitReached() {}
+        public abstract void onThresholdReached(int networkType, String subscriberId);
 
+        /**
+         * @hide used for internal bookkeeping
+         */
         private DataUsageRequest request;
     }
 
@@ -414,18 +429,24 @@ public class NetworkStatsManager {
                 template = NetworkTemplate.buildTemplateWifiWildcard();
                 } break;
             default: {
-                Log.w(TAG, "Cannot create template for network type " + networkType
-                        + ", subscriberId '" + NetworkIdentity.scrubSubscriberId(subscriberId) +
-                        "'.");
+                throw new IllegalArgumentException("Cannot create template for network type "
+                        + networkType + ", subscriberId '"
+                        + NetworkIdentity.scrubSubscriberId(subscriberId) + "'.");
             }
         }
         return template;
     }
 
     private static class CallbackHandler extends Handler {
-        private DataUsageCallback mCallback;
-        CallbackHandler(Looper looper, DataUsageCallback callback) {
+        private final int mNetworkType;
+        private final String mSubscriberId;
+        private UsageCallback mCallback;
+
+        CallbackHandler(Looper looper, int networkType, String subscriberId,
+                UsageCallback callback) {
             super(looper);
+            mNetworkType = networkType;
+            mSubscriberId = subscriberId;
             mCallback = callback;
         }
 
@@ -437,7 +458,7 @@ public class NetworkStatsManager {
             switch (message.what) {
                 case CALLBACK_LIMIT_REACHED: {
                     if (mCallback != null) {
-                        mCallback.onLimitReached();
+                        mCallback.onThresholdReached(mNetworkType, mSubscriberId);
                     } else {
                         Log.e(TAG, "limit reached with released callback for " + request);
                     }
index 8526584..ac9a5a3 100644 (file)
@@ -20,7 +20,6 @@ import android.net.NetworkTemplate;
 import android.os.Parcel;
 import android.os.Parcelable;
 
-import java.util.Arrays;
 import java.util.Objects;
 
 /**
@@ -28,56 +27,33 @@ import java.util.Objects;
  * {@link android.app.usage.NetworkStatsManager#registerDataUsageCallback}.
  * If no {@code uid}s are set, callbacks are restricted to device-owners,
  * carrier-privileged apps, or system apps.
+ *
+ * @hide
  */
 public final class DataUsageRequest implements Parcelable {
 
-    /**
-     * @hide
-     */
     public static final String PARCELABLE_KEY = "DataUsageRequest";
-
-    /**
-     * @hide
-     */
     public static final int REQUEST_ID_UNSET = 0;
 
     /**
      * Identifies the request.  {@link DataUsageRequest}s should only be constructed by
      * the Framework and it is used internally to identify the request.
-     * @hide
      */
     public final int requestId;
 
     /**
-     * Set of {@link NetworkTemplate}s describing the networks to monitor.
-     * @hide
+     * {@link NetworkTemplate} describing the network to monitor.
      */
-    public final NetworkTemplate[] templates;
-
-    /**
-     * Set of UIDs of which to monitor data usage.
-     *
-     * <p>If not {@code null}, the caller will be notified when any of the uids exceed
-     * the given threshold. If {@code null} all uids for which the calling process has access
-     * to stats will be monitored.
-     * @hide
-     */
-    public final int[] uids;
+    public final NetworkTemplate template;
 
     /**
      * Threshold in bytes to be notified on.
-     * @hide
      */
     public final long thresholdInBytes;
 
-    /**
-     * @hide
-     */
-    public DataUsageRequest(int requestId, NetworkTemplate[] templates, int[] uids,
-                long thresholdInBytes) {
+    public DataUsageRequest(int requestId, NetworkTemplate template, long thresholdInBytes) {
         this.requestId = requestId;
-        this.templates = templates;
-        this.uids = uids;
+        this.template = template;
         this.thresholdInBytes = thresholdInBytes;
     }
 
@@ -89,8 +65,7 @@ public final class DataUsageRequest implements Parcelable {
     @Override
     public void writeToParcel(Parcel dest, int flags) {
         dest.writeInt(requestId);
-        dest.writeTypedArray(templates, flags);
-        dest.writeIntArray(uids);
+        dest.writeParcelable(template, flags);
         dest.writeLong(thresholdInBytes);
     }
 
@@ -99,11 +74,10 @@ public final class DataUsageRequest implements Parcelable {
                 @Override
                 public DataUsageRequest createFromParcel(Parcel in) {
                     int requestId = in.readInt();
-                    NetworkTemplate[] templates = in.createTypedArray(NetworkTemplate.CREATOR);
-                    int[] uids = in.createIntArray();
+                    NetworkTemplate template = in.readParcelable(null);
                     long thresholdInBytes = in.readLong();
-                    DataUsageRequest result = new DataUsageRequest(requestId,
-                            templates, uids, thresholdInBytes);
+                    DataUsageRequest result = new DataUsageRequest(requestId, template,
+                            thresholdInBytes);
                     return result;
                 }
 
@@ -116,8 +90,7 @@ public final class DataUsageRequest implements Parcelable {
     @Override
     public String toString() {
         return "DataUsageRequest [ requestId=" + requestId
-                + ", networkTemplates=" + Arrays.toString(templates)
-                + ", uids=" + Arrays.toString(uids)
+                + ", networkTemplate=" + template
                 + ", thresholdInBytes=" + thresholdInBytes + " ]";
     }
 
@@ -126,23 +99,13 @@ public final class DataUsageRequest implements Parcelable {
         if (obj instanceof DataUsageRequest == false) return false;
         DataUsageRequest that = (DataUsageRequest) obj;
         return that.requestId == this.requestId
-                && Arrays.deepEquals(that.templates, this.templates)
-                && Arrays.equals(that.uids, this.uids)
+                && Objects.equals(that.template, this.template)
                 && that.thresholdInBytes == this.thresholdInBytes;
     }
 
     @Override
     public int hashCode() {
-        // Start with a non-zero constant.
-        int result = 17;
-
-        // Include a hash for each field.
-        result = 31 * result + requestId;
-        result = 31 * result + Arrays.deepHashCode(templates);
-        result = 31 * result + Arrays.hashCode(uids);
-        result = 31 * result + (int) (thresholdInBytes ^ (thresholdInBytes >>> 32));
-
-        return result;
+        return Objects.hash(requestId, template, thresholdInBytes);
    }
 
 }
index 2eea940..e693009 100644 (file)
@@ -61,10 +61,10 @@ interface INetworkStatsService {
     void advisePersistThreshold(long thresholdBytes);
 
     /** Registers a callback on data usage. */
-    DataUsageRequest registerDataUsageCallback(String callingPackage,
+    DataUsageRequest registerUsageCallback(String callingPackage,
             in DataUsageRequest request, in Messenger messenger, in IBinder binder);
 
     /** Unregisters a callback on data usage. */
-    void unregisterDataUsageRequest(in DataUsageRequest request);
+    void unregisterUsageRequest(in DataUsageRequest request);
 
 }
index 6f781b3..230c2e9 100644 (file)
@@ -81,8 +81,6 @@ class NetworkStatsObservers {
      */
     public DataUsageRequest register(DataUsageRequest inputRequest, Messenger messenger,
                 IBinder binder, int callingUid, @NetworkStatsAccess.Level int accessLevel) {
-        checkVisibilityUids(callingUid, accessLevel, inputRequest.uids);
-
         DataUsageRequest request = buildRequest(inputRequest);
         RequestInfo requestInfo = buildRequestInfo(request, messenger, binder, callingUid,
                 accessLevel);
@@ -211,14 +209,13 @@ class NetworkStatsObservers {
                     + ". Overriding to a safer default of " + thresholdInBytes + " bytes");
         }
         return new DataUsageRequest(mNextDataUsageRequestId.incrementAndGet(),
-                request.templates, request.uids, thresholdInBytes);
+                request.template, thresholdInBytes);
     }
 
     private RequestInfo buildRequestInfo(DataUsageRequest request,
                 Messenger messenger, IBinder binder, int callingUid,
                 @NetworkStatsAccess.Level int accessLevel) {
-        if (accessLevel <= NetworkStatsAccess.Level.USER
-                || request.uids != null && request.uids.length > 0) {
+        if (accessLevel <= NetworkStatsAccess.Level.USER) {
             return new UserUsageRequestInfo(this, request, messenger, binder, callingUid,
                     accessLevel);
         } else {
@@ -229,19 +226,6 @@ class NetworkStatsObservers {
         }
     }
 
-    private void checkVisibilityUids(int callingUid, @NetworkStatsAccess.Level int accessLevel,
-                int[] uids) {
-        if (uids == null) {
-            return;
-        }
-        for (int i = 0; i < uids.length; i++) {
-            if (!NetworkStatsAccess.isAccessibleToUser(uids[i], callingUid, accessLevel)) {
-                throw new SecurityException("Caller " + callingUid + " cannot monitor network stats"
-                        + " for uid " + uids[i] + " with accessLevel " + accessLevel);
-            }
-        }
-    }
-
     /**
      * Tracks information relevant to a data usage observer.
      * It will notice when the calling process dies so we can self-expire.
@@ -359,15 +343,13 @@ class NetworkStatsObservers {
 
         @Override
         protected boolean checkStats() {
-            for (int i = 0; i < mRequest.templates.length; i++) {
-                long bytesSoFar = getTotalBytesForNetwork(mRequest.templates[i]);
-                if (LOGV) {
-                    Slog.v(TAG, bytesSoFar + " bytes so far since notification for "
-                            + mRequest.templates[i]);
-                }
-                if (bytesSoFar > mRequest.thresholdInBytes) {
-                    return true;
-                }
+            long bytesSoFar = getTotalBytesForNetwork(mRequest.template);
+            if (LOGV) {
+                Slog.v(TAG, bytesSoFar + " bytes so far since notification for "
+                        + mRequest.template);
+            }
+            if (bytesSoFar > mRequest.thresholdInBytes) {
+                return true;
             }
             return false;
         }
@@ -405,20 +387,17 @@ class NetworkStatsObservers {
 
         @Override
         protected boolean checkStats() {
-            int[] uidsToMonitor = getUidsToMonitor();
-
-            for (int i = 0; i < mRequest.templates.length; i++) {
-                for (int j = 0; j < uidsToMonitor.length; j++) {
-                    long bytesSoFar = getTotalBytesForNetworkUid(mRequest.templates[i],
-                            uidsToMonitor[j]);
-
-                    if (LOGV) {
-                        Slog.v(TAG, bytesSoFar + " bytes so far since notification for "
-                                + mRequest.templates[i] + " for uid=" + uidsToMonitor[j]);
-                    }
-                    if (bytesSoFar > mRequest.thresholdInBytes) {
-                        return true;
-                    }
+            int[] uidsToMonitor = mCollection.getRelevantUids(mAccessLevel, mCallingUid);
+
+            for (int i = 0; i < uidsToMonitor.length; i++) {
+                long bytesSoFar = getTotalBytesForNetworkUid(mRequest.template, uidsToMonitor[i]);
+
+                if (LOGV) {
+                    Slog.v(TAG, bytesSoFar + " bytes so far since notification for "
+                            + mRequest.template + " for uid=" + uidsToMonitor[i]);
+                }
+                if (bytesSoFar > mRequest.thresholdInBytes) {
+                    return true;
                 }
             }
             return false;
@@ -453,21 +432,6 @@ class NetworkStatsObservers {
                 return 0;
             }
         }
-
-        private int[] getUidsToMonitor() {
-            if (mRequest.uids == null || mRequest.uids.length == 0) {
-                return mCollection.getRelevantUids(mAccessLevel, mCallingUid);
-            }
-            // Pick only uids from the request that are currently accessible to the user
-            IntArray accessibleUids = new IntArray(mRequest.uids.length);
-            for (int i = 0; i < mRequest.uids.length; i++) {
-                int uid = mRequest.uids[i];
-                if (NetworkStatsAccess.isAccessibleToUser(uid, mCallingUid, mAccessLevel)) {
-                    accessibleUids.add(uid);
-                }
-            }
-            return accessibleUids.toArray();
-        }
     }
 
     private static class StatsContext {
index 2c2e9b9..8610fa1 100644 (file)
@@ -578,9 +578,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
                 if (tag == TAG_NONE) {
                     return getUidComplete().getHistory(template, uid, set, tag, fields, start, end,
                             accessLevel);
-                } else {
+                } else if (uid == Binder.getCallingUid()) {
                     return getUidTagComplete().getHistory(template, uid, set, tag, fields,
                             start, end, accessLevel);
+                } else {
+                    throw new SecurityException("Calling package " + mCallingPackage
+                            + " cannot access tag information from a different uid");
                 }
             }
 
@@ -761,12 +764,11 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
     }
 
     @Override
-    public DataUsageRequest registerDataUsageCallback(String callingPackage,
+    public DataUsageRequest registerUsageCallback(String callingPackage,
                 DataUsageRequest request, Messenger messenger, IBinder binder) {
         checkNotNull(callingPackage, "calling package is null");
         checkNotNull(request, "DataUsageRequest is null");
-        checkNotNull(request.templates, "NetworkTemplate is null");
-        checkArgument(request.templates.length > 0);
+        checkNotNull(request.template, "NetworkTemplate is null");
         checkNotNull(messenger, "messenger is null");
         checkNotNull(binder, "binder is null");
 
@@ -788,7 +790,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
    }
 
     @Override
-    public void unregisterDataUsageRequest(DataUsageRequest request) {
+    public void unregisterUsageRequest(DataUsageRequest request) {
         checkNotNull(request, "DataUsageRequest is null");
 
         int callingUid = Binder.getCallingUid();
index cff5876..21560ac 100644 (file)
@@ -56,7 +56,7 @@ import com.android.server.net.NetworkStatsServiceTest.IdleableHandlerThread;
 import com.android.server.net.NetworkStatsServiceTest.LatchedHandler;
 
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Objects;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -91,7 +91,6 @@ public class NetworkStatsObserversTest extends TestCase {
     private static final long BASE_BYTES = 7 * MB_IN_BYTES;
     private static final int INVALID_TYPE = -1;
 
-    private static final int[] NO_UIDS = null;
     private static final VpnInfo[] VPN_INFO = new VpnInfo[0];
 
     private long mElapsedRealtime;
@@ -134,112 +133,60 @@ public class NetworkStatsObserversTest extends TestCase {
 
     public void testRegister_thresholdTooLow_setsDefaultThreshold() throws Exception {
         long thresholdTooLowBytes = 1L;
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, thresholdTooLowBytes);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdTooLowBytes);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateWifi, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
     }
 
     public void testRegister_highThreshold_accepted() throws Exception {
         long highThresholdBytes = 2 * THRESHOLD_BYTES;
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, highThresholdBytes);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, highThresholdBytes);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateWifi, request.template));
         assertEquals(highThresholdBytes, request.thresholdInBytes);
     }
 
     public void testRegister_twoRequests_twoIds() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, THRESHOLD_BYTES);
 
         DataUsageRequest request1 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request1.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request1.templates));
-        assertNull(request1.uids);
+        assertTrue(Objects.equals(sTemplateWifi, request1.template));
         assertEquals(THRESHOLD_BYTES, request1.thresholdInBytes);
 
         DataUsageRequest request2 = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request2.requestId > request1.requestId);
-        assertTrue(Arrays.deepEquals(templates, request2.templates));
-        assertNull(request2.uids);
+        assertTrue(Objects.equals(sTemplateWifi, request2.template));
         assertEquals(THRESHOLD_BYTES, request2.thresholdInBytes);
     }
 
-    public void testRegister_defaultAccess_otherUids_securityException() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
-        int[] uids = new int[] { UID_RED, UID_BLUE, UID_GREEN };
-        DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
-
-        try {
-            mStatsObservers.register(inputRequest, mMessenger, mockBinder, UID_RED,
-                    NetworkStatsAccess.Level.DEFAULT);
-            fail("Should have denied access");
-        } catch (SecurityException expected) {}
-    }
-
-    public void testRegister_userAccess_otherUidsSameUser()
-            throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
-        int[] uids = new int[] { UID_RED, UID_BLUE, UID_GREEN };
-        DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
-
-        DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
-                UID_RED, NetworkStatsAccess.Level.USER);
-        assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertTrue(Arrays.equals(uids, request.uids));
-        assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
-    }
-
-    public void testRegister_defaultAccess_sameUid() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
-        int[] uids = new int[] { UID_RED };
-        DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
-
-        DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
-                UID_RED, NetworkStatsAccess.Level.DEFAULT);
-        assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertTrue(Arrays.equals(uids, request.uids));
-        assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
-    }
-
     public void testUnregister_unknownRequest_noop() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
         DataUsageRequest unknownRequest = new DataUsageRequest(
-                123456 /* id */, templates, NO_UIDS, THRESHOLD_BYTES);
+                123456 /* id */, sTemplateWifi, THRESHOLD_BYTES);
 
         mStatsObservers.unregister(unknownRequest, UID_RED);
     }
 
     public void testUnregister_knownRequest_releasesCaller() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
         Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
 
@@ -250,15 +197,13 @@ public class NetworkStatsObserversTest extends TestCase {
     }
 
     public void testUnregister_knownRequest_invalidUid_doesNotUnregister() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 UID_RED, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
         Mockito.verify(mockBinder).linkToDeath(any(IBinder.DeathRecipient.class), anyInt());
 
@@ -269,15 +214,13 @@ public class NetworkStatsObserversTest extends TestCase {
     }
 
     public void testUpdateStats_initialSample_doesNotNotify() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -301,15 +244,13 @@ public class NetworkStatsObserversTest extends TestCase {
     }
 
     public void testUpdateStats_belowThreshold_doesNotNotify() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -339,16 +280,14 @@ public class NetworkStatsObserversTest extends TestCase {
         assertEquals(INVALID_TYPE, mHandler.mLastMessageType);
     }
 
-    public void testUpdateStats_aboveThresholdNetwork_notifies() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
+    public void testUpdateStats_deviceAccess_notifies() throws Exception {
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -378,104 +317,14 @@ public class NetworkStatsObserversTest extends TestCase {
         assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
     }
 
-    public void testUpdateStats_aboveThresholdMultipleNetwork_notifies() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
-        DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
-
-        DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
-                UID_RED, NetworkStatsAccess.Level.DEVICESUMMARY);
-        assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
-        assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
-
-        NetworkIdentitySet identSet1 = new NetworkIdentitySet();
-        identSet1.add(new NetworkIdentity(
-                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
-                IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
-        mActiveIfaces.put(TEST_IFACE, identSet1);
-
-        NetworkIdentitySet identSet2 = new NetworkIdentitySet();
-        identSet2.add(new NetworkIdentity(
-                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
-                IMSI_2, null /* networkId */, false /* roaming */, true /* metered */));
-        mActiveIfaces.put(TEST_IFACE2, identSet2);
-
-        // Baseline
-        NetworkStats xtSnapshot = new NetworkStats(TEST_START, 1 /* initialSize */)
-                .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L)
-                .addIfaceValues(TEST_IFACE2, BASE_BYTES + 1234L, 18L, BASE_BYTES, 12L);
-        NetworkStats uidSnapshot = null;
-        mStatsObservers.updateStats(
-                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
-                VPN_INFO, TEST_START);
-
-        // Delta - traffic on IMSI2
-        xtSnapshot = new NetworkStats(TEST_START + MINUTE_IN_MILLIS, 1 /* initialSize */)
-                .addIfaceValues(TEST_IFACE, BASE_BYTES, 8L, BASE_BYTES, 16L)
-                .addIfaceValues(TEST_IFACE2, BASE_BYTES + THRESHOLD_BYTES, 22L,
-                        BASE_BYTES + THRESHOLD_BYTES, 24L);
-        mStatsObservers.updateStats(
-                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
-                VPN_INFO, TEST_START);
-        waitForObserverToIdle();
-
-        assertTrue(mCv.block(WAIT_TIMEOUT));
-        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
-    }
-
-    public void testUpdateStats_aboveThresholdUid_notifies() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
-        int[] uids = new int[] { UID_RED, UID_BLUE, UID_GREEN };
-        DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, uids, THRESHOLD_BYTES);
-
-        DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
-                Process.SYSTEM_UID, NetworkStatsAccess.Level.DEVICE);
-        assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertTrue(Arrays.equals(uids,request.uids));
-        assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
-
-        NetworkIdentitySet identSet = new NetworkIdentitySet();
-        identSet.add(new NetworkIdentity(
-                TYPE_MOBILE, TelephonyManager.NETWORK_TYPE_UNKNOWN,
-                IMSI_1, null /* networkId */, false /* roaming */, true /* metered */));
-        mActiveUidIfaces.put(TEST_IFACE, identSet);
-
-        // Baseline
-        NetworkStats xtSnapshot = null;
-        NetworkStats uidSnapshot = new NetworkStats(TEST_START, 2 /* initialSize */)
-                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
-                        BASE_BYTES, 2L, BASE_BYTES, 2L, 0L);
-        mStatsObservers.updateStats(
-                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
-                VPN_INFO, TEST_START);
-
-        // Delta
-        uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
-                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
-                        BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
-        mStatsObservers.updateStats(
-                xtSnapshot, uidSnapshot, mActiveIfaces, mActiveUidIfaces,
-                VPN_INFO, TEST_START);
-        waitForObserverToIdle();
-
-        assertTrue(mCv.block(WAIT_TIMEOUT));
-        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
-    }
-
-    public void testUpdateStats_defaultAccess_noUid_notifiesSameUid() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
+    public void testUpdateStats_defaultAccess_notifiesSameUid() throws Exception {
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 UID_RED, NetworkStatsAccess.Level.DEFAULT);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -494,7 +343,7 @@ public class NetworkStatsObserversTest extends TestCase {
                 VPN_INFO, TEST_START);
 
         // Delta
-        uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
+        uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
                         BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
         mStatsObservers.updateStats(
@@ -506,16 +355,14 @@ public class NetworkStatsObserversTest extends TestCase {
         assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, mHandler.mLastMessageType);
     }
 
-    public void testUpdateStats_defaultAccess_noUid_usageOtherUid_doesNotNotify() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
+    public void testUpdateStats_defaultAccess_usageOtherUid_doesNotNotify() throws Exception {
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 UID_BLUE, NetworkStatsAccess.Level.DEFAULT);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -534,7 +381,7 @@ public class NetworkStatsObserversTest extends TestCase {
                 VPN_INFO, TEST_START);
 
         // Delta
-        uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
+        uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
                         BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
         mStatsObservers.updateStats(
@@ -547,15 +394,13 @@ public class NetworkStatsObserversTest extends TestCase {
     }
 
     public void testUpdateStats_userAccess_usageSameUser_notifies() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 UID_BLUE, NetworkStatsAccess.Level.USER);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -574,7 +419,7 @@ public class NetworkStatsObserversTest extends TestCase {
                 VPN_INFO, TEST_START);
 
         // Delta
-        uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
+        uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
                 .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
                         BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
         mStatsObservers.updateStats(
@@ -587,15 +432,13 @@ public class NetworkStatsObserversTest extends TestCase {
     }
 
     public void testUpdateStats_userAccess_usageAnotherUser_doesNotNotify() throws Exception {
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1 };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, NO_UIDS, THRESHOLD_BYTES);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateImsi1, THRESHOLD_BYTES);
 
         DataUsageRequest request = mStatsObservers.register(inputRequest, mMessenger, mockBinder,
                 UID_RED, NetworkStatsAccess.Level.USER);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateImsi1, request.template));
         assertEquals(THRESHOLD_BYTES, request.thresholdInBytes);
 
         NetworkIdentitySet identSet = new NetworkIdentitySet();
@@ -614,7 +457,7 @@ public class NetworkStatsObserversTest extends TestCase {
                 VPN_INFO, TEST_START);
 
         // Delta
-        uidSnapshot = new NetworkStats(TEST_START+ 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
+        uidSnapshot = new NetworkStats(TEST_START + 2 * MINUTE_IN_MILLIS, 2 /* initialSize */)
                 .addValues(TEST_IFACE, UID_ANOTHER_USER, SET_DEFAULT, TAG_NONE, ROAMING_NO,
                         BASE_BYTES + THRESHOLD_BYTES, 2L, BASE_BYTES + THRESHOLD_BYTES, 2L, 0L);
         mStatsObservers.updateStats(
index 74c1984..94c6711 100644 (file)
@@ -100,7 +100,7 @@ import org.easymock.EasyMock;
 
 import java.io.File;
 import java.util.ArrayList;
-import java.util.Arrays;
+import java.util.Objects;
 import java.util.List;
 
 /**
@@ -887,7 +887,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
 
     }
 
-    public void testRegisterDataUsageCallback_network() throws Exception {
+    public void testRegisterUsageCallback() throws Exception {
         // pretend that wifi network comes online; service should ask about full
         // network state, and poll any existing interfaces before updating.
         expectCurrentTime();
@@ -907,9 +907,8 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
 
         String callingPackage = "the.calling.package";
         long thresholdInBytes = 1L;  // very small; should be overriden by framework
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateWifi };
         DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, null /* uids */, thresholdInBytes);
+                DataUsageRequest.REQUEST_ID_UNSET, sTemplateWifi, thresholdInBytes);
 
         // Create a messenger that waits for callback activity
         ConditionVariable cv = new ConditionVariable(false);
@@ -931,11 +930,10 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
 
         // Register and verify request and that binder was called
         DataUsageRequest request =
-                mService.registerDataUsageCallback(callingPackage, inputRequest,
+                mService.registerUsageCallback(callingPackage, inputRequest,
                         messenger, mockBinder);
         assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertNull(request.uids);
+        assertTrue(Objects.equals(sTemplateWifi, request.template));
         long minThresholdInBytes = 2 * 1024 * 1024; // 2 MB
         assertEquals(minThresholdInBytes, request.thresholdInBytes);
 
@@ -997,7 +995,7 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
         EasyMock.replay(mockBinder);
 
         // Unregister request
-        mService.unregisterDataUsageRequest(request);
+        mService.unregisterUsageRequest(request);
 
         // Wait for the caller to ack receipt of CALLBACK_RELEASED
         assertTrue(cv.block(WAIT_TIMEOUT));
@@ -1007,157 +1005,13 @@ public class NetworkStatsServiceTest extends AndroidTestCase {
         EasyMock.verify(mockBinder);
     }
 
-    public void testRegisterDataUsageCallback_uids() throws Exception {
-        // pretend that network comes online
-        expectCurrentTime();
-        expectDefaultSettings();
-        expectNetworkState(buildMobile3gState(IMSI_1, true /* isRoaming */));
-        expectNetworkStatsSummary(buildEmptyStats());
-        expectNetworkStatsUidDetail(buildEmptyStats());
-        expectNetworkStatsPoll();
-        expectBandwidthControlCheck();
-
-        replay();
-        mService.forceUpdateIfaces();
-        verifyAndReset();
-
-        String callingPackage = "the.calling.package";
-        long thresholdInBytes = 10 * 1024 * 1024;  // 10 MB
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
-        int[] uids = new int[] { UID_RED };
-        DataUsageRequest inputRequest = new DataUsageRequest(
-                DataUsageRequest.REQUEST_ID_UNSET, templates, uids, thresholdInBytes);
-
-        // Create a messenger that waits for callback activity
-        ConditionVariable cv = new ConditionVariable(false);
-        cv.close();
-        LatchedHandler latchedHandler = new LatchedHandler(Looper.getMainLooper(), cv);
-        Messenger messenger = new Messenger(latchedHandler);
-
-        // Allow binder to connect
-        IBinder mockBinder = createMock(IBinder.class);
-        mockBinder.linkToDeath((IBinder.DeathRecipient) anyObject(), anyInt());
-        EasyMock.replay(mockBinder);
-
-        // Force poll
-        expectCurrentTime();
-        expectDefaultSettings();
-        expectNetworkStatsSummary(buildEmptyStats());
-        expectNetworkStatsUidDetail(buildEmptyStats());
-        expectNetworkStatsPoll();
-        replay();
-
-        // Register and verify request and that binder was called
-        DataUsageRequest request =
-                mService.registerDataUsageCallback(callingPackage, inputRequest,
-                        messenger, mockBinder);
-        assertTrue(request.requestId > 0);
-        assertTrue(Arrays.deepEquals(templates, request.templates));
-        assertTrue(Arrays.equals(uids, request.uids));
-        assertEquals(thresholdInBytes, request.thresholdInBytes);
-
-        // Wait for service to handle internal MSG_REGISTER_DATA_USAGE_LISTENER
-        mHandler.sendMessage(mHandler.obtainMessage(-1));
-        mHandlerThread.waitForIdle(WAIT_TIMEOUT);
-
-        verifyAndReset();
-
-        // Make sure that the caller binder gets connected
-        EasyMock.verify(mockBinder);
-        EasyMock.reset(mockBinder);
-
-        // modify some number on mobile interface, and trigger poll event
-        // not enough traffic to call data usage callback
-        incrementCurrentTime(HOUR_IN_MILLIS);
-        expectCurrentTime();
-        expectDefaultSettings();
-        expectNetworkStatsSummary(buildEmptyStats());
-        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
-                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO, 128L, 2L,
-                        128L, 2L, 0L)
-                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO, 64L, 1L, 64L,
-                        1L, 0L));
-        expectNetworkStatsPoll();
-
-        replay();
-        forcePollAndWaitForIdle();
-
-        // verify service recorded history
-        assertUidTotal(sTemplateImsi1, UID_RED, 128L, 2L, 128L, 2L, 0);
-
-        // verify entire history present
-        NetworkStats stats = mSession.getSummaryForAllUid(
-                sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
-        assertEquals(2, stats.size());
-        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES, 128L, 2L,
-                128L, 2L, 0);
-        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES, 64L, 1L, 64L,
-                1L, 0);
-
-        verifyAndReset();
-
-        // make sure callback has not being called
-        assertEquals(INVALID_TYPE, latchedHandler.mLastMessageType);
-
-        // and bump forward again, with counters going higher. this is
-        // important, since it will trigger the data usage callback
-        incrementCurrentTime(DAY_IN_MILLIS);
-        expectCurrentTime();
-        expectDefaultSettings();
-        expectNetworkStatsSummary(buildEmptyStats());
-        expectNetworkStatsUidDetail(new NetworkStats(getElapsedRealtime(), 1)
-                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_NO,
-                        128000000L, 2L, 128000000L, 2L, 0L)
-                .addValues(TEST_IFACE, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_NO,
-                        64000000L, 1L, 64000000L, 1L, 0L));
-        expectNetworkStatsPoll();
-
-        replay();
-        forcePollAndWaitForIdle();
-
-        // verify service recorded history
-        assertUidTotal(sTemplateImsi1, UID_RED, 128000000L, 2L, 128000000L, 2L, 0);
-
-        // verify entire history present
-        stats = mSession.getSummaryForAllUid(
-                sTemplateImsi1, Long.MIN_VALUE, Long.MAX_VALUE, true);
-        assertEquals(2, stats.size());
-        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, TAG_NONE, ROAMING_YES,
-                128000000L, 2L, 128000000L, 2L, 0);
-        assertValues(stats, IFACE_ALL, UID_RED, SET_DEFAULT, 0xF00D, ROAMING_YES,
-                64000000L, 1L, 64000000L, 1L, 0);
-
-        verifyAndReset();
-
-        // Wait for the caller to ack receipt of CALLBACK_LIMIT_REACHED
-        assertTrue(cv.block(WAIT_TIMEOUT));
-        assertEquals(NetworkStatsManager.CALLBACK_LIMIT_REACHED, latchedHandler.mLastMessageType);
-        cv.close();
-
-        // Allow binder to disconnect
-        expect(mockBinder.unlinkToDeath((IBinder.DeathRecipient) anyObject(), anyInt()))
-                .andReturn(true);
-        EasyMock.replay(mockBinder);
-
-        // Unregister request
-        mService.unregisterDataUsageRequest(request);
-
-        // Wait for the caller to ack receipt of CALLBACK_RELEASED
-        assertTrue(cv.block(WAIT_TIMEOUT));
-        assertEquals(NetworkStatsManager.CALLBACK_RELEASED, latchedHandler.mLastMessageType);
-
-        // Make sure that the caller binder gets disconnected
-        EasyMock.verify(mockBinder);
-    }
-
-    public void testUnregisterDataUsageCallback_unknown_noop() throws Exception {
+    public void testUnregisterUsageCallback_unknown_noop() throws Exception {
         String callingPackage = "the.calling.package";
         long thresholdInBytes = 10 * 1024 * 1024;  // 10 MB
-        NetworkTemplate[] templates = new NetworkTemplate[] { sTemplateImsi1, sTemplateImsi2 };
         DataUsageRequest unknownRequest = new DataUsageRequest(
-                2, templates, null /* uids */, thresholdInBytes);
+                2 /* requestId */, sTemplateImsi1, thresholdInBytes);
 
-        mService.unregisterDataUsageRequest(unknownRequest);
+        mService.unregisterUsageRequest(unknownRequest);
     }
 
     private static File getBaseDir(File statsDir) {