fmapp2: Allow switching between wired and Bluetooth headset

Remove previous restriction that audio can not be switched between wired
and Bluetooth headset as Android Audio framework puts no such restriction.

CRs-Fixed: 945076
Change-Id: I1cd683c5cdc584a799749e3b147a6e8b4be45248
diff --git a/fmapp2/src/com/caf/fmradio/FMRadio.java b/fmapp2/src/com/caf/fmradio/FMRadio.java
index 45b68bc..3537137 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadio.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadio.java
@@ -2060,10 +2060,6 @@
         }else{
             mSpeakerButton.setImageResource(R.drawable.btn_earphone);
         }
-        if (isA2DPConnected())
-            mSpeakerButton.setClickable(false);
-        else
-            mSpeakerButton.setClickable(true);
       }
    }
 
@@ -2245,11 +2241,11 @@
    private void A2DPConnectionState(boolean state) {
       Log.d(LOGTAG, "A2DPConnectionState with:" +state);
       if (state) {
-          Log.d(LOGTAG, "make speaker button disable");
-          mSpeakerButton.setClickable(false);
+          Log.d(LOGTAG, "A2DP connected, set button to speaker");
+          mSpeakerButton.setImageResource(R.drawable.btn_speaker);
       } else {
-          Log.d(LOGTAG, "make speaker button enable");
-          mSpeakerButton.setClickable(true);
+          Log.d(LOGTAG, "A2DP dis-connected, set button to earphone");
+          mSpeakerButton.setImageResource(R.drawable.btn_earphone);
       }
    }
    /** Scan related */
diff --git a/fmapp2/src/com/caf/fmradio/FMRadioService.java b/fmapp2/src/com/caf/fmradio/FMRadioService.java
index b9adc42..4cf9617 100644
--- a/fmapp2/src/com/caf/fmradio/FMRadioService.java
+++ b/fmapp2/src/com/caf/fmradio/FMRadioService.java
@@ -94,6 +94,10 @@
 import android.app.ActivityManager;
 import android.app.ActivityManager.RunningAppProcessInfo;
 import android.media.session.MediaSession;
+import android.bluetooth.BluetoothA2dp;
+import android.bluetooth.BluetoothProfile;
+import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothDevice;
 
 /**
  * Provides "background" FM Radio (that uses the hardware) capabilities,
@@ -258,6 +262,8 @@
       String valueStr = audioManager.getParameters("isA2dpDeviceSupported");
       mA2dpDeviceSupportInHal = valueStr.contains("=true");
       Log.d(LOGTAG, " is A2DP device Supported In HAL"+mA2dpDeviceSupportInHal);
+
+      getA2dpStatusAtStart();
    }
 
    @Override
@@ -587,7 +593,7 @@
                 @Override
                 public void onReceive(Context context, Intent intent) {
                     String action = intent.getAction();
-                    Log.d(LOGTAG, "on receive HeadsetListener" +action);
+                    Log.d(LOGTAG, "on receive HeadsetListener " + action);
                     if (action.equals(Intent.ACTION_HEADSET_PLUG)) {
                        Log.d(LOGTAG, "ACTION_HEADSET_PLUG Intent received");
                        // Listen for ACTION_HEADSET_PLUG broadcasts.
@@ -606,7 +612,7 @@
                               mA2dpDeviceState.isDisconnected(intent))) {
                         boolean  bA2dpConnected =
                         mA2dpDeviceState.isConnected(intent);
-                        Log.d(LOGTAG, "bA2dpConnected:" +bA2dpConnected);
+                        Log.d(LOGTAG, "bA2dpConnected: " + bA2dpConnected);
                         try {
                              if ((mServiceInUse) && (mCallbacks != null))
                                  mCallbacks.onA2DPConnectionstateChanged(bA2dpConnected);
@@ -2304,20 +2310,28 @@
      }
      return mStorageAvail;
    }
-   public void enableSpeaker(boolean speakerOn) {
-       if(isCallActive())
-           return ;
-       mSpeakerPhoneOn = speakerOn;
-       Log.d(LOGTAG, "speakerOn:" + speakerOn);
-       if ((false == speakerOn) && (!mA2dpConnected)) {
-            Log.d(LOGTAG, "enabling headset");
-            AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_NONE);
-       }
 
-       if (speakerOn) {
+   public void enableSpeaker(boolean speakerOn) {
+       Log.d(LOGTAG, "speakerOn: " + speakerOn);
+
+       if (isCallActive())
+           return;
+
+       mSpeakerPhoneOn = speakerOn;
+
+       if (speakerOn == false) {
+            if (mA2dpConnected == true) {
+                Log.d(LOGTAG, "A2DP connected, de-select BT");
+                AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_NO_BT_A2DP);
+            } else {
+                Log.d(LOGTAG, "A2DP is not connected, force none");
+                AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_NONE);
+            }
+       } else if (speakerOn == true) {
            Log.d(LOGTAG, "enabling speaker");
            AudioSystem.setForceUse(AudioSystem.FOR_MEDIA, AudioSystem.FORCE_SPEAKER);
        }
+
        Log.d(LOGTAG, "speakerOn completed:" + speakerOn);
    }
   /*
@@ -3525,4 +3539,35 @@
            mDelayedStopHandler.obtainMessage(FOCUSCHANGE, focusChange, 0).sendToTarget();
        }
    };
+
+   class A2dpServiceListener implements BluetoothProfile.ServiceListener {
+       private List<BluetoothDevice> mA2dpDeviceList = null;
+       private BluetoothA2dp mA2dpProfile = null;
+
+       public void onServiceConnected(int profile, BluetoothProfile proxy) {
+           mA2dpProfile = (BluetoothA2dp) proxy;
+           mA2dpDeviceList = mA2dpProfile.getConnectedDevices();
+
+           if (mA2dpDeviceList == null)
+               mA2dpConnected = false;
+           else
+               mA2dpConnected = true;
+           mA2dpDisconnected = !mA2dpConnected;
+           Log.d(LOGTAG, "A2DP Status: " + mA2dpConnected);
+       }
+
+       public void onServiceDisconnected(int profile) {
+           mA2dpProfile = null;
+           mA2dpDeviceList = null;
+       }
+   }
+
+   private void getA2dpStatusAtStart () {
+       BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
+
+       if (!adapter.getProfileProxy(this, new A2dpServiceListener(),
+                                       BluetoothProfile.A2DP)) {
+           Log.d(LOGTAG, "Failed to get A2DP profile proxy");
+       }
+   }
 }