Merge "Fix an incorrectly created race accessing Wifi Supplicant" into klp-dev
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 94d9288..76bd636 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -427,8 +427,12 @@
     /* An IP address was removed from our interface */
     static final int CMD_IP_ADDRESS_REMOVED               = BASE + 141;
 
+    /* Wifi state machine modes of operation */
+    /* CONNECT_MODE - connect to any 'known' AP when it becomes available */
     public static final int CONNECT_MODE                   = 1;
+    /* SCAN_ONLY_MODE - don't connect to any APs; scan, but only while apps hold lock */
     public static final int SCAN_ONLY_MODE                 = 2;
+    /* SCAN_ONLY_WITH_WIFI_OFF - scan, but don't connect to any APs */
     public static final int SCAN_ONLY_WITH_WIFI_OFF_MODE   = 3;
 
     private static final int SUCCESS = 1;
@@ -2942,6 +2946,8 @@
 
             if (mOperationalMode != CONNECT_MODE) {
                 mWifiNative.disconnect();
+                mWifiConfigStore.disableAllNetworks();
+                setWifiState(WIFI_STATE_DISABLED);
                 transitionTo(mScanModeState);
             } else {
                 /* Driver stop may have disabled networks, enable right after start */
@@ -2969,7 +2975,15 @@
             }
             mWifiNative.setPowerSave(true);
 
-            if (mP2pSupported) mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P);
+            if (mP2pSupported) {
+                if (mOperationalMode == CONNECT_MODE) {
+                    mWifiP2pChannel.sendMessage(WifiStateMachine.CMD_ENABLE_P2P);
+                } else {
+                    // P2P statemachine starts in disabled state, and is not enabled until
+                    // CMD_ENABLE_P2P is sent from here; so, nothing needs to be done to
+                    // keep it disabled.
+                }
+            }
 
             final Intent intent = new Intent(WifiManager.WIFI_SCAN_AVAILABLE);
             intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT);
@@ -3240,31 +3254,26 @@
         private int mLastOperationMode;
         @Override
         public void enter() {
-            mWifiConfigStore.disableAllNetworks();
             mLastOperationMode = mOperationalMode;
-            if (mLastOperationMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) {
-                mWifiP2pChannel.sendMessage(CMD_DISABLE_P2P_REQ);
-                setWifiState(WIFI_STATE_DISABLED);
-            }
-        }
-        @Override
-        public void exit() {
-            if (mLastOperationMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) {
-                setWifiState(WIFI_STATE_ENABLED);
-                // Load and re-enable networks when going back to enabled state
-                // This is essential for networks to show up after restore
-                mWifiConfigStore.loadAndEnableAllNetworks();
-                mWifiP2pChannel.sendMessage(CMD_ENABLE_P2P);
-            } else {
-                mWifiConfigStore.enableAllNetworks();
-            }
-            mWifiNative.reconnect();
         }
         @Override
         public boolean processMessage(Message message) {
             switch(message.what) {
                 case CMD_SET_OPERATIONAL_MODE:
                     if (message.arg1 == CONNECT_MODE) {
+
+                        if (mLastOperationMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) {
+                            setWifiState(WIFI_STATE_ENABLED);
+                            // Load and re-enable networks when going back to enabled state
+                            // This is essential for networks to show up after restore
+                            mWifiConfigStore.loadAndEnableAllNetworks();
+                            mWifiP2pChannel.sendMessage(CMD_ENABLE_P2P);
+                        } else {
+                            mWifiConfigStore.enableAllNetworks();
+                        }
+
+                        mWifiNative.reconnect();
+
                         mOperationalMode = CONNECT_MODE;
                         transitionTo(mDisconnectedState);
                     } else {
@@ -3890,6 +3899,13 @@
                 case CMD_SET_OPERATIONAL_MODE:
                     if (message.arg1 != CONNECT_MODE) {
                         mOperationalMode = message.arg1;
+
+                        mWifiConfigStore.disableAllNetworks();
+                        if (mOperationalMode == SCAN_ONLY_WITH_WIFI_OFF_MODE) {
+                            mWifiP2pChannel.sendMessage(CMD_DISABLE_P2P_REQ);
+                            setWifiState(WIFI_STATE_DISABLED);
+                        }
+
                         transitionTo(mScanModeState);
                     }
                     break;