diff --git a/res/values/arrays.xml b/res/values/arrays.xml index eec1ffc4aed..0e5c9208c50 100644 --- a/res/values/arrays.xml +++ b/res/values/arrays.xml @@ -17,7 +17,7 @@ ** limitations under the License. */ --> - + @@ -180,6 +180,56 @@ + + + + + + + Scanning\u2026 + + Connecting\u2026 + + Authenticating\u2026 + + Obtaining IP address\u2026 + + Connected + + Suspended + + Disconnecting\u2026 + + Disconnected + + Unsuccessful + + + + + + + + + Scanning\u2026 + + Connecting to %1$s\u2026 + + Authenticating with %1$s\u2026 + + Obtaining IP address from %1$s\u2026 + + Connected to %1$s + + Suspended + + Disconnecting from %1$s\u2026 + + Disconnected + + Unsuccessful + + diff --git a/src/com/android/settings/wifi/Summary.java b/src/com/android/settings/wifi/Summary.java new file mode 100644 index 00000000000..6da2fa5db17 --- /dev/null +++ b/src/com/android/settings/wifi/Summary.java @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.settings.wifi; + +import com.android.settings.R; + +import android.content.Context; +import android.net.NetworkInfo.DetailedState; +import android.text.TextUtils; + +class Summary { + static String get(Context context, String ssid, DetailedState state) { + String[] formats = context.getResources().getStringArray((ssid == null) + ? R.array.wifi_status : R.array.wifi_status_with_ssid); + int index = state.ordinal(); + + if (index >= formats.length || formats[index].length() == 0) { + return null; + } + return String.format(formats[index], ssid); + } + + static String get(Context context, DetailedState state) { + return get(context, null, state); + } +} diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java index d5376dec148..7ede80dd4c0 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -24,6 +24,8 @@ import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.NetworkInfo; +import android.net.wifi.SupplicantState; +import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.preference.Preference; import android.preference.CheckBoxPreference; @@ -45,9 +47,12 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener { if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { handleWifiStateChanged(intent.getIntExtra( WifiManager.EXTRA_WIFI_STATE, WifiManager.WIFI_STATE_UNKNOWN)); + } else if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) { + handleStateChanged(WifiInfo.getDetailedStateOf((SupplicantState) + intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE))); } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { - handleNetworkStateChanged((NetworkInfo) - intent.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO)); + handleStateChanged(((NetworkInfo) intent.getParcelableExtra( + WifiManager.EXTRA_NETWORK_INFO)).getDetailedState()); } } }; @@ -66,6 +71,8 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener { checkBox.setPersistent(false); mIntentFilter = new IntentFilter(WifiManager.WIFI_STATE_CHANGED_ACTION); + // The order matters! We really should not depend on this. :( + mIntentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); mIntentFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); } @@ -128,11 +135,14 @@ public class WifiEnabler implements Preference.OnPreferenceChangeListener { } } - private void handleNetworkStateChanged(NetworkInfo networkInfo) { - if (mWifiManager.isWifiEnabled()) { - String summary = WifiStatus.getStatus(mContext, - mWifiManager.getConnectionInfo().getSSID(), networkInfo.getDetailedState()); - mCheckBox.setSummary(summary); + private void handleStateChanged(NetworkInfo.DetailedState state) { + // WifiInfo is valid if and only if Wi-Fi is enabled. + // Here we use the state of the check box as an optimization. + if (state != null && mCheckBox.isChecked()) { + WifiInfo info = mWifiManager.getConnectionInfo(); + if (info != null) { + mCheckBox.setSummary(Summary.get(mContext, info.getSSID(), state)); + } } } }