diff options
author | Isaac Levy <ilevy@google.com> | 2011-07-27 08:00:03 -0700 |
---|---|---|
committer | Irfan Sheriff <isheriff@google.com> | 2011-08-05 20:45:08 -0700 |
commit | 8dc6a1b2823f374a176fb21b8a174664a5f825fa (patch) | |
tree | eeb04170d38361b192670d2740ee9509e2283a2c /wifi | |
parent | 9ea31639738e8d2c90dc3a4fcd535d09a0b7209a (diff) | |
download | frameworks_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.java | 2 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiConfigStore.java | 19 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiConfiguration.java | 25 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiInfo.java | 24 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiManager.java | 15 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiStateMachine.java | 36 | ||||
-rw-r--r-- | wifi/java/android/net/wifi/WifiWatchdogStateMachine.java | 124 |
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); } |