Move some wifi tracking code to SettingsLib
Move tracking of which networks are available/saved and their state over to SettingsLib to share it with Quick Settings. Bug: 19180466 Change-Id: Iaeef06b26da8cb38e1ba09a7d105d04d499dc181
This commit is contained in:
@@ -1317,8 +1317,6 @@
|
|||||||
|
|
||||||
<!-- Wifi Assistant title. [CHAR LIMIT=40] -->
|
<!-- Wifi Assistant title. [CHAR LIMIT=40] -->
|
||||||
<string name="wifi_assistant_title">Wi\u2011Fi Assistant</string>
|
<string name="wifi_assistant_title">Wi\u2011Fi Assistant</string>
|
||||||
<!-- Status message of Wi-Fi when it is connected by a Wi-Fi assistant application. [CHAR LIMIT=NONE] -->
|
|
||||||
<string name="connected_via_wfa">Connected via Wi\u2011Fi assistant</string>
|
|
||||||
|
|
||||||
<!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
|
<!-- Wifi Display settings. The title of the screen. [CHAR LIMIT=40] -->
|
||||||
<string name="wifi_display_settings_title">Cast screen</string>
|
<string name="wifi_display_settings_title">Cast screen</string>
|
||||||
@@ -1422,8 +1420,6 @@
|
|||||||
<string name="wifi_error">Error</string>
|
<string name="wifi_error">Error</string>
|
||||||
<!-- Toast message when Wi-Fi or bluetooth is disallowed in airplane mode -->
|
<!-- Toast message when Wi-Fi or bluetooth is disallowed in airplane mode -->
|
||||||
<string name="wifi_in_airplane_mode">In Airplane mode</string>
|
<string name="wifi_in_airplane_mode">In Airplane mode</string>
|
||||||
<!-- Toast message when Wi-Fi cannot scan for networks -->
|
|
||||||
<string name="wifi_fail_to_scan">Can\'t scan for networks</string>
|
|
||||||
<!-- Checkbox title for option to notify user when open networks are nearby -->
|
<!-- Checkbox title for option to notify user when open networks are nearby -->
|
||||||
<string name="wifi_notify_open_networks">Network notification</string>
|
<string name="wifi_notify_open_networks">Network notification</string>
|
||||||
<!-- Checkbox summary for option to notify user when open networks are nearby [CHAR LIMIT=60]-->
|
<!-- Checkbox summary for option to notify user when open networks are nearby [CHAR LIMIT=60]-->
|
||||||
@@ -1578,21 +1574,6 @@
|
|||||||
<string name="wifi_unchanged">(unchanged)</string>
|
<string name="wifi_unchanged">(unchanged)</string>
|
||||||
<!-- Hint for unspecified fields -->
|
<!-- Hint for unspecified fields -->
|
||||||
<string name="wifi_unspecified">(unspecified)</string>
|
<string name="wifi_unspecified">(unspecified)</string>
|
||||||
<!-- Summary for the remembered network. -->
|
|
||||||
<string name="wifi_remembered">Saved</string>
|
|
||||||
<!-- Status for networks disabled for unknown reason -->
|
|
||||||
<string name="wifi_disabled_generic">Disabled</string>
|
|
||||||
<!-- Status for networked disabled from a DNS or DHCP failure -->
|
|
||||||
<string name="wifi_disabled_network_failure">IP Configuration Failure</string>
|
|
||||||
<!-- Status for networked disabled from a wifi association failure -->
|
|
||||||
<string name="wifi_disabled_wifi_failure">WiFi Connection Failure</string>
|
|
||||||
<!-- Status for networks disabled from authentication failure (wrong password
|
|
||||||
or certificate). -->
|
|
||||||
<string name="wifi_disabled_password_failure">Authentication problem</string>
|
|
||||||
<!-- Summary for the remembered network but currently not in range. -->
|
|
||||||
<string name="wifi_not_in_range">Not in range</string>
|
|
||||||
<!-- Summary for the remembered network but no internet connection was detected. -->
|
|
||||||
<string name="wifi_no_internet">No Internet Access Detected, won\'t automatically reconnect.</string>
|
|
||||||
<!-- Substring of status line when Wi-Fi Protected Setup (WPS) is available and
|
<!-- Substring of status line when Wi-Fi Protected Setup (WPS) is available and
|
||||||
string is listed first [CHAR LIMIT=20]-->
|
string is listed first [CHAR LIMIT=20]-->
|
||||||
<string name="wifi_wps_available_first_item">WPS available</string>
|
<string name="wifi_wps_available_first_item">WPS available</string>
|
||||||
@@ -1602,35 +1583,6 @@
|
|||||||
<!-- Message in WriteWifiConfigToNfcDialog when prompted to enter network password [CHAR_LIMIT=40] -->
|
<!-- Message in WriteWifiConfigToNfcDialog when prompted to enter network password [CHAR_LIMIT=40] -->
|
||||||
<string name="wifi_wps_nfc_enter_password">Enter your network password</string>
|
<string name="wifi_wps_nfc_enter_password">Enter your network password</string>
|
||||||
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with WEP security -->
|
|
||||||
<string name="wifi_security_short_wep">WEP</string>
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with WPA security -->
|
|
||||||
<string name="wifi_security_short_wpa">WPA</string>
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with WPA2 security -->
|
|
||||||
<string name="wifi_security_short_wpa2">WPA2</string>
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with both WPA/WPA2 security -->
|
|
||||||
<string name="wifi_security_short_wpa_wpa2">WPA/WPA2</string>
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with unknown PSK type -->
|
|
||||||
<string name="wifi_security_short_psk_generic">@string/wifi_security_short_wpa_wpa2</string>
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with 802.1x EAP security -->
|
|
||||||
<string name="wifi_security_short_eap">802.1x</string>
|
|
||||||
|
|
||||||
<!-- Used in Wi-Fi settings dialogs when Wi-Fi does not have any security. -->
|
|
||||||
<string name="wifi_security_none">None</string>
|
|
||||||
|
|
||||||
<!-- Do not translate. Terminology for wifi with WEP security -->
|
|
||||||
<string name="wifi_security_wep">WEP</string>
|
|
||||||
<!-- Do not translate. Terminology for wifi with WPA security -->
|
|
||||||
<string name="wifi_security_wpa">WPA PSK</string>
|
|
||||||
<!-- Do not translate. Terminology for wifi with WPA2 security -->
|
|
||||||
<string name="wifi_security_wpa2">WPA2 PSK</string>
|
|
||||||
<!-- Do not translate. Terminology for wifi with both WPA/WPA2 security, or unknown -->
|
|
||||||
<string name="wifi_security_wpa_wpa2">WPA/WPA2 PSK</string>
|
|
||||||
<!-- Do not translate. Terminology for wifi with unknown PSK type -->
|
|
||||||
<string name="wifi_security_psk_generic">@string/wifi_security_wpa_wpa2</string>
|
|
||||||
<!-- Do not translate. Concise terminology for wifi with 802.1x EAP security -->
|
|
||||||
<string name="wifi_security_eap">802.1x EAP</string>
|
|
||||||
|
|
||||||
<string name="wifi_scan_always_turnon_message">To improve location accuracy and for other purposes, <xliff:g id="app_name">%1$s</xliff:g> wants to turn on network scanning, even when Wi-Fi is off.\n\nAllow this for all apps that want to scan?</string>
|
<string name="wifi_scan_always_turnon_message">To improve location accuracy and for other purposes, <xliff:g id="app_name">%1$s</xliff:g> wants to turn on network scanning, even when Wi-Fi is off.\n\nAllow this for all apps that want to scan?</string>
|
||||||
<!-- Message informing the user how to turn off [CHAR LIMIT=200] -->
|
<!-- Message informing the user how to turn off [CHAR LIMIT=200] -->
|
||||||
<string name="wifi_scan_always_turnoff_message">To turn this off, go to Advanced in the overflow menu.</string>
|
<string name="wifi_scan_always_turnoff_message">To turn this off, go to Advanced in the overflow menu.</string>
|
||||||
|
@@ -29,6 +29,7 @@ import android.provider.Settings;
|
|||||||
|
|
||||||
import com.android.internal.telephony.PhoneStateIntentReceiver;
|
import com.android.internal.telephony.PhoneStateIntentReceiver;
|
||||||
import com.android.internal.telephony.TelephonyProperties;
|
import com.android.internal.telephony.TelephonyProperties;
|
||||||
|
import com.android.settingslib.WirelessUtils;
|
||||||
|
|
||||||
public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListener {
|
public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListener {
|
||||||
|
|
||||||
@@ -71,7 +72,7 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene
|
|||||||
|
|
||||||
public void resume() {
|
public void resume() {
|
||||||
|
|
||||||
mSwitchPref.setChecked(isAirplaneModeOn(mContext));
|
mSwitchPref.setChecked(WirelessUtils.isAirplaneModeOn(mContext));
|
||||||
|
|
||||||
mPhoneStateReceiver.registerIntent();
|
mPhoneStateReceiver.registerIntent();
|
||||||
mSwitchPref.setOnPreferenceChangeListener(this);
|
mSwitchPref.setOnPreferenceChangeListener(this);
|
||||||
@@ -86,11 +87,6 @@ public class AirplaneModeEnabler implements Preference.OnPreferenceChangeListene
|
|||||||
mContext.getContentResolver().unregisterContentObserver(mAirplaneModeObserver);
|
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) {
|
private void setAirplaneModeOn(boolean enabling) {
|
||||||
// Change the system setting
|
// Change the system setting
|
||||||
Settings.Global.putInt(mContext.getContentResolver(), Settings.Global.AIRPLANE_MODE_ON,
|
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.
|
* - mobile does not send failure notification, fail on timeout.
|
||||||
*/
|
*/
|
||||||
private void onAirplaneModeChanged() {
|
private void onAirplaneModeChanged() {
|
||||||
mSwitchPref.setChecked(isAirplaneModeOn(mContext));
|
mSwitchPref.setChecked(WirelessUtils.isAirplaneModeOn(mContext));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -230,16 +230,6 @@ public class WirelessSettings extends SettingsPreferenceFragment
|
|||||||
Log.d(TAG, s);
|
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() {
|
private boolean isSmsSupported() {
|
||||||
// Some tablet has sim card but could not do telephony operations. Skip those.
|
// Some tablet has sim card but could not do telephony operations. Skip those.
|
||||||
return mTm.isSmsCapable();
|
return mTm.isSmsCapable();
|
||||||
|
@@ -24,14 +24,13 @@ import android.content.IntentFilter;
|
|||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.Message;
|
import android.os.Message;
|
||||||
import android.provider.Settings;
|
import android.provider.Settings;
|
||||||
import android.widget.CompoundButton;
|
|
||||||
import android.widget.Switch;
|
import android.widget.Switch;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.WirelessSettings;
|
|
||||||
import com.android.settings.search.Index;
|
import com.android.settings.search.Index;
|
||||||
import com.android.settings.widget.SwitchBar;
|
import com.android.settings.widget.SwitchBar;
|
||||||
|
import com.android.settingslib.WirelessUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* BluetoothEnabler is a helper to manage the Bluetooth on/off checkbox
|
* 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) {
|
public void onSwitchChanged(Switch switchView, boolean isChecked) {
|
||||||
// Show toast message if Bluetooth is not allowed in airplane mode
|
// Show toast message if Bluetooth is not allowed in airplane mode
|
||||||
if (isChecked &&
|
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();
|
Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
|
||||||
// Reset switch to off
|
// Reset switch to off
|
||||||
switchView.setChecked(false);
|
switchView.setChecked(false);
|
||||||
|
@@ -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<String, ScanResult> 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<String, ScanResult>(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<String, ScanResult> 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);
|
|
||||||
}
|
|
||||||
}
|
|
152
src/com/android/settings/wifi/AccessPointPreference.java
Normal file
152
src/com/android/settings/wifi/AccessPointPreference.java
Normal file
@@ -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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@@ -20,28 +20,22 @@ import android.app.Dialog;
|
|||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.net.wifi.ScanResult;
|
|
||||||
import android.net.wifi.WifiConfiguration;
|
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.Preference.OnPreferenceClickListener;
|
|
||||||
import android.preference.PreferenceScreen;
|
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.util.Log;
|
||||||
import android.view.View;
|
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.SettingsPreferenceFragment;
|
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.ArrayList;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UI to manage saved networks/access points.
|
* UI to manage saved networks/access points.
|
||||||
@@ -88,14 +82,17 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
|
|||||||
PreferenceScreen preferenceScreen = getPreferenceScreen();
|
PreferenceScreen preferenceScreen = getPreferenceScreen();
|
||||||
final Context context = getActivity();
|
final Context context = getActivity();
|
||||||
|
|
||||||
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context, true,
|
||||||
final List<AccessPoint> accessPoints = constructSavedAccessPoints(context, mWifiManager);
|
false);
|
||||||
|
|
||||||
preferenceScreen.removeAll();
|
preferenceScreen.removeAll();
|
||||||
|
|
||||||
final int accessPointsSize = accessPoints.size();
|
final int accessPointsSize = accessPoints.size();
|
||||||
for (int i = 0; i < accessPointsSize; ++i){
|
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) {
|
if(getPreferenceScreen().getPreferenceCount() < 1) {
|
||||||
@@ -103,62 +100,14 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<AccessPoint> constructSavedAccessPoints(Context context,
|
private void showDialog(AccessPointPreference accessPoint, boolean edit) {
|
||||||
WifiManager wifiManager){
|
|
||||||
List<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
|
|
||||||
Map<String, List<ScanResult>> resultsMap = new HashMap<String, List<ScanResult>>();
|
|
||||||
|
|
||||||
final List<WifiConfiguration> configs = wifiManager.getConfiguredNetworks();
|
|
||||||
final List<ScanResult> 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<ScanResult> res = resultsMap.get(result.SSID);
|
|
||||||
|
|
||||||
if(res == null){
|
|
||||||
res = new ArrayList<ScanResult>();
|
|
||||||
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<ScanResult> 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) {
|
|
||||||
if (mDialog != null) {
|
if (mDialog != null) {
|
||||||
removeDialog(WifiSettings.WIFI_DIALOG_ID);
|
removeDialog(WifiSettings.WIFI_DIALOG_ID);
|
||||||
mDialog = null;
|
mDialog = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Save the access point and edit mode
|
// Save the access point and edit mode
|
||||||
mDlgAccessPoint = accessPoint;
|
mDlgAccessPoint = accessPoint.getAccessPoint();
|
||||||
|
|
||||||
showDialog(WifiSettings.WIFI_DIALOG_ID);
|
showDialog(WifiSettings.WIFI_DIALOG_ID);
|
||||||
}
|
}
|
||||||
@@ -198,16 +147,16 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
|
|||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialogInterface, int button) {
|
public void onClick(DialogInterface dialogInterface, int button) {
|
||||||
if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
|
if (button == WifiDialog.BUTTON_FORGET && mSelectedAccessPoint != null) {
|
||||||
mWifiManager.forget(mSelectedAccessPoint.networkId, null);
|
mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, null);
|
||||||
getPreferenceScreen().removePreference(mSelectedAccessPoint);
|
getPreferenceScreen().removePreference((Preference) mSelectedAccessPoint.getTag());
|
||||||
mSelectedAccessPoint = null;
|
mSelectedAccessPoint = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
|
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
|
||||||
if (preference instanceof AccessPoint) {
|
if (preference instanceof AccessPointPreference) {
|
||||||
showDialog((AccessPoint) preference, false);
|
showDialog((AccessPointPreference) preference, false);
|
||||||
return true;
|
return true;
|
||||||
} else{
|
} else{
|
||||||
return super.onPreferenceTreeClick(screen, preference);
|
return super.onPreferenceTreeClick(screen, preference);
|
||||||
@@ -233,15 +182,13 @@ public class SavedAccessPointsWifiSettings extends SettingsPreferenceFragment
|
|||||||
result.add(data);
|
result.add(data);
|
||||||
|
|
||||||
// Add available Wi-Fi access points
|
// Add available Wi-Fi access points
|
||||||
WifiManager wifiManager =
|
final List<AccessPoint> accessPoints = WifiTracker.getCurrentAccessPoints(context,
|
||||||
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
true, false);
|
||||||
final List<AccessPoint> accessPoints =
|
|
||||||
constructSavedAccessPoints(context, wifiManager);
|
|
||||||
|
|
||||||
final int accessPointsSize = accessPoints.size();
|
final int accessPointsSize = accessPoints.size();
|
||||||
for (int i = 0; i < accessPointsSize; ++i){
|
for (int i = 0; i < accessPointsSize; ++i){
|
||||||
data = new SearchIndexableRaw(context);
|
data = new SearchIndexableRaw(context);
|
||||||
data.title = accessPoints.get(i).getTitle().toString();
|
data.title = accessPoints.get(i).getSsid();
|
||||||
data.screenTitle = title;
|
data.screenTitle = title;
|
||||||
data.enabled = enabled;
|
data.enabled = enabled;
|
||||||
result.add(data);
|
result.add(data);
|
||||||
|
@@ -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);
|
|
||||||
}
|
|
||||||
}
|
|
@@ -16,8 +16,6 @@
|
|||||||
|
|
||||||
package com.android.settings.wifi;
|
package com.android.settings.wifi;
|
||||||
|
|
||||||
import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
|
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.net.IpConfiguration;
|
import android.net.IpConfiguration;
|
||||||
@@ -27,7 +25,6 @@ import android.net.LinkAddress;
|
|||||||
import android.net.NetworkInfo.DetailedState;
|
import android.net.NetworkInfo.DetailedState;
|
||||||
import android.net.NetworkUtils;
|
import android.net.NetworkUtils;
|
||||||
import android.net.ProxyInfo;
|
import android.net.ProxyInfo;
|
||||||
import android.net.RouteInfo;
|
|
||||||
import android.net.StaticIpConfiguration;
|
import android.net.StaticIpConfiguration;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.net.wifi.WifiConfiguration;
|
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.WifiEnterpriseConfig.Phase2;
|
||||||
import android.net.wifi.WifiInfo;
|
import android.net.wifi.WifiInfo;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
import android.os.UserHandle;
|
|
||||||
import android.security.Credentials;
|
import android.security.Credentials;
|
||||||
import android.security.KeyStore;
|
import android.security.KeyStore;
|
||||||
import android.text.Editable;
|
import android.text.Editable;
|
||||||
@@ -60,6 +56,7 @@ import android.widget.TextView;
|
|||||||
|
|
||||||
import com.android.settings.ProxySelector;
|
import com.android.settings.ProxySelector;
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.wifi.AccessPoint;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
import java.net.InetAddress;
|
||||||
import java.net.Inet4Address;
|
import java.net.Inet4Address;
|
||||||
@@ -156,7 +153,7 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
mView = view;
|
mView = view;
|
||||||
mAccessPoint = accessPoint;
|
mAccessPoint = accessPoint;
|
||||||
mAccessPointSecurity = (accessPoint == null) ? AccessPoint.SECURITY_NONE :
|
mAccessPointSecurity = (accessPoint == null) ? AccessPoint.SECURITY_NONE :
|
||||||
accessPoint.security;
|
accessPoint.getSecurity();
|
||||||
mEdit = edit;
|
mEdit = edit;
|
||||||
|
|
||||||
mTextViewChangedHandler = new Handler();
|
mTextViewChangedHandler = new Handler();
|
||||||
@@ -209,12 +206,12 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
|
|
||||||
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
|
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
|
||||||
} else {
|
} else {
|
||||||
mConfigUi.setTitle(mAccessPoint.ssid);
|
mConfigUi.setTitle(mAccessPoint.getSsid());
|
||||||
|
|
||||||
ViewGroup group = (ViewGroup) mView.findViewById(R.id.info);
|
ViewGroup group = (ViewGroup) mView.findViewById(R.id.info);
|
||||||
|
|
||||||
boolean showAdvancedFields = false;
|
boolean showAdvancedFields = false;
|
||||||
if (mAccessPoint.networkId != INVALID_NETWORK_ID) {
|
if (mAccessPoint.isSaved()) {
|
||||||
WifiConfiguration config = mAccessPoint.getConfig();
|
WifiConfiguration config = mAccessPoint.getConfig();
|
||||||
if (config.getIpAssignment() == IpAssignment.STATIC) {
|
if (config.getIpAssignment() == IpAssignment.STATIC) {
|
||||||
mIpSettingsSpinner.setSelection(STATIC_IP);
|
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) {
|
|| mEdit) {
|
||||||
showSecurityFields();
|
showSecurityFields();
|
||||||
showIpConfigFields();
|
showIpConfigFields();
|
||||||
@@ -258,16 +255,15 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
if (mEdit) {
|
if (mEdit) {
|
||||||
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
|
mConfigUi.setSubmitButton(res.getString(R.string.wifi_save));
|
||||||
} else {
|
} else {
|
||||||
final DetailedState state = mAccessPoint.getState();
|
final DetailedState state = mAccessPoint.getDetailedState();
|
||||||
final String signalLevel = getSignalString();
|
final String signalLevel = getSignalString();
|
||||||
|
|
||||||
if (state == null && signalLevel != null) {
|
if (state == null && signalLevel != null) {
|
||||||
mConfigUi.setSubmitButton(res.getString(R.string.wifi_connect));
|
mConfigUi.setSubmitButton(res.getString(R.string.wifi_connect));
|
||||||
} else {
|
} else {
|
||||||
if (state != null) {
|
if (state != null) {
|
||||||
addRow(group, R.string.wifi_status, Summary.get(mConfigUi.getContext(),
|
addRow(group, R.string.wifi_status, AccessPoint.getSummary(
|
||||||
state, mAccessPoint.networkId ==
|
mConfigUi.getContext(), state, !mAccessPoint.isSaved()));
|
||||||
WifiConfiguration.INVALID_NETWORK_ID));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (signalLevel != null) {
|
if (signalLevel != null) {
|
||||||
@@ -301,14 +297,14 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
addRow(group, R.string.wifi_security, mAccessPoint.getSecurityString(false));
|
addRow(group, R.string.wifi_security, mAccessPoint.getSecurityString(false));
|
||||||
mView.findViewById(R.id.ip_fields).setVisibility(View.GONE);
|
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));
|
mConfigUi.setForgetButton(res.getString(R.string.wifi_forget));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((mEdit) || (mAccessPoint != null
|
if ((mEdit) || (mAccessPoint != null
|
||||||
&& mAccessPoint.getState() == null && mAccessPoint.getLevel() != -1)){
|
&& mAccessPoint.getDetailedState() == null && mAccessPoint.getLevel() != -1)){
|
||||||
mConfigUi.setCancelButton(res.getString(R.string.wifi_cancel));
|
mConfigUi.setCancelButton(res.getString(R.string.wifi_cancel));
|
||||||
}else{
|
}else{
|
||||||
mConfigUi.setCancelButton(res.getString(R.string.wifi_display_options_done));
|
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) ||
|
if ((mSsidView != null && mSsidView.length() == 0) ||
|
||||||
((mAccessPoint == null || mAccessPoint.networkId == INVALID_NETWORK_ID) &&
|
((mAccessPoint == null || !mAccessPoint.isSaved()) &&
|
||||||
passwordInvalid)) {
|
passwordInvalid)) {
|
||||||
enabled = false;
|
enabled = false;
|
||||||
} else {
|
} else {
|
||||||
@@ -367,7 +363,7 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* package */ WifiConfiguration getConfig() {
|
/* package */ WifiConfiguration getConfig() {
|
||||||
if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID && !mEdit) {
|
if (mAccessPoint != null && mAccessPoint.isSaved() && !mEdit) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -378,11 +374,11 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
mSsidView.getText().toString());
|
mSsidView.getText().toString());
|
||||||
// If the user adds a network manually, assume that it is hidden.
|
// If the user adds a network manually, assume that it is hidden.
|
||||||
config.hiddenSSID = true;
|
config.hiddenSSID = true;
|
||||||
} else if (mAccessPoint.networkId == INVALID_NETWORK_ID) {
|
} else if (!mAccessPoint.isSaved()) {
|
||||||
config.SSID = AccessPoint.convertToQuotedString(
|
config.SSID = AccessPoint.convertToQuotedString(
|
||||||
mAccessPoint.ssid);
|
mAccessPoint.getSsid());
|
||||||
} else {
|
} else {
|
||||||
config.networkId = mAccessPoint.networkId;
|
config.networkId = mAccessPoint.getConfig().networkId;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (mAccessPointSecurity) {
|
switch (mAccessPointSecurity) {
|
||||||
@@ -628,7 +624,7 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
((CheckBox) mView.findViewById(R.id.show_password))
|
((CheckBox) mView.findViewById(R.id.show_password))
|
||||||
.setOnCheckedChangeListener(this);
|
.setOnCheckedChangeListener(this);
|
||||||
|
|
||||||
if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID) {
|
if (mAccessPoint != null && mAccessPoint.isSaved()) {
|
||||||
mPasswordView.setHint(R.string.wifi_unchanged);
|
mPasswordView.setHint(R.string.wifi_unchanged);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -652,7 +648,7 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
loadCertificates(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY);
|
loadCertificates(mEapUserCertSpinner, Credentials.USER_PRIVATE_KEY);
|
||||||
|
|
||||||
// Modifying an existing network
|
// Modifying an existing network
|
||||||
if (mAccessPoint != null && mAccessPoint.networkId != INVALID_NETWORK_ID) {
|
if (mAccessPoint != null && mAccessPoint.isSaved()) {
|
||||||
WifiEnterpriseConfig enterpriseConfig = mAccessPoint.getConfig().enterpriseConfig;
|
WifiEnterpriseConfig enterpriseConfig = mAccessPoint.getConfig().enterpriseConfig;
|
||||||
int eapMethod = enterpriseConfig.getEapMethod();
|
int eapMethod = enterpriseConfig.getEapMethod();
|
||||||
int phase2Method = enterpriseConfig.getPhase2Method();
|
int phase2Method = enterpriseConfig.getPhase2Method();
|
||||||
@@ -794,7 +790,7 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
|
|
||||||
mView.findViewById(R.id.ip_fields).setVisibility(View.VISIBLE);
|
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();
|
config = mAccessPoint.getConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -846,7 +842,7 @@ public class WifiConfigController implements TextWatcher,
|
|||||||
|
|
||||||
mView.findViewById(R.id.proxy_settings_fields).setVisibility(View.VISIBLE);
|
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();
|
config = mAccessPoint.getConfig();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.wifi;
|
package com.android.settings.wifi;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.wifi.AccessPoint;
|
||||||
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.os.Handler;
|
import android.os.Handler;
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.wifi;
|
package com.android.settings.wifi;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.wifi.AccessPoint;
|
||||||
|
|
||||||
import android.app.AlertDialog;
|
import android.app.AlertDialog;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
|
@@ -31,9 +31,9 @@ import android.widget.Switch;
|
|||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
import com.android.settings.WirelessSettings;
|
|
||||||
import com.android.settings.search.Index;
|
import com.android.settings.search.Index;
|
||||||
import com.android.settings.widget.SwitchBar;
|
import com.android.settings.widget.SwitchBar;
|
||||||
|
import com.android.settingslib.WirelessUtils;
|
||||||
|
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
import java.util.concurrent.atomic.AtomicBoolean;
|
||||||
|
|
||||||
@@ -196,7 +196,7 @@ public class WifiEnabler implements SwitchBar.OnSwitchChangeListener {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Show toast message if Wi-Fi is not allowed in airplane mode
|
// 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();
|
Toast.makeText(mContext, R.string.wifi_in_airplane_mode, Toast.LENGTH_SHORT).show();
|
||||||
// Reset switch to off. No infinite check/listenenr loop.
|
// Reset switch to off. No infinite check/listenenr loop.
|
||||||
mSwitchBar.setChecked(false);
|
mSwitchBar.setChecked(false);
|
||||||
|
@@ -18,31 +18,22 @@ package com.android.settings.wifi;
|
|||||||
|
|
||||||
import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
|
import static android.net.wifi.WifiConfiguration.INVALID_NETWORK_ID;
|
||||||
import static android.os.UserManager.DISALLOW_CONFIG_WIFI;
|
import static android.os.UserManager.DISALLOW_CONFIG_WIFI;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
import android.app.Dialog;
|
import android.app.Dialog;
|
||||||
import android.content.BroadcastReceiver;
|
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.DialogInterface;
|
import android.content.DialogInterface;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.content.IntentFilter;
|
|
||||||
import android.content.res.Resources;
|
import android.content.res.Resources;
|
||||||
import android.content.res.TypedArray;
|
import android.content.res.TypedArray;
|
||||||
import android.location.LocationManager;
|
import android.location.LocationManager;
|
||||||
import android.net.ConnectivityManager;
|
import android.net.ConnectivityManager;
|
||||||
import android.net.NetworkInfo;
|
import android.net.NetworkInfo;
|
||||||
import android.net.NetworkInfo.DetailedState;
|
|
||||||
import android.net.NetworkInfo.State;
|
import android.net.NetworkInfo.State;
|
||||||
import android.net.wifi.ScanResult;
|
|
||||||
import android.net.wifi.WifiConfiguration;
|
import android.net.wifi.WifiConfiguration;
|
||||||
import android.net.wifi.WifiInfo;
|
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.net.wifi.WpsInfo;
|
import android.net.wifi.WpsInfo;
|
||||||
import android.nfc.NfcAdapter;
|
import android.nfc.NfcAdapter;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.os.UserHandle;
|
|
||||||
import android.preference.Preference;
|
import android.preference.Preference;
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -62,13 +53,13 @@ import com.android.settings.SettingsActivity;
|
|||||||
import com.android.settings.search.BaseSearchIndexProvider;
|
import com.android.settings.search.BaseSearchIndexProvider;
|
||||||
import com.android.settings.search.Indexable;
|
import com.android.settings.search.Indexable;
|
||||||
import com.android.settings.search.SearchIndexableRaw;
|
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.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.atomic.AtomicBoolean;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Two types of UI are provided here.
|
* Two types of UI are provided here.
|
||||||
@@ -79,7 +70,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
|
|||||||
* and menus.
|
* and menus.
|
||||||
*/
|
*/
|
||||||
public class WifiSettings extends RestrictedSettingsFragment
|
public class WifiSettings extends RestrictedSettingsFragment
|
||||||
implements DialogInterface.OnClickListener, Indexable {
|
implements DialogInterface.OnClickListener, Indexable, WifiTracker.WifiListener,
|
||||||
|
AccessPointListener {
|
||||||
|
|
||||||
private static final String TAG = "WifiSettings";
|
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 WPS_PIN_DIALOG_ID = 3;
|
||||||
private static final int WRITE_NFC_DIALOG_ID = 6;
|
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
|
// Instance state keys
|
||||||
private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
|
private static final String SAVE_DIALOG_EDIT_MODE = "edit_mode";
|
||||||
private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
|
private static final String SAVE_DIALOG_ACCESS_POINT_STATE = "wifi_ap_state";
|
||||||
|
|
||||||
private static boolean savedNetworksExist;
|
private static boolean savedNetworksExist;
|
||||||
|
|
||||||
private final IntentFilter mFilter;
|
protected WifiManager mWifiManager;
|
||||||
private final BroadcastReceiver mReceiver;
|
|
||||||
private final Scanner mScanner;
|
|
||||||
|
|
||||||
/* package */ WifiManager mWifiManager;
|
|
||||||
private WifiManager.ActionListener mConnectListener;
|
private WifiManager.ActionListener mConnectListener;
|
||||||
private WifiManager.ActionListener mSaveListener;
|
private WifiManager.ActionListener mSaveListener;
|
||||||
private WifiManager.ActionListener mForgetListener;
|
private WifiManager.ActionListener mForgetListener;
|
||||||
@@ -122,11 +107,6 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
// An access point being editted is stored here.
|
// An access point being editted is stored here.
|
||||||
private AccessPoint mSelectedAccessPoint;
|
private AccessPoint mSelectedAccessPoint;
|
||||||
|
|
||||||
private NetworkInfo mLastNetworkInfo;
|
|
||||||
private WifiInfo mLastInfo;
|
|
||||||
|
|
||||||
private final AtomicBoolean mConnected = new AtomicBoolean(false);
|
|
||||||
|
|
||||||
private WifiDialog mDialog;
|
private WifiDialog mDialog;
|
||||||
private WriteWifiConfigToNfcDialog mWifiToNfcDialog;
|
private WriteWifiConfigToNfcDialog mWifiToNfcDialog;
|
||||||
|
|
||||||
@@ -150,98 +130,20 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
private AccessPoint mDlgAccessPoint;
|
private AccessPoint mDlgAccessPoint;
|
||||||
private Bundle mAccessPointSavedState;
|
private Bundle mAccessPointSavedState;
|
||||||
|
|
||||||
/** verbose logging flag. this flag is set thru developer debugging options
|
private WifiTracker mWifiTracker;
|
||||||
* and used so as to assist with in-the-field WiFi connectivity debugging */
|
|
||||||
public static int mVerboseLogging = 0;
|
|
||||||
|
|
||||||
/* End of "used in Wifi Setup context" */
|
/* End of "used in Wifi Setup context" */
|
||||||
|
|
||||||
/** A restricted multimap for use in constructAccessPoints */
|
|
||||||
private static class Multimap<K,V> {
|
|
||||||
private final HashMap<K,List<V>> store = new HashMap<K,List<V>>();
|
|
||||||
/** retrieve a non-null list of values with key K */
|
|
||||||
List<V> getAll(K key) {
|
|
||||||
List<V> values = store.get(key);
|
|
||||||
return values != null ? values : Collections.<V>emptyList();
|
|
||||||
}
|
|
||||||
|
|
||||||
void put(K key, V val) {
|
|
||||||
List<V> curVals = store.get(key);
|
|
||||||
if (curVals == null) {
|
|
||||||
curVals = new ArrayList<V>(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() {
|
public WifiSettings() {
|
||||||
super(DISALLOW_CONFIG_WIFI);
|
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
|
@Override
|
||||||
public void onActivityCreated(Bundle savedInstanceState) {
|
public void onActivityCreated(Bundle savedInstanceState) {
|
||||||
super.onActivityCreated(savedInstanceState);
|
super.onActivityCreated(savedInstanceState);
|
||||||
|
|
||||||
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
|
mWifiTracker = new WifiTracker(getActivity(), this, true, true);
|
||||||
|
mWifiManager = mWifiTracker.getManager();
|
||||||
|
|
||||||
mConnectListener = new WifiManager.ActionListener() {
|
mConnectListener = new WifiManager.ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
@@ -321,14 +223,14 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
|
|
||||||
if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
|
if (intent.hasExtra(EXTRA_START_CONNECT_SSID)) {
|
||||||
String ssid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
|
String ssid = intent.getStringExtra(EXTRA_START_CONNECT_SSID);
|
||||||
updateAccessPoints();
|
onAccessPointsChanged();
|
||||||
PreferenceScreen preferenceScreen = getPreferenceScreen();
|
PreferenceScreen preferenceScreen = getPreferenceScreen();
|
||||||
for (int i = 0; i < preferenceScreen.getPreferenceCount(); i++) {
|
for (int i = 0; i < preferenceScreen.getPreferenceCount(); i++) {
|
||||||
Preference preference = preferenceScreen.getPreference(i);
|
Preference preference = preferenceScreen.getPreference(i);
|
||||||
if (preference instanceof AccessPoint) {
|
if (preference instanceof AccessPointPreference) {
|
||||||
AccessPoint accessPoint = (AccessPoint) preference;
|
AccessPoint accessPoint = ((AccessPointPreference) preference).getAccessPoint();
|
||||||
if (ssid.equals(accessPoint.ssid) && accessPoint.networkId == -1
|
if (ssid.equals(accessPoint.getSsid()) && !accessPoint.isSaved()
|
||||||
&& accessPoint.security != AccessPoint.SECURITY_NONE) {
|
&& accessPoint.getSecurity() != AccessPoint.SECURITY_NONE) {
|
||||||
onPreferenceTreeClick(preferenceScreen, preference);
|
onPreferenceTreeClick(preferenceScreen, preference);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -370,8 +272,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
mWifiEnabler.resume(activity);
|
mWifiEnabler.resume(activity);
|
||||||
}
|
}
|
||||||
|
|
||||||
activity.registerReceiver(mReceiver, mFilter);
|
mWifiTracker.startTracking();
|
||||||
updateAccessPoints();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -381,8 +282,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
mWifiEnabler.pause();
|
mWifiEnabler.pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
getActivity().unregisterReceiver(mReceiver);
|
mWifiTracker.stopTracking();
|
||||||
mScanner.pause();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -398,7 +298,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
* @param menu
|
* @param menu
|
||||||
*/
|
*/
|
||||||
void addOptionsMenuItems(Menu menu) {
|
void addOptionsMenuItems(Menu menu) {
|
||||||
final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
|
final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled();
|
||||||
TypedArray ta = getActivity().getTheme().obtainStyledAttributes(
|
TypedArray ta = getActivity().getTheme().obtainStyledAttributes(
|
||||||
new int[] {R.attr.ic_menu_add, R.attr.ic_wps});
|
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)
|
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);
|
showDialog(WPS_PIN_DIALOG_ID);
|
||||||
return true;
|
return true;
|
||||||
case MENU_ID_SCAN:
|
case MENU_ID_SCAN:
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
mWifiTracker.forceScan();
|
||||||
mScanner.forceScan();
|
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
case MENU_ID_ADD_NETWORK:
|
case MENU_ID_ADD_NETWORK:
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
if (mWifiTracker.isWifiEnabled()) {
|
||||||
onAddNetworkPressed();
|
onAddNetworkPressed();
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@@ -502,7 +400,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
} else {
|
} else {
|
||||||
showAppMenuItem.setTitle(R.string.wifi_menu_apps);
|
showAppMenuItem.setTitle(R.string.wifi_menu_apps);
|
||||||
}
|
}
|
||||||
updateAccessPoints();
|
onAccessPointsChanged();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return super.onOptionsItemSelected(item);
|
return super.onOptionsItemSelected(item);
|
||||||
@@ -514,28 +412,24 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
Preference preference = (Preference) getListView().getItemAtPosition(
|
Preference preference = (Preference) getListView().getItemAtPosition(
|
||||||
((AdapterContextMenuInfo) info).position);
|
((AdapterContextMenuInfo) info).position);
|
||||||
|
|
||||||
if (preference instanceof AccessPoint) {
|
if (preference instanceof AccessPointPreference) {
|
||||||
mSelectedAccessPoint = (AccessPoint) preference;
|
mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint();
|
||||||
menu.setHeaderTitle(mSelectedAccessPoint.ssid);
|
menu.setHeaderTitle(mSelectedAccessPoint.getSsid());
|
||||||
if (mSelectedAccessPoint.getLevel() != -1) {
|
if (mSelectedAccessPoint.isConnectable()) {
|
||||||
if (mSelectedAccessPoint.getState() == null) {
|
menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
|
||||||
menu.add(Menu.NONE, MENU_ID_CONNECT, 0, R.string.wifi_menu_connect);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID ||
|
if (mSelectedAccessPoint.isSaved() || mSelectedAccessPoint.isEphemeral()) {
|
||||||
(mSelectedAccessPoint.getNetworkInfo() != null &&
|
|
||||||
mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED)) {
|
|
||||||
// Allow forgetting a network if either the network is saved or ephemerally
|
// 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
|
// connected. (In the latter case, "forget" blacklists the network so it won't
|
||||||
// be used again, ephemerally).
|
// be used again, ephemerally).
|
||||||
menu.add(Menu.NONE, MENU_ID_FORGET, 0, R.string.wifi_menu_forget);
|
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);
|
menu.add(Menu.NONE, MENU_ID_MODIFY, 0, R.string.wifi_menu_modify);
|
||||||
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
|
NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(getActivity());
|
||||||
if (nfcAdapter != null && nfcAdapter.isEnabled() &&
|
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.
|
// 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);
|
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()) {
|
switch (item.getItemId()) {
|
||||||
case MENU_ID_CONNECT: {
|
case MENU_ID_CONNECT: {
|
||||||
if (mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
|
if (mSelectedAccessPoint.isSaved()) {
|
||||||
connect(mSelectedAccessPoint.networkId);
|
connect(mSelectedAccessPoint.getConfig());
|
||||||
} else if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
|
} else if (mSelectedAccessPoint.getSecurity() != AccessPoint.SECURITY_NONE) {
|
||||||
/** Bypass dialog for unsecured networks */
|
/** Bypass dialog for unsecured networks */
|
||||||
mSelectedAccessPoint.generateOpenNetworkConfig();
|
mSelectedAccessPoint.generateOpenNetworkConfig();
|
||||||
connect(mSelectedAccessPoint.getConfig());
|
connect(mSelectedAccessPoint.getConfig());
|
||||||
@@ -580,12 +474,11 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
|
public boolean onPreferenceTreeClick(PreferenceScreen screen, Preference preference) {
|
||||||
if (preference instanceof AccessPoint) {
|
if (preference instanceof AccessPointPreference) {
|
||||||
mSelectedAccessPoint = (AccessPoint) preference;
|
mSelectedAccessPoint = ((AccessPointPreference) preference).getAccessPoint();
|
||||||
/** Bypass dialog for unsecured, unsaved, and inactive networks */
|
/** Bypass dialog for unsecured, unsaved, and inactive networks */
|
||||||
if (mSelectedAccessPoint.security == AccessPoint.SECURITY_NONE &&
|
if (mSelectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE &&
|
||||||
mSelectedAccessPoint.networkId == INVALID_NETWORK_ID &&
|
!mSelectedAccessPoint.isSaved() && !mSelectedAccessPoint.isActive()) {
|
||||||
!mSelectedAccessPoint.isActive()) {
|
|
||||||
mSelectedAccessPoint.generateOpenNetworkConfig();
|
mSelectedAccessPoint.generateOpenNetworkConfig();
|
||||||
if (!savedNetworksExist) {
|
if (!savedNetworksExist) {
|
||||||
savedNetworksExist = true;
|
savedNetworksExist = true;
|
||||||
@@ -651,7 +544,8 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
* Shows the latest access points available with supplemental information like
|
* Shows the latest access points available with supplemental information like
|
||||||
* the strength of network and the security for it.
|
* the strength of network and the security for it.
|
||||||
*/
|
*/
|
||||||
protected void updateAccessPoints() {
|
@Override
|
||||||
|
public void onAccessPointsChanged() {
|
||||||
// Safeguard from some delayed event handling
|
// Safeguard from some delayed event handling
|
||||||
if (getActivity() == null) return;
|
if (getActivity() == null) return;
|
||||||
|
|
||||||
@@ -661,28 +555,27 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
final int wifiState = mWifiManager.getWifiState();
|
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) {
|
switch (wifiState) {
|
||||||
case WifiManager.WIFI_STATE_ENABLED:
|
case WifiManager.WIFI_STATE_ENABLED:
|
||||||
// AccessPoints are automatically sorted with TreeSet.
|
// AccessPoints are automatically sorted with TreeSet.
|
||||||
final Collection<AccessPoint> accessPoints =
|
final Collection<AccessPoint> accessPoints =
|
||||||
constructAccessPoints(getActivity(), mWifiManager, mLastInfo,
|
mWifiTracker.getAccessPoints();
|
||||||
mLastNetworkInfo);
|
|
||||||
getPreferenceScreen().removeAll();
|
getPreferenceScreen().removeAll();
|
||||||
if (accessPoints.size() == 0) {
|
if (accessPoints.size() == 0) {
|
||||||
addMessagePreference(R.string.wifi_empty_list_wifi_on);
|
addMessagePreference(R.string.wifi_empty_list_wifi_on);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (AccessPoint accessPoint : accessPoints) {
|
for (AccessPoint accessPoint : accessPoints) {
|
||||||
if (showAppIcons) {
|
|
||||||
accessPoint.showAppIcon();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ignore access points that are out of range.
|
// Ignore access points that are out of range.
|
||||||
if (accessPoint.getLevel() != -1) {
|
if (accessPoint.getLevel() != -1) {
|
||||||
getPreferenceScreen().addPreference(accessPoint);
|
AccessPointPreference preference = new AccessPointPreference(accessPoint,
|
||||||
|
getActivity());
|
||||||
|
if (showAppIcons) {
|
||||||
|
preference.showAppIcon();
|
||||||
|
}
|
||||||
|
|
||||||
|
getPreferenceScreen().addPreference(preference);
|
||||||
|
accessPoint.setListener(this);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -699,6 +592,11 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
setOffMessage();
|
setOffMessage();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// Update "Saved Networks" menu option.
|
||||||
|
if (savedNetworksExist != mWifiTracker.doSavedNetworksExist()) {
|
||||||
|
savedNetworksExist = !savedNetworksExist;
|
||||||
|
getActivity().invalidateOptionsMenu();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected TextView initEmptyView() {
|
protected TextView initEmptyView() {
|
||||||
@@ -732,127 +630,14 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
getPreferenceScreen().removeAll();
|
getPreferenceScreen().removeAll();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Returns sorted list of access points */
|
@Override
|
||||||
private static List<AccessPoint> constructAccessPoints(Context context,
|
public void onWifiStateChanged(int state) {
|
||||||
WifiManager wifiManager, WifiInfo lastInfo, NetworkInfo lastNetworkInfo) {
|
|
||||||
ArrayList<AccessPoint> accessPoints = new ArrayList<AccessPoint>();
|
|
||||||
/** 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<String, AccessPoint> apMap = new Multimap<String, AccessPoint>();
|
|
||||||
|
|
||||||
final List<WifiConfiguration> 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<ScanResult> 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) {
|
|
||||||
Activity activity = getActivity();
|
Activity activity = getActivity();
|
||||||
if (activity != null) {
|
if (activity != null) {
|
||||||
activity.invalidateOptionsMenu();
|
activity.invalidateOptionsMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (state) {
|
switch (state) {
|
||||||
case WifiManager.WIFI_STATE_ENABLED:
|
|
||||||
mScanner.resume();
|
|
||||||
return; // not break, to avoid the call to pause() below
|
|
||||||
|
|
||||||
case WifiManager.WIFI_STATE_ENABLING:
|
case WifiManager.WIFI_STATE_ENABLING:
|
||||||
addMessagePreference(R.string.wifi_starting);
|
addMessagePreference(R.string.wifi_starting);
|
||||||
break;
|
break;
|
||||||
@@ -861,10 +646,11 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
setOffMessage();
|
setOffMessage();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mLastInfo = null;
|
@Override
|
||||||
mLastNetworkInfo = null;
|
public void onConnectedChanged() {
|
||||||
mScanner.pause();
|
changeNextButtonState(mWifiTracker.isConnected());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -896,8 +682,8 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
|
|
||||||
if (config == null) {
|
if (config == null) {
|
||||||
if (mSelectedAccessPoint != null
|
if (mSelectedAccessPoint != null
|
||||||
&& mSelectedAccessPoint.networkId != INVALID_NETWORK_ID) {
|
&& mSelectedAccessPoint.isSaved()) {
|
||||||
connect(mSelectedAccessPoint.networkId);
|
connect(mSelectedAccessPoint.getConfig());
|
||||||
}
|
}
|
||||||
} else if (config.networkId != INVALID_NETWORK_ID) {
|
} else if (config.networkId != INVALID_NETWORK_ID) {
|
||||||
if (mSelectedAccessPoint != null) {
|
if (mSelectedAccessPoint != null) {
|
||||||
@@ -911,32 +697,25 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
mWifiTracker.resumeScanning();
|
||||||
mScanner.resume();
|
|
||||||
}
|
|
||||||
updateAccessPoints();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* package */ void forget() {
|
/* package */ void forget() {
|
||||||
if (mSelectedAccessPoint.networkId == INVALID_NETWORK_ID) {
|
if (!mSelectedAccessPoint.isSaved()) {
|
||||||
if (mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
|
if (mSelectedAccessPoint.getNetworkInfo().getState() != State.DISCONNECTED) {
|
||||||
// Network is active but has no network ID - must be ephemeral.
|
// Network is active but has no network ID - must be ephemeral.
|
||||||
mWifiManager.disableEphemeralNetwork(
|
mWifiManager.disableEphemeralNetwork(
|
||||||
AccessPoint.convertToQuotedString(mSelectedAccessPoint.ssid));
|
AccessPoint.convertToQuotedString(mSelectedAccessPoint.getSsid()));
|
||||||
} else {
|
} else {
|
||||||
// Should not happen, but a monkey seems to trigger it
|
// Should not happen, but a monkey seems to trigger it
|
||||||
Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
|
Log.e(TAG, "Failed to forget invalid network " + mSelectedAccessPoint.getConfig());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
mWifiManager.forget(mSelectedAccessPoint.networkId, mForgetListener);
|
mWifiManager.forget(mSelectedAccessPoint.getConfig().networkId, mForgetListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mWifiTracker.resumeScanning();
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
|
||||||
mScanner.resume();
|
|
||||||
}
|
|
||||||
updateAccessPoints();
|
|
||||||
|
|
||||||
// We need to rename/replace "Next" button in wifi setup context.
|
// We need to rename/replace "Next" button in wifi setup context.
|
||||||
changeNextButtonState(false);
|
changeNextButtonState(false);
|
||||||
@@ -954,9 +733,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
* Refreshes acccess points and ask Wifi module to scan networks again.
|
* Refreshes acccess points and ask Wifi module to scan networks again.
|
||||||
*/
|
*/
|
||||||
/* package */ void refreshAccessPoints() {
|
/* package */ void refreshAccessPoints() {
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
mWifiTracker.resumeScanning();
|
||||||
mScanner.resume();
|
|
||||||
}
|
|
||||||
|
|
||||||
getPreferenceScreen().removeAll();
|
getPreferenceScreen().removeAll();
|
||||||
}
|
}
|
||||||
@@ -971,7 +748,7 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* package */ int getAccessPointsCount() {
|
/* package */ int getAccessPointsCount() {
|
||||||
final boolean wifiIsEnabled = mWifiManager.isWifiEnabled();
|
final boolean wifiIsEnabled = mWifiTracker.isWifiEnabled();
|
||||||
if (wifiIsEnabled) {
|
if (wifiIsEnabled) {
|
||||||
return getPreferenceScreen().getPreferenceCount();
|
return getPreferenceScreen().getPreferenceCount();
|
||||||
} else {
|
} 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.
|
* Requests wifi module to pause wifi scan. May be ignored when the module is disabled.
|
||||||
*/
|
*/
|
||||||
/* package */ void pauseWifiScan() {
|
/* package */ void pauseWifiScan() {
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
mWifiTracker.pauseScanning();
|
||||||
mScanner.pause();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
|
* Requests wifi module to resume wifi scan. May be ignored when the module is disabled.
|
||||||
*/
|
*/
|
||||||
/* package */ void resumeWifiScan() {
|
/* package */ void resumeWifiScan() {
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
mWifiTracker.resumeScanning();
|
||||||
mScanner.resume();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1002,6 +775,16 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
return R.string.help_url_wifi;
|
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 =
|
public static final SearchIndexProvider SEARCH_INDEX_DATA_PROVIDER =
|
||||||
new BaseSearchIndexProvider() {
|
new BaseSearchIndexProvider() {
|
||||||
@Override
|
@Override
|
||||||
@@ -1016,16 +799,12 @@ public class WifiSettings extends RestrictedSettingsFragment
|
|||||||
data.keywords = res.getString(R.string.keywords_wifi);
|
data.keywords = res.getString(R.string.keywords_wifi);
|
||||||
result.add(data);
|
result.add(data);
|
||||||
|
|
||||||
// Add available Wi-Fi access points
|
// Add saved Wi-Fi access points
|
||||||
WifiManager wifiManager =
|
|
||||||
(WifiManager) context.getSystemService(Context.WIFI_SERVICE);
|
|
||||||
final Collection<AccessPoint> accessPoints =
|
final Collection<AccessPoint> accessPoints =
|
||||||
constructAccessPoints(context, wifiManager, null, null);
|
WifiTracker.getCurrentAccessPoints(context, true, false);
|
||||||
for (AccessPoint accessPoint : accessPoints) {
|
for (AccessPoint accessPoint : accessPoints) {
|
||||||
// We are indexing only the saved Wi-Fi networks.
|
|
||||||
if (accessPoint.getConfig() == null) continue;
|
|
||||||
data = new SearchIndexableRaw(context);
|
data = new SearchIndexableRaw(context);
|
||||||
data.title = accessPoint.getTitle().toString();
|
data.title = accessPoint.getSsid();
|
||||||
data.screenTitle = res.getString(R.string.wifi_settings);
|
data.screenTitle = res.getString(R.string.wifi_settings);
|
||||||
data.enabled = enabled;
|
data.enabled = enabled;
|
||||||
result.add(data);
|
result.add(data);
|
||||||
|
@@ -95,8 +95,8 @@ public class WifiSettingsForSetupWizard extends WifiSettings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void updateAccessPoints() {
|
public void onAccessPointsChanged() {
|
||||||
super.updateAccessPoints();
|
super.onAccessPointsChanged();
|
||||||
updateFooter(getPreferenceScreen().getPreferenceCount() == 0);
|
updateFooter(getPreferenceScreen().getPreferenceCount() == 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -24,8 +24,6 @@ import android.net.NetworkInfo.DetailedState;
|
|||||||
import android.net.wifi.WifiConfiguration;
|
import android.net.wifi.WifiConfiguration;
|
||||||
import android.net.wifi.WifiManager;
|
import android.net.wifi.WifiManager;
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Message;
|
|
||||||
import android.preference.PreferenceScreen;
|
import android.preference.PreferenceScreen;
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
||||||
@@ -39,6 +37,7 @@ import android.widget.ProgressBar;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.wifi.AccessPoint;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.EnumMap;
|
import java.util.EnumMap;
|
||||||
@@ -285,7 +284,7 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis
|
|||||||
default: // DISCONNECTED, FAILED
|
default: // DISCONNECTED, FAILED
|
||||||
if (mScreenState != SCREEN_STATE_CONNECTED &&
|
if (mScreenState != SCREEN_STATE_CONNECTED &&
|
||||||
mWifiSettings.getAccessPointsCount() > 0) {
|
mWifiSettings.getAccessPointsCount() > 0) {
|
||||||
showDisconnectedState(Summary.get(this, state, false /* isEphemeral */));
|
showDisconnectedState(AccessPoint.getSummary(this, state, false /* isEphemeral */));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -422,8 +421,8 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis
|
|||||||
mScreenState = SCREEN_STATE_EDITING;
|
mScreenState = SCREEN_STATE_EDITING;
|
||||||
|
|
||||||
if (selectedAccessPoint != null &&
|
if (selectedAccessPoint != null &&
|
||||||
(selectedAccessPoint.security == AccessPoint.SECURITY_WEP ||
|
(selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_WEP ||
|
||||||
selectedAccessPoint.security == AccessPoint.SECURITY_PSK)) {
|
selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_PSK)) {
|
||||||
// We forcibly set edit as true so that users can modify every field if they want,
|
// 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
|
// 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).
|
// (e.g. password field is hiden when edit==false).
|
||||||
@@ -446,17 +445,17 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis
|
|||||||
|
|
||||||
showDisconnectedProgressBar();
|
showDisconnectedProgressBar();
|
||||||
showEditingButtonState();
|
showEditingButtonState();
|
||||||
} else if (selectedAccessPoint.security == AccessPoint.SECURITY_NONE) {
|
} else if (selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_NONE) {
|
||||||
mNetworkName = selectedAccessPoint.getTitle().toString();
|
mNetworkName = selectedAccessPoint.getSsid().toString();
|
||||||
|
|
||||||
// onConnectButtonPressed() will change visibility status.
|
// onConnectButtonPressed() will change visibility status.
|
||||||
mConnectButton.performClick();
|
mConnectButton.performClick();
|
||||||
} else {
|
} else {
|
||||||
mNetworkName = selectedAccessPoint.getTitle().toString();
|
mNetworkName = selectedAccessPoint.getSsid().toString();
|
||||||
showEditingTitle();
|
showEditingTitle();
|
||||||
showDisconnectedProgressBar();
|
showDisconnectedProgressBar();
|
||||||
showEditingButtonState();
|
showEditingButtonState();
|
||||||
if (selectedAccessPoint.security == AccessPoint.SECURITY_EAP) {
|
if (selectedAccessPoint.getSecurity() == AccessPoint.SECURITY_EAP) {
|
||||||
onEapNetworkSelected();
|
onEapNetworkSelected();
|
||||||
} else {
|
} else {
|
||||||
mConnectButton.setVisibility(View.VISIBLE);
|
mConnectButton.setVisibility(View.VISIBLE);
|
||||||
@@ -657,8 +656,10 @@ public class WifiSettingsForSetupWizardXL extends Activity implements OnClickLis
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (AccessPoint accessPoint : accessPoints) {
|
for (AccessPoint accessPoint : accessPoints) {
|
||||||
accessPoint.setLayoutResource(R.layout.custom_preference);
|
AccessPointPreference preference = (AccessPointPreference) accessPoint.getTag();
|
||||||
preferenceScreen.addPreference(accessPoint);
|
if (preference == null) continue;
|
||||||
|
preference.setLayoutResource(R.layout.custom_preference);
|
||||||
|
preferenceScreen.addPreference(preference);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
package com.android.settings.wifi;
|
package com.android.settings.wifi;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.wifi.AccessPoint;
|
||||||
|
|
||||||
import android.net.wifi.ScanResult;
|
import android.net.wifi.ScanResult;
|
||||||
import java.net.HttpURLConnection;
|
import java.net.HttpURLConnection;
|
||||||
@@ -297,7 +298,8 @@ public class WifiStatusTest extends Activity {
|
|||||||
private void handleNetworkStateChanged(NetworkInfo networkInfo) {
|
private void handleNetworkStateChanged(NetworkInfo networkInfo) {
|
||||||
if (mWifiManager.isWifiEnabled()) {
|
if (mWifiManager.isWifiEnabled()) {
|
||||||
WifiInfo info = mWifiManager.getConnectionInfo();
|
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);
|
info.getNetworkId() == WifiConfiguration.INVALID_NETWORK_ID);
|
||||||
mNetworkState.setText(summary);
|
mNetworkState.setText(summary);
|
||||||
}
|
}
|
||||||
|
@@ -45,6 +45,7 @@ import android.widget.ProgressBar;
|
|||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
import com.android.settings.R;
|
import com.android.settings.R;
|
||||||
|
import com.android.settingslib.wifi.AccessPoint;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
@@ -121,7 +122,7 @@ class WriteWifiConfigToNfcDialog extends AlertDialog
|
|||||||
|
|
||||||
String password = mPasswordView.getText().toString();
|
String password = mPasswordView.getText().toString();
|
||||||
String wpsNfcConfigurationToken
|
String wpsNfcConfigurationToken
|
||||||
= mWifiManager.getWpsNfcConfigurationToken(mAccessPoint.networkId);
|
= mWifiManager.getWpsNfcConfigurationToken(mAccessPoint.getConfig().networkId);
|
||||||
String passwordHex = byteArrayToHexString(password.getBytes());
|
String passwordHex = byteArrayToHexString(password.getBytes());
|
||||||
|
|
||||||
String passwordLength = password.length() >= HEX_RADIX
|
String passwordLength = password.length() >= HEX_RADIX
|
||||||
@@ -224,9 +225,9 @@ class WriteWifiConfigToNfcDialog extends AlertDialog
|
|||||||
private void enableSubmitIfAppropriate() {
|
private void enableSubmitIfAppropriate() {
|
||||||
|
|
||||||
if (mPasswordView != null) {
|
if (mPasswordView != null) {
|
||||||
if (mAccessPoint.security == AccessPoint.SECURITY_WEP) {
|
if (mAccessPoint.getSecurity() == AccessPoint.SECURITY_WEP) {
|
||||||
mSubmitButton.setEnabled(mPasswordView.length() > 0);
|
mSubmitButton.setEnabled(mPasswordView.length() > 0);
|
||||||
} else if (mAccessPoint.security == AccessPoint.SECURITY_PSK) {
|
} else if (mAccessPoint.getSecurity() == AccessPoint.SECURITY_PSK) {
|
||||||
mSubmitButton.setEnabled(mPasswordView.length() >= 8);
|
mSubmitButton.setEnabled(mPasswordView.length() >= 8);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
Reference in New Issue
Block a user