[Wi-Fi] Refactor add wifi networks feature to use WifiNetworkSuggestion.
WifiConfiguration used in the feature of add apps Wi-Fi networks was Deprecated, need to be changed to use WifiNetworkSuggestion.
Bug: 136472483
Test: Refactor AddAppNetworksFragmentTest to apply WifiNetowrkSuggestion
Change-Id: I022d200905880f7f7bd367f5fa62fa88e785db02
diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
index 79d5002..f276603 100644
--- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
+++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksActivity.java
@@ -74,8 +74,8 @@
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);
diff --git a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java
index c925e7b..fb8d85e 100644
--- a/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java
+++ b/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragment.java
@@ -27,6 +27,8 @@
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 @@
// 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 @@
@VisibleForTesting
String mCallingPackageName;
@VisibleForTesting
- List<WifiConfiguration> mAllSpecifiedNetworksList;
+ List<WifiNetworkSuggestion> mAllSpecifiedNetworksList;
@VisibleForTesting
List<UiConfigurationItem> mUiToRequestedList;
@VisibleForTesting
@@ -121,7 +122,8 @@
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 @@
}
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 @@
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 @@
mResultCodeArrayList = new ArrayList<>();
for (int i = 0; i < networksSize; i++) {
- mResultCodeArrayList.add(RESULT_NETWORK_INITIAL);
+ mResultCodeArrayList.add(RESULT_NETWORK_SUCCESS);
}
}
@@ -268,6 +270,53 @@
? config.wepKeys[config.wepTxKeyIndex] : null;
}
+ private boolean isSavedPasspointConfiguration(
+ PasspointConfiguration specifiecPassPointConfiguration) {
+ return mWifiManager.getPasspointConfigurations().stream()
+ .filter(config -> config.equals(specifiecPassPointConfiguration))
+ .findFirst()
+ .isPresent();
+ }
+
+ 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, continue to check others.
+ if (!ssidWithQuotation.equals(privilegedWifiConfiguration.SSID)
+ || authType != privilegedWifiConfiguration.getAuthType()) {
+ continue;
+ }
+
+ // If specified network and saved network have same security types, we'll check
+ // more information according to their security type to judge if they are same.
+ switch (authType) {
+ case KeyMgmt.NONE:
+ final String wep = getWepKey(specifiedConfig);
+ final String savedWep = getWepKey(privilegedWifiConfiguration);
+ return TextUtils.equals(wep, savedWep);
+ case KeyMgmt.OWE:
+ return true;
+ case KeyMgmt.WPA_PSK:
+ case KeyMgmt.WPA2_PSK:
+ case KeyMgmt.SAE:
+ if (specifiedConfig.preSharedKey.equals(
+ privilegedWifiConfiguration.preSharedKey)) {
+ return true;
+ }
+ break;
+ // TODO: Check how to judge enterprise type.
+ default:
+ break;
+ }
+ }
+
+ 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
@@ -283,54 +332,42 @@
}
boolean foundInSavedList;
+ boolean foundError;
+ String displayedName = null;
int networkPositionInBundle = 0;
- for (WifiConfiguration specifiedConfig : mAllSpecifiedNetworksList) {
+ for (WifiNetworkSuggestion suggestion : mAllSpecifiedNetworksList) {
foundInSavedList = false;
- final String displayedSsid = removeDoubleQuotes(specifiedConfig.SSID);
- final String ssidWithQuotation = addQuotationIfNeeded(specifiedConfig.SSID);
- final int authType = specifiedConfig.getAuthType();
+ foundError = false;
- for (WifiConfiguration privilegedWifiConfiguration : savedWifiConfigurations) {
- // If SSID or security type is different, should be new network or need to be
- // updated network.
- if (!ssidWithQuotation.equals(privilegedWifiConfiguration.SSID)
- || authType != privilegedWifiConfiguration.getAuthType()) {
- continue;
+ /**
+ * 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();
}
-
- // If specified network and saved network have same security types, we'll check
- // more information according to their security type to judge if they are same.
- switch (authType) {
- case KeyMgmt.NONE:
- final String wep = getWepKey(specifiedConfig);
- final String savedWep = getWepKey(privilegedWifiConfiguration);
- foundInSavedList = TextUtils.equals(wep, savedWep);
- break;
- case KeyMgmt.OWE:
- foundInSavedList = true;
- break;
- case KeyMgmt.WPA_PSK:
- case KeyMgmt.WPA2_PSK:
- case KeyMgmt.SAE:
- if (specifiedConfig.preSharedKey.equals(
- privilegedWifiConfiguration.preSharedKey)) {
- foundInSavedList = true;
- }
- break;
- // TODO: Check how to judge enterprise type.
- default:
- break;
- }
+ } else {
+ final WifiConfiguration specifiedConfig = suggestion.wifiConfiguration;
+ displayedName = removeDoubleQuotes(specifiedConfig.SSID);
+ foundInSavedList = isSavedWifiConfiguration(specifiedConfig,
+ savedWifiConfigurations);
}
- if (foundInSavedList) {
+ 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 @@
@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 @@
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 @@
* Call framework API to save single network.
*/
private void saveNetwork(int index) {
- final WifiConfiguration wifiConfiguration = mUiToRequestedList.get(
- index).mWifiConfiguration;
- wifiConfiguration.SSID = addQuotationIfNeeded(wifiConfiguration.SSID);
- mSavingIndex = index;
- mWifiManager.save(wifiConfiguration, mSaveListener);
+ 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).mWifiNetworkSuggestion.wifiConfiguration;
+ wifiConfiguration.SSID = addQuotationIfNeeded(wifiConfiguration.SSID);
+ 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 @@
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);
}
diff --git a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
index cf28c9d..17f8d36 100644
--- a/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
+++ b/tests/robotests/src/com/android/settings/wifi/addappnetworks/AddAppNetworksFragmentTest.java
@@ -23,6 +23,7 @@
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 @@
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 @@
@Test
public void launchFragment_shouldShowSaveButton() {
- addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
+ addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
setUpBundle(mFakedSpecifiedNetworksList);
setupFragment();
@@ -88,7 +90,7 @@
@Test
public void launchFragment_shouldShowCancelButton() {
- addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
+ addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
setUpBundle(mFakedSpecifiedNetworksList);
setupFragment();
@@ -97,7 +99,7 @@
@Test
public void requestOneNetwork_shouldShowCorrectSSID() {
- addOneSpecifiedNetworkConfig(mNewWpaConfigEntry);
+ addOneSpecifiedRegularNetworkSuggestion(mNewWpaSuggestionEntry);
setUpBundle(mFakedSpecifiedNetworksList);
setupFragment();
TextView ssidView = (TextView) mAddAppNetworksFragment.mLayoutView.findViewById(
@@ -108,7 +110,7 @@
@Test
public void withNoExtra_requestNetwork_shouldFinished() {
- addOneSpecifiedNetworkConfig(null);
+ addOneSpecifiedRegularNetworkSuggestion(null);
setUpBundle(mFakedSpecifiedNetworksList);
setupFragment();
@@ -119,13 +121,13 @@
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 @@
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 @@
@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 @@
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 @@
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 @@
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 @@
}
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;
+ }
}