From 0f8d436d69860dca49cf71ea4d501699e41c8386 Mon Sep 17 00:00:00 2001 From: Bruno Randolf Date: Sat, 2 Feb 2013 11:10:13 +0000 Subject: Wifi: Allow configuration of Ad-Hoc (IBSS) networks Show Ad-Hoc (IBSS) networks in the list of available Wi-Fi networks and allow to connect to or create new Ad-Hoc (IBSS) networks. This requires the IBSS changes in frameworks/base and external/wpa_supplicant_8 Change-Id: Ie44c47753100bbf8e691446e69b8d31659f64e3b --- src/com/android/settings/wifi/AccessPoint.java | 24 ++++++++++++++------ .../settings/wifi/WifiConfigController.java | 26 ++++++++++++++++++---- src/com/android/settings/wifi/WifiSettings.java | 8 +++---- 3 files changed, 43 insertions(+), 15 deletions(-) (limited to 'src/com/android/settings/wifi') diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java index f6581a5..e69e900 100644 --- a/src/com/android/settings/wifi/AccessPoint.java +++ b/src/com/android/settings/wifi/AccessPoint.java @@ -62,6 +62,8 @@ class AccessPoint extends Preference { int security; int networkId; boolean wpsAvailable = false; + boolean isIBSS = false; + int frequency; PskType pskType = PskType.UNKNOWN; @@ -188,6 +190,8 @@ class AccessPoint extends Preference { security = getSecurity(config); networkId = config.networkId; mRssi = Integer.MAX_VALUE; + isIBSS = config.isIBSS; + frequency = config.frequency; mConfig = config; } @@ -196,6 +200,8 @@ class AccessPoint extends Preference { bssid = result.BSSID; security = getSecurity(result); wpsAvailable = security != SECURITY_EAP && result.capabilities.contains("WPS"); + isIBSS = result.capabilities.contains("[IBSS]"); + frequency = result.frequency; if (security == SECURITY_PSK) pskType = getPskType(result); networkId = -1; @@ -338,24 +344,28 @@ class AccessPoint extends Preference { setTitle(ssid); Context context = getContext(); + StringBuilder summary = new StringBuilder(); + + if (isIBSS) + summary.append(context.getString(R.string.wifi_mode_ibss_short)).append(" "); + if (mState != null) { // This is the active connection - setSummary(Summary.get(context, mState)); + summary.append(Summary.get(context, mState)); } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range - setSummary(context.getString(R.string.wifi_not_in_range)); + summary.append(context.getString(R.string.wifi_not_in_range)); } else if (mConfig != null && mConfig.status == WifiConfiguration.Status.DISABLED) { switch (mConfig.disableReason) { case WifiConfiguration.DISABLED_AUTH_FAILURE: - setSummary(context.getString(R.string.wifi_disabled_password_failure)); + summary.append(context.getString(R.string.wifi_disabled_password_failure)); break; case WifiConfiguration.DISABLED_DHCP_FAILURE: case WifiConfiguration.DISABLED_DNS_FAILURE: - setSummary(context.getString(R.string.wifi_disabled_network_failure)); + summary.append(context.getString(R.string.wifi_disabled_network_failure)); break; case WifiConfiguration.DISABLED_UNKNOWN_REASON: - setSummary(context.getString(R.string.wifi_disabled_generic)); + summary.append(context.getString(R.string.wifi_disabled_generic)); } } else { // In range, not disabled. - StringBuilder summary = new StringBuilder(); if (mConfig != null) { // Is saved network summary.append(context.getString(R.string.wifi_remembered)); } @@ -377,8 +387,8 @@ class AccessPoint extends Preference { summary.append(context.getString(R.string.wifi_wps_available_second_item)); } } - setSummary(summary.toString()); } + setSummary(summary.toString()); } /** diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java index 2598a0e..bde8008 100644 --- a/src/com/android/settings/wifi/WifiConfigController.java +++ b/src/com/android/settings/wifi/WifiConfigController.java @@ -74,6 +74,7 @@ public class WifiConfigController implements TextWatcher, private boolean mEdit; private TextView mSsidView; + private CheckBox mIbssView; // e.g. AccessPoint.SECURITY_NONE private int mAccessPointSecurity; @@ -159,6 +160,7 @@ public class WifiConfigController implements TextWatcher, mIpSettingsSpinner.setOnItemSelectedListener(this); mProxySettingsSpinner = (Spinner) mView.findViewById(R.id.proxy_settings); mProxySettingsSpinner.setOnItemSelectedListener(this); + mIbssView = (CheckBox) mView.findViewById(R.id.wifi_ibss_checkbox); if (mAccessPoint == null) { // new network mConfigUi.setTitle(R.string.wifi_add_network); @@ -184,6 +186,7 @@ public class WifiConfigController implements TextWatcher, showProxyFields(); mView.findViewById(R.id.wifi_advanced_toggle).setVisibility(View.VISIBLE); mView.findViewById(R.id.wifi_advanced_togglebox).setOnClickListener(this); + mView.findViewById(R.id.wifi_ibss_toggle).setVisibility(View.VISIBLE); mConfigUi.setSubmitButton(context.getString(R.string.wifi_save)); } else { @@ -191,6 +194,10 @@ public class WifiConfigController implements TextWatcher, ViewGroup group = (ViewGroup) mView.findViewById(R.id.info); + if (mAccessPoint.isIBSS) { + addRow(group, R.string.wifi_mode, context.getString(R.string.wifi_mode_ibss)); + } + DetailedState state = mAccessPoint.getState(); if (state != null) { addRow(group, R.string.wifi_status, Summary.get(mConfigUi.getContext(), state)); @@ -209,7 +216,8 @@ public class WifiConfigController implements TextWatcher, addRow(group, R.string.wifi_security, mAccessPoint.getSecurityString(false)); - boolean showAdvancedFields = false; + // always show advanced fields for IBSS, because we usually need a static IP + boolean showAdvancedFields = mAccessPoint.isIBSS; if (mAccessPoint.networkId != INVALID_NETWORK_ID) { WifiConfiguration config = mAccessPoint.getConfig(); if (config.ipAssignment == IpAssignment.STATIC) { @@ -247,7 +255,7 @@ public class WifiConfigController implements TextWatcher, if (mEdit) { mConfigUi.setSubmitButton(context.getString(R.string.wifi_save)); } else { - if (state == null && level != -1) { + if (state == null && (level != -1 || mAccessPoint.isIBSS)) { mConfigUi.setSubmitButton(context.getString(R.string.wifi_connect)); } else { mView.findViewById(R.id.ip_fields).setVisibility(View.GONE); @@ -310,13 +318,23 @@ public class WifiConfigController implements TextWatcher, if (mAccessPoint == null) { config.SSID = AccessPoint.convertToQuotedString( mSsidView.getText().toString()); - // If the user adds a network manually, assume that it is hidden. - config.hiddenSSID = true; + + if (mIbssView.isChecked()) { + config.isIBSS = true; + config.frequency = 2412; //TODO: select from UI + } else { + // If the user adds a network manually, assume that it is hidden. + config.hiddenSSID = true; + } } else if (mAccessPoint.networkId == INVALID_NETWORK_ID) { config.SSID = AccessPoint.convertToQuotedString( mAccessPoint.ssid); + config.isIBSS = mAccessPoint.isIBSS; + config.frequency = mAccessPoint.frequency; } else { config.networkId = mAccessPoint.networkId; + config.isIBSS = mAccessPoint.isIBSS; + config.frequency = mAccessPoint.frequency; } switch (mAccessPointSecurity) { diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index a481b08..85c0afa 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -592,7 +592,8 @@ public class WifiSettings extends SettingsPreferenceFragment mSelectedAccessPoint = (AccessPoint) preference; /** Bypass dialog for unsecured, unsaved networks */ if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && - mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { + mSelectedAccessPoint.networkId == INVALID_NETWORK_ID && + !mSelectedAccessPoint.isIBSS) { mSelectedAccessPoint.generateOpenNetworkConfig(); mWifiManager.connect(mSelectedAccessPoint.getConfig(), mConnectListener); } else { @@ -772,9 +773,8 @@ public class WifiSettings extends SettingsPreferenceFragment final List results = mWifiManager.getScanResults(); if (results != null) { for (ScanResult result : results) { - // Ignore hidden and ad-hoc networks. - if (result.SSID == null || result.SSID.length() == 0 || - result.capabilities.contains("[IBSS]")) { + // Ignore hidden networks. + if (result.SSID == null || result.SSID.length() == 0) { continue; } -- cgit v1.1