diff --git a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java index 2de8d9f2c63..15308e179e5 100644 --- a/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java +++ b/src/com/android/settings/wifi/details/WifiDetailPreferenceController.java @@ -269,16 +269,19 @@ public class WifiDetailPreferenceController extends PreferenceController impleme mForgetButton = (Button) mButtonsPref.findViewById(R.id.forget_button); mForgetButton.setText(R.string.forget); mForgetButton.setOnClickListener(view -> forgetNetwork()); - updateInfo(); } @Override public void onResume() { + // Ensure mNetwork is set before any callbacks above are delivered, since our + // NetworkCallback only looks at changes to mNetwork. + mNetwork = mWifiManager.getCurrentNetwork(); + mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork); + mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork); + updateInfo(); + mContext.registerReceiver(mReceiver, mFilter); mConnectivityManagerWrapper.registerNetworkCallback(mNetworkRequest, mNetworkCallback, mHandler); - // updateInfo() will be called during registration because NETWORK_STATE_CHANGED_ACTION is - // a sticky broadcast. - mContext.registerReceiver(mReceiver, mFilter); } @Override @@ -293,9 +296,8 @@ public class WifiDetailPreferenceController extends PreferenceController impleme } private void updateInfo() { - mNetwork = mWifiManager.getCurrentNetwork(); - mLinkProperties = mConnectivityManager.getLinkProperties(mNetwork); - mNetworkCapabilities = mConnectivityManager.getNetworkCapabilities(mNetwork); + // No need to fetch LinkProperties and NetworkCapabilities, they are updated by the + // callbacks. mNetwork doesn't change except in onResume. mNetworkInfo = mConnectivityManager.getNetworkInfo(mNetwork); mWifiInfo = mWifiManager.getConnectionInfo(); if (mNetwork == null || mNetworkInfo == null || mWifiInfo == null) { 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 17da8da17b8..43177f7898c 100644 --- a/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/wifi/details/WifiDetailPreferenceControllerTest.java @@ -266,6 +266,11 @@ public class WifiDetailPreferenceControllerTest { .thenReturn(mockIpv6AddressesPref); } + private void displayAndResume() { + mController.displayPreference(mockScreen); + mController.onResume(); + } + @Test public void isAvailable_shouldAlwaysReturnTrue() { mController.displayPreference(mockScreen); @@ -275,28 +280,28 @@ public class WifiDetailPreferenceControllerTest { @Test public void securityPreference_stringShouldBeSet() { - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockSecurityPref).setDetailText(SECURITY); } @Test public void latestWifiInfo_shouldBeFetchedInDisplayPreference() { - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockWifiManager, times(1)).getConnectionInfo(); } @Test public void latestNetworkInfo_shouldBeFetchedInDisplayPreference() { - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); } @Test public void networkCallback_shouldBeRegisteredOnResume() { - mController.onResume(); + displayAndResume(); verify(mockConnectivityManagerWrapper, times(1)).registerNetworkCallback( nullable(NetworkRequest.class), mCallbackCaptor.capture(), nullable(Handler.class)); @@ -304,7 +309,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void networkCallback_shouldBeUnregisteredOnPause() { - mController.onResume(); + displayAndResume(); mController.onPause(); verify(mockConnectivityManager, times(1)).unregisterNetworkCallback( @@ -316,7 +321,7 @@ public class WifiDetailPreferenceControllerTest { Drawable expectedIcon = NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme()); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockConnectionDetailPref).setIcon(expectedIcon); } @@ -326,14 +331,14 @@ public class WifiDetailPreferenceControllerTest { String summary = "summary"; when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockConnectionDetailPref).setTitle(summary); } @Test public void signalStrengthPref_shouldHaveIconSet() { - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockSignalStrengthPref).setIcon(any(Drawable.class)); } @@ -343,7 +348,7 @@ public class WifiDetailPreferenceControllerTest { String expectedStrength = mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL]; - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockSignalStrengthPref).setDetailText(expectedStrength); } @@ -352,7 +357,7 @@ public class WifiDetailPreferenceControllerTest { public void linkSpeedPref_shouldHaveDetailTextSet() { String expectedLinkSpeed = mContext.getString(R.string.link_speed, LINK_SPEED); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed); } @@ -361,14 +366,14 @@ public class WifiDetailPreferenceControllerTest { public void linkSpeedPref_shouldNotShowIfNotSet() { when(mockWifiInfo.getLinkSpeed()).thenReturn(-1); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockLinkSpeedPref).setVisible(false); } @Test public void macAddressPref_shouldHaveDetailTextSet() { - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockMacAddressPref).setDetailText(MAC_ADDRESS); } @@ -377,7 +382,7 @@ public class WifiDetailPreferenceControllerTest { public void ipAddressPref_shouldHaveDetailTextSet() { mLinkProperties.addLinkAddress(Constants.IPV4_ADDR); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockIpAddressPref).setDetailText(Constants.IPV4_ADDR.getAddress().getHostAddress()); } @@ -388,7 +393,7 @@ public class WifiDetailPreferenceControllerTest { mLinkProperties.addRoute(Constants.IPV4_DEFAULT); mLinkProperties.addRoute(Constants.IPV4_SUBNET); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockSubnetPref).setDetailText("255.255.255.128"); verify(mockGatewayPref).setDetailText("192.0.2.127"); @@ -399,7 +404,7 @@ public class WifiDetailPreferenceControllerTest { mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,4,4})); mLinkProperties.addDnsServer(InetAddress.getByAddress(new byte[]{8,8,8,8})); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8"); } @@ -410,7 +415,7 @@ public class WifiDetailPreferenceControllerTest { // nor connecting and WifiStateMachine has not reached L2ConnectedState. when(mockWifiManager.getCurrentNetwork()).thenReturn(null); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockActivity).finish(); } @@ -421,7 +426,7 @@ public class WifiDetailPreferenceControllerTest { reset(mockIpv6Category, mockIpAddressPref, mockSubnetPref, mockGatewayPref, mockDnsPref); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockIpv6Category).setVisible(false); verify(mockIpAddressPref).setVisible(false); @@ -466,8 +471,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void onLinkPropertiesChanged_updatesFields() { - mController.displayPreference(mockScreen); - mController.onResume(); + displayAndResume(); InOrder inOrder = inOrder(mockIpAddressPref, mockGatewayPref, mockSubnetPref, mockDnsPref, mockIpv6Category, mockIpv6AddressesPref); @@ -529,8 +533,7 @@ public class WifiDetailPreferenceControllerTest { when(mockAccessPoint.getSettingsSummary()).thenReturn(summary); InOrder inOrder = inOrder(mockConnectionDetailPref); - mController.displayPreference(mockScreen); - mController.onResume(); + displayAndResume(); inOrder.verify(mockConnectionDetailPref).setTitle(summary); // Check that an irrelevant capability update does not update the access point summary, as @@ -563,7 +566,7 @@ public class WifiDetailPreferenceControllerTest { when(mockAccessPoint.getConfig()).thenReturn(null); mController = newWifiDetailPreferenceController(); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockForgetButton).setVisibility(View.INVISIBLE); } @@ -573,14 +576,14 @@ public class WifiDetailPreferenceControllerTest { when(mockWifiInfo.isEphemeral()).thenReturn(true); when(mockAccessPoint.getConfig()).thenReturn(null); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockForgetButton).setVisibility(View.VISIBLE); } @Test public void canForgetNetwork_saved() { - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockForgetButton).setVisibility(View.VISIBLE); } @@ -591,7 +594,7 @@ public class WifiDetailPreferenceControllerTest { when(mockWifiInfo.isEphemeral()).thenReturn(true); when(mockWifiInfo.getSSID()).thenReturn(ssid); - mController.displayPreference(mockScreen); + displayAndResume(); mForgetClickListener.getValue().onClick(null); verify(mockWifiManager).disableEphemeralNetwork(ssid); @@ -613,8 +616,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void networkStateChangedIntent_shouldRefetchInfo() { - mController.displayPreference(mockScreen); - mController.onResume(); + displayAndResume(); verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); verify(mockWifiManager, times(1)).getConnectionInfo(); @@ -627,8 +629,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void rssiChangedIntent_shouldRefetchInfo() { - mController.displayPreference(mockScreen); - mController.onResume(); + displayAndResume(); verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class)); verify(mockWifiManager, times(1)).getConnectionInfo(); @@ -641,7 +642,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void networkDisconnectedState_shouldFinishActivity() { - mController.onResume(); + displayAndResume(); when(mockConnectivityManager.getNetworkInfo(any(Network.class))).thenReturn(null); mContext.sendBroadcast(new Intent(WifiManager.NETWORK_STATE_CHANGED_ACTION)); @@ -651,8 +652,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void networkOnLost_shouldFinishActivity() { - mController.displayPreference(mockScreen); - mController.onResume(); + displayAndResume(); mCallbackCaptor.getValue().onLost(mockNetwork); @@ -665,7 +665,7 @@ public class WifiDetailPreferenceControllerTest { mLinkProperties.addLinkAddress(Constants.IPV6_GLOBAL1); mLinkProperties.addLinkAddress(Constants.IPV6_GLOBAL2); - mController.displayPreference(mockScreen); + displayAndResume(); List addrs = mIpv6AddressCaptor.getAllValues(); @@ -681,7 +681,7 @@ public class WifiDetailPreferenceControllerTest { public void ipv6AddressPref_shouldNotBeSelectable() { mLinkProperties.addLinkAddress(Constants.IPV6_GLOBAL2); - mController.displayPreference(mockScreen); + displayAndResume(); assertThat(mockIpv6AddressesPref.isSelectable()).isFalse(); } @@ -690,8 +690,7 @@ public class WifiDetailPreferenceControllerTest { public void captivePortal_shouldShowSignInButton() { InOrder inOrder = inOrder(mockSignInButton); - mController.displayPreference(mockScreen); - mController.onResume(); + displayAndResume(); inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE); @@ -710,7 +709,7 @@ public class WifiDetailPreferenceControllerTest { @Test public void testSignInButton_shouldStartCaptivePortalApp() { - mController.displayPreference(mockScreen); + displayAndResume(); ArgumentCaptor captor = ArgumentCaptor.forClass(OnClickListener.class); verify(mockSignInButton).setOnClickListener(captor.capture()); @@ -723,7 +722,7 @@ public class WifiDetailPreferenceControllerTest { when(mockSignInButton.getVisibility()).thenReturn(View.VISIBLE); when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockButtonsPref).setVisible(true); } @@ -733,7 +732,7 @@ public class WifiDetailPreferenceControllerTest { when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE); when(mockForgetButton.getVisibility()).thenReturn(View.VISIBLE); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockButtonsPref).setVisible(true); } @@ -743,7 +742,7 @@ public class WifiDetailPreferenceControllerTest { when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE); when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE); - mController.displayPreference(mockScreen); + displayAndResume(); verify(mockButtonsPref).setVisible(false); }