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");
+ }
+ }
}