Allow null subscriberId in NetworkStatsManager.

Use a MATCH_MOBILE_WILDCARD template to avoid filtering by
subscriberId when querying statistics from NetworkStatsService.

Bug: 74038898
Change-Id: I8296220472a9ba37044dd1a5ede9bdb45d3ed339
Fixes: 74038898
Test: runtest frameworks-net, CTS tests pass
Merged-In: I1e4e283c6eaecf33d12488e41e0c524f6ff83954
Merged-In: Ia84d2c7cc63bf8b8bf30f133e0382fd7103bf490
(cherry-picked from aosp I4b39e7031416cb33b23d89aa36ff0f774eaa942f)
This commit is contained in:
Remi NGUYEN VAN
2018-03-05 18:14:56 +09:00
parent 662cedc67c
commit 9968ec4f14
2 changed files with 27 additions and 19 deletions

View File

@@ -24,7 +24,6 @@ import android.net.NetworkStatsHistory;
import android.net.NetworkTemplate; import android.net.NetworkTemplate;
import android.net.TrafficStats; import android.net.TrafficStats;
import android.os.RemoteException; import android.os.RemoteException;
import android.os.ServiceManager;
import android.util.IntArray; import android.util.IntArray;
import android.util.Log; import android.util.Log;
@@ -98,9 +97,8 @@ public final class NetworkStats implements AutoCloseable {
/** @hide */ /** @hide */
NetworkStats(Context context, NetworkTemplate template, int flags, long startTimestamp, NetworkStats(Context context, NetworkTemplate template, int flags, long startTimestamp,
long endTimestamp) throws RemoteException, SecurityException { long endTimestamp, INetworkStatsService statsService)
final INetworkStatsService statsService = INetworkStatsService.Stub.asInterface( throws RemoteException, SecurityException {
ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
// Open network stats session // Open network stats session
mSession = statsService.openSessionForUsageStats(flags, context.getOpPackageName()); mSession = statsService.openSessionForUsageStats(flags, context.getOpPackageName());
mCloseGuard.open("close"); mCloseGuard.open("close");

View File

@@ -37,6 +37,8 @@ import android.os.ServiceManager;
import android.os.ServiceManager.ServiceNotFoundException; import android.os.ServiceManager.ServiceNotFoundException;
import android.util.Log; import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
/** /**
* Provides access to network usage history and statistics. Usage data is collected in * Provides access to network usage history and statistics. Usage data is collected in
* discrete bins of time called 'Buckets'. See {@link NetworkStats.Bucket} for details. * discrete bins of time called 'Buckets'. See {@link NetworkStats.Bucket} for details.
@@ -107,9 +109,15 @@ public class NetworkStatsManager {
* {@hide} * {@hide}
*/ */
public NetworkStatsManager(Context context) throws ServiceNotFoundException { public NetworkStatsManager(Context context) throws ServiceNotFoundException {
this(context, INetworkStatsService.Stub.asInterface(
ServiceManager.getServiceOrThrow(Context.NETWORK_STATS_SERVICE)));
}
/** @hide */
@VisibleForTesting
public NetworkStatsManager(Context context, INetworkStatsService service) {
mContext = context; mContext = context;
mService = INetworkStatsService.Stub.asInterface( mService = service;
ServiceManager.getServiceOrThrow(Context.NETWORK_STATS_SERVICE));
setPollOnOpen(true); setPollOnOpen(true);
} }
@@ -135,7 +143,8 @@ public class NetworkStatsManager {
public Bucket querySummaryForDevice(NetworkTemplate template, public Bucket querySummaryForDevice(NetworkTemplate template,
long startTime, long endTime) throws SecurityException, RemoteException { long startTime, long endTime) throws SecurityException, RemoteException {
Bucket bucket = null; Bucket bucket = null;
NetworkStats stats = new NetworkStats(mContext, template, mFlags, startTime, endTime); NetworkStats stats = new NetworkStats(mContext, template, mFlags, startTime, endTime,
mService);
bucket = stats.getDeviceSummaryForNetwork(); bucket = stats.getDeviceSummaryForNetwork();
stats.close(); stats.close();
@@ -208,7 +217,7 @@ public class NetworkStatsManager {
} }
NetworkStats stats; NetworkStats stats;
stats = new NetworkStats(mContext, template, mFlags, startTime, endTime); stats = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
stats.startSummaryEnumeration(); stats.startSummaryEnumeration();
stats.close(); stats.close();
@@ -245,7 +254,7 @@ public class NetworkStatsManager {
} }
NetworkStats result; NetworkStats result;
result = new NetworkStats(mContext, template, mFlags, startTime, endTime); result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
result.startSummaryEnumeration(); result.startSummaryEnumeration();
return result; return result;
@@ -295,7 +304,7 @@ public class NetworkStatsManager {
NetworkStats result; NetworkStats result;
try { try {
result = new NetworkStats(mContext, template, mFlags, startTime, endTime); result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
result.startHistoryEnumeration(uid, tag); result.startHistoryEnumeration(uid, tag);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag, e); Log.e(TAG, "Error while querying stats for uid=" + uid + " tag=" + tag, e);
@@ -341,7 +350,7 @@ public class NetworkStatsManager {
} }
NetworkStats result; NetworkStats result;
result = new NetworkStats(mContext, template, mFlags, startTime, endTime); result = new NetworkStats(mContext, template, mFlags, startTime, endTime, mService);
result.startUserUidEnumeration(); result.startUserUidEnumeration();
return result; return result;
} }
@@ -451,19 +460,20 @@ public class NetworkStatsManager {
} }
private static NetworkTemplate createTemplate(int networkType, String subscriberId) { private static NetworkTemplate createTemplate(int networkType, String subscriberId) {
NetworkTemplate template = null; final NetworkTemplate template;
switch (networkType) { switch (networkType) {
case ConnectivityManager.TYPE_MOBILE: { case ConnectivityManager.TYPE_MOBILE:
template = NetworkTemplate.buildTemplateMobileAll(subscriberId); template = subscriberId == null
} break; ? NetworkTemplate.buildTemplateMobileWildcard()
case ConnectivityManager.TYPE_WIFI: { : NetworkTemplate.buildTemplateMobileAll(subscriberId);
break;
case ConnectivityManager.TYPE_WIFI:
template = NetworkTemplate.buildTemplateWifiWildcard(); template = NetworkTemplate.buildTemplateWifiWildcard();
} break; break;
default: { default:
throw new IllegalArgumentException("Cannot create template for network type " throw new IllegalArgumentException("Cannot create template for network type "
+ networkType + ", subscriberId '" + networkType + ", subscriberId '"
+ NetworkIdentity.scrubSubscriberId(subscriberId) + "'."); + NetworkIdentity.scrubSubscriberId(subscriberId) + "'.");
}
} }
return template; return template;
} }