diff --git a/res/values/arrays.xml b/res/values/arrays.xml
index f9138c2037e..aeda5856691 100644
--- a/res/values/arrays.xml
+++ b/res/values/arrays.xml
@@ -291,16 +291,27 @@
-
+
- - Open
+ - @string/wifi_security_none
- - WEP
+ - @string/wifi_security_wep
- - WPA/WPA2 PSK
+ - @string/wifi_security_psk_generic
- - 802.1x EAP
+ - @string/wifi_security_eap
+
+
+
+
+
+
+ - @string/wifi_security_none
+
+ - @string/wifi_security_wep
+
+ - @string/wifi_security_psk_generic
diff --git a/res/values/strings.xml b/res/values/strings.xml
index a91e6df8dbc..abf5788bf25 100644
--- a/res/values/strings.xml
+++ b/res/values/strings.xml
@@ -1213,19 +1213,59 @@
(unspecified)
- Remembered
-
- Disabled
+ Saved
+
+ Disabled
+
+ Avoided poor connection
+
+ Authentication problem
Not in range
-
- WPS available
-
- Secured with %1$s
-
- Secured with %1$s (WPS available)
-
- %2$s, secured with %1$s
+
+ WPS available
+
+ \u0020(WPS available)
+
+ Secured with %1$s
+
+ , secured with %1$s
+
+
+ WEP
+
+ WPA
+
+ WPA2
+
+ WPA/WPA2
+
+ @string/wifi_security_short_wpa_wpa2
+
+ 802.1x
+
+
+ None
+
+
+ WEP
+
+ WPA PSK
+
+ WPA2 PSK
+
+ WPA/WPA2 PSK
+
+ @string/wifi_security_wpa_wpa2
+
+ 802.1x EAP
+
+
Connect
diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java
index 818174641f1..799a8da9f2d 100644
--- a/src/com/android/settings/wifi/AccessPoint.java
+++ b/src/com/android/settings/wifi/AccessPoint.java
@@ -16,8 +16,6 @@
package com.android.settings.wifi;
-import com.android.settings.R;
-
import android.content.Context;
import android.net.NetworkInfo.DetailedState;
import android.net.wifi.ScanResult;
@@ -27,35 +25,48 @@ import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.preference.Preference;
+import android.util.Log;
import android.view.View;
import android.widget.ImageView;
-import java.util.Comparator;
+import com.android.settings.R;
class AccessPoint extends Preference {
+ static final String TAG = "Settings.AccessPoint";
private static final String KEY_DETAILEDSTATE = "key_detailedstate";
private static final String KEY_WIFIINFO = "key_wifiinfo";
private static final String KEY_SCANRESULT = "key_scanresult";
private static final String KEY_CONFIG = "key_config";
- private static final int[] STATE_SECURED = {R.attr.state_encrypted};
+ private static final int[] STATE_SECURED = {
+ R.attr.state_encrypted
+ };
private static final int[] STATE_NONE = {};
-
+ /** These values are matched in string arrays -- changes must be kept in sync */
static final int SECURITY_NONE = 0;
static final int SECURITY_WEP = 1;
static final int SECURITY_PSK = 2;
static final int SECURITY_EAP = 3;
+ enum PskType {
+ UNKNOWN,
+ WPA,
+ WPA2,
+ WPA_WPA2
+ }
+
String ssid;
String bssid;
int security;
int networkId;
boolean wpsAvailable = false;
+ PskType pskType = PskType.UNKNOWN;
+
private WifiConfiguration mConfig;
- /*package*/ScanResult mScanResult;
+ /* package */ScanResult mScanResult;
private int mRssi;
private WifiInfo mInfo;
@@ -84,6 +95,52 @@ class AccessPoint extends Preference {
return SECURITY_NONE;
}
+ public String getSecurityString(boolean concise) {
+ Context context = getContext();
+ switch(security) {
+ case SECURITY_EAP:
+ return concise ? context.getString(R.string.wifi_security_short_eap) :
+ context.getString(R.string.wifi_security_eap);
+ case SECURITY_PSK:
+ switch (pskType) {
+ case WPA:
+ return concise ? context.getString(R.string.wifi_security_short_wpa) :
+ context.getString(R.string.wifi_security_wpa);
+ case WPA2:
+ return concise ? context.getString(R.string.wifi_security_short_wpa2) :
+ context.getString(R.string.wifi_security_wpa2);
+ case WPA_WPA2:
+ return concise ? context.getString(R.string.wifi_security_short_wpa_wpa2) :
+ context.getString(R.string.wifi_security_wpa_wpa2);
+ case UNKNOWN:
+ default:
+ return concise ? context.getString(R.string.wifi_security_short_psk_generic)
+ : context.getString(R.string.wifi_security_psk_generic);
+ }
+ case SECURITY_WEP:
+ return concise ? context.getString(R.string.wifi_security_short_wep) :
+ context.getString(R.string.wifi_security_wep);
+ case SECURITY_NONE:
+ default:
+ return concise ? "" : context.getString(R.string.wifi_security_none);
+ }
+ }
+
+ private static PskType getPskType(ScanResult result) {
+ boolean wpa = result.capabilities.contains("WPA-PSK");
+ boolean wpa2 = result.capabilities.contains("WPA2-PSK");
+ if (wpa2 && wpa) {
+ return PskType.WPA_WPA2;
+ } else if (wpa2) {
+ return PskType.WPA2;
+ } else if (wpa) {
+ return PskType.WPA;
+ } else {
+ Log.w(TAG, "Received abnormal flag string: " + result.capabilities);
+ return PskType.UNKNOWN;
+ }
+ }
+
AccessPoint(Context context, WifiConfiguration config) {
super(context);
setWidgetLayoutResource(R.layout.preference_widget_wifi_signal);
@@ -138,6 +195,8 @@ class AccessPoint extends Preference {
bssid = result.BSSID;
security = getSecurity(result);
wpsAvailable = security != SECURITY_EAP && result.capabilities.contains("WPS");
+ if (security == SECURITY_PSK)
+ pskType = getPskType(result);
networkId = -1;
mRssi = result.level;
mScanResult = result;
@@ -185,13 +244,15 @@ class AccessPoint extends Preference {
return ssid.compareToIgnoreCase(other.ssid);
}
-
boolean update(ScanResult result) {
// We do not call refresh() since this is called before onBindView().
if (ssid.equals(result.SSID) && security == getSecurity(result)) {
if (WifiManager.compareSignalLevel(result.level, mRssi) > 0) {
mRssi = result.level;
}
+ // This flag only comes from scans, is not easily saved in config
+ if (security == SECURITY_PSK)
+ pskType = getPskType(result);
return true;
}
return false;
@@ -255,34 +316,46 @@ class AccessPoint extends Preference {
Context context = getContext();
mSignal.setImageLevel(getLevel());
- if (mState != null) {
+ if (mState != null) { // This is the active connection
setSummary(Summary.get(context, mState));
- } else {
- String status = null;
- if (mRssi == Integer.MAX_VALUE) {
- status = context.getString(R.string.wifi_not_in_range);
- } else if (mConfig != null) {
- status = context.getString((mConfig.status == WifiConfiguration.Status.DISABLED) ?
- R.string.wifi_disabled : R.string.wifi_remembered);
+ } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range
+ setSummary(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));
+ break;
+ case WifiConfiguration.DISABLED_DHCP_FAILURE:
+ case WifiConfiguration.DISABLED_DNS_FAILURE:
+ setSummary(context.getString(R.string.wifi_disabled_network_failure));
+ break;
+ case WifiConfiguration.DISABLED_UNKNOWN_REASON:
+ setSummary(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));
}
- if (security == SECURITY_NONE) {
- if (wpsAvailable && mConfig == null) {
- setSummary(context.getString(R.string.wifi_open_with_wps));
+ if (security != SECURITY_NONE) {
+ String securityStrFormat;
+ if (summary.length() == 0) {
+ securityStrFormat = context.getString(R.string.wifi_secured_first_item);
} else {
- setSummary(status);
+ securityStrFormat = context.getString(R.string.wifi_secured_second_item);
}
- } else {
- String format;
- if (wpsAvailable && mConfig == null) {
- format = context.getString(R.string.wifi_secured_with_wps);
- } else {
- format = context.getString((status == null) ?
- R.string.wifi_secured : R.string.wifi_secured_with_status);
- }
- String[] type = context.getResources().getStringArray(R.array.wifi_security);
- setSummary(String.format(format, type[security], status));
+ summary.append(String.format(securityStrFormat, getSecurityString(true)));
}
+
+ if (mConfig == null && wpsAvailable) { // Only list WPS available for unsaved networks
+ if (summary.length() == 0) {
+ summary.append(context.getString(R.string.wifi_wps_available_first_item));
+ } else {
+ summary.append(context.getString(R.string.wifi_wps_available_second_item));
+ }
+ }
+ setSummary(summary.toString());
}
}
}
diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java
index 876fd990c68..f879b85b190 100644
--- a/src/com/android/settings/wifi/WifiConfigController.java
+++ b/src/com/android/settings/wifi/WifiConfigController.java
@@ -158,10 +158,11 @@ public class WifiConfigController implements TextWatcher,
mView.findViewById(R.id.type_ssid).setVisibility(View.VISIBLE);
mView.findViewById(R.id.type_security).setVisibility(View.VISIBLE);
// We want custom layout. The content must be same as the other cases.
- mSecuritySpinner.setAdapter(
- new ArrayAdapter(context, R.layout.wifi_setup_custom_list_item_1,
- android.R.id.text1,
- context.getResources().getStringArray(R.array.wifi_security)));
+
+ ArrayAdapter adapter = new ArrayAdapter(context,
+ R.layout.wifi_setup_custom_list_item_1, android.R.id.text1,
+ context.getResources().getStringArray(R.array.wifi_security_no_eap));
+ mSecuritySpinner.setAdapter(adapter);
} else {
mView.findViewById(R.id.type).setVisibility(View.VISIBLE);
}
@@ -181,8 +182,7 @@ public class WifiConfigController implements TextWatcher,
addRow(group, R.string.wifi_status, Summary.get(mConfigUi.getContext(), state));
}
- String[] type = resources.getStringArray(R.array.wifi_security);
- addRow(group, R.string.wifi_security, type[mAccessPoint.security]);
+ addRow(group, R.string.wifi_security, mAccessPoint.getSecurityString(false));
int level = mAccessPoint.getLevel();
if (level != -1) {
diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java
index b3259e0c027..dff6d2a19e4 100644
--- a/src/com/android/settings/wifi/WifiSettings.java
+++ b/src/com/android/settings/wifi/WifiSettings.java
@@ -511,6 +511,7 @@ public class WifiSettings extends SettingsPreferenceFragment
for (AccessPoint accessPoint : accessPoints) {
if (accessPoint.update(result)) {
found = true;
+ break;
}
}
if (!found) {