Merge changes Ia71865a9,I40b6de54 into nyc-dev

* changes:
  Log an event whenever we lose the default network.
  Record the transport types for connectivity events.
diff --git a/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java b/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java
index c6fcb2d..731d5e6 100644
--- a/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java
+++ b/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java
@@ -25,18 +25,30 @@
 public class ConnectivityServiceChangeEvent extends IpConnectivityEvent implements Parcelable {
     public static final String TAG = "ConnectivityServiceChangeEvent";
 
-    private int mNetId;
+    // The ID of the network that has become the new default or NETID_UNSET if none.
+    private final int mNetId;
+    // The ID of the network that was the default before or NETID_UNSET if none.
+    private final int mPrevNetId;
+    // The list of transport types of the new default network, for example TRANSPORT_WIFI, as
+    // defined in NetworkCapabilities.java.
+    private final int[] mTransportTypes;
 
-    public ConnectivityServiceChangeEvent(int netId) {
+    public ConnectivityServiceChangeEvent(int netId, int prevNetId, int[] transportTypes) {
         mNetId = netId;
+        mPrevNetId = prevNetId;
+        mTransportTypes = transportTypes;
     }
 
     public ConnectivityServiceChangeEvent(Parcel in) {
         mNetId = in.readInt();
+        mPrevNetId = in.readInt();
+        mTransportTypes = in.createIntArray();
     }
 
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mNetId);
+        out.writeInt(mPrevNetId);
+        out.writeIntArray(mTransportTypes);
     }
 
     public static final Parcelable.Creator<ConnectivityServiceChangeEvent> CREATOR
@@ -50,8 +62,8 @@
         }
     };
 
-    public static void logEvent(int netId) {
+    public static void logEvent(int netId, int prevNetId, int[] transportTypes) {
         IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_CONSRV_DEFAULT_NET_CHANGE,
-                new ConnectivityServiceChangeEvent(netId));
+                new ConnectivityServiceChangeEvent(netId, prevNetId, transportTypes));
     }
 };
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 2ccc3fe..d8b3a97 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2206,6 +2206,12 @@
             }
             mLegacyTypeTracker.remove(nai, wasDefault);
             rematchAllNetworksAndRequests(null, 0);
+            if (wasDefault && getDefaultNetwork() == null) {
+                // Log that we lost the default network and there is no replacement.
+                final int[] transportTypes = new int[0];
+                ConnectivityServiceChangeEvent.logEvent(NETID_UNSET, nai.network.netId,
+                        transportTypes);
+            }
             if (nai.created) {
                 // Tell netd to clean up the configuration for this network
                 // (routing rules, DNS, etc).
@@ -4427,9 +4433,9 @@
         teardownUnneededNetwork(oldNetwork);
     }
 
-    private void makeDefault(NetworkAgentInfo newNetwork) {
+    private void makeDefault(NetworkAgentInfo newNetwork, NetworkAgentInfo prevNetwork) {
+        int prevNetId = (prevNetwork == null) ? NETID_UNSET : prevNetwork.network.netId;
         if (DBG) log("Switching to new default network: " + newNetwork);
-        ConnectivityServiceChangeEvent.logEvent(newNetwork.network.netId);
         setupDataActivityTracking(newNetwork);
         try {
             mNetd.setDefaultNetId(newNetwork.network.netId);
@@ -4440,6 +4446,8 @@
         handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
         updateTcpBufferSizes(newNetwork);
         setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
+        ConnectivityServiceChangeEvent.logEvent(newNetwork.network.netId, prevNetId,
+                newNetwork.networkCapabilities.getTransportTypes());
     }
 
     // Handles a network appearing or improving its score.
@@ -4590,7 +4598,7 @@
         }
         if (isNewDefault) {
             // Notify system services that this network is up.
-            makeDefault(newNetwork);
+            makeDefault(newNetwork, oldDefaultNetwork);
             synchronized (ConnectivityService.this) {
                 // have a new default network, release the transition wakelock in
                 // a second if it's held.  The second pause is to allow apps