Loading src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java +111 −58 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -97,7 +98,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment { @VisibleForTesting String mCallingPackageName; @VisibleForTesting List<WifiConfiguration> mAllSpecifiedNetworksList; List<WifiNetworkSuggestion> mAllSpecifiedNetworksList; @VisibleForTesting List<UiConfigurationItem> mUiToRequestedList; @VisibleForTesting Loading @@ -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: Loading Loading @@ -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. Loading Loading @@ -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 { Loading Loading @@ -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); } } Loading @@ -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; Loading @@ -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. Loading @@ -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++; Loading Loading @@ -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; } } Loading Loading @@ -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()) { Loading Loading @@ -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 */); } Loading @@ -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); } Loading tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java +59 −29 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading @@ -79,7 +81,7 @@ public class AddAppNetworksFragmentTest { @Test public void launchFragment_shouldShowSaveButton() { addOneSpecifiedNetworkConfig(mNewWpaConfigEntry); addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry); setUpBundle(mFakedSpecifiedNetworksList); setupFragment(); Loading @@ -88,7 +90,7 @@ public class AddAppNetworksFragmentTest { @Test public void launchFragment_shouldShowCancelButton() { addOneSpecifiedNetworkConfig(mNewWpaConfigEntry); addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry); setUpBundle(mFakedSpecifiedNetworksList); setupFragment(); Loading @@ -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( Loading @@ -108,7 +110,7 @@ public class AddAppNetworksFragmentTest { @Test public void withNoExtra_requestNetwork_shouldFinished() { addOneSpecifiedNetworkConfig(null); addOneSpecifiedRegularNetworkSuggestion(null); setUpBundle(mFakedSpecifiedNetworksList); setupFragment(); Loading @@ -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 Loading @@ -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 Loading @@ -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); Loading @@ -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<>(); } Loading @@ -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(); } Loading @@ -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; Loading @@ -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; } } Loading
src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java +2 −2 Original line number Diff line number Diff line Loading @@ -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); Loading
src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java +111 −58 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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; Loading Loading @@ -97,7 +98,7 @@ public class AddAppNetworksFragment extends InstrumentedFragment { @VisibleForTesting String mCallingPackageName; @VisibleForTesting List<WifiConfiguration> mAllSpecifiedNetworksList; List<WifiNetworkSuggestion> mAllSpecifiedNetworksList; @VisibleForTesting List<UiConfigurationItem> mUiToRequestedList; @VisibleForTesting Loading @@ -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: Loading Loading @@ -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. Loading Loading @@ -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 { Loading Loading @@ -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); } } Loading @@ -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; Loading @@ -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. Loading @@ -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++; Loading Loading @@ -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; } } Loading Loading @@ -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()) { Loading Loading @@ -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 */); } Loading @@ -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); } Loading
tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java +59 −29 Original line number Diff line number Diff line Loading @@ -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; Loading @@ -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(); Loading @@ -79,7 +81,7 @@ public class AddAppNetworksFragmentTest { @Test public void launchFragment_shouldShowSaveButton() { addOneSpecifiedNetworkConfig(mNewWpaConfigEntry); addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry); setUpBundle(mFakedSpecifiedNetworksList); setupFragment(); Loading @@ -88,7 +90,7 @@ public class AddAppNetworksFragmentTest { @Test public void launchFragment_shouldShowCancelButton() { addOneSpecifiedNetworkConfig(mNewWpaConfigEntry); addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry); setUpBundle(mFakedSpecifiedNetworksList); setupFragment(); Loading @@ -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( Loading @@ -108,7 +110,7 @@ public class AddAppNetworksFragmentTest { @Test public void withNoExtra_requestNetwork_shouldFinished() { addOneSpecifiedNetworkConfig(null); addOneSpecifiedRegularNetworkSuggestion(null); setUpBundle(mFakedSpecifiedNetworksList); setupFragment(); Loading @@ -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 Loading @@ -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 Loading @@ -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); Loading @@ -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<>(); } Loading @@ -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(); } Loading @@ -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; Loading @@ -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; } }