Merge "[MS19.1] Fix several hidden API dependencies" am: 94990d335e am: b9fba84d29 am: 4ec38f7922
Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1933085 Change-Id: I4692e096dee9b82666f79760701e4e8fb7a40354
This commit is contained in:
@@ -24,13 +24,15 @@ 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.util.IntArray;
|
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
|
|
||||||
|
import com.android.net.module.util.CollectionUtils;
|
||||||
|
|
||||||
import dalvik.system.CloseGuard;
|
import dalvik.system.CloseGuard;
|
||||||
|
|
||||||
import java.lang.annotation.Retention;
|
import java.lang.annotation.Retention;
|
||||||
import java.lang.annotation.RetentionPolicy;
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class providing enumeration over buckets of network usage statistics. {@link NetworkStats} objects
|
* Class providing enumeration over buckets of network usage statistics. {@link NetworkStats} objects
|
||||||
@@ -568,7 +570,7 @@ public final class NetworkStats implements AutoCloseable {
|
|||||||
// the filtering logic below can be removed.
|
// the filtering logic below can be removed.
|
||||||
int[] uids = mSession.getRelevantUids();
|
int[] uids = mSession.getRelevantUids();
|
||||||
// Filtering of uids with empty history.
|
// Filtering of uids with empty history.
|
||||||
IntArray filteredUids = new IntArray(uids.length);
|
final ArrayList<Integer> filteredUids = new ArrayList<>();
|
||||||
for (int uid : uids) {
|
for (int uid : uids) {
|
||||||
try {
|
try {
|
||||||
NetworkStatsHistory history = mSession.getHistoryIntervalForUid(mTemplate, uid,
|
NetworkStatsHistory history = mSession.getHistoryIntervalForUid(mTemplate, uid,
|
||||||
@@ -581,7 +583,7 @@ public final class NetworkStats implements AutoCloseable {
|
|||||||
Log.w(TAG, "Error while getting history of uid " + uid, e);
|
Log.w(TAG, "Error while getting history of uid " + uid, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mUids = filteredUids.toArray();
|
mUids = CollectionUtils.toIntArray(filteredUids);
|
||||||
mUidOrUidIndex = -1;
|
mUidOrUidIndex = -1;
|
||||||
stepHistory();
|
stepHistory();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import android.os.SystemClock;
|
|||||||
import android.util.SparseBooleanArray;
|
import android.util.SparseBooleanArray;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.net.module.util.CollectionUtils;
|
||||||
|
|
||||||
import libcore.util.EmptyArray;
|
import libcore.util.EmptyArray;
|
||||||
|
|
||||||
@@ -1185,7 +1185,7 @@ public final class NetworkStats implements Parcelable {
|
|||||||
* @hide
|
* @hide
|
||||||
*/
|
*/
|
||||||
public void removeUids(int[] uids) {
|
public void removeUids(int[] uids) {
|
||||||
filter(e -> !ArrayUtils.contains(uids, e.uid));
|
filter(e -> !CollectionUtils.contains(uids, e.uid));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1218,7 +1218,7 @@ public final class NetworkStats implements Parcelable {
|
|||||||
filter(e -> (limitUid == UID_ALL || limitUid == e.uid)
|
filter(e -> (limitUid == UID_ALL || limitUid == e.uid)
|
||||||
&& (limitTag == TAG_ALL || limitTag == e.tag)
|
&& (limitTag == TAG_ALL || limitTag == e.tag)
|
||||||
&& (limitIfaces == INTERFACES_ALL
|
&& (limitIfaces == INTERFACES_ALL
|
||||||
|| ArrayUtils.contains(limitIfaces, e.iface)));
|
|| CollectionUtils.contains(limitIfaces, e.iface)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -40,21 +40,17 @@ import android.telephony.SubscriptionPlan;
|
|||||||
import android.text.format.DateUtils;
|
import android.text.format.DateUtils;
|
||||||
import android.util.ArrayMap;
|
import android.util.ArrayMap;
|
||||||
import android.util.AtomicFile;
|
import android.util.AtomicFile;
|
||||||
import android.util.IntArray;
|
import android.util.IndentingPrintWriter;
|
||||||
import android.util.MathUtils;
|
import android.util.Log;
|
||||||
import android.util.Range;
|
import android.util.Range;
|
||||||
import android.util.Slog;
|
|
||||||
import android.util.proto.ProtoOutputStream;
|
import android.util.proto.ProtoOutputStream;
|
||||||
|
|
||||||
import com.android.internal.annotations.VisibleForTesting;
|
import com.android.internal.annotations.VisibleForTesting;
|
||||||
import com.android.internal.util.ArrayUtils;
|
|
||||||
import com.android.internal.util.FastDataInput;
|
import com.android.internal.util.FastDataInput;
|
||||||
import com.android.internal.util.FastDataOutput;
|
import com.android.internal.util.FastDataOutput;
|
||||||
import com.android.internal.util.FileRotator;
|
import com.android.internal.util.FileRotator;
|
||||||
import com.android.internal.util.IndentingPrintWriter;
|
import com.android.net.module.util.CollectionUtils;
|
||||||
|
import com.android.net.module.util.NetworkStatsUtils;
|
||||||
import com.google.android.collect.Lists;
|
|
||||||
import com.google.android.collect.Maps;
|
|
||||||
|
|
||||||
import libcore.io.IoUtils;
|
import libcore.io.IoUtils;
|
||||||
|
|
||||||
@@ -196,11 +192,11 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
|
|
||||||
public int[] getRelevantUids(@NetworkStatsAccess.Level int accessLevel,
|
public int[] getRelevantUids(@NetworkStatsAccess.Level int accessLevel,
|
||||||
final int callerUid) {
|
final int callerUid) {
|
||||||
IntArray uids = new IntArray();
|
final ArrayList<Integer> uids = new ArrayList<>();
|
||||||
for (int i = 0; i < mStats.size(); i++) {
|
for (int i = 0; i < mStats.size(); i++) {
|
||||||
final Key key = mStats.keyAt(i);
|
final Key key = mStats.keyAt(i);
|
||||||
if (NetworkStatsAccess.isAccessibleToUser(key.uid, callerUid, accessLevel)) {
|
if (NetworkStatsAccess.isAccessibleToUser(key.uid, callerUid, accessLevel)) {
|
||||||
int j = uids.binarySearch(key.uid);
|
int j = Collections.binarySearch(uids, new Integer(key.uid));
|
||||||
|
|
||||||
if (j < 0) {
|
if (j < 0) {
|
||||||
j = ~j;
|
j = ~j;
|
||||||
@@ -208,7 +204,7 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return uids.toArray();
|
return CollectionUtils.toIntArray(uids);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -225,7 +221,8 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
|
|
||||||
// 180 days of history should be enough for anyone; if we end up needing
|
// 180 days of history should be enough for anyone; if we end up needing
|
||||||
// more, we'll dynamically grow the history object.
|
// more, we'll dynamically grow the history object.
|
||||||
final int bucketEstimate = (int) MathUtils.constrain(((end - start) / mBucketDuration), 0,
|
final int bucketEstimate = (int) NetworkStatsUtils.constrain(
|
||||||
|
((end - start) / mBucketDuration), 0,
|
||||||
(180 * DateUtils.DAY_IN_MILLIS) / mBucketDuration);
|
(180 * DateUtils.DAY_IN_MILLIS) / mBucketDuration);
|
||||||
final NetworkStatsHistory combined = new NetworkStatsHistory(
|
final NetworkStatsHistory combined = new NetworkStatsHistory(
|
||||||
mBucketDuration, bucketEstimate, fields);
|
mBucketDuration, bucketEstimate, fields);
|
||||||
@@ -316,7 +313,7 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
|
|
||||||
final long deltaTotal = combined.getTotalBytes() - beforeTotal;
|
final long deltaTotal = combined.getTotalBytes() - beforeTotal;
|
||||||
if (deltaTotal != 0) {
|
if (deltaTotal != 0) {
|
||||||
Slog.d(TAG, "Augmented network usage by " + deltaTotal + " bytes");
|
Log.d(TAG, "Augmented network usage by " + deltaTotal + " bytes");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally we can slice data as originally requested
|
// Finally we can slice data as originally requested
|
||||||
@@ -489,11 +486,11 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
|
|
||||||
private void write(DataOutput out) throws IOException {
|
private void write(DataOutput out) throws IOException {
|
||||||
// cluster key lists grouped by ident
|
// cluster key lists grouped by ident
|
||||||
final HashMap<NetworkIdentitySet, ArrayList<Key>> keysByIdent = Maps.newHashMap();
|
final HashMap<NetworkIdentitySet, ArrayList<Key>> keysByIdent = new HashMap<>();
|
||||||
for (Key key : mStats.keySet()) {
|
for (Key key : mStats.keySet()) {
|
||||||
ArrayList<Key> keys = keysByIdent.get(key.ident);
|
ArrayList<Key> keys = keysByIdent.get(key.ident);
|
||||||
if (keys == null) {
|
if (keys == null) {
|
||||||
keys = Lists.newArrayList();
|
keys = new ArrayList<>();
|
||||||
keysByIdent.put(key.ident, keys);
|
keysByIdent.put(key.ident, keys);
|
||||||
}
|
}
|
||||||
keys.add(key);
|
keys.add(key);
|
||||||
@@ -640,12 +637,12 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
* {@link TrafficStats#UID_REMOVED}.
|
* {@link TrafficStats#UID_REMOVED}.
|
||||||
*/
|
*/
|
||||||
public void removeUids(int[] uids) {
|
public void removeUids(int[] uids) {
|
||||||
final ArrayList<Key> knownKeys = Lists.newArrayList();
|
final ArrayList<Key> knownKeys = new ArrayList<>();
|
||||||
knownKeys.addAll(mStats.keySet());
|
knownKeys.addAll(mStats.keySet());
|
||||||
|
|
||||||
// migrate all UID stats into special "removed" bucket
|
// migrate all UID stats into special "removed" bucket
|
||||||
for (Key key : knownKeys) {
|
for (Key key : knownKeys) {
|
||||||
if (ArrayUtils.contains(uids, key.uid)) {
|
if (CollectionUtils.contains(uids, key.uid)) {
|
||||||
// only migrate combined TAG_NONE history
|
// only migrate combined TAG_NONE history
|
||||||
if (key.tag == TAG_NONE) {
|
if (key.tag == TAG_NONE) {
|
||||||
final NetworkStatsHistory uidHistory = mStats.get(key);
|
final NetworkStatsHistory uidHistory = mStats.get(key);
|
||||||
@@ -672,7 +669,7 @@ public class NetworkStatsCollection implements FileRotator.Reader, FileRotator.W
|
|||||||
}
|
}
|
||||||
|
|
||||||
private ArrayList<Key> getSortedKeys() {
|
private ArrayList<Key> getSortedKeys() {
|
||||||
final ArrayList<Key> keys = Lists.newArrayList();
|
final ArrayList<Key> keys = new ArrayList<>();
|
||||||
keys.addAll(mStats.keySet());
|
keys.addAll(mStats.keySet());
|
||||||
Collections.sort(keys);
|
Collections.sort(keys);
|
||||||
return keys;
|
return keys;
|
||||||
|
|||||||
@@ -28,7 +28,6 @@ import static android.net.NetworkStatsHistory.ParcelUtils.readLongArray;
|
|||||||
import static android.net.NetworkStatsHistory.ParcelUtils.writeLongArray;
|
import static android.net.NetworkStatsHistory.ParcelUtils.writeLongArray;
|
||||||
import static android.text.format.DateUtils.SECOND_IN_MILLIS;
|
import static android.text.format.DateUtils.SECOND_IN_MILLIS;
|
||||||
|
|
||||||
import static com.android.internal.util.ArrayUtils.total;
|
|
||||||
import static com.android.net.module.util.NetworkStatsUtils.multiplySafeByRational;
|
import static com.android.net.module.util.NetworkStatsUtils.multiplySafeByRational;
|
||||||
|
|
||||||
import android.compat.annotation.UnsupportedAppUsage;
|
import android.compat.annotation.UnsupportedAppUsage;
|
||||||
@@ -37,10 +36,11 @@ import android.os.Parcel;
|
|||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
import android.service.NetworkStatsHistoryBucketProto;
|
import android.service.NetworkStatsHistoryBucketProto;
|
||||||
import android.service.NetworkStatsHistoryProto;
|
import android.service.NetworkStatsHistoryProto;
|
||||||
import android.util.MathUtils;
|
import android.util.IndentingPrintWriter;
|
||||||
import android.util.proto.ProtoOutputStream;
|
import android.util.proto.ProtoOutputStream;
|
||||||
|
|
||||||
import com.android.internal.util.IndentingPrintWriter;
|
import com.android.net.module.util.CollectionUtils;
|
||||||
|
import com.android.net.module.util.NetworkStatsUtils;
|
||||||
|
|
||||||
import libcore.util.EmptyArray;
|
import libcore.util.EmptyArray;
|
||||||
|
|
||||||
@@ -174,7 +174,7 @@ public class NetworkStatsHistory implements Parcelable {
|
|||||||
txPackets = new long[bucketStart.length];
|
txPackets = new long[bucketStart.length];
|
||||||
operations = new long[bucketStart.length];
|
operations = new long[bucketStart.length];
|
||||||
bucketCount = bucketStart.length;
|
bucketCount = bucketStart.length;
|
||||||
totalBytes = total(rxBytes) + total(txBytes);
|
totalBytes = CollectionUtils.total(rxBytes) + CollectionUtils.total(txBytes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case VERSION_ADD_PACKETS:
|
case VERSION_ADD_PACKETS:
|
||||||
@@ -189,7 +189,7 @@ public class NetworkStatsHistory implements Parcelable {
|
|||||||
txPackets = readVarLongArray(in);
|
txPackets = readVarLongArray(in);
|
||||||
operations = readVarLongArray(in);
|
operations = readVarLongArray(in);
|
||||||
bucketCount = bucketStart.length;
|
bucketCount = bucketStart.length;
|
||||||
totalBytes = total(rxBytes) + total(txBytes);
|
totalBytes = CollectionUtils.total(rxBytes) + CollectionUtils.total(txBytes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
@@ -267,7 +267,7 @@ public class NetworkStatsHistory implements Parcelable {
|
|||||||
} else {
|
} else {
|
||||||
index -= 1;
|
index -= 1;
|
||||||
}
|
}
|
||||||
return MathUtils.constrain(index, 0, bucketCount - 1);
|
return NetworkStatsUtils.constrain(index, 0, bucketCount - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -281,7 +281,7 @@ public class NetworkStatsHistory implements Parcelable {
|
|||||||
} else {
|
} else {
|
||||||
index += 1;
|
index += 1;
|
||||||
}
|
}
|
||||||
return MathUtils.constrain(index, 0, bucketCount - 1);
|
return NetworkStatsUtils.constrain(index, 0, bucketCount - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -349,6 +349,9 @@ public class NetworkStatsHistory implements Parcelable {
|
|||||||
|
|
||||||
// create any buckets needed by this range
|
// create any buckets needed by this range
|
||||||
ensureBuckets(start, end);
|
ensureBuckets(start, end);
|
||||||
|
// Return fast if there is still no entry. This would typically happen when the start,
|
||||||
|
// end or duration are not valid values, e.g. start > end, negative duration value, etc.
|
||||||
|
if (bucketCount == 0) return;
|
||||||
|
|
||||||
// distribute data usage into buckets
|
// distribute data usage into buckets
|
||||||
long duration = end - start;
|
long duration = end - start;
|
||||||
@@ -560,6 +563,9 @@ public class NetworkStatsHistory implements Parcelable {
|
|||||||
entry.txPackets = txPackets != null ? 0 : UNKNOWN;
|
entry.txPackets = txPackets != null ? 0 : UNKNOWN;
|
||||||
entry.operations = operations != null ? 0 : UNKNOWN;
|
entry.operations = operations != null ? 0 : UNKNOWN;
|
||||||
|
|
||||||
|
// Return fast if there is no entry.
|
||||||
|
if (bucketCount == 0) return entry;
|
||||||
|
|
||||||
final int startIndex = getIndexAfter(end);
|
final int startIndex = getIndexAfter(end);
|
||||||
for (int i = startIndex; i >= 0; i--) {
|
for (int i = startIndex; i >= 0; i--) {
|
||||||
final long curStart = bucketStart[i];
|
final long curStart = bucketStart[i];
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ import android.telephony.TelephonyManager;
|
|||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.ArraySet;
|
import android.util.ArraySet;
|
||||||
|
|
||||||
import com.android.internal.util.ArrayUtils;
|
import com.android.net.module.util.CollectionUtils;
|
||||||
import com.android.net.module.util.NetworkIdentityUtils;
|
import com.android.net.module.util.NetworkIdentityUtils;
|
||||||
import com.android.net.module.util.NetworkStatsUtils;
|
import com.android.net.module.util.NetworkStatsUtils;
|
||||||
|
|
||||||
@@ -703,7 +703,7 @@ public final class NetworkTemplate implements Parcelable {
|
|||||||
*/
|
*/
|
||||||
public boolean matchesSubscriberId(@Nullable String subscriberId) {
|
public boolean matchesSubscriberId(@Nullable String subscriberId) {
|
||||||
return mSubscriberIdMatchRule == NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL
|
return mSubscriberIdMatchRule == NetworkStatsUtils.SUBSCRIBER_ID_MATCH_RULE_ALL
|
||||||
|| ArrayUtils.contains(mMatchSubscriberIds, subscriberId);
|
|| CollectionUtils.contains(mMatchSubscriberIds, subscriberId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -723,8 +723,8 @@ public final class NetworkTemplate implements Parcelable {
|
|||||||
// TODO: consider matching against WiMAX subscriber identity
|
// TODO: consider matching against WiMAX subscriber identity
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
return ident.mType == TYPE_MOBILE && !ArrayUtils.isEmpty(mMatchSubscriberIds)
|
return ident.mType == TYPE_MOBILE && !CollectionUtils.isEmpty(mMatchSubscriberIds)
|
||||||
&& ArrayUtils.contains(mMatchSubscriberIds, ident.mSubscriberId)
|
&& CollectionUtils.contains(mMatchSubscriberIds, ident.mSubscriberId)
|
||||||
&& matchesCollapsedRatType(ident);
|
&& matchesCollapsedRatType(ident);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -835,8 +835,8 @@ public final class NetworkTemplate implements Parcelable {
|
|||||||
*/
|
*/
|
||||||
private boolean matchesCarrier(NetworkIdentity ident) {
|
private boolean matchesCarrier(NetworkIdentity ident) {
|
||||||
return ident.mSubscriberId != null
|
return ident.mSubscriberId != null
|
||||||
&& !ArrayUtils.isEmpty(mMatchSubscriberIds)
|
&& !CollectionUtils.isEmpty(mMatchSubscriberIds)
|
||||||
&& ArrayUtils.contains(mMatchSubscriberIds, ident.mSubscriberId);
|
&& CollectionUtils.contains(mMatchSubscriberIds, ident.mSubscriberId);
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean matchesMobileWildcard(NetworkIdentity ident) {
|
private boolean matchesMobileWildcard(NetworkIdentity ident) {
|
||||||
@@ -953,7 +953,7 @@ public final class NetworkTemplate implements Parcelable {
|
|||||||
if (template.mSubscriberId == null) return template;
|
if (template.mSubscriberId == null) return template;
|
||||||
|
|
||||||
for (String[] merged : mergedList) {
|
for (String[] merged : mergedList) {
|
||||||
if (ArrayUtils.contains(merged, template.mSubscriberId)) {
|
if (CollectionUtils.contains(merged, template.mSubscriberId)) {
|
||||||
// Requested template subscriber is part of the merge group; return
|
// Requested template subscriber is part of the merge group; return
|
||||||
// a template that matches all merged subscribers.
|
// a template that matches all merged subscribers.
|
||||||
return new NetworkTemplate(template.mMatchRule, merged[0], merged,
|
return new NetworkTemplate(template.mMatchRule, merged[0], merged,
|
||||||
|
|||||||
Reference in New Issue
Block a user