OSDN Git Service

Merge "Fix up NetworkCapabilities' toString" am: 7959e70ef2 am: 773523a667
authorChalard Jean <jchalard@google.com>
Thu, 1 Mar 2018 06:13:04 +0000 (06:13 +0000)
committerandroid-build-merger <android-build-merger@google.com>
Thu, 1 Mar 2018 06:13:04 +0000 (06:13 +0000)
am: 669194a830

Change-Id: I3d3f3f34f30b69750e197b185c4e70bd360f35e0

1  2 
core/java/android/net/NetworkCapabilities.java

@@@ -1227,61 -1229,70 +1227,95 @@@ public final class NetworkCapabilities 
  
      @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" : "");
-         String specifier = (mNetworkSpecifier == null ?
-                 "" : " Specifier: <" + mNetworkSpecifier + ">");
-         String signalStrength = (hasSignalStrength() ? " SignalStrength: " + mSignalStrength : "");
+         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 uids = (null != mUids ? " Uids: <" + mUids + ">" : "");
+         sb.append("]");
+         return sb.toString();
+     }
  
-         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;
+         }
      }
  
 +    /** @hide */
 +    public void writeToProto(ProtoOutputStream proto, long fieldId) {
 +        final long token = proto.start(fieldId);
 +
 +        for (int transport : getTransportTypes()) {
 +            proto.write(NetworkCapabilitiesProto.TRANSPORTS, transport);
 +        }
 +
 +        for (int capability : getCapabilities()) {
 +            proto.write(NetworkCapabilitiesProto.CAPABILITIES, capability);
 +        }
 +
 +        proto.write(NetworkCapabilitiesProto.LINK_UP_BANDWIDTH_KBPS, mLinkUpBandwidthKbps);
 +        proto.write(NetworkCapabilitiesProto.LINK_DOWN_BANDWIDTH_KBPS, mLinkDownBandwidthKbps);
 +
 +        if (mNetworkSpecifier != null) {
 +            proto.write(NetworkCapabilitiesProto.NETWORK_SPECIFIER, mNetworkSpecifier.toString());
 +        }
 +
 +        proto.write(NetworkCapabilitiesProto.CAN_REPORT_SIGNAL_STRENGTH, hasSignalStrength());
 +        proto.write(NetworkCapabilitiesProto.SIGNAL_STRENGTH, mSignalStrength);
 +
 +        proto.end(token);
 +    }
 +
      /**
       * @hide
       */