Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3c0d5ff3 authored by Amin Shaikh's avatar Amin Shaikh
Browse files

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
parent 8fc0d1f9
Loading
Loading
Loading
Loading
+16 −6
Original line number Original line Diff line number Diff line
@@ -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) {
            if (mWifiConfig.isPasspoint()) {
                mWifiManager.removePasspointConfiguration(mWifiConfig.FQDN);
                mWifiManager.removePasspointConfiguration(mWifiConfig.FQDN);
            } else {
            } else {
                mWifiManager.forget(mWifiConfig.networkId, null /* action listener */);
                mWifiManager.forget(mWifiConfig.networkId, null /* action listener */);
            }
            }
        }
        }
    }
    }
}
+4 −5
Original line number Original line Diff line number Diff line
@@ -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
+36 −12
Original line number Original line Diff line number Diff line
@@ -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