Merge "Add an API hint for metered multipath traffic."
diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java
index 8223cdf..9dde3e2 100644
--- a/services/core/java/com/android/server/ConnectivityService.java
+++ b/services/core/java/com/android/server/ConnectivityService.java
@@ -1303,13 +1303,16 @@
     @Override
     public LinkProperties getLinkProperties(Network network) {
         enforceAccessPermission();
-        NetworkAgentInfo nai = getNetworkAgentInfoForNetwork(network);
-        if (nai != null) {
-            synchronized (nai) {
-                return new LinkProperties(nai.linkProperties);
-            }
+        return getLinkProperties(getNetworkAgentInfoForNetwork(network));
+    }
+
+    private LinkProperties getLinkProperties(NetworkAgentInfo nai) {
+        if (nai == null) {
+            return null;
         }
-        return null;
+        synchronized (nai) {
+            return new LinkProperties(nai.linkProperties);
+        }
     }
 
     private NetworkCapabilities getNetworkCapabilitiesInternal(NetworkAgentInfo nai) {
@@ -3145,7 +3148,8 @@
         enforceAccessPermission();
         enforceInternetPermission();
 
-        NetworkAgentInfo nai;
+        // TODO: execute this logic on ConnectivityService handler.
+        final NetworkAgentInfo nai;
         if (network == null) {
             nai = getDefaultNetwork();
         } else {
@@ -3156,21 +3160,24 @@
             return;
         }
         // Revalidate if the app report does not match our current validated state.
-        if (hasConnectivity == nai.lastValidated) return;
+        if (hasConnectivity == nai.lastValidated) {
+            return;
+        }
         final int uid = Binder.getCallingUid();
         if (DBG) {
             log("reportNetworkConnectivity(" + nai.network.netId + ", " + hasConnectivity +
                     ") by " + uid);
         }
-        synchronized (nai) {
-            // Validating a network that has not yet connected could result in a call to
-            // rematchNetworkAndRequests() which is not meant to work on such networks.
-            if (!nai.everConnected) return;
-
-            if (isNetworkWithLinkPropertiesBlocked(nai.linkProperties, uid, false)) return;
-
-            nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
+        // Validating a network that has not yet connected could result in a call to
+        // rematchNetworkAndRequests() which is not meant to work on such networks.
+        if (!nai.everConnected) {
+            return;
         }
+        LinkProperties lp = getLinkProperties(nai);
+        if (isNetworkWithLinkPropertiesBlocked(lp, uid, false)) {
+            return;
+        }
+        nai.networkMonitor.sendMessage(NetworkMonitor.CMD_FORCE_REEVALUATION, uid);
     }
 
     private ProxyInfo getDefaultProxy() {
diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
index 011e505..8c16dbb 100644
--- a/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
+++ b/tests/net/java/com/android/server/connectivity/IpConnectivityEventBuilderTest.java
@@ -58,8 +58,6 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  default_network_event <",
                 "    network_id <",
                 "      network_id: 102",
@@ -72,6 +70,8 @@
                 "    transport_types: 2",
                 "    transport_types: 3",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -89,13 +89,14 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  dhcp_event <",
                 "    duration_ms: 192",
+                "    error_code: 0",
                 "    if_name: \"wlan0\"",
                 "    state_transition: \"SomeState\"",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -112,13 +113,14 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  dhcp_event <",
                 "    duration_ms: 0",
-                "    if_name: \"wlan0\"",
                 "    error_code: 50397184",
+                "    if_name: \"wlan0\"",
+                "    state_transition: \"\"",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -137,8 +139,6 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  dns_lookup_batch <",
                 "    event_types: 1",
                 "    event_types: 1",
@@ -168,6 +168,8 @@
                 "    return_codes: 200",
                 "    return_codes: 178",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -185,13 +187,13 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  ip_provisioning_event <",
                 "    event_type: 1",
                 "    if_name: \"wlan0\"",
                 "    latency_ms: 5678",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -208,12 +210,12 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  ip_reachability_event <",
                 "    event_type: 512",
                 "    if_name: \"wlan0\"",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -231,8 +233,6 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  network_event <",
                 "    event_type: 5",
                 "    latency_ms: 20410",
@@ -240,6 +240,8 @@
                 "      network_id: 100",
                 "    >",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -287,8 +289,6 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  apf_program_event <",
                 "    current_ras: 9",
                 "    drop_multicast: true",
@@ -297,6 +297,8 @@
                 "    lifetime: 200",
                 "    program_length: 2048",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -319,8 +321,6 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  apf_statistics <",
                 "    dropped_ras: 2",
                 "    duration_ms: 45000",
@@ -331,6 +331,8 @@
                 "    received_ras: 10",
                 "    zero_lifetime_ras: 1",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
@@ -351,8 +353,6 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 1",
-                "  transport: 0",
                 "  ra_event <",
                 "    dnssl_lifetime: -1",
                 "    prefix_preferred_lifetime: 300",
@@ -361,6 +361,8 @@
                 "    route_info_lifetime: -1",
                 "    router_lifetime: 2000",
                 "  >",
+                "  time_ms: 1",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
diff --git a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
index 450653c..9a33cde 100644
--- a/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
+++ b/tests/net/java/com/android/server/connectivity/IpConnectivityMetricsTest.java
@@ -158,25 +158,24 @@
         String want = joinLines(
                 "dropped_events: 0",
                 "events <",
-                "  time_ms: 100",
-                "  transport: 0",
                 "  ip_reachability_event <",
                 "    event_type: 512",
                 "    if_name: \"wlan0\"",
                 "  >",
+                "  time_ms: 100",
+                "  transport: 0",
                 ">",
                 "events <",
-                "  time_ms: 200",
-                "  transport: 0",
                 "  dhcp_event <",
                 "    duration_ms: 192",
+                "    error_code: 0",
                 "    if_name: \"wlan0\"",
                 "    state_transition: \"SomeState\"",
                 "  >",
+                "  time_ms: 200",
+                "  transport: 0",
                 ">",
                 "events <",
-                "  time_ms: 300",
-                "  transport: 0",
                 "  default_network_event <",
                 "    network_id <",
                 "      network_id: 102",
@@ -189,15 +188,17 @@
                 "    transport_types: 2",
                 "    transport_types: 3",
                 "  >",
+                "  time_ms: 300",
+                "  transport: 0",
                 ">",
                 "events <",
-                "  time_ms: 400",
-                "  transport: 0",
                 "  ip_provisioning_event <",
                 "    event_type: 1",
                 "    if_name: \"wlan0\"",
                 "    latency_ms: 5678",
                 "  >",
+                "  time_ms: 400",
+                "  transport: 0",
                 ">",
                 "events <",
                 "  time_ms: 500",
@@ -212,8 +213,6 @@
                 "  >",
                 ">",
                 "events <",
-                "  time_ms: 600",
-                "  transport: 0",
                 "  apf_statistics <",
                 "    dropped_ras: 2",
                 "    duration_ms: 45000",
@@ -224,10 +223,10 @@
                 "    received_ras: 10",
                 "    zero_lifetime_ras: 1",
                 "  >",
+                "  time_ms: 600",
+                "  transport: 0",
                 ">",
                 "events <",
-                "  time_ms: 700",
-                "  transport: 0",
                 "  ra_event <",
                 "    dnssl_lifetime: -1",
                 "    prefix_preferred_lifetime: 300",
@@ -236,6 +235,8 @@
                 "    route_info_lifetime: -1",
                 "    router_lifetime: 2000",
                 "  >",
+                "  time_ms: 700",
+                "  transport: 0",
                 ">",
                 "version: 2");
 
diff --git a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
index 97afa60..6c8babb 100644
--- a/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
+++ b/tests/net/java/com/android/server/connectivity/NetdEventListenerServiceTest.java
@@ -212,8 +212,6 @@
 
         IpConnectivityEvent got = events.get(0);
         String want = joinLines(
-                "time_ms: 0",
-                "transport: 0",
                 "connect_statistics <",
                 "  connect_count: 12",
                 "  errnos_counters <",
@@ -247,7 +245,10 @@
                 "  latencies_ms: 67",
                 "  latencies_ms: 110",
                 "  latencies_ms: 214",
-                "  latencies_ms: 523");
+                "  latencies_ms: 523",
+                ">",
+                "time_ms: 0",
+                "transport: 0");
         verifyConnectEvent(want, got);
     }