Merge "Enable networks on screen on"
diff --git a/services/java/com/android/server/WifiService.java b/services/java/com/android/server/WifiService.java
index ff703fd..a9d42e3 100644
--- a/services/java/com/android/server/WifiService.java
+++ b/services/java/com/android/server/WifiService.java
@@ -877,6 +877,7 @@
                 // because of any locks so clear that tracking immediately.
                 reportStartWorkSource();
                 mWifiStateMachine.enableRssiPolling(true);
+                mWifiStateMachine.enableAllNetworks();
                 updateWifiState();
             } else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
                 if (DBG) {
diff --git a/wifi/java/android/net/wifi/SupplicantStateTracker.java b/wifi/java/android/net/wifi/SupplicantStateTracker.java
index 08e4606..1a00507 100644
--- a/wifi/java/android/net/wifi/SupplicantStateTracker.java
+++ b/wifi/java/android/net/wifi/SupplicantStateTracker.java
@@ -48,6 +48,9 @@
     /* Maximum retries on a password failure notification */
     private static final int MAX_RETRIES_ON_PASSWORD_FAILURE = 2;
 
+    /* Tracks if networks have been disabled during a connection */
+    private boolean mNetworksDisabledDuringConnect = false;
+
     private Context mContext;
 
     private HierarchicalState mUninitializedState = new UninitializedState();
@@ -79,6 +82,16 @@
         start();
     }
 
+    private void handleNetworkConnectionFailure(int netId) {
+        /* If other networks disabled during connection, enable them */
+        if (mNetworksDisabledDuringConnect) {
+            WifiConfigStore.enableAllNetworks();
+            mNetworksDisabledDuringConnect = false;
+        }
+        /* Disable failed network */
+        WifiConfigStore.disableNetwork(netId);
+    }
+
     private void transitionOnSupplicantStateChange(StateChangeResult stateChangeResult) {
         SupplicantState supState = (SupplicantState) stateChangeResult.state;
 
@@ -156,6 +169,9 @@
                 case WifiStateMachine.CMD_RESET_SUPPLICANT_STATE:
                     transitionTo(mUninitializedState);
                     break;
+                case WifiStateMachine.CMD_CONNECT_NETWORK:
+                    mNetworksDisabledDuringConnect = true;
+                    break;
                 default:
                     Log.e(TAG, "Ignoring " + message);
                     break;
@@ -211,7 +227,7 @@
              if (mPasswordFailuresCount >= MAX_RETRIES_ON_PASSWORD_FAILURE) {
                  Log.d(TAG, "Failed to authenticate, disabling network " +
                          stateChangeResult.networkId);
-                 WifiConfigStore.disableNetwork(stateChangeResult.networkId);
+                 handleNetworkConnectionFailure(stateChangeResult.networkId);
                  mPasswordFailuresCount = 0;
              }
          }
@@ -256,7 +272,7 @@
                         if (mLoopDetectCount > MAX_SUPPLICANT_LOOP_ITERATIONS) {
                             Log.d(TAG, "Supplicant loop detected, disabling network " +
                                     stateChangeResult.networkId);
-                            WifiConfigStore.disableNetwork(stateChangeResult.networkId);
+                            handleNetworkConnectionFailure(stateChangeResult.networkId);
                         }
                         mLoopDetectIndex = state.ordinal();
                         sendSupplicantStateChangedBroadcast(state,
@@ -279,7 +295,11 @@
              if (DBG) Log.d(TAG, getName() + "\n");
              /* Reset password failure count */
              mPasswordFailuresCount = 0;
-         }
+             if (mNetworksDisabledDuringConnect) {
+                 WifiConfigStore.enableAllNetworks();
+                 mNetworksDisabledDuringConnect = false;
+             }
+        }
         @Override
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
diff --git a/wifi/java/android/net/wifi/WifiConfigStore.java b/wifi/java/android/net/wifi/WifiConfigStore.java
index e650b87..56bc5d7 100644
--- a/wifi/java/android/net/wifi/WifiConfigStore.java
+++ b/wifi/java/android/net/wifi/WifiConfigStore.java
@@ -164,10 +164,12 @@
      * of configured networks indicates all networks as being enabled
      */
     static void enableAllNetworks() {
+        boolean networkEnabledStateChanged = false;
         synchronized (sConfiguredNetworks) {
             for(WifiConfiguration config : sConfiguredNetworks.values()) {
                 if(config != null && config.status == Status.DISABLED) {
                     if(WifiNative.enableNetworkCommand(config.networkId, false)) {
+                        networkEnabledStateChanged = true;
                         config.status = Status.ENABLED;
                     } else {
                         Log.e(TAG, "Enable network failed on " + config.networkId);
@@ -176,8 +178,10 @@
             }
         }
 
-        WifiNative.saveConfigCommand();
-        sendConfiguredNetworksChangedBroadcast();
+        if (networkEnabledStateChanged) {
+            WifiNative.saveConfigCommand();
+            sendConfiguredNetworksChangedBroadcast();
+        }
     }
 
     /**
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 909ad43..f03a9e5 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -161,10 +161,6 @@
     private SupplicantStateTracker mSupplicantStateTracker;
     private WpsStateMachine mWpsStateMachine;
 
-    /* Connection to a specific network involves disabling all networks,
-     * this flag tracks if networks need to be re-enabled */
-    private boolean mEnableAllNetworks = false;
-
     private AlarmManager mAlarmManager;
     private PendingIntent mScanIntent;
     /* Tracks current frequency mode */
@@ -243,14 +239,16 @@
     static final int CMD_REMOVE_NETWORK                   = 53;
     /* Enable a network. The device will attempt a connection to the given network. */
     static final int CMD_ENABLE_NETWORK                   = 54;
+    /* Enable all networks */
+    static final int CMD_ENABLE_ALL_NETWORKS              = 55;
     /* Disable a network. The device does not attempt a connection to the given network. */
-    static final int CMD_DISABLE_NETWORK                  = 55;
+    static final int CMD_DISABLE_NETWORK                  = 56;
     /* Blacklist network. De-prioritizes the given BSSID for connection. */
-    static final int CMD_BLACKLIST_NETWORK                = 56;
+    static final int CMD_BLACKLIST_NETWORK                = 57;
     /* Clear the blacklist network list */
-    static final int CMD_CLEAR_BLACKLIST                  = 57;
+    static final int CMD_CLEAR_BLACKLIST                  = 58;
     /* Save configuration */
-    static final int CMD_SAVE_CONFIG                      = 58;
+    static final int CMD_SAVE_CONFIG                      = 59;
 
     /* Supplicant commands after driver start*/
     /* Initiate a scan */
@@ -852,6 +850,10 @@
        sendMessage(obtainMessage(CMD_ENABLE_RSSI_POLL, enabled ? 1 : 0, 0));
     }
 
+    public void enableAllNetworks() {
+        sendMessage(CMD_ENABLE_ALL_NETWORKS);
+    }
+
     /**
      * Start packet filtering
      */
@@ -1004,7 +1006,6 @@
         sb.append("mLastSignalLevel ").append(mLastSignalLevel).append(LS);
         sb.append("mLastBssid ").append(mLastBssid).append(LS);
         sb.append("mLastNetworkId ").append(mLastNetworkId).append(LS);
-        sb.append("mEnableAllNetworks ").append(mEnableAllNetworks).append(LS);
         sb.append("mReconnectCount ").append(mReconnectCount).append(LS);
         sb.append("mIsScanMode ").append(mIsScanMode).append(LS);
         sb.append("Supplicant status").append(LS)
@@ -1618,6 +1619,7 @@
                 case CMD_SAVE_NETWORK:
                 case CMD_FORGET_NETWORK:
                 case CMD_RSSI_POLL:
+                case CMD_ENABLE_ALL_NETWORKS:
                     break;
                 case CMD_START_WPS:
                     WpsConfiguration config = (WpsConfiguration) message.obj;
@@ -1986,9 +1988,9 @@
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
             WifiConfiguration config;
+            boolean eventLoggingEnabled = true;
             switch(message.what) {
                 case CMD_STOP_SUPPLICANT:   /* Supplicant stopped by user */
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     Log.d(TAG, "stopping supplicant");
                     if (!WifiNative.stopSupplicant()) {
                         Log.e(TAG, "Failed to stop supplicant, issue kill");
@@ -2001,7 +2003,6 @@
                     transitionTo(mSupplicantStoppingState);
                     break;
                 case SUP_DISCONNECTION_EVENT:  /* Supplicant connection lost */
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     Log.e(TAG, "Connection lost, restart supplicant");
                     WifiNative.killSupplicant();
                     WifiNative.closeSupplicantConnection();
@@ -2012,6 +2013,7 @@
                     sendMessageDelayed(CMD_START_SUPPLICANT, SUPPLICANT_RESTART_INTERVAL_MSECS);
                     break;
                 case SCAN_RESULTS_EVENT:
+                    eventLoggingEnabled = false;
                     setScanResults(WifiNative.scanResultsCommand());
                     sendScanResultsAvailableBroadcast();
                     break;
@@ -2020,28 +2022,26 @@
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
                 case CMD_ADD_OR_UPDATE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     config = (WifiConfiguration) message.obj;
                     mReplyChannel.replyToMessage(message, CMD_ADD_OR_UPDATE_NETWORK,
                             WifiConfigStore.addOrUpdateNetwork(config));
                     break;
                 case CMD_REMOVE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     ok = WifiConfigStore.removeNetwork(message.arg1);
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
                 case CMD_ENABLE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     ok = WifiConfigStore.enableNetwork(message.arg1, message.arg2 == 1);
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
+                case CMD_ENABLE_ALL_NETWORKS:
+                    WifiConfigStore.enableAllNetworks();
+                    break;
                 case CMD_DISABLE_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     ok = WifiConfigStore.disableNetwork(message.arg1);
                     mReplyChannel.replyToMessage(message, message.what, ok ? SUCCESS : FAILURE);
                     break;
                 case CMD_BLACKLIST_NETWORK:
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     WifiNative.addToBlacklistCommand((String)message.obj);
                     break;
                 case CMD_CLEAR_BLACKLIST:
@@ -2065,7 +2065,6 @@
                     /* Cannot start soft AP while in client mode */
                 case CMD_START_AP:
                     Log.d(TAG, "Failed to start soft AP with a running supplicant");
-                    EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
                     setWifiApState(WIFI_AP_STATE_FAILED);
                     break;
                 case CMD_SET_SCAN_MODE:
@@ -2081,6 +2080,9 @@
                 default:
                     return NOT_HANDLED;
             }
+            if (eventLoggingEnabled) {
+                EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            }
             return HANDLED;
         }
     }
@@ -2201,6 +2203,7 @@
         @Override
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
+            boolean eventLoggingEnabled = true;
             switch(message.what) {
                 case CMD_SET_SCAN_TYPE:
                     if (message.arg1 == SCAN_ACTIVE) {
@@ -2210,6 +2213,7 @@
                     }
                     break;
                 case CMD_START_SCAN:
+                    eventLoggingEnabled = false;
                     WifiNative.scanCommand(message.arg1 == SCAN_ACTIVE);
                     break;
                 case CMD_SET_HIGH_PERF_MODE:
@@ -2254,7 +2258,9 @@
                 default:
                     return NOT_HANDLED;
             }
-            EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            if (eventLoggingEnabled) {
+                EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            }
             return HANDLED;
         }
         @Override
@@ -2424,11 +2430,8 @@
                         WifiConfigStore.selectNetwork(netId);
                     }
 
-                    /* Save a flag to indicate that we need to enable all
-                     * networks after supplicant indicates a network
-                     * state change event
-                     */
-                    mEnableAllNetworks = true;
+                    /* The state tracker handles enabling networks upon completion/failure */
+                    mSupplicantStateTracker.sendMessage(CMD_CONNECT_NETWORK);
 
                     WifiNative.reconnectCommand();
 
@@ -2669,6 +2672,7 @@
         @Override
         public boolean processMessage(Message message) {
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
+            boolean eventLoggingEnabled = true;
             switch (message.what) {
                 case CMD_DISCONNECT:
                     WifiNative.disconnectCommand();
@@ -2692,6 +2696,7 @@
                     }
                     break;
                 case CMD_START_SCAN:
+                    eventLoggingEnabled = false;
                     /* When the network is connected, re-scanning can trigger
                      * a reconnection. Put it in scan-only mode during scan.
                      * When scan results are received, the mode is switched
@@ -2727,6 +2732,7 @@
                 case NETWORK_CONNECTION_EVENT:
                     break;
                 case CMD_RSSI_POLL:
+                    eventLoggingEnabled = false;
                     if (message.arg1 == mRssiPollToken) {
                         // Get Info and continue polling
                         fetchRssiAndLinkSpeedNative();
@@ -2749,7 +2755,9 @@
                 default:
                     return NOT_HANDLED;
             }
-            EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            if (eventLoggingEnabled) {
+                EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
+            }
             return HANDLED;
         }
     }
@@ -2782,13 +2790,6 @@
             EventLog.writeEvent(EVENTLOG_WIFI_EVENT_HANDLED, message.what);
             return HANDLED;
         }
-        @Override
-        public void exit() {
-            if (mEnableAllNetworks) {
-                mEnableAllNetworks = false;
-                WifiConfigStore.enableAllNetworks();
-            }
-        }
     }
 
     class DisconnectedState extends HierarchicalState {