Expose time-interval detail query on INetworkStatsSession

Also, force polling when a session is opened for NetworkStatsManager.

Bug: 21864554
Bug: 21754685
Change-Id: I24ea822c2d5bc1421ec7ee65d0cfe27cf02dd69e
This commit is contained in:
Zoltan Szatmary-Ban
2015-06-16 15:49:16 +01:00
parent fd6ca6c8d4
commit f34946fabb
4 changed files with 49 additions and 18 deletions

View File

@@ -309,12 +309,10 @@ public final class NetworkStats implements AutoCloseable {
/** /**
* Collects device summary results into a Bucket. * Collects device summary results into a Bucket.
* @param startTime
* @param endTime
* @throws RemoteException * @throws RemoteException
*/ */
Bucket getDeviceSummaryForNetwork(long startTime, long endTime) throws RemoteException { Bucket getDeviceSummaryForNetwork() throws RemoteException {
mSummary = mSession.getDeviceSummaryForNetwork(mTemplate, startTime, endTime); mSummary = mSession.getDeviceSummaryForNetwork(mTemplate, mStartTimeStamp, mEndTimeStamp);
// Setting enumeration index beyond end to avoid accidental enumeration over data that does // Setting enumeration index beyond end to avoid accidental enumeration over data that does
// not belong to the calling user. // not belong to the calling user.
@@ -325,12 +323,10 @@ public final class NetworkStats implements AutoCloseable {
/** /**
* Collects summary results and sets summary enumeration mode. * Collects summary results and sets summary enumeration mode.
* @param startTime
* @param endTime
* @throws RemoteException * @throws RemoteException
*/ */
void startSummaryEnumeration(long startTime, long endTime) throws RemoteException { void startSummaryEnumeration() throws RemoteException {
mSummary = mSession.getSummaryForAllUid(mTemplate, startTime, endTime, false); mSummary = mSession.getSummaryForAllUid(mTemplate, mStartTimeStamp, mEndTimeStamp, false);
mEnumerationIndex = 0; mEnumerationIndex = 0;
} }
@@ -341,8 +337,9 @@ public final class NetworkStats implements AutoCloseable {
void startHistoryEnumeration(int uid) { void startHistoryEnumeration(int uid) {
mHistory = null; mHistory = null;
try { try {
mHistory = mSession.getHistoryForUid(mTemplate, uid, android.net.NetworkStats.SET_ALL, mHistory = mSession.getHistoryIntervalForUid(mTemplate, uid,
android.net.NetworkStats.TAG_NONE, NetworkStatsHistory.FIELD_ALL); android.net.NetworkStats.SET_ALL, android.net.NetworkStats.TAG_NONE,
NetworkStatsHistory.FIELD_ALL, mStartTimeStamp, mEndTimeStamp);
setSingleUid(uid); setSingleUid(uid);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(TAG, e); Log.w(TAG, e);
@@ -368,9 +365,9 @@ public final class NetworkStats implements AutoCloseable {
stepUid(); stepUid();
mHistory = null; mHistory = null;
try { try {
mHistory = mSession.getHistoryForUid(mTemplate, getUid(), mHistory = mSession.getHistoryIntervalForUid(mTemplate, getUid(),
android.net.NetworkStats.SET_ALL, android.net.NetworkStats.TAG_NONE, android.net.NetworkStats.SET_ALL, android.net.NetworkStats.TAG_NONE,
NetworkStatsHistory.FIELD_ALL); NetworkStatsHistory.FIELD_ALL, mStartTimeStamp, mEndTimeStamp);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.w(TAG, e); Log.w(TAG, e);
// Leaving mHistory null // Leaving mHistory null

View File

@@ -97,7 +97,7 @@ public class NetworkStatsManager {
Bucket bucket = null; Bucket bucket = null;
NetworkStats stats = new NetworkStats(mContext, template, startTime, endTime); NetworkStats stats = new NetworkStats(mContext, template, startTime, endTime);
bucket = stats.getDeviceSummaryForNetwork(startTime, endTime); bucket = stats.getDeviceSummaryForNetwork();
stats.close(); stats.close();
return bucket; return bucket;
@@ -106,7 +106,7 @@ public class NetworkStatsManager {
/** /**
* Query network usage statistics summaries. Result is summarised data usage for all uids * 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. * 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' * 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}. * {@link NetworkStats.Bucket#UID_ALL}.
* *
@@ -130,7 +130,7 @@ public class NetworkStatsManager {
NetworkStats stats; NetworkStats stats;
stats = new NetworkStats(mContext, template, startTime, endTime); stats = new NetworkStats(mContext, template, startTime, endTime);
stats.startSummaryEnumeration(startTime, endTime); stats.startSummaryEnumeration();
stats.close(); stats.close();
return stats.getSummaryAggregate(); return stats.getSummaryAggregate();
@@ -140,7 +140,7 @@ public class NetworkStatsManager {
* Query network usage statistics summaries. Result filtered to include only uids belonging to * 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 * calling user. Result is aggregated over time, hence all buckets will have the same start and
* end timestamps. Not aggregated over state or uid. This means buckets' start and end * 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 * timestamps are going to be the same as the 'startTime' and 'endTime' parameters, state and
* uid are going to vary. * uid are going to vary.
* *
* @param networkType As defined in {@link ConnectivityManager}, e.g. * @param networkType As defined in {@link ConnectivityManager}, e.g.
@@ -163,7 +163,7 @@ public class NetworkStatsManager {
NetworkStats result; NetworkStats result;
result = new NetworkStats(mContext, template, startTime, endTime); result = new NetworkStats(mContext, template, startTime, endTime);
result.startSummaryEnumeration(startTime, endTime); result.startSummaryEnumeration();
return result; return result;
} }
@@ -173,6 +173,9 @@ public class NetworkStatsManager {
* Result is aggregated over state but not aggregated over time. This means buckets' start and * 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 * end timestamps are going to be between 'startTime' and 'endTime' parameters, state is going
* to be {@link NetworkStats.Bucket#STATE_ALL} and uid the same as the 'uid' parameter. * to be {@link NetworkStats.Bucket#STATE_ALL} and uid the same as the 'uid' parameter.
* <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.
* *
* @param networkType As defined in {@link ConnectivityManager}, e.g. * @param networkType As defined in {@link ConnectivityManager}, e.g.
* {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI} * {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI}
@@ -205,6 +208,9 @@ public class NetworkStatsManager {
* calling user. Result is aggregated over state but not aggregated over time or uid. This means * 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' * buckets' start and end timestamps are going to be between 'startTime' and 'endTime'
* parameters, state is going to be {@link NetworkStats.Bucket#STATE_ALL} and uid will vary. * parameters, state is going to be {@link NetworkStats.Bucket#STATE_ALL} and uid will vary.
* <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.
* *
* @param networkType As defined in {@link ConnectivityManager}, e.g. * @param networkType As defined in {@link ConnectivityManager}, e.g.
* {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI} * {@link ConnectivityManager#TYPE_MOBILE}, {@link ConnectivityManager#TYPE_WIFI}

View File

@@ -35,6 +35,8 @@ interface INetworkStatsSession {
NetworkStats getSummaryForAllUid(in NetworkTemplate template, long start, long end, boolean includeTags); NetworkStats getSummaryForAllUid(in NetworkTemplate template, long start, long end, boolean includeTags);
/** Return historical network layer stats for specific UID traffic that matches template. */ /** Return historical network layer stats for specific UID traffic that matches template. */
NetworkStatsHistory getHistoryForUid(in NetworkTemplate template, int uid, int set, int tag, int fields); NetworkStatsHistory getHistoryForUid(in NetworkTemplate template, int uid, int set, int tag, int fields);
/** Return historical network layer stats for specific UID traffic that matches template. */
NetworkStatsHistory getHistoryIntervalForUid(in NetworkTemplate template, int uid, int set, int tag, int fields, long start, long end);
/** Return array of uids that have stats and are accessible to the calling user */ /** Return array of uids that have stats and are accessible to the calling user */
int[] getRelevantUids(); int[] getRelevantUids();

View File

@@ -436,13 +436,26 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
@Override @Override
public INetworkStatsSession openSession() { public INetworkStatsSession openSession() {
return openSessionForUsageStats(null); return createSession(null, /* poll on create */ false);
} }
@Override @Override
public INetworkStatsSession openSessionForUsageStats(final String callingPackage) { public INetworkStatsSession openSessionForUsageStats(final String callingPackage) {
return createSession(callingPackage, /* poll on create */ true);
}
private INetworkStatsSession createSession(final String callingPackage, boolean pollOnCreate) {
assertBandwidthControlEnabled(); assertBandwidthControlEnabled();
if (pollOnCreate) {
final long ident = Binder.clearCallingIdentity();
try {
performPoll(FLAG_PERSIST_ALL);
} finally {
Binder.restoreCallingIdentity(ident);
}
}
// return an IBinder which holds strong references to any loaded stats // return an IBinder which holds strong references to any loaded stats
// for its lifetime; when caller closes only weak references remain. // for its lifetime; when caller closes only weak references remain.
@@ -525,6 +538,19 @@ public class NetworkStatsService extends INetworkStatsService.Stub {
} }
} }
@Override
public NetworkStatsHistory getHistoryIntervalForUid(
NetworkTemplate template, int uid, int set, int tag, int fields,
long start, long end) {
enforcePermissionForManagedAdmin(mCallingPackage);
if (tag == TAG_NONE) {
return getUidComplete().getHistory(template, uid, set, tag, fields, start, end);
} else {
return getUidTagComplete().getHistory(template, uid, set, tag, fields,
start, end);
}
}
@Override @Override
public void close() { public void close() {
mUidComplete = null; mUidComplete = null;