summaryrefslogtreecommitdiffstats
path: root/wifi
diff options
context:
space:
mode:
authorIsaac Levy <ilevy@google.com>2011-07-27 08:00:03 -0700
committerIrfan Sheriff <isheriff@google.com>2011-08-05 20:45:08 -0700
commit8dc6a1b2823f374a176fb21b8a174664a5f825fa (patch)
treeeeb04170d38361b192670d2740ee9509e2283a2c /wifi
parent9ea31639738e8d2c90dc3a4fcd535d09a0b7209a (diff)
downloadframeworks_base-8dc6a1b2823f374a176fb21b8a174664a5f825fa.zip
frameworks_base-8dc6a1b2823f374a176fb21b8a174664a5f825fa.tar.gz
frameworks_base-8dc6a1b2823f374a176fb21b8a174664a5f825fa.tar.bz2
Watchdog notify on explicit connect
Notifies when user explicitly clicks on wifi dialog. Change-Id: I5eee37d68b422d748d41e9384d5006482a223dc5
Diffstat (limited to 'wifi')
-rw-r--r--wifi/java/android/net/wifi/SupplicantStateTracker.java2
-rw-r--r--wifi/java/android/net/wifi/WifiConfigStore.java19
-rw-r--r--wifi/java/android/net/wifi/WifiConfiguration.java25
-rw-r--r--wifi/java/android/net/wifi/WifiInfo.java24
-rw-r--r--wifi/java/android/net/wifi/WifiManager.java15
-rw-r--r--wifi/java/android/net/wifi/WifiStateMachine.java36
-rw-r--r--wifi/java/android/net/wifi/WifiWatchdogStateMachine.java124
7 files changed, 184 insertions, 61 deletions
diff --git a/wifi/java/android/net/wifi/SupplicantStateTracker.java b/wifi/java/android/net/wifi/SupplicantStateTracker.java
index 9168e62..cbd284c 100644
--- a/wifi/java/android/net/wifi/SupplicantStateTracker.java
+++ b/wifi/java/android/net/wifi/SupplicantStateTracker.java
@@ -89,7 +89,7 @@ class SupplicantStateTracker extends StateMachine {
mNetworksDisabledDuringConnect = false;
}
/* Disable failed network */
- WifiConfigStore.disableNetwork(netId);
+ WifiConfigStore.disableNetwork(netId, WifiConfiguration.DISABLED_AUTH_FAILURE);
}
private void transitionOnSupplicantStateChange(StateChangeResult stateChangeResult) {
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index d83b968..9a51d5e 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -195,8 +195,9 @@ class WifiConfigStore {
* or a failure event from supplicant
*
* @param config The configuration details in WifiConfiguration
+ * @return the networkId now associated with the specified configuration
*/
- static void selectNetwork(WifiConfiguration config) {
+ static int selectNetwork(WifiConfiguration config) {
if (config != null) {
NetworkUpdateResult result = addOrUpdateNetworkNative(config);
int netId = result.getNetworkId();
@@ -205,7 +206,9 @@ class WifiConfigStore {
} else {
Log.e(TAG, "Failed to update network " + config);
}
+ return netId;
}
+ return INVALID_NETWORK_ID;
}
/**
@@ -351,10 +354,22 @@ class WifiConfigStore {
* @param netId network to be disabled
*/
static boolean disableNetwork(int netId) {
+ return disableNetwork(netId, WifiConfiguration.DISABLED_UNKNOWN_REASON);
+ }
+
+ /**
+ * Disable a network. Note that there is no saveConfig operation.
+ * @param netId network to be disabled
+ * @param reason reason code network was disabled
+ */
+ static boolean disableNetwork(int netId, int reason) {
boolean ret = WifiNative.disableNetworkCommand(netId);
synchronized (sConfiguredNetworks) {
WifiConfiguration config = sConfiguredNetworks.get(netId);
- if (config != null) config.status = Status.DISABLED;
+ if (config != null) {
+ config.status = Status.DISABLED;
+ config.disableReason = reason;
+ }
}
sendConfiguredNetworksChangedBroadcast();
return ret;
diff --git a/wifi/java/android/net/wifi/WifiConfiguration.java b/wifi/java/android/net/wifi/WifiConfiguration.java
index 28a5bc6..d2a0b30 100644
--- a/wifi/java/android/net/wifi/WifiConfiguration.java
+++ b/wifi/java/android/net/wifi/WifiConfiguration.java
@@ -211,6 +211,15 @@ public class WifiConfiguration implements Parcelable {
public static final String[] strings = { "current", "disabled", "enabled" };
}
+ /** @hide */
+ public static final int DISABLED_UNKNOWN_REASON = 0;
+ /** @hide */
+ public static final int DISABLED_DNS_FAILURE = 1;
+ /** @hide */
+ public static final int DISABLED_DHCP_FAILURE = 2;
+ /** @hide */
+ public static final int DISABLED_AUTH_FAILURE = 3;
+
/**
* The ID number that the supplicant uses to identify this
* network configuration entry. This must be passed as an argument
@@ -223,6 +232,14 @@ public class WifiConfiguration implements Parcelable {
* @see Status
*/
public int status;
+
+ /**
+ * The code referring to a reason for disabling the network
+ * Valid when {@link #status} == Status.DISABLED
+ * @hide
+ */
+ public int disableReason;
+
/**
* The network's SSID. Can either be an ASCII string,
* which must be enclosed in double quotation marks
@@ -351,6 +368,7 @@ public class WifiConfiguration implements Parcelable {
BSSID = null;
priority = 0;
hiddenSSID = false;
+ disableReason = DISABLED_UNKNOWN_REASON;
allowedKeyManagement = new BitSet();
allowedProtocols = new BitSet();
allowedAuthAlgorithms = new BitSet();
@@ -367,12 +385,13 @@ public class WifiConfiguration implements Parcelable {
linkProperties = new LinkProperties();
}
+ @Override
public String toString() {
- StringBuffer sbuf = new StringBuffer();
+ StringBuilder sbuf = new StringBuilder();
if (this.status == WifiConfiguration.Status.CURRENT) {
sbuf.append("* ");
} else if (this.status == WifiConfiguration.Status.DISABLED) {
- sbuf.append("- ");
+ sbuf.append("- DSBLE: ").append(this.disableReason).append(" ");
}
sbuf.append("ID: ").append(this.networkId).append(" SSID: ").append(this.SSID).
append(" BSSID: ").append(this.BSSID).append(" PRIO: ").append(this.priority).
@@ -541,6 +560,7 @@ public class WifiConfiguration implements Parcelable {
public void writeToParcel(Parcel dest, int flags) {
dest.writeInt(networkId);
dest.writeInt(status);
+ dest.writeInt(disableReason);
dest.writeString(SSID);
dest.writeString(BSSID);
dest.writeString(preSharedKey);
@@ -571,6 +591,7 @@ public class WifiConfiguration implements Parcelable {
WifiConfiguration config = new WifiConfiguration();
config.networkId = in.readInt();
config.status = in.readInt();
+ config.disableReason = in.readInt();
config.SSID = in.readString();
config.BSSID = in.readString();
config.preSharedKey = in.readString();
diff --git a/wifi/java/android/net/wifi/WifiInfo.java b/wifi/java/android/net/wifi/WifiInfo.java
index 7bb927b..d5b404e 100644
--- a/wifi/java/android/net/wifi/WifiInfo.java
+++ b/wifi/java/android/net/wifi/WifiInfo.java
@@ -70,6 +70,7 @@ public class WifiInfo implements Parcelable {
private InetAddress mIpAddress;
private String mMacAddress;
+ private boolean mExplicitConnect;
WifiInfo() {
mSSID = null;
@@ -79,6 +80,7 @@ public class WifiInfo implements Parcelable {
mRssi = -9999;
mLinkSpeed = -1;
mHiddenSSID = false;
+ mExplicitConnect = false;
}
/**
@@ -96,6 +98,7 @@ public class WifiInfo implements Parcelable {
mLinkSpeed = source.mLinkSpeed;
mIpAddress = source.mIpAddress;
mMacAddress = source.mMacAddress;
+ mExplicitConnect = source.mExplicitConnect;
}
}
@@ -172,6 +175,22 @@ public class WifiInfo implements Parcelable {
mNetworkId = id;
}
+
+ /**
+ * @hide
+ */
+ public boolean isExplicitConnect() {
+ return mExplicitConnect;
+ }
+
+ /**
+ * @hide
+ */
+ public void setExplicitConnect(boolean explicitConnect) {
+ this.mExplicitConnect = explicitConnect;
+ }
+
+
/**
* Each configured network has a unique small integer ID, used to identify
* the network when performing operations on the supplicant. This method
@@ -260,7 +279,8 @@ public class WifiInfo implements Parcelable {
append(mSupplicantState == null ? none : mSupplicantState).
append(", RSSI: ").append(mRssi).
append(", Link speed: ").append(mLinkSpeed).
- append(", Net ID: ").append(mNetworkId);
+ append(", Net ID: ").append(mNetworkId).
+ append(", Explicit connect: ").append(mExplicitConnect);
return sb.toString();
}
@@ -284,6 +304,7 @@ public class WifiInfo implements Parcelable {
dest.writeString(getSSID());
dest.writeString(mBSSID);
dest.writeString(mMacAddress);
+ dest.writeByte(mExplicitConnect ? (byte)1 : (byte)0);
mSupplicantState.writeToParcel(dest, flags);
}
@@ -303,6 +324,7 @@ public class WifiInfo implements Parcelable {
info.setSSID(in.readString());
info.mBSSID = in.readString();
info.mMacAddress = in.readString();
+ info.mExplicitConnect = in.readByte() == 1 ? true : false;
info.mSupplicantState = SupplicantState.CREATOR.createFromParcel(in);
return info;
}
diff --git a/wifi/java/android/net/wifi/WifiManager.java b/wifi/java/android/net/wifi/WifiManager.java
index cd6621f..5f8385c 100644
--- a/wifi/java/android/net/wifi/WifiManager.java
+++ b/wifi/java/android/net/wifi/WifiManager.java
@@ -615,6 +615,17 @@ public class WifiManager {
}
/**
+ * Disable a configured network asynchronously. This call is for abnormal network
+ * events, and the user may be notified of network change, if they recently attempted
+ * to connect to the specified network.
+ * @param netId the ID of the network as returned by {@link #addNetwork}.
+ * @hide
+ */
+ public void disableNetwork(int netId, int reason) {
+ mAsyncChannel.sendMessage(CMD_DISABLE_NETWORK, netId, reason);
+ }
+
+ /**
* Disassociate from the currently active access point. This may result
* in the asynchronous delivery of state change events.
* @return {@code true} if the operation succeeded
@@ -1058,6 +1069,8 @@ public class WifiManager {
public static final int CMD_SAVE_NETWORK = 3;
/** @hide */
public static final int CMD_START_WPS = 4;
+ /** @hide */
+ public static final int CMD_DISABLE_NETWORK = 5;
/* Events from WifiService */
/** @hide */
@@ -1617,4 +1630,4 @@ public class WifiManager {
return false;
}
}
-}
+} \ No newline at end of file
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 331d5c0..82ff0de 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -68,12 +68,14 @@ import android.os.PowerManager;
import android.os.Process;
import android.os.RemoteException;
import android.os.ServiceManager;
+import android.os.SystemClock;
import android.os.SystemProperties;
import android.os.WorkSource;
import android.provider.Settings;
import android.util.EventLog;
import android.util.Log;
import android.util.LruCache;
+import android.util.Slog;
import com.android.internal.app.IBatteryStats;
import com.android.internal.util.AsyncChannel;
@@ -482,6 +484,11 @@ public class WifiStateMachine extends StateMachine {
private final WorkSource mLastRunningWifiUids = new WorkSource();
private final IBatteryStats mBatteryStats;
+ private boolean mNextWifiActionExplicit = false;
+ private int mLastExplicitNetworkId;
+ private long mLastNetworkChoiceTime;
+ private static final long EXPLICIT_CONNECT_ALLOWED_DELAY_MS = 2 * 60 * 1000;
+
public WifiStateMachine(Context context, String wlanInterface) {
super(TAG);
@@ -821,7 +828,8 @@ public class WifiStateMachine extends StateMachine {
* @return {@code true} if the operation succeeds, {@code false} otherwise
*/
public boolean syncDisableNetwork(AsyncChannel channel, int netId) {
- Message resultMsg = channel.sendMessageSynchronously(CMD_DISABLE_NETWORK, netId);
+ Message resultMsg = channel.sendMessageSynchronously(CMD_DISABLE_NETWORK, netId,
+ WifiConfiguration.DISABLED_UNKNOWN_REASON);
boolean result = (resultMsg.arg1 != FAILURE);
resultMsg.recycle();
return result;
@@ -866,6 +874,12 @@ public class WifiStateMachine extends StateMachine {
sendMessage(obtainMessage(CMD_FORGET_NETWORK, netId, 0));
}
+ public void disableNetwork(Messenger replyTo, int netId, int reason) {
+ Message message = obtainMessage(CMD_DISABLE_NETWORK, netId, reason);
+ message.replyTo = replyTo;
+ sendMessage(message);
+ }
+
public void startWps(Messenger replyTo, WpsConfiguration config) {
Message msg = obtainMessage(CMD_START_WPS, config);
msg.replyTo = replyTo;
@@ -1534,6 +1548,7 @@ public class WifiStateMachine extends StateMachine {
mWifiInfo.setNetworkId(WifiConfiguration.INVALID_NETWORK_ID);
mWifiInfo.setRssi(MIN_RSSI);
mWifiInfo.setLinkSpeed(-1);
+ mWifiInfo.setExplicitConnect(false);
/* send event to CM & network change broadcast */
setNetworkDetailedState(DetailedState.DISCONNECTED);
@@ -1631,7 +1646,8 @@ public class WifiStateMachine extends StateMachine {
if (++mReconnectCount > getMaxDhcpRetries()) {
Log.e(TAG, "Failed " +
mReconnectCount + " times, Disabling " + mLastNetworkId);
- WifiConfigStore.disableNetwork(mLastNetworkId);
+ WifiConfigStore.disableNetwork(mLastNetworkId,
+ WifiConfiguration.DISABLED_DHCP_FAILURE);
mReconnectCount = 0;
}
@@ -2169,7 +2185,7 @@ public class WifiStateMachine extends StateMachine {
WifiConfigStore.enableAllNetworks();
break;
case CMD_DISABLE_NETWORK:
- ok = WifiConfigStore.disableNetwork(message.arg1);
+ ok = WifiConfigStore.disableNetwork(message.arg1, message.arg2);
mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
break;
case CMD_BLACKLIST_NETWORK:
@@ -2605,7 +2621,7 @@ public class WifiStateMachine extends StateMachine {
* a connection to the enabled network.
*/
if (config != null) {
- WifiConfigStore.selectNetwork(config);
+ netId = WifiConfigStore.selectNetwork(config);
} else {
WifiConfigStore.selectNetwork(netId);
}
@@ -2614,7 +2630,10 @@ public class WifiStateMachine extends StateMachine {
mSupplicantStateTracker.sendMessage(CMD_CONNECT_NETWORK);
WifiNative.reconnectCommand();
-
+ mLastExplicitNetworkId = netId;
+ mLastNetworkChoiceTime = SystemClock.elapsedRealtime();
+ mNextWifiActionExplicit = true;
+ Slog.d(TAG, "Setting wifi connect explicit for netid " + netId);
/* Expect a disconnection from the old connection */
transitionTo(mDisconnectingState);
break;
@@ -2636,6 +2655,13 @@ public class WifiStateMachine extends StateMachine {
mWifiInfo.setSSID(fetchSSID());
mWifiInfo.setBSSID(mLastBssid);
mWifiInfo.setNetworkId(mLastNetworkId);
+ if (mNextWifiActionExplicit &&
+ mWifiInfo.getNetworkId() == mLastExplicitNetworkId &&
+ SystemClock.elapsedRealtime() < mLastNetworkChoiceTime +
+ EXPLICIT_CONNECT_ALLOWED_DELAY_MS) {
+ mWifiInfo.setExplicitConnect(true);
+ }
+ mNextWifiActionExplicit = false;
/* send event to CM & network change broadcast */
setNetworkDetailedState(DetailedState.OBTAINING_IPADDR);
sendNetworkStateChangeBroadcast(mLastBssid);
diff --git a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
index 168c68b..5c8926c 100644
--- a/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiWatchdogStateMachine.java
@@ -70,6 +70,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
private static final boolean VDBG = false;
private static final boolean DBG = true;
private static final String WWSM_TAG = "WifiWatchdogStateMachine";
+ private static final String WATCHDOG_NOTIFICATION_ID = "Android.System.WifiWatchdog";
private static final int WIFI_SIGNAL_LEVELS = 4;
/**
@@ -157,7 +158,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
/**
* The {@link WifiInfo} object passed to WWSM on network broadcasts
*/
- private WifiInfo mInitialConnInfo;
+ private WifiInfo mConnectionInfo;
private int mNetEventCounter = 0;
/**
@@ -173,7 +174,9 @@ public class WifiWatchdogStateMachine extends StateMachine {
* It triggers a disableNetwork call if a DNS check fails.
*/
public boolean mDisableAPNextFailure = false;
- public ConnectivityManager mConnectivityManager;
+ private ConnectivityManager mConnectivityManager;
+ private boolean mNotificationShown;
+ public boolean mHasConnectedWifiManager = false;
/**
* STATE MAP
@@ -212,8 +215,6 @@ public class WifiWatchdogStateMachine extends StateMachine {
setInitialState(mWatchdogDisabledState);
updateSettings();
- mShowDisabledNotification = getSettingsBoolean(mContentResolver,
- Settings.Secure.WIFI_WATCHDOG_SHOW_DISABLED_NETWORK_POPUP, true);
}
public static WifiWatchdogStateMachine makeWifiWatchdogStateMachine(Context context) {
@@ -318,6 +319,9 @@ public class WifiWatchdogStateMachine extends StateMachine {
mContext.getContentResolver().registerContentObserver(
Settings.Secure.getUriFor(Settings.Secure.WIFI_WATCHDOG_WALLED_GARDEN_URL),
false, contentObserver);
+ mContext.getContentResolver().registerContentObserver(
+ Settings.Secure.getUriFor(Settings.Secure.WIFI_WATCHDOG_SHOW_DISABLED_NETWORK_POPUP)
+ , false, contentObserver);
}
/**
@@ -356,7 +360,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
public void dump(PrintWriter pw) {
pw.print("WatchdogStatus: ");
pw.print("State " + getCurrentState());
- pw.println(", network [" + mInitialConnInfo + "]");
+ pw.println(", network [" + mConnectionInfo + "]");
pw.print("checkFailures " + mNumCheckFailures);
pw.println(", bssids: " + mBssids);
pw.println("lastSingleCheck: " + mOnlineWatchState.lastCheckTime);
@@ -396,6 +400,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
mWalledGardenIntervalMs = Secure.getLong(mContentResolver,
Secure.WIFI_WATCHDOG_WALLED_GARDEN_INTERVAL_MS,
DEFAULT_WALLED_GARDEN_INTERVAL_MS);
+ mShowDisabledNotification = getSettingsBoolean(mContentResolver,
+ Settings.Secure.WIFI_WATCHDOG_SHOW_DISABLED_NETWORK_POPUP, true);
}
/**
@@ -420,17 +426,42 @@ public class WifiWatchdogStateMachine extends StateMachine {
}
/**
- *
- */
+ * Uses {@link #mConnectionInfo}.
+ */
+ private void updateBssids() {
+ String curSsid = mConnectionInfo.getSSID();
+ List<ScanResult> results = mWifiManager.getScanResults();
+ int oldNumBssids = mBssids.size();
+
+ if (results == null) {
+ if (DBG) {
+ Slog.d(WWSM_TAG, "updateBssids: Got null scan results!");
+ }
+ return;
+ }
+
+ for (ScanResult result : results) {
+ if (result == null || result.SSID == null) {
+ if (DBG) {
+ Slog.d(WWSM_TAG, "Received invalid scan result: " + result);
+ }
+ continue;
+ }
+ if (curSsid.equals(result.SSID))
+ mBssids.add(result.BSSID);
+ }
+ }
+
private void resetWatchdogState() {
if (VDBG) {
Slog.v(WWSM_TAG, "Resetting watchdog state...");
}
- mInitialConnInfo = null;
+ mConnectionInfo = null;
mDisableAPNextFailure = false;
mLastWalledGardenCheckTime = null;
mNumCheckFailures = 0;
mBssids.clear();
+ cancelNetworkNotification();
}
private void popUpBrowser() {
@@ -441,11 +472,11 @@ public class WifiWatchdogStateMachine extends StateMachine {
mContext.startActivity(intent);
}
- private void displayDisabledNetworkNotification() {
+ private void displayDisabledNetworkNotification(String ssid) {
Resources r = Resources.getSystem();
CharSequence title =
r.getText(com.android.internal.R.string.wifi_watchdog_network_disabled);
- CharSequence msg =
+ String msg = ssid +
r.getText(com.android.internal.R.string.wifi_watchdog_network_disabled_detailed);
Notification wifiDisabledWarning = new Notification.Builder(mContext)
@@ -455,7 +486,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
.setContentTitle(title)
.setContentText(msg)
.setContentIntent(PendingIntent.getActivity(mContext, 0,
- new Intent(Settings.ACTION_WIFI_IP_SETTINGS)
+ new Intent(WifiManager.ACTION_PICK_WIFI_NETWORK)
.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK), 0))
.setWhen(System.currentTimeMillis())
.setAutoCancel(true)
@@ -464,7 +495,17 @@ public class WifiWatchdogStateMachine extends StateMachine {
NotificationManager notificationManager = (NotificationManager) mContext
.getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.notify("WifiWatchdog", wifiDisabledWarning.icon, wifiDisabledWarning);
+ notificationManager.notify(WATCHDOG_NOTIFICATION_ID, 1, wifiDisabledWarning);
+ mNotificationShown = true;
+ }
+
+ public void cancelNetworkNotification() {
+ if (mNotificationShown) {
+ NotificationManager notificationManager = (NotificationManager) mContext
+ .getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(WATCHDOG_NOTIFICATION_ID, 1);
+ mNotificationShown = false;
+ }
}
/**
@@ -537,6 +578,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
switch (networkInfo.getState()) {
case CONNECTED:
+ cancelNetworkNotification();
WifiInfo wifiInfo = (WifiInfo)
stateChangeIntent.getParcelableExtra(WifiManager.EXTRA_WIFI_INFO);
if (wifiInfo == null) {
@@ -551,6 +593,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
}
initConnection(wifiInfo);
+ mConnectionInfo = wifiInfo;
+ updateBssids();
transitionTo(mDnsCheckingState);
mNetEventCounter++;
return HANDLED;
@@ -579,16 +623,15 @@ public class WifiWatchdogStateMachine extends StateMachine {
*/
private void initConnection(WifiInfo wifiInfo) {
if (VDBG) {
- Slog.v(WWSM_TAG, "Connected:: old " + wifiInfoToStr(mInitialConnInfo) +
+ Slog.v(WWSM_TAG, "Connected:: old " + wifiInfoToStr(mConnectionInfo) +
" ==> new " + wifiInfoToStr(wifiInfo));
}
- if (mInitialConnInfo == null || !wifiInfo.getSSID().equals(mInitialConnInfo.getSSID())) {
+ if (mConnectionInfo == null || !wifiInfo.getSSID().equals(mConnectionInfo.getSSID())) {
resetWatchdogState();
- } else if (!wifiInfo.getBSSID().equals(mInitialConnInfo.getBSSID())) {
+ } else if (!wifiInfo.getBSSID().equals(mConnectionInfo.getBSSID())) {
mDisableAPNextFailure = false;
}
- mInitialConnInfo = wifiInfo;
}
@Override
@@ -606,27 +649,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
public boolean processMessage(Message msg) {
switch (msg.what) {
case EVENT_SCAN_RESULTS_AVAILABLE:
- String curSsid = mInitialConnInfo.getSSID();
- List<ScanResult> results = mWifiManager.getScanResults();
- int oldNumBssids = mBssids.size();
-
- if (results == null) {
- if (DBG) {
- Slog.d(WWSM_TAG, "updateBssids: Got null scan results!");
- }
- return HANDLED;
- }
-
- for (ScanResult result : results) {
- if (result == null || result.SSID == null) {
- if (VDBG) {
- Slog.v(WWSM_TAG, "Received invalid scan result: " + result);
- }
- continue;
- }
- if (curSsid.equals(result.SSID))
- mBssids.add(result.BSSID);
- }
+ updateBssids();
return HANDLED;
case EVENT_WATCHDOG_SETTINGS_CHANGE:
// Stop current checks, but let state update
@@ -635,7 +658,6 @@ public class WifiWatchdogStateMachine extends StateMachine {
}
return NOT_HANDLED;
}
-
}
class DnsCheckingState extends State {
@@ -653,7 +675,7 @@ public class WifiWatchdogStateMachine extends StateMachine {
if (DBG) {
Slog.d(WWSM_TAG, "Starting DNS pings at " + SystemClock.elapsedRealtime());
dnsCheckLogStr = String.format("Pinging %s on ssid [%s]: ",
- dns, mInitialConnInfo.getSSID());
+ mDnsPinger.getDns(), mConnectionInfo.getSSID());
}
for (int i=0; i < mNumDnsPings; i++) {
@@ -905,7 +927,8 @@ public class WifiWatchdogStateMachine extends StateMachine {
return HANDLED;
}
- if (mDisableAPNextFailure || mNumCheckFailures >= mMaxSsidBlacklists) {
+ if (mDisableAPNextFailure || mNumCheckFailures >= mBssids.size()
+ || mNumCheckFailures >= mMaxSsidBlacklists) {
if (hasNoMobileData()) {
Slog.w(WWSM_TAG, "Would disable bad network, but device has no mobile data!" +
" Going idle...");
@@ -913,23 +936,26 @@ public class WifiWatchdogStateMachine extends StateMachine {
transitionTo(mNotConnectedState);
return HANDLED;
}
+
// TODO : Unban networks if they had low signal ?
- Slog.i(WWSM_TAG, "Disabling current SSID " + wifiInfoToStr(mInitialConnInfo)
+ Slog.i(WWSM_TAG, "Disabling current SSID " + wifiInfoToStr(mConnectionInfo)
+ ". " + "numCheckFailures " + mNumCheckFailures
+ ", numAPs " + mBssids.size());
- mWifiManager.disableNetwork(mInitialConnInfo.getNetworkId());
- if (mShowDisabledNotification) {
- displayDisabledNetworkNotification();
- mShowDisabledNotification = false;
- putSettingsBoolean(mContentResolver,
- Settings.Secure.WIFI_WATCHDOG_SHOW_DISABLED_NETWORK_POPUP, false);
+ int networkId = mConnectionInfo.getNetworkId();
+ if (!mHasConnectedWifiManager) {
+ mWifiManager.asyncConnect(mContext, getHandler());
+ mHasConnectedWifiManager = true;
+ }
+ mWifiManager.disableNetwork(networkId, WifiConfiguration.DISABLED_DNS_FAILURE);
+ if (mShowDisabledNotification && mConnectionInfo.isExplicitConnect()) {
+ displayDisabledNetworkNotification(mConnectionInfo.getSSID());
}
transitionTo(mNotConnectedState);
} else {
- Slog.i(WWSM_TAG, "Blacklisting current BSSID. " + wifiInfoToStr(mInitialConnInfo)
+ Slog.i(WWSM_TAG, "Blacklisting current BSSID. " + wifiInfoToStr(mConnectionInfo)
+ "numCheckFailures " + mNumCheckFailures + ", numAPs " + mBssids.size());
- mWifiManager.addToBlacklist(mInitialConnInfo.getBSSID());
+ mWifiManager.addToBlacklist(mConnectionInfo.getBSSID());
mWifiManager.reassociate();
transitionTo(mBlacklistedApState);
}