Show "Forget" button for ephemeral networks.

- Move forget button preference handling logic to
WifiDetailPreferenceController
- Remove unnecessary updateInfo call in onResume since
NETWORK_STATE_CHANGED_ACTION is a sticky broadcast
- Populate network state fields and set up initial wifi state
when the Preference is displayed instead of waiting for onResume

Bug: 37751816
Test: m RunSettingsRoboTests && manually tested on device
Change-Id: I509013c72a0d26fc9a3feca564d92a0ab8414d1e
This commit is contained in:
Amin Shaikh
2017-05-02 16:33:37 -07:00
parent efed517a8a
commit dec19d10c2
3 changed files with 128 additions and 91 deletions

View File

@@ -52,14 +52,15 @@ import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import com.android.internal.logging.nano.MetricsProto;
import com.android.settings.R;
import com.android.settings.SettingsRobolectricTestRunner;
import com.android.settings.TestConfig;
import com.android.settings.applications.LayoutPreference;
import com.android.settings.core.instrumentation.MetricsFeatureProvider;
import com.android.settings.core.lifecycle.Lifecycle;
import com.android.settings.wifi.WifiDetailPreference;
import com.android.settings.vpn2.ConnectivityManagerWrapper;
import com.android.settings.vpn2.ConnectivityManagerWrapperImpl;
import com.android.settings.wifi.WifiDetailPreference;
import com.android.settingslib.wifi.AccessPoint;
import org.junit.Before;
@@ -67,6 +68,7 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Answers;
import org.mockito.ArgumentCaptor;
import org.mockito.Captor;
import org.mockito.InOrder;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
@@ -103,6 +105,7 @@ public class WifiDetailPreferenceControllerTest {
@Mock private WifiInfo mockWifiInfo;
@Mock private WifiNetworkDetailsFragment mockFragment;
@Mock private WifiManager mockWifiManager;
@Mock private MetricsFeatureProvider mockMetricsFeatureProvider;
@Mock private Preference mockConnectionDetailPref;
@Mock private LayoutPreference mockButtonsPref;
@@ -116,9 +119,12 @@ public class WifiDetailPreferenceControllerTest {
@Mock private WifiDetailPreference mockGatewayPref;
@Mock private WifiDetailPreference mockSubnetPref;
@Mock private WifiDetailPreference mockDnsPref;
@Mock private Button mockForgetButton;
@Mock private PreferenceCategory mockIpv6AddressCategory;
private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
@Captor private ArgumentCaptor<NetworkCallback> mCallbackCaptor;
@Captor private ArgumentCaptor<View.OnClickListener> mForgetClickListener;
private Context mContext = RuntimeEnvironment.application;
private Lifecycle mLifecycle;
private LinkProperties mLinkProperties;
@@ -143,12 +149,8 @@ public class WifiDetailPreferenceControllerTest {
throw new RuntimeException(e);
}
mCallbackCaptor = ArgumentCaptor.forClass(NetworkCallback.class);
when(mockAccessPoint.getConfig()).thenReturn(mockWifiConfig);
when(mockAccessPoint.getLevel()).thenReturn(LEVEL);
when(mockAccessPoint.getNetworkInfo()).thenReturn(mockNetworkInfo);
when(mockAccessPoint.getRssi()).thenReturn(RSSI);
when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY);
when(mockConnectivityManagerWrapper.getConnectivityManager())
@@ -157,6 +159,7 @@ public class WifiDetailPreferenceControllerTest {
.thenReturn(mockNetworkInfo);
doNothing().when(mockConnectivityManagerWrapper).registerNetworkCallback(
any(NetworkRequest.class), mCallbackCaptor.capture(), any(Handler.class));
doNothing().when(mockForgetButton).setOnClickListener(mForgetClickListener.capture());
when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
when(mockWifiInfo.getRssi()).thenReturn(RSSI);
@@ -169,9 +172,8 @@ public class WifiDetailPreferenceControllerTest {
when(mockFragment.getActivity()).thenReturn(mockActivity);
mController = newWifiDetailPreferenceController();
setupMockedPreferenceScreen();
mController = newWifiDetailPreferenceController();
}
private WifiDetailPreferenceController newWifiDetailPreferenceController() {
@@ -182,7 +184,8 @@ public class WifiDetailPreferenceControllerTest {
mockFragment,
null, // Handler
mLifecycle,
mockWifiManager);
mockWifiManager,
mockMetricsFeatureProvider);
}
private void setupMockedPreferenceScreen() {
@@ -192,6 +195,8 @@ public class WifiDetailPreferenceControllerTest {
.thenReturn(mockConnectionDetailPref);
when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_BUTTONS_PREF))
.thenReturn(mockButtonsPref);
when(mockButtonsPref.findViewById(R.id.left_button))
.thenReturn(mockForgetButton);
when(mockButtonsPref.findViewById(R.id.right_button))
.thenReturn(mockSignInButton);
when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_SIGNAL_STRENGTH_PREF))
@@ -214,30 +219,32 @@ public class WifiDetailPreferenceControllerTest {
.thenReturn(mockDnsPref);
when(mockScreen.findPreference(WifiDetailPreferenceController.KEY_IPV6_ADDRESS_CATEGORY))
.thenReturn(mockIpv6AddressCategory);
mController.displayPreference(mockScreen);
}
@Test
public void isAvailable_shouldAlwaysReturnTrue() {
mController.displayPreference(mockScreen);
assertThat(mController.isAvailable()).isTrue();
}
@Test
public void securityPreference_stringShouldBeSet() {
mController.displayPreference(mockScreen);
verify(mockSecurityPref).setDetailText(SECURITY);
}
@Test
public void latestWifiInfo_shouldBeFetchedOnResume() {
mController.onResume();
public void latestWifiInfo_shouldBeFetchedInDisplayPreference() {
mController.displayPreference(mockScreen);
verify(mockWifiManager, times(1)).getConnectionInfo();
}
@Test
public void latestNetworkInfo_shouldBeFetchedOnResume() {
mController.onResume();
public void latestNetworkInfo_shouldBeFetchedInDisplayPreference() {
mController.displayPreference(mockScreen);
verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
}
@@ -264,7 +271,7 @@ public class WifiDetailPreferenceControllerTest {
Drawable expectedIcon =
NetworkBadging.getWifiIcon(LEVEL, NetworkBadging.BADGING_NONE, mContext.getTheme());
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockConnectionDetailPref).setIcon(expectedIcon);
}
@@ -274,14 +281,14 @@ public class WifiDetailPreferenceControllerTest {
String summary = "summary";
when(mockAccessPoint.getSettingsSummary()).thenReturn(summary);
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockConnectionDetailPref).setTitle(summary);
}
@Test
public void signalStrengthPref_shouldHaveIconSet() {
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockSignalStrengthPref).setIcon(any(Drawable.class));
}
@@ -291,7 +298,7 @@ public class WifiDetailPreferenceControllerTest {
String expectedStrength =
mContext.getResources().getStringArray(R.array.wifi_signal)[LEVEL];
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockSignalStrengthPref).setDetailText(expectedStrength);
}
@@ -300,7 +307,7 @@ public class WifiDetailPreferenceControllerTest {
public void linkSpeedPref_shouldHaveDetailTextSet() {
String expectedLinkSpeed = mContext.getString(R.string.link_speed, LINK_SPEED);
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockLinkSpeedPref).setDetailText(expectedLinkSpeed);
}
@@ -309,14 +316,14 @@ public class WifiDetailPreferenceControllerTest {
public void linkSpeedPref_shouldNotShowIfNotSet() {
when(mockWifiInfo.getLinkSpeed()).thenReturn(-1);
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockLinkSpeedPref).setVisible(false);
}
@Test
public void macAddressPref_shouldHaveDetailTextSet() {
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockMacAddressPref).setDetailText(MAC_ADDRESS);
}
@@ -327,7 +334,7 @@ public class WifiDetailPreferenceControllerTest {
mLinkProperties.addLinkAddress(ipv4Address);
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockIpAddressPref).setDetailText(mIpv4Address.getHostAddress());
}
@@ -339,7 +346,7 @@ public class WifiDetailPreferenceControllerTest {
InetAddress gateway = mIpv4Address;
mLinkProperties.addRoute(new RouteInfo(subnet, gateway));
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockSubnetPref).setDetailText("255.255.255.0");
verify(mockGatewayPref).setDetailText(mIpv4Address.getHostAddress());
@@ -350,7 +357,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.onResume();
mController.displayPreference(mockScreen);
verify(mockDnsPref).setDetailText("8.8.4.4,8.8.8.8");
}
@@ -361,7 +368,7 @@ public class WifiDetailPreferenceControllerTest {
// nor connecting and WifiStateMachine has not reached L2ConnectedState.
when(mockWifiManager.getCurrentNetwork()).thenReturn(null);
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockActivity).finish();
}
@@ -372,7 +379,7 @@ public class WifiDetailPreferenceControllerTest {
reset(mockIpv6AddressCategory, mockIpAddressPref, mockSubnetPref, mockGatewayPref,
mockDnsPref);
mController.onResume();
mController.displayPreference(mockScreen);
verify(mockIpv6AddressCategory).setVisible(false);
verify(mockIpAddressPref).setVisible(false);
@@ -389,27 +396,28 @@ public class WifiDetailPreferenceControllerTest {
@Test
public void canForgetNetwork_noNetwork() {
when(mockAccessPoint.getConfig()).thenReturn(null);
mController = newWifiDetailPreferenceController();
mController.displayPreference(mockScreen);
mController.onResume();
assertThat(mController.canForgetNetwork()).isFalse();
verify(mockForgetButton).setVisibility(View.INVISIBLE);
}
@Test
public void canForgetNetwork_ephemeral() {
when(mockWifiInfo.isEphemeral()).thenReturn(true);
when(mockAccessPoint.getConfig()).thenReturn(null);
mController = newWifiDetailPreferenceController();
mController.displayPreference(mockScreen);
mController.onResume();
assertThat(mController.canForgetNetwork()).isTrue();
mController.displayPreference(mockScreen);
verify(mockForgetButton).setVisibility(View.VISIBLE);
}
@Test
public void canForgetNetwork_saved() {
assertThat(mController.canForgetNetwork()).isTrue();
mController.displayPreference(mockScreen);
verify(mockForgetButton).setVisibility(View.VISIBLE);
}
@Test
@@ -418,25 +426,31 @@ public class WifiDetailPreferenceControllerTest {
when(mockWifiInfo.isEphemeral()).thenReturn(true);
when(mockWifiInfo.getSSID()).thenReturn(ssid);
mController.onResume();
mController.forgetNetwork();
mController.displayPreference(mockScreen);
mForgetClickListener.getValue().onClick(null);
verify(mockWifiManager).disableEphemeralNetwork(ssid);
verify(mockMetricsFeatureProvider)
.action(mockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
}
@Test
public void forgetNetwork_saved() {
mockWifiConfig.networkId = 5;
mController.forgetNetwork();
mController.displayPreference(mockScreen);
mForgetClickListener.getValue().onClick(null);
verify(mockWifiManager).forget(mockWifiConfig.networkId, null);
verify(mockMetricsFeatureProvider)
.action(mockActivity, MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
}
@Test
public void networkStateChangedIntent_shouldRefetchInfo() {
mController.displayPreference(mockScreen);
mController.onResume();
verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
verify(mockWifiManager, times(1)).getConnectionInfo();
@@ -448,7 +462,9 @@ public class WifiDetailPreferenceControllerTest {
@Test
public void rssiChangedIntent_shouldRefetchInfo() {
mController.displayPreference(mockScreen);
mController.onResume();
verify(mockConnectivityManager, times(1)).getNetworkInfo(any(Network.class));
verify(mockWifiManager, times(1)).getConnectionInfo();
@@ -470,6 +486,7 @@ public class WifiDetailPreferenceControllerTest {
@Test
public void networkOnLost_shouldFinishActivity() {
mController.displayPreference(mockScreen);
mController.onResume();
mCallbackCaptor.getValue().onLost(mockNetwork);
@@ -483,7 +500,7 @@ public class WifiDetailPreferenceControllerTest {
mLinkProperties.addLinkAddress(ipv6Address);
mController.onResume();
mController.displayPreference(mockScreen);
ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(Preference.class);
verify(mockIpv6AddressCategory).addPreference(preferenceCaptor.capture());
@@ -496,7 +513,7 @@ public class WifiDetailPreferenceControllerTest {
mLinkProperties.addLinkAddress(ipv6Address);
mController.onResume();
mController.displayPreference(mockScreen);
ArgumentCaptor<Preference> preferenceCaptor = ArgumentCaptor.forClass(Preference.class);
verify(mockIpv6AddressCategory).addPreference(preferenceCaptor.capture());
@@ -505,9 +522,11 @@ public class WifiDetailPreferenceControllerTest {
@Test
public void captivePortal_shouldShowSignInButton() {
reset(mockSignInButton);
InOrder inOrder = inOrder(mockSignInButton);
mController.displayPreference(mockScreen);
mController.onResume();
inOrder.verify(mockSignInButton).setVisibility(View.INVISIBLE);
NetworkCapabilities nc = new NetworkCapabilities();
@@ -531,11 +550,41 @@ public class WifiDetailPreferenceControllerTest {
@Test
public void testSignInButton_shouldStartCaptivePortalApp() {
mController.onResume();
mController.displayPreference(mockScreen);
ArgumentCaptor<OnClickListener> captor = ArgumentCaptor.forClass(OnClickListener.class);
verify(mockSignInButton).setOnClickListener(captor.capture());
captor.getValue().onClick(mockSignInButton);
verify(mockConnectivityManagerWrapper).startCaptivePortalApp(mockNetwork);
}
@Test
public void signInButtonVisible_buttonPanelShouldBeVisible() {
when(mockSignInButton.getVisibility()).thenReturn(View.VISIBLE);
when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE);
mController.displayPreference(mockScreen);
verify(mockButtonsPref).setVisible(true);
}
@Test
public void forgetButtonVisible_buttonPanelShouldBeVisible() {
when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE);
when(mockForgetButton.getVisibility()).thenReturn(View.VISIBLE);
mController.displayPreference(mockScreen);
verify(mockButtonsPref).setVisible(true);
}
@Test
public void neitherButtonVisible_buttonPanelShouldBeInvisible() {
when(mockSignInButton.getVisibility()).thenReturn(View.INVISIBLE);
when(mockForgetButton.getVisibility()).thenReturn(View.INVISIBLE);
mController.displayPreference(mockScreen);
verify(mockButtonsPref).setVisible(false);
}
}