Fix NPE when forgetting networks.

- Fixed disablement of ephemeral networks
- Exit out of the fragment when Forget is pressed

Bug: 36723238
Test: m RunSettingsRoboTests and manual testing
Change-Id: I83c09a44dbef0f02a452dc8c3163523a27bd4b63
This commit is contained in:
Amin Shaikh
2017-03-31 13:56:53 -07:00
parent 8fc0d1f948
commit 3c0d5ff3d1
3 changed files with 56 additions and 23 deletions

View File

@@ -106,6 +106,7 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
mSignalStr = context.getResources().getStringArray(R.array.wifi_signal); mSignalStr = context.getResources().getStringArray(R.array.wifi_signal);
mWifiConfig = accessPoint.getConfig(); mWifiConfig = accessPoint.getConfig();
mWifiManager = wifiManager; mWifiManager = wifiManager;
mWifiInfo = wifiManager.getConnectionInfo();
lifecycle.addObserver(this); lifecycle.addObserver(this);
} }
@@ -265,16 +266,25 @@ public class WifiDetailPreferenceController extends PreferenceController impleme
mDnsPref.setDetailText(builder.toString()); mDnsPref.setDetailText(builder.toString());
} }
/**
* Returns whether the network represented by this preference can be forgotten.
*/
public boolean canForgetNetwork() {
return mWifiInfo != null && mWifiInfo.isEphemeral() || mWifiConfig != null;
}
/** /**
* Forgets the wifi network associated with this preference. * Forgets the wifi network associated with this preference.
*/ */
public void forgetNetwork() { public void forgetNetwork() {
if (mWifiConfig.ephemeral) { if (mWifiInfo != null && mWifiInfo.isEphemeral()) {
mWifiManager.disableEphemeralNetwork(mWifiConfig.SSID); mWifiManager.disableEphemeralNetwork(mWifiInfo.getSSID());
} else if (mWifiConfig.isPasspoint()) { } else if (mWifiConfig != null) {
mWifiManager.removePasspointConfiguration(mWifiConfig.FQDN); if (mWifiConfig.isPasspoint()) {
} else { mWifiManager.removePasspointConfiguration(mWifiConfig.FQDN);
mWifiManager.forget(mWifiConfig.networkId, null /* action listener */); } else {
mWifiManager.forget(mWifiConfig.networkId, null /* action listener */);
}
} }
} }
} }

View File

@@ -16,10 +16,8 @@
package com.android.settings.wifi.details; package com.android.settings.wifi.details;
import android.content.Context; import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager; import android.net.wifi.WifiManager;
import android.os.Bundle; import android.os.Bundle;
import android.view.View;
import android.widget.Button; import android.widget.Button;
import com.android.internal.logging.nano.MetricsProto; import com.android.internal.logging.nano.MetricsProto;
@@ -63,8 +61,9 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
// Header Title set automatically from launching Preference // Header Title set automatically from launching Preference
mForgetButton = (Button) ((LayoutPreference) findPreference(KEY_FORGET_BUTTON)) LayoutPreference forgetPreference = ((LayoutPreference) findPreference(KEY_FORGET_BUTTON));
.findViewById(R.id.button); forgetPreference.setVisible(mWifiDetailPreferenceController.canForgetNetwork());
mForgetButton = (Button) forgetPreference.findViewById(R.id.button);
mForgetButton.setText(R.string.forget); mForgetButton.setText(R.string.forget);
mForgetButton.setOnClickListener(view -> forgetNetwork()); mForgetButton.setOnClickListener(view -> forgetNetwork());
} }
@@ -72,7 +71,7 @@ public class WifiNetworkDetailsFragment extends DashboardFragment {
private void forgetNetwork() { private void forgetNetwork() {
mMetricsFeatureProvider.action(getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_FORGET); mMetricsFeatureProvider.action(getActivity(), MetricsProto.MetricsEvent.ACTION_WIFI_FORGET);
mWifiDetailPreferenceController.forgetNetwork(); mWifiDetailPreferenceController.forgetNetwork();
mForgetButton.setEnabled(false); getActivity().finish();
} }
@Override @Override

View File

@@ -18,6 +18,7 @@ package com.android.settings.wifi.details;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Matchers.any; import static org.mockito.Matchers.any;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when; import static org.mockito.Mockito.when;
@@ -93,14 +94,14 @@ public class WifiDetailPreferenceControllerTest {
when(mockAccessPoint.getRssi()).thenReturn(RSSI); when(mockAccessPoint.getRssi()).thenReturn(RSSI);
when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY); when(mockAccessPoint.getSecurityString(false)).thenReturn(SECURITY);
when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
when(mockWifiInfo.getRssi()).thenReturn(RSSI);
when(mockWifiManager.getConnectionInfo()).thenReturn(mockWifiInfo);
mController = new WifiDetailPreferenceController( mController = new WifiDetailPreferenceController(
mockAccessPoint, mContext, mLifecycle, mockWifiManager); mockAccessPoint, mContext, mLifecycle, mockWifiManager);
setupMockedPreferenceScreen(); setupMockedPreferenceScreen();
when(mockWifiInfo.getRssi()).thenReturn(RSSI);
when(mockWifiInfo.getLinkSpeed()).thenReturn(LINK_SPEED);
when(mockWifiManager.getConnectionInfo()).thenReturn(mockWifiInfo);
} }
private void setupMockedPreferenceScreen() { private void setupMockedPreferenceScreen() {
@@ -143,7 +144,8 @@ public class WifiDetailPreferenceControllerTest {
public void latestWifiInfoAndConfig_shouldBeFetchedOnResume() { public void latestWifiInfoAndConfig_shouldBeFetchedOnResume() {
mController.onResume(); mController.onResume();
verify(mockWifiManager).getConnectionInfo(); // Once in construction, once in onResume
verify(mockWifiManager, times(2)).getConnectionInfo();
} }
@Test @Test
@@ -193,19 +195,41 @@ public class WifiDetailPreferenceControllerTest {
} }
@Test @Test
public void forgetNetwork_ephemeral() { public void canForgetNetwork_noNetwork() {
WifiConfiguration wifiConfiguration = new WifiConfiguration(); when(mockAccessPoint.getConfig()).thenReturn(null);
wifiConfiguration.SSID = "ssid";
// WifiConfiguration#isEphemeral will not be visible in robolectric until O is supported
wifiConfiguration.ephemeral = true;
when(mockAccessPoint.getConfig()).thenReturn(wifiConfiguration);
mController = new WifiDetailPreferenceController( mController = new WifiDetailPreferenceController(
mockAccessPoint, mContext, mLifecycle, mockWifiManager); mockAccessPoint, mContext, mLifecycle, mockWifiManager);
assertThat(mController.canForgetNetwork()).isFalse();
}
@Test
public void canForgetNetwork_ephemeral() {
when(mockWifiInfo.isEphemeral()).thenReturn(true);
when(mockAccessPoint.getConfig()).thenReturn(null);
mController = new WifiDetailPreferenceController(
mockAccessPoint, mContext, mLifecycle, mockWifiManager);
assertThat(mController.canForgetNetwork()).isTrue();
}
@Test
public void canForgetNetwork_saved() {
assertThat(mController.canForgetNetwork()).isTrue();
}
@Test
public void forgetNetwork_ephemeral() {
String ssid = "ssid";
when(mockWifiInfo.isEphemeral()).thenReturn(true);
when(mockWifiInfo.getSSID()).thenReturn(ssid);
mController.forgetNetwork(); mController.forgetNetwork();
verify(mockWifiManager).disableEphemeralNetwork(wifiConfiguration.SSID); verify(mockWifiManager).disableEphemeralNetwork(ssid);
} }
@Test @Test