diff --git a/core/java/android/net/NetworkCapabilities.java b/core/java/android/net/NetworkCapabilities.java index 67521a0a0c..ba6bc9b582 100644 --- a/core/java/android/net/NetworkCapabilities.java +++ b/core/java/android/net/NetworkCapabilities.java @@ -1229,34 +1229,68 @@ public final class NetworkCapabilities implements Parcelable { @Override public String toString() { - // TODO: enumerate bits for transports and capabilities instead of creating arrays. - // TODO: use a StringBuilder instead of string concatenation. - int[] types = getTransportTypes(); - String transports = (types.length > 0) ? " Transports: " + transportNamesOf(types) : ""; - - types = getCapabilities(); - String capabilities = (types.length > 0 ? " Capabilities: " : ""); - for (int i = 0; i < types.length; ) { - capabilities += capabilityNameOf(types[i]); - if (++i < types.length) capabilities += "&"; + final StringBuilder sb = new StringBuilder("["); + if (0 != mTransportTypes) { + sb.append(" Transports: "); + appendStringRepresentationOfBitMaskToStringBuilder(sb, mTransportTypes, + NetworkCapabilities::transportNameOf, "|"); + } + if (0 != mNetworkCapabilities) { + sb.append(" Capabilities: "); + appendStringRepresentationOfBitMaskToStringBuilder(sb, mNetworkCapabilities, + NetworkCapabilities::capabilityNameOf, "&"); + } + if (mLinkUpBandwidthKbps > 0) { + sb.append(" LinkUpBandwidth>=").append(mLinkUpBandwidthKbps).append("Kbps"); + } + if (mLinkDownBandwidthKbps > 0) { + sb.append(" LinkDnBandwidth>=").append(mLinkDownBandwidthKbps).append("Kbps"); + } + if (mNetworkSpecifier != null) { + sb.append(" Specifier: <").append(mNetworkSpecifier).append(">"); + } + if (hasSignalStrength()) { + sb.append(" SignalStrength: ").append(mSignalStrength); } - String upBand = ((mLinkUpBandwidthKbps > 0) ? " LinkUpBandwidth>=" + - mLinkUpBandwidthKbps + "Kbps" : ""); - String dnBand = ((mLinkDownBandwidthKbps > 0) ? " LinkDnBandwidth>=" + - mLinkDownBandwidthKbps + "Kbps" : ""); + if (null != mUids) { + if ((1 == mUids.size()) && (mUids.valueAt(0).count() == 1)) { + sb.append(" Uid: ").append(mUids.valueAt(0).start); + } else { + sb.append(" Uids: <").append(mUids).append(">"); + } + } + if (mEstablishingVpnAppUid != INVALID_UID) { + sb.append(" EstablishingAppUid: ").append(mEstablishingVpnAppUid); + } - String specifier = (mNetworkSpecifier == null ? - "" : " Specifier: <" + mNetworkSpecifier + ">"); + sb.append("]"); + return sb.toString(); + } - String signalStrength = (hasSignalStrength() ? " SignalStrength: " + mSignalStrength : ""); - String uids = (null != mUids ? " Uids: <" + mUids + ">" : ""); - - String establishingAppUid = " EstablishingAppUid: " + mEstablishingVpnAppUid; - - return "[" + transports + capabilities + upBand + dnBand + specifier + signalStrength - + uids + establishingAppUid + "]"; + private interface NameOf { + String nameOf(int value); + } + /** + * @hide + */ + public static void appendStringRepresentationOfBitMaskToStringBuilder(StringBuilder sb, + long bitMask, NameOf nameFetcher, String separator) { + int bitPos = 0; + boolean firstElementAdded = false; + while (bitMask != 0) { + if ((bitMask & 1) != 0) { + if (firstElementAdded) { + sb.append(separator); + } else { + firstElementAdded = true; + } + sb.append(nameFetcher.nameOf(bitPos)); + } + bitMask >>= 1; + ++bitPos; + } } /** diff --git a/core/java/android/net/UidRange.java b/core/java/android/net/UidRange.java index fd465d95a9..3164929943 100644 --- a/core/java/android/net/UidRange.java +++ b/core/java/android/net/UidRange.java @@ -21,8 +21,6 @@ import static android.os.UserHandle.PER_USER_RANGE; import android.os.Parcel; import android.os.Parcelable; -import java.lang.IllegalArgumentException; - /** * An inclusive range of UIDs. * @@ -52,6 +50,13 @@ public final class UidRange implements Parcelable { return start <= uid && uid <= stop; } + /** + * Returns the count of UIDs in this range. + */ + public int count() { + return 1 + stop - start; + } + /** * @return {@code true} if this range contains every UID contained by the {@param other} range. */