OSDN Git Service

Remove uids with empty history from NetworkStats uid enumeration
authorZoltan Szatmary-Ban <szatmz@google.com>
Thu, 13 Aug 2015 15:53:10 +0000 (16:53 +0100)
committerZoltan Szatmary-Ban <szatmz@google.com>
Fri, 14 Aug 2015 15:21:52 +0000 (16:21 +0100)
Bug: 23018174
Change-Id: I1a482280599e0f5da18a208e727653d4bd4107ec

core/java/android/app/usage/NetworkStats.java

index 9d5eabb..ef08eb9 100644 (file)
@@ -24,6 +24,7 @@ import android.net.NetworkTemplate;
 import android.net.TrafficStats;
 import android.os.RemoteException;
 import android.os.ServiceManager;
+import android.util.IntArray;
 import android.util.Log;
 
 import dalvik.system.CloseGuard;
@@ -353,7 +354,25 @@ public final class NetworkStats implements AutoCloseable {
      * @throws RemoteException
      */
     void startUserUidEnumeration() throws RemoteException {
-        setUidEnumeration(mSession.getRelevantUids());
+        // TODO: getRelevantUids should be sensitive to time interval. When that's done,
+        //       the filtering logic below can be removed.
+        int[] uids = mSession.getRelevantUids();
+        // Filtering of uids with empty history.
+        IntArray filteredUids = new IntArray(uids.length);
+        for (int uid : uids) {
+            try {
+                NetworkStatsHistory history = mSession.getHistoryIntervalForUid(mTemplate, uid,
+                        android.net.NetworkStats.SET_ALL, android.net.NetworkStats.TAG_NONE,
+                        NetworkStatsHistory.FIELD_ALL, mStartTimeStamp, mEndTimeStamp);
+                if (history != null && history.size() > 0) {
+                    filteredUids.add(uid);
+                }
+            } catch (RemoteException e) {
+                Log.w(TAG, "Error while getting history of uid " + uid, e);
+            }
+        }
+        mUids = filteredUids.toArray();
+        mUidOrUidIndex = -1;
         stepHistory();
     }
 
@@ -468,11 +487,6 @@ public final class NetworkStats implements AutoCloseable {
         mUidOrUidIndex = uid;
     }
 
-    private void setUidEnumeration(int[] uids) {
-        mUids = uids;
-        mUidOrUidIndex = -1;
-    }
-
     private void stepUid() {
         if (mUids != null) {
             ++mUidOrUidIndex;