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:
@@ -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 */);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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
|
||||||
|
@@ -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
|
||||||
|
Reference in New Issue
Block a user