Merge "Remove synchronous bluetooth callbacks"
diff --git a/wifi/java/android/net/wifi/WifiStateMachine.java b/wifi/java/android/net/wifi/WifiStateMachine.java
index 7dd1909..6ef3907 100644
--- a/wifi/java/android/net/wifi/WifiStateMachine.java
+++ b/wifi/java/android/net/wifi/WifiStateMachine.java
@@ -165,6 +165,10 @@
     private static final int CMD_UNLOAD_DRIVER_SUCCESS            = 5;
     /* Indicates driver unload failed */
     private static final int CMD_UNLOAD_DRIVER_FAILURE            = 6;
+    /* Set bluetooth headset proxy */
+    private static final int CMD_SET_BLUETOOTH_HEADSET_PROXY      = 7;
+    /* Set bluetooth A2dp proxy */
+    private static final int CMD_SET_BLUETOOTH_A2DP_PROXY         = 8;
 
     /* Start the supplicant */
     private static final int CMD_START_SUPPLICANT                 = 11;
@@ -1267,21 +1271,20 @@
     }
 
     /**
-     * Whether to disable coexistence mode while obtaining IP address. This
-     * logic will return true only if the current bluetooth
-     * headset/handsfree state is disconnected. This means if it is in an
-     * error state, we will NOT disable coexistence mode to err on the side
-     * of safety.
+     * Whether to disable coexistence mode while obtaining IP address. We
+     * disable coexistence if the headset indicates that there are no
+     * connected devices. If we have not got an indication of the service
+     * connection yet, we go ahead with disabling coexistence mode.
      *
      * @return Whether to disable coexistence mode.
      */
-    private synchronized boolean shouldDisableCoexistenceMode() {
+    private boolean shouldDisableCoexistenceMode() {
+        if (mBluetoothHeadset == null) return true;
         Set<BluetoothDevice> devices = mBluetoothHeadset.getConnectedDevices();
-
-        return (devices.size() != 0 ? true : false);
+        return (devices.size() != 0 ? false : true);
     }
 
-    private synchronized void checkIsBluetoothPlaying() {
+    private void checkIsBluetoothPlaying() {
         boolean isBluetoothPlaying = false;
         if (mBluetoothA2dp != null) {
             Set<BluetoothDevice> connected = mBluetoothA2dp.getConnectedDevices();
@@ -1299,23 +1302,19 @@
     private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
         new BluetoothProfile.ServiceListener() {
         public void onServiceConnected(int profile, BluetoothProfile proxy) {
-            synchronized (WifiStateMachine.this) {
                 if (profile == BluetoothProfile.HEADSET) {
-                    mBluetoothHeadset = (BluetoothHeadset) proxy;
+                    sendMessage(CMD_SET_BLUETOOTH_HEADSET_PROXY, proxy);
                 } else if (profile == BluetoothProfile.A2DP) {
-                    mBluetoothA2dp = (BluetoothA2dp)proxy;
+                    sendMessage(CMD_SET_BLUETOOTH_A2DP_PROXY, proxy);
                 }
-            }
         }
 
         public void onServiceDisconnected(int profile) {
-            synchronized (WifiStateMachine.this) {
                 if (profile == BluetoothProfile.HEADSET) {
-                    mBluetoothHeadset = null;
+                    sendMessage(CMD_SET_BLUETOOTH_HEADSET_PROXY, null);
                 } else if (profile == BluetoothProfile.A2DP) {
-                    mBluetoothA2dp = null;
+                    sendMessage(CMD_SET_BLUETOOTH_A2DP_PROXY, null);
                 }
-            }
         }
     };
 
@@ -1575,6 +1574,12 @@
             if (DBG) Log.d(TAG, getName() + message.toString() + "\n");
             SyncParams syncParams;
             switch (message.what) {
+                case CMD_SET_BLUETOOTH_HEADSET_PROXY:
+                    mBluetoothHeadset = (BluetoothHeadset) message.obj;
+                    break;
+                case CMD_SET_BLUETOOTH_A2DP_PROXY:
+                    mBluetoothA2dp = (BluetoothA2dp) message.obj;
+                    break;
                     /* Synchronous call returns */
                 case CMD_PING_SUPPLICANT:
                 case CMD_REMOVE_NETWORK:
@@ -2468,10 +2473,7 @@
                 mModifiedBluetoothCoexistenceMode = false;
                 mPowerMode = DRIVER_POWER_MODE_AUTO;
 
-                // TODO(): Incorporate the else part in the state machine
-                // If mBluetoothHeadset == null, means it not conencted to the
-                // service yet.
-                if (mBluetoothHeadset != null && shouldDisableCoexistenceMode()) {
+                if (shouldDisableCoexistenceMode()) {
                     /*
                      * There are problems setting the Wi-Fi driver's power
                      * mode to active when bluetooth coexistence mode is