diff --git a/res/values/strings.xml b/res/values/strings.xml index 04960360e84..82c9a67a2ff 100644 --- a/res/values/strings.xml +++ b/res/values/strings.xml @@ -1317,8 +1317,6 @@ Wi\u2011Fi Assistant - - Connected via Wi\u2011Fi assistant Cast screen @@ -1422,8 +1420,6 @@ Error In Airplane mode - - Can\'t scan for networks Network notification @@ -1578,21 +1574,6 @@ (unchanged) (unspecified) - - Saved - - Disabled - - IP Configuration Failure - - WiFi Connection Failure - - Authentication problem - - Not in range - - No Internet Access Detected, won\'t automatically reconnect. WPS available @@ -1602,35 +1583,6 @@ Enter your network password - - 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 - To improve location accuracy and for other purposes, %1$s wants to turn on network scanning, even when Wi-Fi is off.\n\nAllow this for all apps that want to scan? To turn this off, go to Advanced in the overflow menu. diff --git a/src/com/android/settings/AirplaneModeEnabler.java b/src/com/android/settings/AirplaneModeEnabler.java index 5b8ad0d9e9d..06648dbfb7c 100644 --- a/src/com/android/settings/AirplaneModeEnabler.java +++ b/src/com/android/settings/AirplaneModeEnabler.java @@ -29,6 +29,7 @@ import android.provider.Settings; import com.android.internal.telephony.PhoneStateIntentReceiver; import com.android.internal.telephony.TelephonyProperties; +import com.android.settingslib.WirelessUtils; public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListener { @@ -71,7 +72,7 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene public void resume() { - mSwitchPref.setChecked(isAirplaneModeOn(mContext)); + mSwitchPref.setChecked(WirelessUtils.isAirplaneModeOn(mContext)); mPhoneStateReceiver.registerIntent(); mSwitchPref.setOnPreferenceChangeListener(this); @@ -86,11 +87,6 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene mContext.getContentResolver().unregisterContentObserver(mAirplaneModeObserver); } - public static boolean isAirplaneModeOn(Context context) { - return Settings.Global.getInt(context.getContentResolver(), - Settings.Global.AIRPLANE_MODE_ON, 0) != 0; - } - private void setAirplaneModeOn(boolean enabling) { // Change the system setting Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON, @@ -113,7 +109,7 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene * - mobile does not send failure notification, fail on timeout. */ private void onAirplaneModeChanged() { - mSwitchPref.setChecked(isAirplaneModeOn(mContext)); + mSwitchPref.setChecked(WirelessUtils.isAirplaneModeOn(mContext)); } /** diff --git a/src/com/android/settings/WirelessSettings.java b/src/com/android/settings/WirelessSettings.java index e9c39d9d9dc..0bd6b29f9f5 100644 --- a/src/com/android/settings/WirelessSettings.java +++ b/src/com/android/settings/WirelessSettings.java @@ -230,16 +230,6 @@ public class WirelessSettings extends SettingsPreferenceFragment Log.d(TAG, s); } - public static boolean isRadioAllowed(Context context, String type) { - if (!AirplaneModeEnabler.isAirplaneModeOn(context)) { - return true; - } - // Here we use the same logic in onCreate(). - String toggleable = Settings.Global.getString(context.getContentResolver(), - Settings.Global.AIRPLANE_MODE_TOGGLEABLE_RADIOS); - return toggleable != null && toggleable.contains(type); - } - private boolean isSmsSupported() { // Some tablet has sim card but could not do telephony operations. Skip those. return mTm.isSmsCapable(); diff --git a/src/com/android/settings/bluetooth/BluetoothEnabler.java b/src/com/android/settings/bluetooth/BluetoothEnabler.java index b006c656194..188a37a0772 100644 --- a/src/com/android/settings/bluetooth/BluetoothEnabler.java +++ b/src/com/android/settings/bluetooth/BluetoothEnabler.java @@ -24,14 +24,13 @@ import android.content.IntentFilter; import android.os.Handler; import android.os.Message; import android.provider.Settings; -import android.widget.CompoundButton; import android.widget.Switch; import android.widget.Toast; import com.android.settings.R; -import com.android.settings.WirelessSettings; import com.android.settings.search.Index; import com.android.settings.widget.SwitchBar; +import com.android.settingslib.WirelessUtils; /** * BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox @@ -177,7 +176,7 @@ public final class BluetoothEnabler implements SwitchBar.OnSwitchChangeListener public void onSwitchChanged(Switch switchView, boolean isChecked) { // Show toast message if Bluetooth is not allowed in airplane mode if (isChecked && - !WirelessSettings.isRadioAllowed(mContext, Settings.Global.RADIO_BLUETOOTH)) { + !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_BLUETOOTH)) { Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); // Reset switch to off switchView.setChecked(false); diff --git a/src/com/android/settings/wifi/AccessPoint.java b/src/com/android/settings/wifi/AccessPoint.java deleted file mode 100644 index 9c72bbcd789..00000000000 --- a/src/com/android/settings/wifi/AccessPoint.java +++ /dev/null @@ -1,741 +0,0 @@ -/* - * 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.content.pm.PackageManager; -import android.content.pm.PackageManager.NameNotFoundException; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.StateListDrawable; -import android.net.NetworkInfo; -import android.net.NetworkInfo.DetailedState; -import android.net.NetworkInfo.State; -import android.net.wifi.ScanResult; -import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiConfiguration.KeyMgmt; -import android.net.wifi.WifiInfo; -import android.net.wifi.WifiManager; -import android.os.Bundle; -import android.preference.Preference; -import android.util.Log; -import android.util.LruCache; -import android.view.View; -import android.widget.ImageView; -import android.widget.TextView; - -import java.util.Map; - - -class AccessPoint extends Preference { - static final String TAG = "Settings.AccessPoint"; - - /** - * Lower bound on the 2.4 GHz (802.11b/g/n) WLAN channels - */ - public static final int LOWER_FREQ_24GHZ = 2400; - - /** - * Upper bound on the 2.4 GHz (802.11b/g/n) WLAN channels - */ - public static final int HIGHER_FREQ_24GHZ = 2500; - - /** - * Lower bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels - */ - public static final int LOWER_FREQ_5GHZ = 4900; - - /** - * Upper bound on the 5.0 GHz (802.11a/h/j/n/ac) WLAN channels - */ - public static final int HIGHER_FREQ_5GHZ = 5900; - - /** - * Experimental: we should be able to show the user the list of BSSIDs and bands - * for that SSID. - * For now this data is used only with Verbose Logging so as to show the band and number - * of BSSIDs on which that network is seen. - */ - public LruCache mScanResultCache; - - - private static final String KEY_NETWORKINFO = "key_networkinfo"; - 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_NONE = {}; - - private static int[] wifi_signal_attributes = { R.attr.wifi_signal }; - - /** - * 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 = -1; - boolean wpsAvailable = false; - boolean showSummary = true; - - PskType pskType = PskType.UNKNOWN; - - private WifiConfiguration mConfig; - /* package */ScanResult mScanResult; - - private int mRssi = Integer.MAX_VALUE; - private long mSeen = 0; - - private WifiInfo mInfo; - private NetworkInfo mNetworkInfo; - private TextView mSummaryView; - - private static final int VISIBILITY_MAX_AGE_IN_MILLI = 1000000; - private static final int VISIBILITY_OUTDATED_AGE_IN_MILLI = 20000; - private static final int SECOND_TO_MILLI = 1000; - - static int getSecurity(WifiConfiguration config) { - if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { - return SECURITY_PSK; - } - if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) || - config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { - return SECURITY_EAP; - } - return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE; - } - - private static int getSecurity(ScanResult result) { - if (result.capabilities.contains("WEP")) { - return SECURITY_WEP; - } else if (result.capabilities.contains("PSK")) { - return SECURITY_PSK; - } else if (result.capabilities.contains("EAP")) { - return SECURITY_EAP; - } - 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); - loadConfig(config); - refresh(); - } - - AccessPoint(Context context, ScanResult result) { - super(context); - loadResult(result); - refresh(); - } - - AccessPoint(Context context, Bundle savedState) { - super(context); - - mConfig = savedState.getParcelable(KEY_CONFIG); - if (mConfig != null) { - loadConfig(mConfig); - } - mScanResult = (ScanResult) savedState.getParcelable(KEY_SCANRESULT); - if (mScanResult != null) { - loadResult(mScanResult); - } - mInfo = (WifiInfo) savedState.getParcelable(KEY_WIFIINFO); - if (savedState.containsKey(KEY_NETWORKINFO)) { - mNetworkInfo = savedState.getParcelable(KEY_NETWORKINFO); - } - update(mInfo, mNetworkInfo); - } - - public void saveWifiState(Bundle savedState) { - savedState.putParcelable(KEY_CONFIG, mConfig); - savedState.putParcelable(KEY_SCANRESULT, mScanResult); - savedState.putParcelable(KEY_WIFIINFO, mInfo); - if (mNetworkInfo != null) { - savedState.putParcelable(KEY_NETWORKINFO, mNetworkInfo); - } - } - - private void loadConfig(WifiConfiguration config) { - ssid = (config.SSID == null ? "" : removeDoubleQuotes(config.SSID)); - bssid = config.BSSID; - security = getSecurity(config); - networkId = config.networkId; - mConfig = config; - } - - private void loadResult(ScanResult result) { - ssid = result.SSID; - bssid = result.BSSID; - security = getSecurity(result); - wpsAvailable = security != SECURITY_EAP && result.capabilities.contains("WPS"); - if (security == SECURITY_PSK) - pskType = getPskType(result); - mRssi = result.level; - mScanResult = result; - if (result.seen > mSeen) { - mSeen = result.seen; - } - } - - @Override - protected void onBindView(View view) { - super.onBindView(view); - updateIcon(getLevel(), getContext()); - - mSummaryView = (TextView) view.findViewById(com.android.internal.R.id.summary); - mSummaryView.setVisibility(showSummary ? View.VISIBLE : View.GONE); - - notifyChanged(); - } - - protected void updateIcon(int level, Context context) { - if (level == -1) { - setIcon(null); - } else { - Drawable drawable = getIcon(); - - if (drawable == null) { - // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then - // set the icon (drawable) to that state's drawable. - StateListDrawable sld = (StateListDrawable) context.getTheme() - .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0); - // If sld is null then we are indexing and therefore do not have access to - // (nor need to display) the drawable. - if (sld != null) { - sld.setState((security != SECURITY_NONE) ? STATE_SECURED : STATE_NONE); - drawable = sld.getCurrent(); - setIcon(drawable); - } - } - - if (drawable != null) { - drawable.setLevel(level); - } - } - } - - public void showAppIcon() { - PackageManager pm = getContext().getPackageManager(); - String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID); - - Drawable drawable = pm.getDefaultActivityIcon(); - if (mConfig == null) { - drawable.setAlpha(0); - } else if (mConfig.creatorName.equals(systemName)) { - drawable = getContext().getApplicationInfo().loadIcon(pm); - } else { - try { - drawable = pm.getApplicationIcon(mConfig.creatorName); - } catch (NameNotFoundException nnfe) { - // use default app icon - } - } - - setIcon(drawable); - } - - @Override - public int compareTo(Preference preference) { - if (!(preference instanceof AccessPoint)) { - return 1; - } - AccessPoint other = (AccessPoint) preference; - // Active one goes first. - if (isActive() && !other.isActive()) return -1; - if (!isActive() && other.isActive()) return 1; - - // Reachable one goes before unreachable one. - if (mRssi != Integer.MAX_VALUE && other.mRssi == Integer.MAX_VALUE) return -1; - if (mRssi == Integer.MAX_VALUE && other.mRssi != Integer.MAX_VALUE) return 1; - - // Configured one goes before unconfigured one. - if (networkId != WifiConfiguration.INVALID_NETWORK_ID - && other.networkId == WifiConfiguration.INVALID_NETWORK_ID) return -1; - if (networkId == WifiConfiguration.INVALID_NETWORK_ID - && other.networkId != WifiConfiguration.INVALID_NETWORK_ID) return 1; - - // Sort by signal strength. - int difference = WifiManager.compareSignalLevel(other.mRssi, mRssi); - if (difference != 0) { - return difference; - } - // Sort by ssid. - return ssid.compareToIgnoreCase(other.ssid); - } - - @Override - public boolean equals(Object other) { - if (!(other instanceof AccessPoint)) return false; - return (this.compareTo((AccessPoint) other) == 0); - } - - @Override - public int hashCode() { - int result = 0; - if (mInfo != null) result += 13 * mInfo.hashCode(); - result += 19 * mRssi; - result += 23 * networkId; - result += 29 * ssid.hashCode(); - return result; - } - - boolean update(ScanResult result) { - if (result.seen > mSeen) { - mSeen = result.seen; - } - if (WifiSettings.mVerboseLogging > 0) { - if (mScanResultCache == null) { - mScanResultCache = new LruCache(32); - } - mScanResultCache.put(result.BSSID, result); - } - - if (ssid.equals(result.SSID) && security == getSecurity(result)) { - if (WifiManager.compareSignalLevel(result.level, mRssi) > 0) { - int oldLevel = getLevel(); - mRssi = result.level; - if (getLevel() != oldLevel) { - notifyChanged(); - } - } - // This flag only comes from scans, is not easily saved in config - if (security == SECURITY_PSK) { - pskType = getPskType(result); - } - mScanResult = result; - refresh(); - return true; - } - return false; - } - - /** Return whether the given {@link WifiInfo} is for this access point. */ - private boolean isInfoForThisAccessPoint(WifiInfo info) { - if (networkId != WifiConfiguration.INVALID_NETWORK_ID) { - return networkId == info.getNetworkId(); - } else { - // Might be an ephemeral connection with no WifiConfiguration. Try matching on SSID. - // (Note that we only do this if the WifiConfiguration explicitly equals INVALID). - // TODO: Handle hex string SSIDs. - return ssid.equals(removeDoubleQuotes(info.getSSID())); - } - } - - void update(WifiInfo info, NetworkInfo networkInfo) { - boolean reorder = false; - if (info != null && isInfoForThisAccessPoint(info)) { - reorder = (mInfo == null); - mRssi = info.getRssi(); - mInfo = info; - mNetworkInfo = networkInfo; - refresh(); - } else if (mInfo != null) { - reorder = true; - mInfo = null; - mNetworkInfo = null; - refresh(); - } - if (reorder) { - notifyHierarchyChanged(); - } - } - - int getLevel() { - if (mRssi == Integer.MAX_VALUE) { - return -1; - } - return WifiManager.calculateSignalLevel(mRssi, 4); - } - - WifiConfiguration getConfig() { - return mConfig; - } - - WifiInfo getInfo() { - return mInfo; - } - - NetworkInfo getNetworkInfo() { - return mNetworkInfo; - } - - DetailedState getState() { - return mNetworkInfo != null ? mNetworkInfo.getDetailedState() : null; - } - - static String removeDoubleQuotes(String string) { - int length = string.length(); - if ((length > 1) && (string.charAt(0) == '"') - && (string.charAt(length - 1) == '"')) { - return string.substring(1, length - 1); - } - return string; - } - - static String convertToQuotedString(String string) { - return "\"" + string + "\""; - } - - /** - * Shows or Hides the Summary of an AccessPoint. - * - * @param showSummary true will show the summary, false will hide the summary - */ - public void setShowSummary(boolean showSummary) { - this.showSummary = showSummary; - if (mSummaryView != null) { - mSummaryView.setVisibility(showSummary ? View.VISIBLE : View.GONE); - } // otherwise, will be handled in onBindView. - } - - /** - * Returns the visibility status of the WifiConfiguration. - * - * @return autojoin debugging information - * TODO: use a string formatter - * ["rssi 5Ghz", "num results on 5GHz" / "rssi 5Ghz", "num results on 5GHz"] - * For instance [-40,5/-30,2] - */ - private String getVisibilityStatus() { - StringBuilder visibility = new StringBuilder(); - StringBuilder scans24GHz = null; - StringBuilder scans5GHz = null; - String bssid = null; - - long now = System.currentTimeMillis(); - - if (mInfo != null) { - bssid = mInfo.getBSSID(); - if (bssid != null) { - visibility.append(" ").append(bssid); - } - visibility.append(" rssi=").append(mInfo.getRssi()); - visibility.append(" "); - visibility.append(" score=").append(mInfo.score); - visibility.append(String.format(" tx=%.1f,", mInfo.txSuccessRate)); - visibility.append(String.format("%.1f,", mInfo.txRetriesRate)); - visibility.append(String.format("%.1f ", mInfo.txBadRate)); - visibility.append(String.format("rx=%.1f", mInfo.rxSuccessRate)); - } - - if (mScanResultCache != null) { - int rssi5 = WifiConfiguration.INVALID_RSSI; - int rssi24 = WifiConfiguration.INVALID_RSSI; - int num5 = 0; - int num24 = 0; - int numBlackListed = 0; - int n24 = 0; // Number scan results we included in the string - int n5 = 0; // Number scan results we included in the string - Map list = mScanResultCache.snapshot(); - // TODO: sort list by RSSI or age - for (ScanResult result : list.values()) { - if (result.seen == 0) - continue; - - if (result.autoJoinStatus != ScanResult.ENABLED) numBlackListed++; - - if (result.frequency >= LOWER_FREQ_5GHZ - && result.frequency <= HIGHER_FREQ_5GHZ) { - // Strictly speaking: [4915, 5825] - // number of known BSSID on 5GHz band - num5 = num5 + 1; - } else if (result.frequency >= LOWER_FREQ_24GHZ - && result.frequency <= HIGHER_FREQ_24GHZ) { - // Strictly speaking: [2412, 2482] - // number of known BSSID on 2.4Ghz band - num24 = num24 + 1; - } - - // Ignore results seen, older than 20 seconds - if (now - result.seen > VISIBILITY_OUTDATED_AGE_IN_MILLI) continue; - - if (result.frequency >= LOWER_FREQ_5GHZ - && result.frequency <= HIGHER_FREQ_5GHZ) { - if (result.level > rssi5) { - rssi5 = result.level; - } - if (n5 < 4) { - if (scans5GHz == null) scans5GHz = new StringBuilder(); - scans5GHz.append(" \n{").append(result.BSSID); - if (bssid != null && result.BSSID.equals(bssid)) scans5GHz.append("*"); - scans5GHz.append("=").append(result.frequency); - scans5GHz.append(",").append(result.level); - if (result.autoJoinStatus != 0) { - scans5GHz.append(",st=").append(result.autoJoinStatus); - } - if (result.numIpConfigFailures != 0) { - scans5GHz.append(",ipf=").append(result.numIpConfigFailures); - } - scans5GHz.append("}"); - n5++; - } - } else if (result.frequency >= LOWER_FREQ_24GHZ - && result.frequency <= HIGHER_FREQ_24GHZ) { - if (result.level > rssi24) { - rssi24 = result.level; - } - if (n24 < 4) { - if (scans24GHz == null) scans24GHz = new StringBuilder(); - scans24GHz.append(" \n{").append(result.BSSID); - if (bssid != null && result.BSSID.equals(bssid)) scans24GHz.append("*"); - scans24GHz.append("=").append(result.frequency); - scans24GHz.append(",").append(result.level); - if (result.autoJoinStatus != 0) { - scans24GHz.append(",st=").append(result.autoJoinStatus); - } - if (result.numIpConfigFailures != 0) { - scans24GHz.append(",ipf=").append(result.numIpConfigFailures); - } - scans24GHz.append("}"); - n24++; - } - } - } - visibility.append(" ["); - if (num24 > 0) { - visibility.append("(").append(num24).append(")"); - if (n24 <= 4) { - if (scans24GHz != null) { - visibility.append(scans24GHz.toString()); - } - } else { - visibility.append("max=").append(rssi24); - if (scans24GHz != null) { - visibility.append(",").append(scans24GHz.toString()); - } - } - } - visibility.append(";"); - if (num5 > 0) { - visibility.append("(").append(num5).append(")"); - if (n5 <= 4) { - if (scans5GHz != null) { - visibility.append(scans5GHz.toString()); - } - } else { - visibility.append("max=").append(rssi5); - if (scans5GHz != null) { - visibility.append(",").append(scans5GHz.toString()); - } - } - } - if (numBlackListed > 0) - visibility.append("!").append(numBlackListed); - visibility.append("]"); - } else { - if (mRssi != Integer.MAX_VALUE) { - visibility.append(" rssi="); - visibility.append(mRssi); - if (mScanResult != null) { - visibility.append(", f="); - visibility.append(mScanResult.frequency); - } - } - } - - return visibility.toString(); - } - - /** - * Return whether this is the active connection. - * For ephemeral connections (networkId is invalid), this returns false if the network is - * disconnected. - */ - boolean isActive() { - return mNetworkInfo != null && - (networkId != WifiConfiguration.INVALID_NETWORK_ID || - mNetworkInfo.getState() != State.DISCONNECTED); - } - - /** - * Updates the title and summary; may indirectly call notifyChanged(). - */ - private void refresh() { - setTitle(ssid); - - final Context context = getContext(); - updateIcon(getLevel(), context); - - // Force new summary - setSummary(null); - - // Update to new summary - StringBuilder summary = new StringBuilder(); - - if (isActive()) { // This is the active connection - summary.append(Summary.get(context, getState(), - networkId == WifiConfiguration.INVALID_NETWORK_ID)); - } else if (mConfig != null - && mConfig.hasNoInternetAccess()) { - summary.append(context.getString(R.string.wifi_no_internet)); - } else if (mConfig != null && ((mConfig.status == WifiConfiguration.Status.DISABLED && - mConfig.disableReason != WifiConfiguration.DISABLED_UNKNOWN_REASON) - || mConfig.autoJoinStatus - >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE)) { - if (mConfig.autoJoinStatus - >= WifiConfiguration.AUTO_JOIN_DISABLED_ON_AUTH_FAILURE) { - if (mConfig.disableReason == WifiConfiguration.DISABLED_DHCP_FAILURE) { - summary.append(context.getString(R.string.wifi_disabled_network_failure)); - } else if (mConfig.disableReason == WifiConfiguration.DISABLED_AUTH_FAILURE) { - summary.append(context.getString(R.string.wifi_disabled_password_failure)); - } else { - summary.append(context.getString(R.string.wifi_disabled_wifi_failure)); - } - } else { - switch (mConfig.disableReason) { - case WifiConfiguration.DISABLED_AUTH_FAILURE: - summary.append(context.getString(R.string.wifi_disabled_password_failure)); - break; - case WifiConfiguration.DISABLED_DHCP_FAILURE: - case WifiConfiguration.DISABLED_DNS_FAILURE: - summary.append(context.getString(R.string.wifi_disabled_network_failure)); - break; - case WifiConfiguration.DISABLED_UNKNOWN_REASON: - case WifiConfiguration.DISABLED_ASSOCIATION_REJECT: - summary.append(context.getString(R.string.wifi_disabled_generic)); - break; - } - } - } else if (mRssi == Integer.MAX_VALUE) { // Wifi out of range - summary.append(context.getString(R.string.wifi_not_in_range)); - } else { // In range, not disabled. - if (mConfig != null) { // Is saved network - summary.append(context.getString(R.string.wifi_remembered)); - } - } - - if (WifiSettings.mVerboseLogging > 0) { - // Add RSSI/band information for this config, what was seen up to 6 seconds ago - // verbose WiFi Logging is only turned on thru developers settings - if (mInfo != null && mNetworkInfo != null) { // This is the active connection - summary.append(" f=" + Integer.toString(mInfo.getFrequency())); - } - summary.append(" " + getVisibilityStatus()); - if (mConfig != null && mConfig.autoJoinStatus > 0) { - summary.append(" (" + mConfig.autoJoinStatus); - if (mConfig.blackListTimestamp > 0) { - long now = System.currentTimeMillis(); - long diff = (now - mConfig.blackListTimestamp)/1000; - long sec = diff%60; //seconds - long min = (diff/60)%60; //minutes - long hour = (min/60)%60; //hours - summary.append(", "); - if (hour > 0) summary.append(Long.toString(hour) + "h "); - summary.append( Long.toString(min) + "m "); - summary.append( Long.toString(sec) + "s "); - } - summary.append(")"); - } - if (mConfig != null && mConfig.numIpConfigFailures > 0) { - summary.append(" ipf=").append(mConfig.numIpConfigFailures); - } - if (mConfig != null && mConfig.numConnectionFailures > 0) { - summary.append(" cf=").append(mConfig.numConnectionFailures); - } - if (mConfig != null && mConfig.numAuthFailures > 0) { - summary.append(" authf=").append(mConfig.numAuthFailures); - } - if (mConfig != null && mConfig.numNoInternetAccessReports > 0) { - summary.append(" noInt=").append(mConfig.numNoInternetAccessReports); - } - } - - if (summary.length() > 0) { - setSummary(summary.toString()); - setShowSummary(true); - } else { - setShowSummary(false); - } - } - - /** - * Generate and save a default wifiConfiguration with common values. - * Can only be called for unsecured networks. - * @hide - */ - protected void generateOpenNetworkConfig() { - if (security != SECURITY_NONE) - throw new IllegalStateException(); - if (mConfig != null) - return; - mConfig = new WifiConfiguration(); - mConfig.SSID = AccessPoint.convertToQuotedString(ssid); - mConfig.allowedKeyManagement.set(KeyMgmt.NONE); - } -} diff --git a/src/com/android/settings/wifi/AccessPointPreference.java b/src/com/android/settings/wifi/AccessPointPreference.java new file mode 100644 index 00000000000..397543458a9 --- /dev/null +++ b/src/com/android/settings/wifi/AccessPointPreference.java @@ -0,0 +1,152 @@ +/* + * Copyright (C) 2015 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 android.content.Context; +import android.content.pm.PackageManager; +import android.content.pm.PackageManager.NameNotFoundException; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.StateListDrawable; +import android.net.wifi.WifiConfiguration; +import android.preference.Preference; +import android.view.View; +import android.widget.TextView; + +import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; + +public class AccessPointPreference extends Preference { + + private static final int[] STATE_SECURED = { + R.attr.state_encrypted + }; + private static final int[] STATE_NONE = {}; + + private static int[] wifi_signal_attributes = { R.attr.wifi_signal }; + + private TextView mSummaryView; + private boolean showSummary = true; + private AccessPoint mAccessPoint; + + public AccessPointPreference(AccessPoint accessPoint, Context context) { + super(context); + mAccessPoint = accessPoint; + mAccessPoint.setTag(this); + refresh(); + } + + public AccessPoint getAccessPoint() { + return mAccessPoint; + } + + @Override + protected void onBindView(View view) { + super.onBindView(view); + updateIcon(mAccessPoint.getLevel(), getContext()); + + mSummaryView = (TextView) view.findViewById(com.android.internal.R.id.summary); + mSummaryView.setVisibility(showSummary ? View.VISIBLE : View.GONE); + + notifyChanged(); + } + + public void showAppIcon() { + PackageManager pm = getContext().getPackageManager(); + String systemName = pm.getNameForUid(android.os.Process.SYSTEM_UID); + WifiConfiguration mConfig = mAccessPoint.getConfig(); + + Drawable drawable = pm.getDefaultActivityIcon(); + if (mConfig == null) { + drawable.setAlpha(0); + } else if (mConfig.creatorName.equals(systemName)) { + drawable = getContext().getApplicationInfo().loadIcon(pm); + } else { + try { + drawable = pm.getApplicationIcon(mConfig.creatorName); + } catch (NameNotFoundException nnfe) { + // use default app icon + } + } + + setIcon(drawable); + } + + protected void updateIcon(int level, Context context) { + if (level == -1) { + setIcon(null); + } else { + Drawable drawable = getIcon(); + + if (drawable == null) { + // To avoid a drawing race condition, we first set the state (SECURE/NONE) and then + // set the icon (drawable) to that state's drawable. + StateListDrawable sld = (StateListDrawable) context.getTheme() + .obtainStyledAttributes(wifi_signal_attributes).getDrawable(0); + // If sld is null then we are indexing and therefore do not have access to + // (nor need to display) the drawable. + if (sld != null) { + sld.setState((mAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE) + ? STATE_SECURED + : STATE_NONE); + drawable = sld.getCurrent(); + setIcon(drawable); + } + } + + if (drawable != null) { + drawable.setLevel(level); + } + } + } + + /** + * Shows or Hides the Summary of an AccessPoint. + * + * @param showSummary true will show the summary, false will hide the summary + */ + public void setShowSummary(boolean showSummary) { + this.showSummary = showSummary; + if (mSummaryView != null) { + mSummaryView.setVisibility(showSummary ? View.VISIBLE : View.GONE); + } // otherwise, will be handled in onBindView. + } + + /** + * Updates the title and summary; may indirectly call notifyChanged(). + */ + public void refresh() { + setTitle(mAccessPoint.getSsid()); + + final Context context = getContext(); + updateIcon(mAccessPoint.getLevel(), context); + + // Force new summary + setSummary(null); + + String summary = mAccessPoint.getSummary(); + if (summary.length() > 0) { + setSummary(summary); + setShowSummary(true); + } else { + setShowSummary(false); + } + } + + public void onLevelChanged() { + notifyChanged(); + } + +} diff --git a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java index bea720cf441..e92bda7efc6 100644 --- a/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java +++ b/src/com/android/settings/wifi/SavedAccessPointsWifiSettings.java @@ -20,28 +20,22 @@ import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; import android.content.res.Resources; -import android.net.wifi.ScanResult; -import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Bundle; import android.preference.Preference; -import android.preference.Preference.OnPreferenceClickListener; import android.preference.PreferenceScreen; - -import com.android.settings.search.BaseSearchIndexProvider; -import com.android.settings.search.Indexable; -import com.android.settings.search.SearchIndexableRaw; - import android.util.Log; -import android.view.View; import com.android.settings.R; import com.android.settings.SettingsPreferenceFragment; +import com.android.settings.search.BaseSearchIndexProvider; +import com.android.settings.search.Indexable; +import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.wifi.AccessPoint; +import com.android.settingslib.wifi.WifiTracker; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; -import java.util.Map; /** * UI to manage saved networks/access points. @@ -88,14 +82,17 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment PreferenceScreen preferenceScreen = getPreferenceScreen(); final Context context = getActivity(); - mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - final List accessPoints = constructSavedAccessPoints(context, mWifiManager); + final List accessPoints = WifiTracker.getCurrentAccessPoints(context, true, + false); preferenceScreen.removeAll(); final int accessPointsSize = accessPoints.size(); for (int i = 0; i < accessPointsSize; ++i){ - preferenceScreen.addPreference(accessPoints.get(i)); + AccessPointPreference preference = new AccessPointPreference(accessPoints.get(i), + context); + preference.setShowSummary(false); + preferenceScreen.addPreference(preference); } if(getPreferenceScreen().getPreferenceCount() < 1) { @@ -103,62 +100,14 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment } } - private static List constructSavedAccessPoints(Context context, - WifiManager wifiManager){ - List accessPoints = new ArrayList(); - Map> resultsMap = new HashMap>(); - - final List configs = wifiManager.getConfiguredNetworks(); - final List scanResults = wifiManager.getScanResults(); - - if (configs != null) { - //Construct a Map for quick searching of a wifi network via ssid. - final int scanResultsSize = scanResults.size(); - for (int i = 0; i < scanResultsSize; ++i){ - final ScanResult result = scanResults.get(i); - List res = resultsMap.get(result.SSID); - - if(res == null){ - res = new ArrayList(); - resultsMap.put(result.SSID, res); - } - - res.add(result); - } - - final int configsSize = configs.size(); - for (int i = 0; i < configsSize; ++i){ - WifiConfiguration config = configs.get(i); - if (config.selfAdded && config.numAssociation == 0) { - continue; - } - AccessPoint accessPoint = new AccessPoint(context, config); - final List results = resultsMap.get(accessPoint.ssid); - - accessPoint.setShowSummary(false); - if(results != null){ - final int resultsSize = results.size(); - for (int j = 0; j < resultsSize; ++j){ - accessPoint.update(results.get(j)); - accessPoint.setIcon(null); - } - } - - accessPoints.add(accessPoint); - } - } - - return accessPoints; - } - - private void showDialog(AccessPoint accessPoint, boolean edit) { + private void showDialog(AccessPointPreference accessPoint, boolean edit) { if (mDialog != null) { removeDialog(WifiSettings.WIFI_DIALOG_ID); mDialog = null; } // Save the access point and edit mode - mDlgAccessPoint = accessPoint; + mDlgAccessPoint = accessPoint.getAccessPoint(); showDialog(WifiSettings.WIFI_DIALOG_ID); } @@ -198,16 +147,16 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment @Override public void onClick(DialogInterface dialogInterface, int button) { if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) { - mWifiManager.forget(mSelectedAccessPoint.networkId, null); - getPreferenceScreen().removePreference(mSelectedAccessPoint); + mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, null); + getPreferenceScreen().removePreference((Preference) mSelectedAccessPoint.getTag()); mSelectedAccessPoint = null; } } @Override public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { - if (preference instanceof AccessPoint) { - showDialog((AccessPoint) preference, false); + if (preference instanceof AccessPointPreference) { + showDialog((AccessPointPreference) preference, false); return true; } else{ return super.onPreferenceTreeClick(screen, preference); @@ -233,15 +182,13 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment result.add(data); // Add available Wi-Fi access points - WifiManager wifiManager = - (WifiManager) context.getSystemService(Context.WIFI_SERVICE); - final List accessPoints = - constructSavedAccessPoints(context, wifiManager); + final List accessPoints = WifiTracker.getCurrentAccessPoints(context, + true, false); final int accessPointsSize = accessPoints.size(); for (int i = 0; i < accessPointsSize; ++i){ data = new SearchIndexableRaw(context); - data.title = accessPoints.get(i).getTitle().toString(); + data.title = accessPoints.get(i).getSsid(); data.screenTitle = title; data.enabled = enabled; result.add(data); diff --git a/src/com/android/settings/wifi/Summary.java b/src/com/android/settings/wifi/Summary.java deleted file mode 100644 index 123f64a8a73..00000000000 --- a/src/com/android/settings/wifi/Summary.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * 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; - -class Summary { - static String get(Context context, String ssid, DetailedState state, boolean isEphemeral) { - if (state == DetailedState.CONNECTED && isEphemeral && ssid == null) { - // Special case for connected + ephemeral networks. - return context.getString(R.string.connected_via_wfa); - } - - 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, boolean isEphemeral) { - return get(context, null, state, isEphemeral); - } -} diff --git a/src/com/android/settings/wifi/WifiConfigController.java b/src/com/android/settings/wifi/WifiConfigController.java index 643ccb810a1..a5d076575d6 100644 --- a/src/com/android/settings/wifi/WifiConfigController.java +++ b/src/com/android/settings/wifi/WifiConfigController.java @@ -16,8 +16,6 @@ package com.android.settings.wifi; -import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; - import android.content.Context; import android.content.res.Resources; import android.net.IpConfiguration; @@ -27,7 +25,6 @@ import android.net.LinkAddress; import android.net.NetworkInfo.DetailedState; import android.net.NetworkUtils; import android.net.ProxyInfo; -import android.net.RouteInfo; import android.net.StaticIpConfiguration; import android.net.Uri; import android.net.wifi.WifiConfiguration; @@ -38,7 +35,6 @@ import android.net.wifi.WifiEnterpriseConfig.Eap; import android.net.wifi.WifiEnterpriseConfig.Phase2; import android.net.wifi.WifiInfo; import android.os.Handler; -import android.os.UserHandle; import android.security.Credentials; import android.security.KeyStore; import android.text.Editable; @@ -60,6 +56,7 @@ import android.widget.TextView; import com.android.settings.ProxySelector; import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; import java.net.InetAddress; import java.net.Inet4Address; @@ -156,7 +153,7 @@ public class WifiConfigController implements TextWatcher, mView = view; mAccessPoint = accessPoint; mAccessPointSecurity = (accessPoint == null) ? AccessPoint.SECURITY_NONE : - accessPoint.security; + accessPoint.getSecurity(); mEdit = edit; mTextViewChangedHandler = new Handler(); @@ -209,12 +206,12 @@ public class WifiConfigController implements TextWatcher, mConfigUi.setSubmitButton(res.getString(R.string.wifi_save)); } else { - mConfigUi.setTitle(mAccessPoint.ssid); + mConfigUi.setTitle(mAccessPoint.getSsid()); ViewGroup group = (ViewGroup) mView.findViewById(R.id.info); boolean showAdvancedFields = false; - if (mAccessPoint.networkId != INVALID_NETWORK_ID) { + if (mAccessPoint.isSaved()) { WifiConfiguration config = mAccessPoint.getConfig(); if (config.getIpAssignment() == IpAssignment.STATIC) { mIpSettingsSpinner.setSelection(STATIC_IP); @@ -241,7 +238,7 @@ public class WifiConfigController implements TextWatcher, } } - if ((mAccessPoint.networkId == INVALID_NETWORK_ID && !mAccessPoint.isActive()) + if ((!mAccessPoint.isSaved() && !mAccessPoint.isActive()) || mEdit) { showSecurityFields(); showIpConfigFields(); @@ -258,16 +255,15 @@ public class WifiConfigController implements TextWatcher, if (mEdit) { mConfigUi.setSubmitButton(res.getString(R.string.wifi_save)); } else { - final DetailedState state = mAccessPoint.getState(); + final DetailedState state = mAccessPoint.getDetailedState(); final String signalLevel = getSignalString(); if (state == null && signalLevel != null) { mConfigUi.setSubmitButton(res.getString(R.string.wifi_connect)); } else { if (state != null) { - addRow(group, R.string.wifi_status, Summary.get(mConfigUi.getContext(), - state, mAccessPoint.networkId == - WifiConfiguration.INVALID_NETWORK_ID)); + addRow(group, R.string.wifi_status, AccessPoint.getSummary( + mConfigUi.getContext(), state, !mAccessPoint.isSaved())); } if (signalLevel != null) { @@ -301,14 +297,14 @@ public class WifiConfigController implements TextWatcher, addRow(group, R.string.wifi_security, mAccessPoint.getSecurityString(false)); mView.findViewById(R.id.ip_fields).setVisibility(View.GONE); } - if (mAccessPoint.networkId != INVALID_NETWORK_ID || mAccessPoint.isActive()) { + if (mAccessPoint.isSaved() || mAccessPoint.isActive()) { mConfigUi.setForgetButton(res.getString(R.string.wifi_forget)); } } } if ((mEdit) || (mAccessPoint != null - && mAccessPoint.getState() == null && mAccessPoint.getLevel() != -1)){ + && mAccessPoint.getDetailedState() == null && mAccessPoint.getLevel() != -1)){ mConfigUi.setCancelButton(res.getString(R.string.wifi_cancel)); }else{ mConfigUi.setCancelButton(res.getString(R.string.wifi_display_options_done)); @@ -353,7 +349,7 @@ public class WifiConfigController implements TextWatcher, } if ((mSsidView != null && mSsidView.length() == 0) || - ((mAccessPoint == null || mAccessPoint.networkId == INVALID_NETWORK_ID) && + ((mAccessPoint == null || !mAccessPoint.isSaved()) && passwordInvalid)) { enabled = false; } else { @@ -367,7 +363,7 @@ public class WifiConfigController implements TextWatcher, } /* package */ WifiConfiguration getConfig() { - if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID && !mEdit) { + if (mAccessPoint != null && mAccessPoint.isSaved() && !mEdit) { return null; } @@ -378,11 +374,11 @@ public class WifiConfigController implements TextWatcher, mSsidView.getText().toString()); // If the user adds a network manually, assume that it is hidden. config.hiddenSSID = true; - } else if (mAccessPoint.networkId == INVALID_NETWORK_ID) { + } else if (!mAccessPoint.isSaved()) { config.SSID = AccessPoint.convertToQuotedString( - mAccessPoint.ssid); + mAccessPoint.getSsid()); } else { - config.networkId = mAccessPoint.networkId; + config.networkId = mAccessPoint.getConfig().networkId; } switch (mAccessPointSecurity) { @@ -628,7 +624,7 @@ public class WifiConfigController implements TextWatcher, ((CheckBox) mView.findViewById(R.id.show_password)) .setOnCheckedChangeListener(this); - if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID) { + if (mAccessPoint != null && mAccessPoint.isSaved()) { mPasswordView.setHint(R.string.wifi_unchanged); } } @@ -652,7 +648,7 @@ public class WifiConfigController implements TextWatcher, loadCertificates(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY); // Modifying an existing network - if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID) { + if (mAccessPoint != null && mAccessPoint.isSaved()) { WifiEnterpriseConfig enterpriseConfig = mAccessPoint.getConfig().enterpriseConfig; int eapMethod = enterpriseConfig.getEapMethod(); int phase2Method = enterpriseConfig.getPhase2Method(); @@ -794,7 +790,7 @@ public class WifiConfigController implements TextWatcher, mView.findViewById(R.id.ip_fields).setVisibility(View.VISIBLE); - if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID) { + if (mAccessPoint != null && mAccessPoint.isSaved()) { config = mAccessPoint.getConfig(); } @@ -846,7 +842,7 @@ public class WifiConfigController implements TextWatcher, mView.findViewById(R.id.proxy_settings_fields).setVisibility(View.VISIBLE); - if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID) { + if (mAccessPoint != null && mAccessPoint.isSaved()) { config = mAccessPoint.getConfig(); } diff --git a/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java b/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java index 440e6946fce..62bb5e170e2 100644 --- a/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java +++ b/src/com/android/settings/wifi/WifiConfigUiForSetupWizardXL.java @@ -17,6 +17,7 @@ package com.android.settings.wifi; import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; import android.content.Context; import android.os.Handler; diff --git a/src/com/android/settings/wifi/WifiDialog.java b/src/com/android/settings/wifi/WifiDialog.java index 942c5dd871c..1f03fe3d7cf 100644 --- a/src/com/android/settings/wifi/WifiDialog.java +++ b/src/com/android/settings/wifi/WifiDialog.java @@ -17,6 +17,7 @@ package com.android.settings.wifi; import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; import android.app.AlertDialog; import android.content.Context; diff --git a/src/com/android/settings/wifi/WifiEnabler.java b/src/com/android/settings/wifi/WifiEnabler.java index 0952941becf..754dbaa26cf 100644 --- a/src/com/android/settings/wifi/WifiEnabler.java +++ b/src/com/android/settings/wifi/WifiEnabler.java @@ -31,9 +31,9 @@ import android.widget.Switch; import android.widget.Toast; import com.android.settings.R; -import com.android.settings.WirelessSettings; import com.android.settings.search.Index; import com.android.settings.widget.SwitchBar; +import com.android.settingslib.WirelessUtils; import java.util.concurrent.atomic.AtomicBoolean; @@ -196,7 +196,7 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener { return; } // Show toast message if Wi-Fi is not allowed in airplane mode - if (isChecked && !WirelessSettings.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) { + if (isChecked && !WirelessUtils.isRadioAllowed(mContext, Settings.Global.RADIO_WIFI)) { Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show(); // Reset switch to off. No infinite check/listenenr loop. mSwitchBar.setChecked(false); diff --git a/src/com/android/settings/wifi/WifiSettings.java b/src/com/android/settings/wifi/WifiSettings.java index 7b6d076b39d..a4ecf0e9323 100644 --- a/src/com/android/settings/wifi/WifiSettings.java +++ b/src/com/android/settings/wifi/WifiSettings.java @@ -18,31 +18,22 @@ package com.android.settings.wifi; import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID; import static android.os.UserManager.DISALLOW_CONFIG_WIFI; - import android.app.Activity; import android.app.Dialog; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.IntentFilter; import android.content.res.Resources; import android.content.res.TypedArray; import android.location.LocationManager; import android.net.ConnectivityManager; import android.net.NetworkInfo; -import android.net.NetworkInfo.DetailedState; import android.net.NetworkInfo.State; -import android.net.wifi.ScanResult; import android.net.wifi.WifiConfiguration; -import android.net.wifi.WifiInfo; import android.net.wifi.WifiManager; import android.net.wifi.WpsInfo; import android.nfc.NfcAdapter; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; -import android.os.UserHandle; import android.preference.Preference; import android.preference.PreferenceScreen; import android.util.Log; @@ -62,13 +53,13 @@ import com.android.settings.SettingsActivity; import com.android.settings.search.BaseSearchIndexProvider; import com.android.settings.search.Indexable; import com.android.settings.search.SearchIndexableRaw; +import com.android.settingslib.wifi.AccessPoint; +import com.android.settingslib.wifi.AccessPoint.AccessPointListener; +import com.android.settingslib.wifi.WifiTracker; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; /** * Two types of UI are provided here. @@ -79,7 +70,8 @@ import java.util.concurrent.atomic.AtomicBoolean; * and menus. */ public class WifiSettings extends RestrictedSettingsFragment - implements DialogInterface.OnClickListener, Indexable { + implements DialogInterface.OnClickListener, Indexable, WifiTracker.WifiListener, + AccessPointListener { private static final String TAG = "WifiSettings"; @@ -100,20 +92,13 @@ public class WifiSettings extends RestrictedSettingsFragment private static final int WPS_PIN_DIALOG_ID = 3; private static final int WRITE_NFC_DIALOG_ID = 6; - // Combo scans can take 5-6s to complete - set to 10s. - private static final int WIFI_RESCAN_INTERVAL_MS = 10 * 1000; - // Instance state keys private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode"; private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state"; private static boolean savedNetworksExist; - private final IntentFilter mFilter; - private final BroadcastReceiver mReceiver; - private final Scanner mScanner; - - /* package */ WifiManager mWifiManager; + protected WifiManager mWifiManager; private WifiManager.ActionListener mConnectListener; private WifiManager.ActionListener mSaveListener; private WifiManager.ActionListener mForgetListener; @@ -122,11 +107,6 @@ public class WifiSettings extends RestrictedSettingsFragment // An access point being editted is stored here. private AccessPoint mSelectedAccessPoint; - private NetworkInfo mLastNetworkInfo; - private WifiInfo mLastInfo; - - private final AtomicBoolean mConnected = new AtomicBoolean(false); - private WifiDialog mDialog; private WriteWifiConfigToNfcDialog mWifiToNfcDialog; @@ -150,98 +130,20 @@ public class WifiSettings extends RestrictedSettingsFragment private AccessPoint mDlgAccessPoint; private Bundle mAccessPointSavedState; - /** verbose logging flag. this flag is set thru developer debugging options - * and used so as to assist with in-the-field WiFi connectivity debugging */ - public static int mVerboseLogging = 0; + private WifiTracker mWifiTracker; /* End of "used in Wifi Setup context" */ - /** A restricted multimap for use in constructAccessPoints */ - private static class Multimap { - private final HashMap> store = new HashMap>(); - /** retrieve a non-null list of values with key K */ - List getAll(K key) { - List values = store.get(key); - return values != null ? values : Collections.emptyList(); - } - - void put(K key, V val) { - List curVals = store.get(key); - if (curVals == null) { - curVals = new ArrayList(3); - store.put(key, curVals); - } - curVals.add(val); - } - } - - private static class Scanner extends Handler { - private int mRetry = 0; - private WifiSettings mWifiSettings = null; - - Scanner(WifiSettings wifiSettings) { - mWifiSettings = wifiSettings; - } - - void resume() { - if (!hasMessages(0)) { - sendEmptyMessage(0); - } - } - - void forceScan() { - removeMessages(0); - sendEmptyMessage(0); - } - - void pause() { - mRetry = 0; - removeMessages(0); - } - - @Override - public void handleMessage(Message message) { - if (mWifiSettings.mWifiManager.startScan()) { - mRetry = 0; - } else if (++mRetry >= 3) { - mRetry = 0; - Activity activity = mWifiSettings.getActivity(); - if (activity != null) { - Toast.makeText(activity, R.string.wifi_fail_to_scan, Toast.LENGTH_LONG).show(); - } - return; - } - sendEmptyMessageDelayed(0, WIFI_RESCAN_INTERVAL_MS); - } - } - public WifiSettings() { super(DISALLOW_CONFIG_WIFI); - mFilter = new IntentFilter(); - mFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION); - mFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); - mFilter.addAction(WifiManager.NETWORK_IDS_CHANGED_ACTION); - mFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); - mFilter.addAction(WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION); - mFilter.addAction(WifiManager.LINK_CONFIGURATION_CHANGED_ACTION); - mFilter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION); - mFilter.addAction(WifiManager.RSSI_CHANGED_ACTION); - - mReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - handleEvent(intent); - } - }; - - mScanner = new Scanner(this); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); - mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); + mWifiTracker = new WifiTracker(getActivity(), this, true, true); + mWifiManager = mWifiTracker.getManager(); mConnectListener = new WifiManager.ActionListener() { @Override @@ -321,14 +223,14 @@ public class WifiSettings extends RestrictedSettingsFragment if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) { String ssid = intent.getStringExtra(EXTRA_START_CONNECT_SSID); - updateAccessPoints(); + onAccessPointsChanged(); PreferenceScreen preferenceScreen = getPreferenceScreen(); for (int i = 0; i < preferenceScreen.getPreferenceCount(); i++) { Preference preference = preferenceScreen.getPreference(i); - if (preference instanceof AccessPoint) { - AccessPoint accessPoint = (AccessPoint) preference; - if (ssid.equals(accessPoint.ssid) && accessPoint.networkId == -1 - && accessPoint.security != AccessPoint.SECURITY_NONE) { + if (preference instanceof AccessPointPreference) { + AccessPoint accessPoint = ((AccessPointPreference) preference).getAccessPoint(); + if (ssid.equals(accessPoint.getSsid()) && !accessPoint.isSaved() + && accessPoint.getSecurity() != AccessPoint.SECURITY_NONE) { onPreferenceTreeClick(preferenceScreen, preference); break; } @@ -370,8 +272,7 @@ public class WifiSettings extends RestrictedSettingsFragment mWifiEnabler.resume(activity); } - activity.registerReceiver(mReceiver, mFilter); - updateAccessPoints(); + mWifiTracker.startTracking(); } @Override @@ -381,8 +282,7 @@ public class WifiSettings extends RestrictedSettingsFragment mWifiEnabler.pause(); } - getActivity().unregisterReceiver(mReceiver); - mScanner.pause(); + mWifiTracker.stopTracking(); } @Override @@ -398,7 +298,7 @@ public class WifiSettings extends RestrictedSettingsFragment * @param menu */ void addOptionsMenuItems(Menu menu) { - final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); + final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled(); TypedArray ta = getActivity().getTheme().obtainStyledAttributes( new int[] {R.attr.ic_menu_add, R.attr.ic_wps}); menu.add(Menu.NONE, MENU_ID_ADD_NETWORK, 0, R.string.wifi_add_network) @@ -463,12 +363,10 @@ public class WifiSettings extends RestrictedSettingsFragment showDialog(WPS_PIN_DIALOG_ID); return true; case MENU_ID_SCAN: - if (mWifiManager.isWifiEnabled()) { - mScanner.forceScan(); - } + mWifiTracker.forceScan(); return true; case MENU_ID_ADD_NETWORK: - if (mWifiManager.isWifiEnabled()) { + if (mWifiTracker.isWifiEnabled()) { onAddNetworkPressed(); } return true; @@ -502,7 +400,7 @@ public class WifiSettings extends RestrictedSettingsFragment } else { showAppMenuItem.setTitle(R.string.wifi_menu_apps); } - updateAccessPoints(); + onAccessPointsChanged(); return true; } return super.onOptionsItemSelected(item); @@ -514,28 +412,24 @@ public class WifiSettings extends RestrictedSettingsFragment Preference preference = (Preference) getListView().getItemAtPosition( ((AdapterContextMenuInfo) info).position); - if (preference instanceof AccessPoint) { - mSelectedAccessPoint = (AccessPoint) preference; - menu.setHeaderTitle(mSelectedAccessPoint.ssid); - if (mSelectedAccessPoint.getLevel() != -1) { - if (mSelectedAccessPoint.getState() == null) { - menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); - } + if (preference instanceof AccessPointPreference) { + mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint(); + menu.setHeaderTitle(mSelectedAccessPoint.getSsid()); + if (mSelectedAccessPoint.isConnectable()) { + menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect); } - if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID || - (mSelectedAccessPoint.getNetworkInfo() != null && - mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED)) { + if (mSelectedAccessPoint.isSaved() || mSelectedAccessPoint.isEphemeral()) { // Allow forgetting a network if either the network is saved or ephemerally // connected. (In the latter case, "forget" blacklists the network so it won't // be used again, ephemerally). menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget); } - if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { + if (mSelectedAccessPoint.isSaved()) { menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify); NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity()); if (nfcAdapter != null && nfcAdapter.isEnabled() && - mSelectedAccessPoint.security != AccessPoint.SECURITY_NONE) { + mSelectedAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE) { // Only allow writing of NFC tags for password-protected networks. menu.add(Menu.NONE, MENU_ID_WRITE_NFC, 0, R.string.wifi_menu_write_to_nfc); } @@ -551,9 +445,9 @@ public class WifiSettings extends RestrictedSettingsFragment } switch (item.getItemId()) { case MENU_ID_CONNECT: { - if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { - connect(mSelectedAccessPoint.networkId); - } else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) { + if (mSelectedAccessPoint.isSaved()) { + connect(mSelectedAccessPoint.getConfig()); + } else if (mSelectedAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE) { /** Bypass dialog for unsecured networks */ mSelectedAccessPoint.generateOpenNetworkConfig(); connect(mSelectedAccessPoint.getConfig()); @@ -580,12 +474,11 @@ public class WifiSettings extends RestrictedSettingsFragment @Override public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) { - if (preference instanceof AccessPoint) { - mSelectedAccessPoint = (AccessPoint) preference; + if (preference instanceof AccessPointPreference) { + mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint(); /** Bypass dialog for unsecured, unsaved, and inactive networks */ - if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE && - mSelectedAccessPoint.networkId == INVALID_NETWORK_ID && - !mSelectedAccessPoint.isActive()) { + if (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE && + !mSelectedAccessPoint.isSaved() && !mSelectedAccessPoint.isActive()) { mSelectedAccessPoint.generateOpenNetworkConfig(); if (!savedNetworksExist) { savedNetworksExist = true; @@ -651,7 +544,8 @@ public class WifiSettings extends RestrictedSettingsFragment * Shows the latest access points available with supplemental information like * the strength of network and the security for it. */ - protected void updateAccessPoints() { + @Override + public void onAccessPointsChanged() { // Safeguard from some delayed event handling if (getActivity() == null) return; @@ -661,28 +555,27 @@ public class WifiSettings extends RestrictedSettingsFragment } final int wifiState = mWifiManager.getWifiState(); - //when we update the screen, check if verbose logging has been turned on or off - mVerboseLogging = mWifiManager.getVerboseLoggingLevel(); - switch (wifiState) { case WifiManager.WIFI_STATE_ENABLED: // AccessPoints are automatically sorted with TreeSet. final Collection accessPoints = - constructAccessPoints(getActivity(), mWifiManager, mLastInfo, - mLastNetworkInfo); + mWifiTracker.getAccessPoints(); getPreferenceScreen().removeAll(); if (accessPoints.size() == 0) { addMessagePreference(R.string.wifi_empty_list_wifi_on); } for (AccessPoint accessPoint : accessPoints) { - if (showAppIcons) { - accessPoint.showAppIcon(); - } - // Ignore access points that are out of range. if (accessPoint.getLevel() != -1) { - getPreferenceScreen().addPreference(accessPoint); + AccessPointPreference preference = new AccessPointPreference(accessPoint, + getActivity()); + if (showAppIcons) { + preference.showAppIcon(); + } + + getPreferenceScreen().addPreference(preference); + accessPoint.setListener(this); } } break; @@ -699,6 +592,11 @@ public class WifiSettings extends RestrictedSettingsFragment setOffMessage(); break; } + // Update "Saved Networks" menu option. + if (savedNetworksExist != mWifiTracker.doSavedNetworksExist()) { + savedNetworksExist = !savedNetworksExist; + getActivity().invalidateOptionsMenu(); + } } protected TextView initEmptyView() { @@ -732,127 +630,14 @@ public class WifiSettings extends RestrictedSettingsFragment getPreferenceScreen().removeAll(); } - /** Returns sorted list of access points */ - private static List constructAccessPoints(Context context, - WifiManager wifiManager, WifiInfo lastInfo, NetworkInfo lastNetworkInfo) { - ArrayList accessPoints = new ArrayList(); - /** Lookup table to more quickly update AccessPoints by only considering objects with the - * correct SSID. Maps SSID -> List of AccessPoints with the given SSID. */ - Multimap apMap = new Multimap(); - - final List configs = wifiManager.getConfiguredNetworks(); - if (configs != null) { - // Update "Saved Networks" menu option. - if (savedNetworksExist != (configs.size() > 0)) { - savedNetworksExist = !savedNetworksExist; - if (context instanceof Activity) { - ((Activity) context).invalidateOptionsMenu(); - } - } - for (WifiConfiguration config : configs) { - if (config.selfAdded && config.numAssociation == 0) { - continue; - } - AccessPoint accessPoint = new AccessPoint(context, config); - if (lastInfo != null && lastNetworkInfo != null) { - accessPoint.update(lastInfo, lastNetworkInfo); - } - accessPoints.add(accessPoint); - apMap.put(accessPoint.ssid, accessPoint); - } - } - - final List results = wifiManager.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]")) { - continue; - } - - boolean found = false; - for (AccessPoint accessPoint : apMap.getAll(result.SSID)) { - if (accessPoint.update(result)) - found = true; - } - if (!found) { - AccessPoint accessPoint = new AccessPoint(context, result); - if (lastInfo != null && lastNetworkInfo != null) { - accessPoint.update(lastInfo, lastNetworkInfo); - } - accessPoints.add(accessPoint); - apMap.put(accessPoint.ssid, accessPoint); - } - } - } - - // Pre-sort accessPoints to speed preference insertion - Collections.sort(accessPoints); - return accessPoints; - } - - private void handleEvent(Intent intent) { - String action = intent.getAction(); - if (WifiManager.WIFI_STATE_CHANGED_ACTION.equals(action)) { - updateWifiState(intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, - WifiManager.WIFI_STATE_UNKNOWN)); - } else if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(action) || - WifiManager.CONFIGURED_NETWORKS_CHANGED_ACTION.equals(action) || - WifiManager.LINK_CONFIGURATION_CHANGED_ACTION.equals(action)) { - updateAccessPoints(); - } else if (WifiManager.NETWORK_STATE_CHANGED_ACTION.equals(action)) { - NetworkInfo info = (NetworkInfo) intent.getParcelableExtra( - WifiManager.EXTRA_NETWORK_INFO); - mConnected.set(info.isConnected()); - changeNextButtonState(info.isConnected()); - updateAccessPoints(); - updateNetworkInfo(info); - } else if (WifiManager.RSSI_CHANGED_ACTION.equals(action)) { - updateNetworkInfo(null); - } - } - - private void updateNetworkInfo(NetworkInfo networkInfo) { - /* sticky broadcasts can call this when wifi is disabled */ - if (!mWifiManager.isWifiEnabled()) { - mScanner.pause(); - return; - } - - if (networkInfo != null && - networkInfo.getDetailedState() == DetailedState.OBTAINING_IPADDR) { - mScanner.pause(); - } else { - mScanner.resume(); - } - - mLastInfo = mWifiManager.getConnectionInfo(); - if (networkInfo != null) { - mLastNetworkInfo = networkInfo; - } - - for (int i = getPreferenceScreen().getPreferenceCount() - 1; i >= 0; --i) { - // Maybe there's a WifiConfigPreference - Preference preference = getPreferenceScreen().getPreference(i); - if (preference instanceof AccessPoint) { - final AccessPoint accessPoint = (AccessPoint) preference; - accessPoint.update(mLastInfo, mLastNetworkInfo); - } - } - } - - private void updateWifiState(int state) { + @Override + public void onWifiStateChanged(int state) { Activity activity = getActivity(); if (activity != null) { activity.invalidateOptionsMenu(); } switch (state) { - case WifiManager.WIFI_STATE_ENABLED: - mScanner.resume(); - return; // not break, to avoid the call to pause() below - case WifiManager.WIFI_STATE_ENABLING: addMessagePreference(R.string.wifi_starting); break; @@ -861,10 +646,11 @@ public class WifiSettings extends RestrictedSettingsFragment setOffMessage(); break; } + } - mLastInfo = null; - mLastNetworkInfo = null; - mScanner.pause(); + @Override + public void onConnectedChanged() { + changeNextButtonState(mWifiTracker.isConnected()); } /** @@ -896,8 +682,8 @@ public class WifiSettings extends RestrictedSettingsFragment if (config == null) { if (mSelectedAccessPoint != null - && mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) { - connect(mSelectedAccessPoint.networkId); + && mSelectedAccessPoint.isSaved()) { + connect(mSelectedAccessPoint.getConfig()); } } else if (config.networkId != INVALID_NETWORK_ID) { if (mSelectedAccessPoint != null) { @@ -911,32 +697,25 @@ public class WifiSettings extends RestrictedSettingsFragment } } - if (mWifiManager.isWifiEnabled()) { - mScanner.resume(); - } - updateAccessPoints(); + mWifiTracker.resumeScanning(); } /* package */ void forget() { - if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) { + if (!mSelectedAccessPoint.isSaved()) { if (mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) { // Network is active but has no network ID - must be ephemeral. mWifiManager.disableEphemeralNetwork( - AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid)); + AccessPoint.convertToQuotedString(mSelectedAccessPoint.getSsid())); } else { // Should not happen, but a monkey seems to trigger it Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig()); return; } } else { - mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener); + mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, mForgetListener); } - - if (mWifiManager.isWifiEnabled()) { - mScanner.resume(); - } - updateAccessPoints(); + mWifiTracker.resumeScanning(); // We need to rename/replace "Next" button in wifi setup context. changeNextButtonState(false); @@ -954,9 +733,7 @@ public class WifiSettings extends RestrictedSettingsFragment * Refreshes acccess points and ask Wifi module to scan networks again. */ /* package */ void refreshAccessPoints() { - if (mWifiManager.isWifiEnabled()) { - mScanner.resume(); - } + mWifiTracker.resumeScanning(); getPreferenceScreen().removeAll(); } @@ -971,7 +748,7 @@ public class WifiSettings extends RestrictedSettingsFragment } /* package */ int getAccessPointsCount() { - final boolean wifiIsEnabled = mWifiManager.isWifiEnabled(); + final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled(); if (wifiIsEnabled) { return getPreferenceScreen().getPreferenceCount(); } else { @@ -983,18 +760,14 @@ public class WifiSettings extends RestrictedSettingsFragment * Requests wifi module to pause wifi scan. May be ignored when the module is disabled. */ /* package */ void pauseWifiScan() { - if (mWifiManager.isWifiEnabled()) { - mScanner.pause(); - } + mWifiTracker.pauseScanning(); } /** * Requests wifi module to resume wifi scan. May be ignored when the module is disabled. */ /* package */ void resumeWifiScan() { - if (mWifiManager.isWifiEnabled()) { - mScanner.resume(); - } + mWifiTracker.resumeScanning(); } @Override @@ -1002,6 +775,16 @@ public class WifiSettings extends RestrictedSettingsFragment return R.string.help_url_wifi; } + @Override + public void onAccessPointChanged(AccessPoint accessPoint) { + ((AccessPointPreference) accessPoint.getTag()).refresh(); + } + + @Override + public void onLevelChanged(AccessPoint accessPoint) { + ((AccessPointPreference) accessPoint.getTag()).onLevelChanged(); + } + public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER = new BaseSearchIndexProvider() { @Override @@ -1016,16 +799,12 @@ public class WifiSettings extends RestrictedSettingsFragment data.keywords = res.getString(R.string.keywords_wifi); result.add(data); - // Add available Wi-Fi access points - WifiManager wifiManager = - (WifiManager) context.getSystemService(Context.WIFI_SERVICE); + // Add saved Wi-Fi access points final Collection accessPoints = - constructAccessPoints(context, wifiManager, null, null); + WifiTracker.getCurrentAccessPoints(context, true, false); for (AccessPoint accessPoint : accessPoints) { - // We are indexing only the saved Wi-Fi networks. - if (accessPoint.getConfig() == null) continue; data = new SearchIndexableRaw(context); - data.title = accessPoint.getTitle().toString(); + data.title = accessPoint.getSsid(); data.screenTitle = res.getString(R.string.wifi_settings); data.enabled = enabled; result.add(data); diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java index d3219454f79..efa56d706d5 100644 --- a/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java +++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizard.java @@ -95,8 +95,8 @@ public class WifiSettingsForSetupWizard extends WifiSettings { } @Override - protected void updateAccessPoints() { - super.updateAccessPoints(); + public void onAccessPointsChanged() { + super.onAccessPointsChanged(); updateFooter(getPreferenceScreen().getPreferenceCount() == 0); } diff --git a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java index 2588309c91a..a3018a3d4d7 100644 --- a/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java +++ b/src/com/android/settings/wifi/WifiSettingsForSetupWizardXL.java @@ -24,8 +24,6 @@ import android.net.NetworkInfo.DetailedState; import android.net.wifi.WifiConfiguration; import android.net.wifi.WifiManager; import android.os.Bundle; -import android.os.Handler; -import android.os.Message; import android.preference.PreferenceScreen; import android.text.TextUtils; import android.util.Log; @@ -39,6 +37,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; import java.util.Collection; import java.util.EnumMap; @@ -285,7 +284,7 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis default: // DISCONNECTED, FAILED if (mScreenState != SCREEN_STATE_CONNECTED && mWifiSettings.getAccessPointsCount() > 0) { - showDisconnectedState(Summary.get(this, state, false /* isEphemeral */)); + showDisconnectedState(AccessPoint.getSummary(this, state, false /* isEphemeral */)); } break; } @@ -422,8 +421,8 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis mScreenState = SCREEN_STATE_EDITING; if (selectedAccessPoint != null && - (selectedAccessPoint.security == AccessPoint.SECURITY_WEP || - selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) { + (selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_WEP || + selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_PSK)) { // We forcibly set edit as true so that users can modify every field if they want, // while config UI doesn't allow them to edit some of them when edit is false // (e.g. password field is hiden when edit==false). @@ -446,17 +445,17 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis showDisconnectedProgressBar(); showEditingButtonState(); - } else if (selectedAccessPoint.security == AccessPoint.SECURITY_NONE) { - mNetworkName = selectedAccessPoint.getTitle().toString(); + } else if (selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE) { + mNetworkName = selectedAccessPoint.getSsid().toString(); // onConnectButtonPressed() will change visibility status. mConnectButton.performClick(); } else { - mNetworkName = selectedAccessPoint.getTitle().toString(); + mNetworkName = selectedAccessPoint.getSsid().toString(); showEditingTitle(); showDisconnectedProgressBar(); showEditingButtonState(); - if (selectedAccessPoint.security == AccessPoint.SECURITY_EAP) { + if (selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_EAP) { onEapNetworkSelected(); } else { mConnectButton.setVisibility(View.VISIBLE); @@ -657,8 +656,10 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis } for (AccessPoint accessPoint : accessPoints) { - accessPoint.setLayoutResource(R.layout.custom_preference); - preferenceScreen.addPreference(accessPoint); + AccessPointPreference preference = (AccessPointPreference) accessPoint.getTag(); + if (preference == null) continue; + preference.setLayoutResource(R.layout.custom_preference); + preferenceScreen.addPreference(preference); } } diff --git a/src/com/android/settings/wifi/WifiStatusTest.java b/src/com/android/settings/wifi/WifiStatusTest.java index 48921d70566..85afb7cafda 100644 --- a/src/com/android/settings/wifi/WifiStatusTest.java +++ b/src/com/android/settings/wifi/WifiStatusTest.java @@ -17,6 +17,7 @@ package com.android.settings.wifi; import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; import android.net.wifi.ScanResult; import java.net.HttpURLConnection; @@ -297,7 +298,8 @@ public class WifiStatusTest extends Activity { private void handleNetworkStateChanged(NetworkInfo networkInfo) { if (mWifiManager.isWifiEnabled()) { WifiInfo info = mWifiManager.getConnectionInfo(); - String summary = Summary.get(this, info.getSSID(), networkInfo.getDetailedState(), + String summary = AccessPoint.getSummary(this, info.getSSID(), + networkInfo.getDetailedState(), info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID); mNetworkState.setText(summary); } diff --git a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java index 2667e0b926c..87850e55807 100644 --- a/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java +++ b/src/com/android/settings/wifi/WriteWifiConfigToNfcDialog.java @@ -45,6 +45,7 @@ import android.widget.ProgressBar; import android.widget.TextView; import com.android.settings.R; +import com.android.settingslib.wifi.AccessPoint; import java.io.IOException; @@ -121,7 +122,7 @@ class WriteWifiConfigToNfcDialog extends AlertDialog String password = mPasswordView.getText().toString(); String wpsNfcConfigurationToken - = mWifiManager.getWpsNfcConfigurationToken(mAccessPoint.networkId); + = mWifiManager.getWpsNfcConfigurationToken(mAccessPoint.getConfig().networkId); String passwordHex = byteArrayToHexString(password.getBytes()); String passwordLength = password.length() >= HEX_RADIX @@ -224,9 +225,9 @@ class WriteWifiConfigToNfcDialog extends AlertDialog private void enableSubmitIfAppropriate() { if (mPasswordView != null) { - if (mAccessPoint.security == AccessPoint.SECURITY_WEP) { + if (mAccessPoint.getSecurity() == AccessPoint.SECURITY_WEP) { mSubmitButton.setEnabled(mPasswordView.length() > 0); - } else if (mAccessPoint.security == AccessPoint.SECURITY_PSK) { + } else if (mAccessPoint.getSecurity() == AccessPoint.SECURITY_PSK) { mSubmitButton.setEnabled(mPasswordView.length() >= 8); } } else {