Merge changes I23540440,I67269e1a into oc-dev

* changes:
  When validation state changes, update the AP summary.
  Minor tweaks to WifiDetailPreferenceControllerTest.
diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
index c0dd0a8..0d585c7 100644
--- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
+++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java
@@ -16,6 +16,7 @@
 package com.android.settings.wifi.details;
 
 import static android.net.NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL;
+import static android.net.NetworkCapabilities.NET_CAPABILITY_VALIDATED;
 import static android.net.NetworkCapabilities.TRANSPORT_WIFI;
 
 import android.app.Fragment;
@@ -165,9 +166,24 @@
             }
         }
 
+        private boolean hasCapabilityChanged(NetworkCapabilities nc, int cap) {
+            // If this is the first time we get NetworkCapabilities, report that something changed.
+            if (mNetworkCapabilities == null) return true;
+
+            // nc can never be null, see ConnectivityService#callCallbackForRequest.
+            return mNetworkCapabilities.hasCapability(cap) != nc.hasCapability(cap);
+        }
+
         @Override
         public void onCapabilitiesChanged(Network network, NetworkCapabilities nc) {
+            // If the network just validated or lost Internet access, refresh network state.
+            // Don't do this on every NetworkCapabilities change because refreshNetworkState
+            // sends IPCs to the system server from the UI thread, which can cause jank.
             if (network.equals(mNetwork) && !nc.equals(mNetworkCapabilities)) {
+                if (hasCapabilityChanged(nc, NET_CAPABILITY_VALIDATED) ||
+                        hasCapabilityChanged(nc, NET_CAPABILITY_CAPTIVE_PORTAL)) {
+                    refreshNetworkState();
+                }
                 mNetworkCapabilities = nc;
                 updateIpLayerInfo();
             }
diff --git a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
index 41825a5..18cfa4e 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -445,6 +445,17 @@
         mCallbackCaptor.getValue().onLinkPropertiesChanged(mockNetwork, new LinkProperties(lp));
     }
 
+    private void updateNetworkCapabilities(NetworkCapabilities nc) {
+        mCallbackCaptor.getValue().onCapabilitiesChanged(mockNetwork, new NetworkCapabilities(nc));
+    }
+
+    private NetworkCapabilities makeNetworkCapabilities() {
+        NetworkCapabilities nc = new NetworkCapabilities();
+        nc.clearAll();
+        nc.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
+        return nc;
+    }
+
     private void verifyDisplayedIpv6Addresses(InOrder inOrder, LinkAddress... addresses) {
         String text = Arrays.stream(addresses)
                 .map(address -> asString(address))
@@ -508,6 +519,45 @@
     }
 
     @Test
+    public void onCapabilitiesChanged_callsRefreshIfNecessary() {
+        NetworkCapabilities nc = makeNetworkCapabilities();
+        when(mockConnectivityManager.getNetworkCapabilities(mockNetwork))
+                .thenReturn(new NetworkCapabilities(nc));
+
+        String summary = "Connected, no Internet";
+        when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
+
+        InOrder inOrder = inOrder(mockConnectionDetailPref);
+        mController.displayPreference(mockScreen);
+        mController.onResume();
+        inOrder.verify(mockConnectionDetailPref).setTitle(summary);
+
+        // Check that an irrelevant capability update does not update the access point summary, as
+        // doing so could cause unnecessary jank...
+        summary = "Connected";
+        when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mockConnectionDetailPref, never()).setTitle(any());
+
+        // ... but that if the network validates, then we do refresh.
+        nc.addCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mockConnectionDetailPref).setTitle(summary);
+
+        summary = "Connected, no Internet";
+        when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
+
+        // Another irrelevant update won't cause the UI to refresh...
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mockConnectionDetailPref, never()).setTitle(any());
+
+        // ... but if the network is no longer validated, then we display "connected, no Internet".
+        nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED);
+        updateNetworkCapabilities(nc);
+        inOrder.verify(mockConnectionDetailPref).setTitle(summary);
+    }
+
+    @Test
     public void canForgetNetwork_noNetwork() {
         when(mockAccessPoint.getConfig()).thenReturn(null);
 
@@ -589,7 +639,7 @@
     }
 
     @Test
-    public void networkDisconnectdState_shouldFinishActivity() {
+    public void networkDisconnectedState_shouldFinishActivity() {
         mController.onResume();
 
         when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(null);
@@ -644,22 +694,16 @@
 
         inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE);
 
-        NetworkCapabilities nc = new NetworkCapabilities();
-        nc.clearAll();
-        nc.addTransportType(NetworkCapabilities.TRANSPORT_WIFI);
-
-        NetworkCallback callback = mCallbackCaptor.getValue();
-        callback.onCapabilitiesChanged(mockNetwork, nc);
+        NetworkCapabilities nc = makeNetworkCapabilities();
+        updateNetworkCapabilities(nc);
         inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE);
 
-        nc = new NetworkCapabilities(nc);
         nc.addCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
-        callback.onCapabilitiesChanged(mockNetwork, nc);
+        updateNetworkCapabilities(nc);
         inOrder.verify(mockSignInButton).setVisibility(View.VISIBLE);
 
-        nc = new NetworkCapabilities(nc);
         nc.removeCapability(NetworkCapabilities.NET_CAPABILITY_CAPTIVE_PORTAL);
-        callback.onCapabilitiesChanged(mockNetwork, nc);
+        updateNetworkCapabilities(nc);
         inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE);
     }