Merge "Also log IPv4 and IPv6 connectivity of any previous default network" into nyc-dev
diff --git a/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java b/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java
index 731d5e6..a491ffc 100644
--- a/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java
+++ b/core/java/android/net/metrics/ConnectivityServiceChangeEvent.java
@@ -27,28 +27,38 @@
 
     // 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;
+    // The ID of the network that was the default before or NETID_UNSET if none.
+    private final int mPrevNetId;
+    // Whether the previous network had IPv4/IPv6 connectivity.
+    private final boolean mPrevIPv4;
+    private final boolean mPrevIPv6;
 
-    public ConnectivityServiceChangeEvent(int netId, int prevNetId, int[] transportTypes) {
+    public ConnectivityServiceChangeEvent(int netId, int[] transportTypes,
+                int prevNetId, boolean prevIPv4, boolean prevIPv6) {
         mNetId = netId;
-        mPrevNetId = prevNetId;
         mTransportTypes = transportTypes;
+        mPrevNetId = prevNetId;
+        mPrevIPv4 = prevIPv4;
+        mPrevIPv6 = prevIPv6;
     }
 
     public ConnectivityServiceChangeEvent(Parcel in) {
         mNetId = in.readInt();
-        mPrevNetId = in.readInt();
         mTransportTypes = in.createIntArray();
+        mPrevNetId = in.readInt();
+        mPrevIPv4 = (in.readByte() > 0);
+        mPrevIPv6 = (in.readByte() > 0);
     }
 
     public void writeToParcel(Parcel out, int flags) {
         out.writeInt(mNetId);
-        out.writeInt(mPrevNetId);
         out.writeIntArray(mTransportTypes);
+        out.writeInt(mPrevNetId);
+        out.writeByte(mPrevIPv4 ? (byte) 1 : (byte) 0);
+        out.writeByte(mPrevIPv6 ? (byte) 1 : (byte) 0);
     }
 
     public static final Parcelable.Creator<ConnectivityServiceChangeEvent> CREATOR
@@ -62,8 +72,10 @@
         }
     };
 
-    public static void logEvent(int netId, int prevNetId, int[] transportTypes) {
+    public static void logEvent(int netId, int[] transportTypes,
+            int prevNetId, boolean prevIPv4, boolean prevIPv6) {
         IpConnectivityEvent.logEvent(IpConnectivityEvent.IPCE_CONSRV_DEFAULT_NET_CHANGE,
-                new ConnectivityServiceChangeEvent(netId, prevNetId, transportTypes));
+                new ConnectivityServiceChangeEvent(
+                        netId, transportTypes, prevNetId, prevIPv4, prevIPv6));
     }
 };
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index d8b3a97..e5fe03a 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -2208,9 +2208,7 @@
             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);
+                logConnectivityServiceChangeEvent(null, nai);
             }
             if (nai.created) {
                 // Tell netd to clean up the configuration for this network
@@ -4434,7 +4432,6 @@
     }
 
     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);
         setupDataActivityTracking(newNetwork);
         try {
@@ -4446,8 +4443,8 @@
         handleApplyDefaultProxy(newNetwork.linkProperties.getHttpProxy());
         updateTcpBufferSizes(newNetwork);
         setDefaultDnsSystemProperties(newNetwork.linkProperties.getDnsServers());
-        ConnectivityServiceChangeEvent.logEvent(newNetwork.network.netId, prevNetId,
-                newNetwork.networkCapabilities.getTransportTypes());
+
+        logConnectivityServiceChangeEvent(newNetwork, prevNetwork);
     }
 
     // Handles a network appearing or improving its score.
@@ -5068,4 +5065,22 @@
             NetworkAgentInfo nai, NetworkRequest defaultRequest) {
         return new NetworkMonitor(context, handler, nai, defaultRequest);
     }
+
+    private static void logConnectivityServiceChangeEvent(
+            NetworkAgentInfo next, NetworkAgentInfo prev) {
+        final int newNetId = (next == null) ? NETID_UNSET : next.network.netId;
+        final int[] newTransportTypes = (next == null)
+                ? new int[0]
+                : next.networkCapabilities.getTransportTypes();
+
+        final int oldNetId = (prev == null) ? NETID_UNSET : prev.network.netId;
+        final boolean hadIPv4 = (prev != null) &&
+                prev.linkProperties.hasIPv4Address() &&
+                prev.linkProperties.hasIPv4DefaultRoute();
+        final boolean hadIPv6 = (prev != null) &&
+                prev.linkProperties.hasGlobalIPv6Address() &&
+                prev.linkProperties.hasIPv6DefaultRoute();
+        ConnectivityServiceChangeEvent.logEvent(newNetId, newTransportTypes,
+                oldNetId, hadIPv4, hadIPv6);
+    }
 }