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) {