When validation state changes, update the AP summary.
This stops the AP summary from getting stuck on "Connected, no
Internet" even when the system has validated Internet access.
Bug: 62209358
Test: make -j64 RunSettingsRoboTests
Change-Id: I235404408f7d8b958653d25656d97da8206e35ce
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 5a4eafc..18cfa4e 100644
--- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java
@@ -519,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);