summaryrefslogtreecommitdiffstats
path: root/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java')
-rw-r--r--src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java201
1 files changed, 39 insertions, 162 deletions
diff --git a/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java b/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
index 168019930..6543794ab 100644
--- a/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
+++ b/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java
@@ -68,6 +68,8 @@ import java.util.List;
import java.util.Queue;
import java.util.Set;
+import com.android.bluetooth.R;
+
final class HeadsetClientStateMachine extends StateMachine {
private static final String TAG = "HeadsetClientStateMachine";
private static final boolean DBG = false;
@@ -126,8 +128,6 @@ final class HeadsetClientStateMachine extends StateMachine {
private int mIndicatorCallHeld;
private boolean mVgsFromStack = false;
private boolean mVgmFromStack = false;
- private Uri alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM);
- private Ringtone mRingtone = null;
private String mOperatorName;
private String mSubscriberInfo;
@@ -144,6 +144,8 @@ final class HeadsetClientStateMachine extends StateMachine {
private final AudioManager mAudioManager;
private int mAudioState;
+ // Indicates whether audio can be routed to the device.
+ private boolean mAudioRouteAllowed;
private boolean mAudioWbs;
private final BluetoothAdapter mAdapter;
private boolean mNativeAvailable;
@@ -173,18 +175,23 @@ final class HeadsetClientStateMachine extends StateMachine {
ProfileService.println(sb, "mIndicatorCallHeld: " + mIndicatorCallHeld);
ProfileService.println(sb, "mVgsFromStack: " + mVgsFromStack);
ProfileService.println(sb, "mVgmFromStack: " + mVgmFromStack);
- ProfileService.println(sb, "mRingtone: " + mRingtone);
ProfileService.println(sb, "mOperatorName: " + mOperatorName);
ProfileService.println(sb, "mSubscriberInfo: " + mSubscriberInfo);
ProfileService.println(sb, "mVoiceRecognitionActive: " + mVoiceRecognitionActive);
ProfileService.println(sb, "mInBandRingtone: " + mInBandRingtone);
+
ProfileService.println(sb, "mCalls:");
- for (BluetoothHeadsetClientCall call : mCalls.values()) {
- ProfileService.println(sb, " " + call);
+ if (mCalls != null) {
+ for (BluetoothHeadsetClientCall call : mCalls.values()) {
+ ProfileService.println(sb, " " + call);
+ }
}
+
ProfileService.println(sb, "mCallsUpdate:");
- for (BluetoothHeadsetClientCall call : mCallsUpdate.values()) {
- ProfileService.println(sb, " " + call);
+ if (mCallsUpdate != null) {
+ for (BluetoothHeadsetClientCall call : mCallsUpdate.values()) {
+ ProfileService.println(sb, " " + call);
+ }
}
}
@@ -446,18 +453,6 @@ final class HeadsetClientStateMachine extends StateMachine {
private void updateCallSetupIndicator(int callsetup) {
Log.d(TAG, "updateCallSetupIndicator " + callsetup + " " + mPendingAction.first);
- if (mRingtone != null && mRingtone.isPlaying()) {
- Log.d(TAG,"stopping ring after no response");
- mRingtone.stop();
- if (mAudioManager.getMode() == AudioManager.MODE_RINGTONE) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- }
- //abandon audio focus
- Log.d(TAG, "abandonAudioFocus");
- // abandon audio focus after the mode has been set back to normal
- mAudioManager.abandonAudioFocusForCall();
- }
-
if (waitForIndicators(-1, callsetup, -1)) {
return;
}
@@ -1004,17 +999,6 @@ final class HeadsetClientStateMachine extends StateMachine {
int action;
Log.d(TAG, "rejectCall");
- if ( mRingtone != null && mRingtone.isPlaying()) {
- Log.d(TAG,"stopping ring after call reject");
- mRingtone.stop();
- if (mAudioManager.getMode() == AudioManager.MODE_RINGTONE) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- }
- //abandon audio focus
- Log.d(TAG, "abandonAudioFocus");
- // abandon audio focus after the mode has been set back to normal
- mAudioManager.abandonAudioFocusForCall();
- }
BluetoothHeadsetClientCall c =
getCall(BluetoothHeadsetClientCall.CALL_STATE_INCOMING,
@@ -1227,19 +1211,9 @@ final class HeadsetClientStateMachine extends StateMachine {
mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
mAudioWbs = false;
- if(alert == null) {
- // alert is null, using backup
- alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
- if(alert == null) {
- // alert backup is null, using 2nd backup
- alert = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_RINGTONE);
- }
- }
- if (alert != null) {
- mRingtone = RingtoneManager.getRingtone(mService, alert);
- } else {
- Log.e(TAG,"alert is NULL no ringtone");
- }
+ mAudioRouteAllowed = context.getResources().getBoolean(
+ R.bool.headset_client_initial_audio_route_allowed);
+
mIndicatorNetworkState = HeadsetClientHalConstants.NETWORK_STATE_NOT_AVAILABLE;
mIndicatorNetworkType = HeadsetClientHalConstants.SERVICE_TYPE_HOME;
mIndicatorNetworkSignal = 0;
@@ -1480,8 +1454,6 @@ final class HeadsetClientStateMachine extends StateMachine {
case EVENT_TYPE_SUBSCRIBER_INFO:
case EVENT_TYPE_CURRENT_CALLS:
case EVENT_TYPE_OPERATOR_NAME:
- case EVENT_TYPE_CGMI:
- case EVENT_TYPE_CGMM:
default:
Log.e(TAG, "Connecting: ignoring stack event: " + event.type);
break;
@@ -2000,42 +1972,6 @@ final class HeadsetClientStateMachine extends StateMachine {
mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
break;
case EVENT_TYPE_RING_INDICATION:
- Log.e(TAG, "start ringing");
- if (mRingtone != null && mRingtone.isPlaying()) {
- Log.d(TAG,"ring already playing");
- break;
- }
- int newAudioMode = AudioManager.MODE_RINGTONE;
- int currMode = mAudioManager.getMode();
- if (currMode != newAudioMode) {
- // request audio focus before setting the new mode
- mAudioManager.requestAudioFocusForCall(AudioManager.MODE_RINGTONE,
- AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
- Log.d(TAG, "setAudioMode Setting audio mode from "
- + currMode + " to " + newAudioMode);
- mAudioManager.setMode(newAudioMode);
- }
- if (mRingtone != null) {
- mRingtone.play();
- }
- break;
- case EVENT_TYPE_CGMI:
- Log.d(TAG, "cgmi:" + event.valueString);
- // broadcast intent with the string
- intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
- intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_ID,
- event.valueString);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
- mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
- break;
- case EVENT_TYPE_CGMM:
- Log.d(TAG, "cgmm:" + event.valueString);
- // broadcast intent with the string
- intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
- intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_MODEL,
- event.valueString);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
- mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
break;
default:
Log.e(TAG, "Unknown stack event: " + event.type);
@@ -2063,18 +1999,6 @@ final class HeadsetClientStateMachine extends StateMachine {
private void processConnectionEvent(int state, BluetoothDevice device) {
switch (state) {
case HeadsetClientHalConstants.CONNECTION_STATE_DISCONNECTED:
- if (mRingtone != null && mRingtone.isPlaying()) {
- mRingtone.stop();
- if (mAudioManager.getMode() ==
- AudioManager.MODE_RINGTONE) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- }
- //abandon audio focus
- Log.d(TAG, "abandonAudioFocus");
- /* abandon audio focus after the mode has
- been set back to normal*/
- mAudioManager.abandonAudioFocusForCall();
- }
Log.d(TAG, "Connected disconnects.");
// AG disconnects
if (mCurrentDevice.equals(device)) {
@@ -2106,12 +2030,13 @@ final class HeadsetClientStateMachine extends StateMachine {
mAudioWbs = true;
// fall through
case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED:
+ if (!mAudioRouteAllowed) {
+ sendMessage(HeadsetClientStateMachine.DISCONNECT_AUDIO);
+ break;
+ }
+
mAudioState = BluetoothHeadsetClient.STATE_AUDIO_CONNECTED;
// request audio focus for call
- if (mRingtone != null && mRingtone.isPlaying()) {
- Log.d(TAG,"stopping ring and request focus for call");
- mRingtone.stop();
- }
int newAudioMode = AudioManager.MODE_IN_CALL;
int currMode = mAudioManager.getMode();
if (currMode != newAudioMode) {
@@ -2122,6 +2047,11 @@ final class HeadsetClientStateMachine extends StateMachine {
+ currMode + " to " + newAudioMode);
mAudioManager.setMode(newAudioMode);
}
+
+ // We need to set the volume after switching into HFP mode as some Audio HALs
+ // reset the volume to a known-default on mode switch.
+ final int volume =
+ mAudioManager.getStreamVolume(AudioManager.STREAM_BLUETOOTH_SCO);
Log.d(TAG,"hfp_enable=true");
Log.d(TAG,"mAudioWbs is " + mAudioWbs);
if (mAudioWbs) {
@@ -2133,8 +2063,7 @@ final class HeadsetClientStateMachine extends StateMachine {
mAudioManager.setParameters("hfp_set_sampling_rate=8000");
}
mAudioManager.setParameters("hfp_enable=true");
- broadcastAudioState(device, BluetoothHeadsetClient.STATE_AUDIO_CONNECTED,
- BluetoothHeadsetClient.STATE_AUDIO_CONNECTING);
+ mAudioManager.setParameters("hfp_volume=" + volume);
transitionTo(mAudioOn);
break;
case HeadsetClientHalConstants.AUDIO_STATE_CONNECTING:
@@ -2168,6 +2097,9 @@ final class HeadsetClientStateMachine extends StateMachine {
Log.d(TAG, "Enter AudioOn: " + getCurrentMessage().what);
mAudioManager.setStreamSolo(AudioManager.STREAM_BLUETOOTH_SCO, true);
+
+ broadcastAudioState(mCurrentDevice, BluetoothHeadsetClient.STATE_AUDIO_CONNECTED,
+ BluetoothHeadsetClient.STATE_AUDIO_CONNECTING);
}
@Override
@@ -2214,7 +2146,6 @@ final class HeadsetClientStateMachine extends StateMachine {
}
break;
case STACK_EVENT:
- Intent intent = null;
StackEvent event = (StackEvent) message.obj;
if (DBG) {
Log.d(TAG, "AudioOn: event type: " + event.type);
@@ -2230,50 +2161,6 @@ final class HeadsetClientStateMachine extends StateMachine {
+ event.valueInt);
processAudioEvent(event.valueInt, event.device);
break;
- case EVENT_TYPE_RING_INDICATION:
- /* PTS test case TC_HF_ICA_BV_05_I creates SCO even
- * after disabling in-band ringtone, disconnect SCO
- * if inband ringtone is disabled */
- Log.i(TAG,"Ring Indication in Audio connected state " +
- "mInBandRingtone " + mInBandRingtone);
- if (mInBandRingtone !=
- HeadsetClientHalConstants.IN_BAND_RING_NOT_PROVIDED) {
- break;
- }
- if (disconnectAudioNative(getByteAddress(mCurrentDevice))) {
- mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
- //abandon audio focus
- if (mAudioManager.getMode() != AudioManager.MODE_NORMAL) {
- mAudioManager.setMode(AudioManager.MODE_NORMAL);
- Log.d(TAG, "abandonAudioFocus");
- //abandon audio focus after the mode has been set back to normal
- mAudioManager.abandonAudioFocusForCall();
- }
- Log.d(TAG,"hfp_enable=false");
- mAudioManager.setParameters("hfp_enable=false");
- broadcastAudioState(mCurrentDevice,
- BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED,
- BluetoothHeadsetClient.STATE_AUDIO_CONNECTED);
- }
- break;
- case EVENT_TYPE_CGMI:
- Log.d(TAG, "cgmi:" + event.valueString);
- // broadcast intent with the string
- intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
- intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_ID,
- event.valueString);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
- mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
- break;
- case EVENT_TYPE_CGMM:
- Log.d(TAG, "cgmm:" + event.valueString);
- // broadcast intent with the string
- intent = new Intent(BluetoothHeadsetClient.ACTION_AG_EVENT);
- intent.putExtra(BluetoothHeadsetClient.EXTRA_MANF_MODEL,
- event.valueString);
- intent.putExtra(BluetoothDevice.EXTRA_DEVICE, event.device);
- mService.sendBroadcast(intent, ProfileService.BLUETOOTH_PERM);
- break;
default:
return NOT_HANDLED;
}
@@ -2503,6 +2390,14 @@ final class HeadsetClientStateMachine extends StateMachine {
return (getCurrentState() == mAudioOn);
}
+ public void setAudioRouteAllowed(boolean allowed) {
+ mAudioRouteAllowed = allowed;
+ }
+
+ public boolean getAudioRouteAllowed() {
+ return mAudioRouteAllowed;
+ }
+
synchronized int getAudioState(BluetoothDevice device) {
if (mCurrentDevice == null || !mCurrentDevice.equals(device)) {
return BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED;
@@ -2683,20 +2578,6 @@ final class HeadsetClientStateMachine extends StateMachine {
sendMessage(STACK_EVENT, event);
}
- private void onCgmi(String manf_id) {
- StackEvent event = new StackEvent(EVENT_TYPE_CGMI);
- event.valueString = manf_id;
- Log.d(TAG, "incoming" + event);
- sendMessage(STACK_EVENT, event);
- }
-
- private void onCgmm(String manf_model) {
- StackEvent event = new StackEvent(EVENT_TYPE_CGMM);
- event.valueString = manf_model;
- Log.d(TAG, "incoming" + event);
- sendMessage(STACK_EVENT, event);
- }
-
private String getCurrentDeviceName() {
String defaultName = "<unknown>";
if (mCurrentDevice == null) {
@@ -2736,8 +2617,6 @@ final class HeadsetClientStateMachine extends StateMachine {
final private static int EVENT_TYPE_IN_BAND_RING = 19;
final private static int EVENT_TYPE_LAST_VOICE_TAG_NUMBER = 20;
final private static int EVENT_TYPE_RING_INDICATION= 21;
- final private static int EVENT_TYPE_CGMI= 22;
- final private static int EVENT_TYPE_CGMM= 23;
// for debugging only
private final String EVENT_TYPE_NAMES[] =
@@ -2764,8 +2643,6 @@ final class HeadsetClientStateMachine extends StateMachine {
"EVENT_TYPE_IN_BAND_RING",
"EVENT_TYPE_LAST_VOICE_TAG_NUMBER",
"EVENT_TYPE_RING_INDICATION",
- "EVENT_TYPE_CGMI",
- "EVENT_TYPE_CGMM",
};
private class StackEvent {