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

Commit 4fa11dcb authored by Goven Liu's avatar Goven Liu Committed by Android (Google) Code Review
Browse files

Merge "[Wi-Fi] Refactor add wifi networks feature to use WifiNetworkSuggestion."

parents 4a70204f 237290f8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -74,8 +74,8 @@ public class AddAppNetworksActivity extends FragmentActivity {
    void showAddNetworksFragment() {
        // TODO: Check the new intent status.
        mBundle.putString(KEY_CALLING_PACKAGE_NAME, getCallingPackage());
        mBundle.putParcelableArrayList(Settings.EXTRA_WIFI_CONFIGURATION_LIST,
                getIntent().getParcelableArrayListExtra(Settings.EXTRA_WIFI_CONFIGURATION_LIST));
        mBundle.putParcelableArrayList(Settings.EXTRA_WIFI_NETWORK_LIST,
                getIntent().getParcelableArrayListExtra(Settings.EXTRA_WIFI_NETWORK_LIST));

        final FragmentManager fragmentManager = getSupportFragmentManager();
        Fragment fragment = fragmentManager.findFragmentByTag(TAG);
+111 −58
Original line number Diff line number Diff line
@@ -27,6 +27,8 @@ import android.graphics.drawable.Drawable;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiConfiguration.KeyMgmt;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiNetworkSuggestion;
import android.net.wifi.hotspot2.PasspointConfiguration;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
@@ -65,8 +67,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
    // Possible result values in each item of the returned result list, which is used
    // to inform the caller APP the processed result of each specified network.
    @VisibleForTesting
    static final int RESULT_NETWORK_INITIAL = -1;  //initial value
    private static final int RESULT_NETWORK_SUCCESS = 0;
    static final int RESULT_NETWORK_SUCCESS = 0;
    private static final int RESULT_NETWORK_ADD_ERROR = 1;
    @VisibleForTesting
    static final int RESULT_NETWORK_ALREADY_EXISTS = 2;
@@ -97,7 +98,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
    @VisibleForTesting
    String mCallingPackageName;
    @VisibleForTesting
    List<WifiConfiguration> mAllSpecifiedNetworksList;
    List<WifiNetworkSuggestion> mAllSpecifiedNetworksList;
    @VisibleForTesting
    List<UiConfigurationItem> mUiToRequestedList;
    @VisibleForTesting
@@ -121,7 +122,8 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
                case MESSAGE_START_SAVING_NETWORK:
                    mSaveButton.setEnabled(false);
                    // Save the proposed networks, start from first one.
                    saveNetwork(0);
                    mSavingIndex = 0;
                    saveNetwork(mSavingIndex);
                    break;

                case MESSAGE_SHOW_SAVED_AND_CONNECT_NETWORK:
@@ -192,7 +194,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
        }

        mAllSpecifiedNetworksList =
                bundle.getParcelableArrayList(Settings.EXTRA_WIFI_CONFIGURATION_LIST);
                bundle.getParcelableArrayList(Settings.EXTRA_WIFI_NETWORK_LIST);

        // If there is no network in the request intent or the requested networks exceed the
        // maximum limit, then just finish activity.
@@ -224,7 +226,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
            setSingleNetworkSignalIcon();
            // Show the SSID of the proposed network.
            ((TextView) mLayoutView.findViewById(R.id.single_ssid)).setText(
                    mAllSpecifiedNetworksList.get(0).SSID);
                    mUiToRequestedList.get(0).mDisplayedSsid);
            // Set the status view as gone when UI is initialized.
            mSingleNetworkProcessingStatusView.setVisibility(View.GONE);
        } else {
@@ -259,7 +261,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
        mResultCodeArrayList = new ArrayList<>();

        for (int i = 0; i < networksSize; i++) {
            mResultCodeArrayList.add(RESULT_NETWORK_INITIAL);
            mResultCodeArrayList.add(RESULT_NETWORK_SUCCESS);
        }
    }

@@ -268,31 +270,22 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
                ? config.wepKeys[config.wepTxKeyIndex] : null;
    }

    /**
     * For the APP specified networks, filter saved ones and mark those saved as existed. And
     * prepare a new UiConfigurationItem list, which contains those new or need to be updated
     * networks, for creating UI to user.
     */
    @VisibleForTesting
    void filterSavedNetworks(
            List<WifiConfiguration> savedWifiConfigurations) {
        if (mUiToRequestedList == null) {
            mUiToRequestedList = new ArrayList<>();
        } else {
            mUiToRequestedList.clear();
    private boolean isSavedPasspointConfiguration(
            PasspointConfiguration specifiecPassPointConfiguration) {
        return mWifiManager.getPasspointConfigurations().stream()
                .filter(config -> config.equals(specifiecPassPointConfiguration))
                .findFirst()
                .isPresent();
    }

        boolean foundInSavedList;
        int networkPositionInBundle = 0;
        for (WifiConfiguration specifiedConfig : mAllSpecifiedNetworksList) {
            foundInSavedList = false;
            final String displayedSsid = removeDoubleQuotes(specifiedConfig.SSID);
    private boolean isSavedWifiConfiguration(WifiConfiguration specifiedConfig,
            List<WifiConfiguration> savedWifiConfigurations) {
        final String ssidWithQuotation = addQuotationIfNeeded(specifiedConfig.SSID);
        final int authType = specifiedConfig.getAuthType();

        // TODO: reformat to use lambda
        for (WifiConfiguration privilegedWifiConfiguration : savedWifiConfigurations) {
            // If SSID or security type is different, should be new network or need to be
                // updated network.
            // updated network, continue to check others.
            if (!ssidWithQuotation.equals(privilegedWifiConfiguration.SSID)
                    || authType != privilegedWifiConfiguration.getAuthType()) {
                continue;
@@ -304,17 +297,15 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
                case KeyMgmt.NONE:
                    final String wep = getWepKey(specifiedConfig);
                    final String savedWep = getWepKey(privilegedWifiConfiguration);
                        foundInSavedList = TextUtils.equals(wep, savedWep);
                        break;
                    return TextUtils.equals(wep, savedWep);
                case KeyMgmt.OWE:
                        foundInSavedList = true;
                        break;
                    return true;
                case KeyMgmt.WPA_PSK:
                case KeyMgmt.WPA2_PSK:
                case KeyMgmt.SAE:
                    if (specifiedConfig.preSharedKey.equals(
                            privilegedWifiConfiguration.preSharedKey)) {
                            foundInSavedList = true;
                        return true;
                    }
                    break;
                // TODO: Check how to judge enterprise type.
@@ -323,14 +314,60 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
            }
        }

            if (foundInSavedList) {
        return false;
    }

    /**
     * For the APP specified networks, filter saved ones and mark those saved as existed. And
     * prepare a new UiConfigurationItem list, which contains those new or need to be updated
     * networks, for creating UI to user.
     */
    @VisibleForTesting
    void filterSavedNetworks(
            List<WifiConfiguration> savedWifiConfigurations) {
        if (mUiToRequestedList == null) {
            mUiToRequestedList = new ArrayList<>();
        } else {
            mUiToRequestedList.clear();
        }

        boolean foundInSavedList;
        boolean foundError;
        String displayedName = null;
        int networkPositionInBundle = 0;
        for (WifiNetworkSuggestion suggestion : mAllSpecifiedNetworksList) {
            foundInSavedList = false;
            foundError = false;

            /**
             * If specified is passpoint network, need to check with the existing passpoint
             * networks.
             */
            if (suggestion.passpointConfiguration != null) {
                if (!suggestion.passpointConfiguration.validate()) {
                    foundError = true;
                } else {
                    foundInSavedList = isSavedPasspointConfiguration(
                            suggestion.passpointConfiguration);
                    displayedName = suggestion.passpointConfiguration.getHomeSp().getFriendlyName();
                }
            } else {
                final WifiConfiguration specifiedConfig = suggestion.wifiConfiguration;
                displayedName = removeDoubleQuotes(specifiedConfig.SSID);
                foundInSavedList = isSavedWifiConfiguration(specifiedConfig,
                        savedWifiConfigurations);
            }

            if (foundError) {
                mResultCodeArrayList.set(networkPositionInBundle, RESULT_NETWORK_ADD_ERROR);
            } else if (foundInSavedList) {
                // If this requested network already in the saved networks, mark this item in the
                // result code list as existed.
                mResultCodeArrayList.set(networkPositionInBundle, RESULT_NETWORK_ALREADY_EXISTS);
            } else {
                // Prepare to add to UI list to show to user
                UiConfigurationItem uiConfigurationIcon = new UiConfigurationItem(displayedSsid,
                        specifiedConfig, networkPositionInBundle);
                UiConfigurationItem uiConfigurationIcon = new UiConfigurationItem(displayedName,
                        suggestion, networkPositionInBundle);
                mUiToRequestedList.add(uiConfigurationIcon);
            }
            networkPositionInBundle++;
@@ -433,12 +470,13 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
    @VisibleForTesting
    static class UiConfigurationItem {
        public final String mDisplayedSsid;
        public final WifiConfiguration mWifiConfiguration;
        public final WifiNetworkSuggestion mWifiNetworkSuggestion;
        public final int mIndex;

        UiConfigurationItem(String displayedSsid, WifiConfiguration wifiConfiguration, int index) {
        UiConfigurationItem(String displayedSsid, WifiNetworkSuggestion wifiNetworkSuggestion,
                int index) {
            mDisplayedSsid = displayedSsid;
            mWifiConfiguration = wifiConfiguration;
            mWifiNetworkSuggestion = wifiNetworkSuggestion;
            mIndex = index;
        }
    }
@@ -497,9 +535,6 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
        mSaveListener = new WifiManager.ActionListener() {
            @Override
            public void onSuccess() {
                // Set success into result list.
                mResultCodeArrayList.set(mUiToRequestedList.get(mSavingIndex).mIndex,
                        RESULT_NETWORK_SUCCESS);
                mAnyNetworkSavedSuccess = true;

                if (saveNextNetwork()) {
@@ -561,16 +596,34 @@ public class AddAppNetworksFragment extends InstrumentedFragment {
     * Call framework API to save single network.
     */
    private void saveNetwork(int index) {
        if (mUiToRequestedList.get(index).mWifiNetworkSuggestion.passpointConfiguration != null) {
            // Save passpoint, if no IllegalArgumentException, then treat it as success.
            try {
                mWifiManager.addOrUpdatePasspointConfiguration(mUiToRequestedList.get(
                        index).mWifiNetworkSuggestion.passpointConfiguration);
                mAnyNetworkSavedSuccess = true;
            } catch (IllegalArgumentException e) {
                mResultCodeArrayList.set(mUiToRequestedList.get(index).mIndex,
                        RESULT_NETWORK_ADD_ERROR);
            }

            if (saveNextNetwork()) {
                return;
            }
            // Show saved or failed according to all results.
            showSavedOrFail();
            return;
        } else {
            final WifiConfiguration wifiConfiguration = mUiToRequestedList.get(
                index).mWifiConfiguration;
                    index).mWifiNetworkSuggestion.wifiConfiguration;
            wifiConfiguration.SSID = addQuotationIfNeeded(wifiConfiguration.SSID);
        mSavingIndex = index;
            mWifiManager.save(wifiConfiguration, mSaveListener);
        }
    }

    private void connectNetwork(int index) {
        final WifiConfiguration wifiConfiguration = mUiToRequestedList.get(
                index).mWifiConfiguration;
                index).mWifiNetworkSuggestion.wifiConfiguration;
        mWifiManager.connect(wifiConfiguration, null /* ActionListener */);
    }

@@ -581,7 +634,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment {

        if (resultArrayList != null) {
            Intent intent = new Intent();
            intent.putIntegerArrayListExtra(Settings.EXTRA_WIFI_CONFIGURATION_RESULT_LIST,
            intent.putIntegerArrayListExtra(Settings.EXTRA_WIFI_NETWORK_RESULT_LIST,
                    (ArrayList<Integer>) resultArrayList);
            mActivity.setResult(resultCode, intent);
        }
+59 −29
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import static org.mockito.Mockito.spy;

import android.app.settings.SettingsEnums;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiNetworkSuggestion;
import android.os.Bundle;
import android.os.Parcelable;
import android.provider.Settings;
@@ -46,31 +47,32 @@ public class AddAppNetworksFragmentTest {
    private static final String FAKE_APP_NAME = "fake_app_name";
    private static final String FAKE_NEW_WPA_SSID = "fake_new_wpa_ssid";
    private static final String FAKE_NEW_OPEN_SSID = "fake_new_open_ssid";
    private static final String FAKE_NEW_OPEN_SSID_WITH_QUOTE = "\"fake_new_open_ssid\"";
    private static final String FAKE_NEW_SAVED_WPA_SSID = "\"fake_new_wpa_ssid\"";

    private AddAppNetworksFragment mAddAppNetworksFragment;
    private List<WifiConfiguration> mFakedSpecifiedNetworksList;
    private List<WifiNetworkSuggestion> mFakedSpecifiedNetworksList;
    private List<WifiConfiguration> mFakeSavedNetworksList;
    private WifiConfiguration mNewWpaConfigEntry;
    private WifiConfiguration mNewOpenConfigEntry;
    private WifiConfiguration mSavedWpaConfigEntry;
    private WifiNetworkSuggestion mNewWpaSuggestionEntry;
    private WifiNetworkSuggestion mNewOpenSuggestionEntry;
    private WifiConfiguration mSavedWpaConfigurationEntry;
    private Bundle mBundle;
    private ArrayList<Integer> mFakedResultArrayList = new ArrayList<>();

    @Before
    public void setUp() {
        mAddAppNetworksFragment = spy(new AddAppNetworksFragment());
        mNewWpaConfigEntry = generateWifiConfig(FAKE_NEW_WPA_SSID,
                WifiConfiguration.KeyMgmt.WPA_PSK, "\"1234567890\"");
        mNewOpenConfigEntry = generateWifiConfig(FAKE_NEW_OPEN_SSID,
        mNewWpaSuggestionEntry = generateRegularWifiSuggestion(FAKE_NEW_WPA_SSID,
                WifiConfiguration.KeyMgmt.WPA_PSK, "1234567890");
        mNewOpenSuggestionEntry = generateRegularWifiSuggestion(FAKE_NEW_OPEN_SSID,
                WifiConfiguration.KeyMgmt.NONE, null);
        mSavedWpaConfigEntry = generateWifiConfig(FAKE_NEW_SAVED_WPA_SSID,
        mSavedWpaConfigurationEntry = generateRegularWifiConfiguration(FAKE_NEW_SAVED_WPA_SSID,
                WifiConfiguration.KeyMgmt.WPA_PSK, "\"1234567890\"");
    }

    @Test
    public void callingPackageName_onCreateView_shouldBeCorrect() {
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        setUpBundle(mFakedSpecifiedNetworksList);
        setupFragment();

@@ -79,7 +81,7 @@ public class AddAppNetworksFragmentTest {

    @Test
    public void launchFragment_shouldShowSaveButton() {
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        setUpBundle(mFakedSpecifiedNetworksList);
        setupFragment();

@@ -88,7 +90,7 @@ public class AddAppNetworksFragmentTest {

    @Test
    public void launchFragment_shouldShowCancelButton() {
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        setUpBundle(mFakedSpecifiedNetworksList);
        setupFragment();

@@ -97,7 +99,7 @@ public class AddAppNetworksFragmentTest {

    @Test
    public void requestOneNetwork_shouldShowCorrectSSID() {
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        setUpBundle(mFakedSpecifiedNetworksList);
        setupFragment();
        TextView ssidView = (TextView) mAddAppNetworksFragment.mLayoutView.findViewById(
@@ -108,7 +110,7 @@ public class AddAppNetworksFragmentTest {

    @Test
    public void withNoExtra_requestNetwork_shouldFinished() {
        addOneSpecifiedNetworkConfig(null);
        addOneSpecifiedRegularNetworkSuggestion(null);
        setUpBundle(mFakedSpecifiedNetworksList);
        setupFragment();

@@ -119,13 +121,13 @@ public class AddAppNetworksFragmentTest {
    public void withOneHalfSavedNetworks_uiListAndResultListShouldBeCorrect() {
        // Arrange
        // Setup a fake saved network list and assign to fragment.
        addOneSavedNetworkConfig(mSavedWpaConfigEntry);
        addOneSavedNetworkConfiguration(mSavedWpaConfigurationEntry);
        // Setup two specified networks and their results and assign to fragment.
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedNetworkConfig(mNewOpenConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewOpenSuggestionEntry);
        mAddAppNetworksFragment.mAllSpecifiedNetworksList = mFakedSpecifiedNetworksList;
        mFakedResultArrayList.add(mAddAppNetworksFragment.RESULT_NETWORK_INITIAL);
        mFakedResultArrayList.add(mAddAppNetworksFragment.RESULT_NETWORK_INITIAL);
        mFakedResultArrayList.add(mAddAppNetworksFragment.RESULT_NETWORK_SUCCESS);
        mFakedResultArrayList.add(mAddAppNetworksFragment.RESULT_NETWORK_SUCCESS);
        mAddAppNetworksFragment.mResultCodeArrayList = mFakedResultArrayList;

        // Act
@@ -136,7 +138,8 @@ public class AddAppNetworksFragmentTest {
        assertThat(mAddAppNetworksFragment.mResultCodeArrayList.get(0)).isEqualTo(
                mAddAppNetworksFragment.RESULT_NETWORK_ALREADY_EXISTS);
        assertThat(mAddAppNetworksFragment.mUiToRequestedList.get(
                0).mWifiConfiguration.SSID).isEqualTo(FAKE_NEW_OPEN_SSID);
                0).mWifiNetworkSuggestion.wifiConfiguration.SSID).isEqualTo(
                FAKE_NEW_OPEN_SSID_WITH_QUOTE);
    }

    @Test
@@ -147,13 +150,13 @@ public class AddAppNetworksFragmentTest {

    @Test
    public void getThreeNetworksNewIntent_shouldHaveThreeItemsInUiList() {
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        setUpBundle(mFakedSpecifiedNetworksList);
        setupFragment();

        // Add two more networks and update framework bundle.
        addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
        addOneSpecifiedNetworkConfig(mNewOpenConfigEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
        addOneSpecifiedRegularNetworkSuggestion(mNewOpenSuggestionEntry);
        setUpBundle(mFakedSpecifiedNetworksList);
        Bundle bundle = mAddAppNetworksFragment.getArguments();
        mAddAppNetworksFragment.createContent(bundle);
@@ -162,7 +165,7 @@ public class AddAppNetworksFragmentTest {
        assertThat(mAddAppNetworksFragment.mUiToRequestedList).hasSize(3);
    }

    private void addOneSavedNetworkConfig(@NonNull WifiConfiguration wifiConfiguration) {
    private void addOneSavedNetworkConfiguration(@NonNull WifiConfiguration wifiConfiguration) {
        if (mFakeSavedNetworksList == null) {
            mFakeSavedNetworksList = new ArrayList<>();
        }
@@ -170,20 +173,21 @@ public class AddAppNetworksFragmentTest {
        mFakeSavedNetworksList.add(wifiConfiguration);
    }

    private void addOneSpecifiedNetworkConfig(@NonNull WifiConfiguration wifiConfiguration) {
        if (wifiConfiguration != null) {
    private void addOneSpecifiedRegularNetworkSuggestion(
            @NonNull WifiNetworkSuggestion wifiNetworkSuggestion) {
        if (wifiNetworkSuggestion != null) {
            if (mFakedSpecifiedNetworksList == null) {
                mFakedSpecifiedNetworksList = new ArrayList<>();
            }
            mFakedSpecifiedNetworksList.add(wifiConfiguration);
            mFakedSpecifiedNetworksList.add(wifiNetworkSuggestion);
        }
    }

    private void setUpBundle(List<WifiConfiguration> allFakedNetworksList) {
    private void setUpBundle(List<WifiNetworkSuggestion> allFakedNetworksList) {
        // Set up bundle.
        final Bundle bundle = new Bundle();
        bundle.putString(AddAppNetworksActivity.KEY_CALLING_PACKAGE_NAME, FAKE_APP_NAME);
        bundle.putParcelableArrayList(Settings.EXTRA_WIFI_CONFIGURATION_LIST,
        bundle.putParcelableArrayList(Settings.EXTRA_WIFI_NETWORK_LIST,
                (ArrayList<? extends Parcelable>) allFakedNetworksList);
        doReturn(bundle).when(mAddAppNetworksFragment).getArguments();
    }
@@ -192,7 +196,8 @@ public class AddAppNetworksFragmentTest {
        FragmentController.setupFragment(mAddAppNetworksFragment);
    }

    private static WifiConfiguration generateWifiConfig(String ssid, int securityType,
    private static WifiConfiguration generateRegularWifiConfiguration(String ssid, int
            securityType,
            String password) {
        final WifiConfiguration config = new WifiConfiguration();
        config.SSID = ssid;
@@ -203,4 +208,29 @@ public class AddAppNetworksFragmentTest {
        }
        return config;
    }

    private static WifiNetworkSuggestion generateRegularWifiSuggestion(String ssid,
            int securityType,
            String password) {
        WifiNetworkSuggestion suggestion = null;

        switch (securityType) {
            case WifiConfiguration.KeyMgmt.NONE:
                suggestion = new WifiNetworkSuggestion.Builder()
                        .setSsid(ssid)
                        .build();
                break;
            case WifiConfiguration.KeyMgmt.WPA_PSK:
                suggestion = new WifiNetworkSuggestion.Builder()
                        .setSsid(ssid)
                        .setWpa2Passphrase(password)
                        .build();
                break;
            default:
                break;

        }

        return suggestion;
    }
}