Better ConnectivityMetricsEvent printing

This patch adds more information printing for IpConnectivity event
classes in android.net.metrics.

example:

ConnectivityMetricsEvent(14:36:35.799, 0, 1026): DhcpClientEvent(wlan0, DhcpRequestingState)
ConnectivityMetricsEvent(14:36:35.805, 0, 1026): DhcpClientEvent(wlan0, DhcpHaveAddressState)
ConnectivityMetricsEvent(14:36:35.809, 0, 4096): IpManagerEvent(wlan0, PROVISIONING_OK, 155ms)
ConnectivityMetricsEvent(14:36:35.810, 0, 1026): DhcpClientEvent(wlan0, DhcpBoundState)
ConnectivityMetricsEvent(14:36:35.871, 0, 2048): NetworkEvent(101, NETWORK_CONNECTED, 0ms)
ConnectivityMetricsEvent(14:36:35.874, 0, 2051): ValidationProbeEvent(101, PROBE_HTTP:599, 3ms)
ConnectivityMetricsEvent(14:36:35.874, 0, 2048): NetworkEvent(101, NETWORK_VALIDATION_FAILED, 0ms)
ConnectivityMetricsEvent(14:36:35.928, 0, 3072): DefaultNetworkEvent(0 -> 101, [WIFI], IPv4: false, IPv6: false)
ConnectivityMetricsEvent(14:36:37.008, 0, 2051): ValidationProbeEvent(101, PROBE_HTTP:204, 134ms)
ConnectivityMetricsEvent(14:36:37.008, 0, 2050): NetworkEvent(101, NETWORK_VALIDATED, 1137ms)

Also fixes a couple of event logging issues:
  - do no record spurious receive DhcpErrorEvent when a network goes down.
  - add an eventType field to IpManagerEvent instead of using the
    loggger component tag.

Bug: 28204408
Change-Id: Ia6f4ccfd7a0c63a5ccec18825f226c0b5781217b
diff --git a/core/java/android/net/metrics/IpManagerEvent.java b/core/java/android/net/metrics/IpManagerEvent.java
index 5bbcbf1..fcc7608 100644
--- a/core/java/android/net/metrics/IpManagerEvent.java
+++ b/core/java/android/net/metrics/IpManagerEvent.java
@@ -19,27 +19,39 @@
 import android.annotation.SystemApi;
 import android.os.Parcel;
 import android.os.Parcelable;
+import android.util.SparseArray;
+
+import com.android.internal.util.MessageUtils;
 
 /**
  * {@hide}
  */
 @SystemApi
 public final class IpManagerEvent extends IpConnectivityEvent implements Parcelable {
+
+    public static final int PROVISIONING_OK    = 1;
+    public static final int PROVISIONING_FAIL  = 2;
+    public static final int COMPLETE_LIFECYCLE = 3;
+
     public final String ifName;
+    public final int eventType;
     public final long durationMs;
 
-    private IpManagerEvent(String ifName, long duration) {
+    private IpManagerEvent(String ifName, int eventType, long duration) {
         this.ifName = ifName;
+        this.eventType = eventType;
         this.durationMs = duration;
     }
 
     private IpManagerEvent(Parcel in) {
         this.ifName = in.readString();
+        this.eventType = in.readInt();
         this.durationMs = in.readLong();
     }
 
     public void writeToParcel(Parcel out, int flags) {
         out.writeString(ifName);
+        out.writeInt(eventType);
         out.writeLong(durationMs);
     }
 
@@ -59,6 +71,17 @@
     };
 
     public static void logEvent(int eventType, String ifName, long durationMs) {
-        logEvent(eventType, new IpManagerEvent(ifName, durationMs));
+        logEvent(IPCE_IPMGR_BASE, new IpManagerEvent(ifName, eventType, durationMs));
+    }
+
+    @Override
+    public String toString() {
+        return String.format("IpManagerEvent(%s, %s, %dms)",
+                ifName, Decoder.constants.get(eventType), durationMs);
+    }
+
+    final static class Decoder {
+        static final SparseArray<String> constants = MessageUtils.findMessageNames(
+                new Class[]{IpManagerEvent.class}, new String[]{"PROVISIONING_", "COMPLETE_"});
     }
 };