Loading src/com/android/bluetooth/hfp/HeadsetStateMachine.java +27 −8 Original line number Original line Diff line number Diff line Loading @@ -78,6 +78,7 @@ import java.util.List; import java.util.Map; import java.util.Map; import java.util.Set; import java.util.Set; import android.os.SystemProperties; import android.os.SystemProperties; import java.util.concurrent.ConcurrentLinkedQueue; final class HeadsetStateMachine extends StateMachine { final class HeadsetStateMachine extends StateMachine { private static final String TAG = "HeadsetStateMachine"; private static final String TAG = "HeadsetStateMachine"; Loading Loading @@ -190,6 +191,8 @@ final class HeadsetStateMachine extends StateMachine { private int mA2dpPlayState; private int mA2dpPlayState; private int mA2dpState; private int mA2dpState; private boolean mPendingCiev; private boolean mPendingCiev; //ConcurrentLinkeQueue is used so that it is threadsafe private ConcurrentLinkedQueue<HeadsetCallState> mPendingCallStates = new ConcurrentLinkedQueue<HeadsetCallState>(); // mCurrentDevice is the device connected before the state changes // mCurrentDevice is the device connected before the state changes // mTargetDevice is the device to be connected // mTargetDevice is the device to be connected Loading Loading @@ -1240,6 +1243,7 @@ final class HeadsetStateMachine extends StateMachine { sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); mA2dpSuspend = false;/*Reset at SLC*/ mA2dpSuspend = false;/*Reset at SLC*/ mPendingCiev = false; mPendingCiev = false; mPendingCallStates.clear(); if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if (DBG) { if (DBG) { log("Headset connected while we are in some call state"); log("Headset connected while we are in some call state"); Loading Loading @@ -2266,6 +2270,7 @@ final class HeadsetStateMachine extends StateMachine { sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); mA2dpSuspend = false;/*Reset at SLC*/ mA2dpSuspend = false;/*Reset at SLC*/ mPendingCiev = false; mPendingCiev = false; mPendingCallStates.clear(); if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { log("Headset connected while we are in some call state"); log("Headset connected while we are in some call state"); log("Make A2dpSuspended=true here"); log("Make A2dpSuspended=true here"); Loading Loading @@ -2815,6 +2820,7 @@ final class HeadsetStateMachine extends StateMachine { if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { log("suspending A2DP stream for SCO"); log("suspending A2DP stream for SCO"); mPendingCiev = true; mPendingCiev = true; //This is VOIP call, dont need to remember the states return true; return true; } } } } Loading Loading @@ -2882,7 +2888,6 @@ final class HeadsetStateMachine extends StateMachine { BluetoothA2dp.STATE_NOT_PLAYING); BluetoothA2dp.STATE_NOT_PLAYING); Log.d(TAG, "A2dp Play State Changed: Current State: " + currState + Log.d(TAG, "A2dp Play State Changed: Current State: " + currState + "Prev State: " + prevState + "A2pSuspend: " + mA2dpSuspend); "Prev State: " + prevState + "A2pSuspend: " + mA2dpSuspend); mA2dpPlayState = currState; if (prevState == BluetoothA2dp.STATE_PLAYING) { if (prevState == BluetoothA2dp.STATE_PLAYING) { if (mA2dpSuspend && mPendingCiev) { if (mA2dpSuspend && mPendingCiev) { Loading @@ -2900,9 +2905,18 @@ final class HeadsetStateMachine extends StateMachine { } else { } else { //send incomming phone status to remote device //send incomming phone status to remote device log("A2dp is suspended, updating phone status if any"); log("A2dp is suspended, updating phone status if any"); phoneStateChangeNative( mPhoneState.getNumActiveCall(), Iterator<HeadsetCallState> it = mPendingCallStates.iterator(); mPhoneState.getNumHeldCall(),mPhoneState.getCallState(), if (it != null) { mPhoneState.getNumber(),mPhoneState.getType()); while (it.hasNext()) { HeadsetCallState callState = it.next(); phoneStateChangeNative( callState.mNumActive, callState.mNumHeld,callState.mCallState, callState.mNumber,callState.mType); it.remove(); } } else { Log.d(TAG, "There are no pending call state changes"); } } } mPendingCiev = false; mPendingCiev = false; } } Loading @@ -2919,6 +2933,7 @@ final class HeadsetStateMachine extends StateMachine { } } } } } } mA2dpPlayState = currState; } } private void processAnswerCall(BluetoothDevice device) { private void processAnswerCall(BluetoothDevice device) { Loading Loading @@ -3122,12 +3137,16 @@ final class HeadsetStateMachine extends StateMachine { private void processA2dpState(HeadsetCallState callState) { private void processA2dpState(HeadsetCallState callState) { log("mA2dpPlayState " + mA2dpPlayState + " mA2dpSuspend " + mA2dpSuspend ); log("mA2dpPlayState " + mA2dpPlayState + " mA2dpSuspend " + mA2dpSuspend ); if ((isInCall()) && (isConnected()) && if ((isInCall()) && (isConnected()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED) && (!mA2dpSuspend)) { (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if (!mA2dpSuspend) { Log.d(TAG, "Suspend A2DP streaming"); mAudioManager.setParameters("A2dpSuspended=true"); mAudioManager.setParameters("A2dpSuspended=true"); mA2dpSuspend = true; mA2dpSuspend = true; } if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { Log.d(TAG, "suspending A2DP stream for Call"); Log.d(TAG, "Cache the call state for future"); mPendingCiev = true; mPendingCiev = true; mPendingCallStates.add(callState); return ; return ; } } } } Loading Loading
src/com/android/bluetooth/hfp/HeadsetStateMachine.java +27 −8 Original line number Original line Diff line number Diff line Loading @@ -78,6 +78,7 @@ import java.util.List; import java.util.Map; import java.util.Map; import java.util.Set; import java.util.Set; import android.os.SystemProperties; import android.os.SystemProperties; import java.util.concurrent.ConcurrentLinkedQueue; final class HeadsetStateMachine extends StateMachine { final class HeadsetStateMachine extends StateMachine { private static final String TAG = "HeadsetStateMachine"; private static final String TAG = "HeadsetStateMachine"; Loading Loading @@ -190,6 +191,8 @@ final class HeadsetStateMachine extends StateMachine { private int mA2dpPlayState; private int mA2dpPlayState; private int mA2dpState; private int mA2dpState; private boolean mPendingCiev; private boolean mPendingCiev; //ConcurrentLinkeQueue is used so that it is threadsafe private ConcurrentLinkedQueue<HeadsetCallState> mPendingCallStates = new ConcurrentLinkedQueue<HeadsetCallState>(); // mCurrentDevice is the device connected before the state changes // mCurrentDevice is the device connected before the state changes // mTargetDevice is the device to be connected // mTargetDevice is the device to be connected Loading Loading @@ -1240,6 +1243,7 @@ final class HeadsetStateMachine extends StateMachine { sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); mA2dpSuspend = false;/*Reset at SLC*/ mA2dpSuspend = false;/*Reset at SLC*/ mPendingCiev = false; mPendingCiev = false; mPendingCallStates.clear(); if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if (DBG) { if (DBG) { log("Headset connected while we are in some call state"); log("Headset connected while we are in some call state"); Loading Loading @@ -2266,6 +2270,7 @@ final class HeadsetStateMachine extends StateMachine { sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); sendMessageDelayed(QUERY_PHONE_STATE_AT_SLC, QUERY_PHONE_STATE_CHANGED_DELAYED); mA2dpSuspend = false;/*Reset at SLC*/ mA2dpSuspend = false;/*Reset at SLC*/ mPendingCiev = false; mPendingCiev = false; mPendingCallStates.clear(); if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if ((isInCall()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { log("Headset connected while we are in some call state"); log("Headset connected while we are in some call state"); log("Make A2dpSuspended=true here"); log("Make A2dpSuspended=true here"); Loading Loading @@ -2815,6 +2820,7 @@ final class HeadsetStateMachine extends StateMachine { if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { log("suspending A2DP stream for SCO"); log("suspending A2DP stream for SCO"); mPendingCiev = true; mPendingCiev = true; //This is VOIP call, dont need to remember the states return true; return true; } } } } Loading Loading @@ -2882,7 +2888,6 @@ final class HeadsetStateMachine extends StateMachine { BluetoothA2dp.STATE_NOT_PLAYING); BluetoothA2dp.STATE_NOT_PLAYING); Log.d(TAG, "A2dp Play State Changed: Current State: " + currState + Log.d(TAG, "A2dp Play State Changed: Current State: " + currState + "Prev State: " + prevState + "A2pSuspend: " + mA2dpSuspend); "Prev State: " + prevState + "A2pSuspend: " + mA2dpSuspend); mA2dpPlayState = currState; if (prevState == BluetoothA2dp.STATE_PLAYING) { if (prevState == BluetoothA2dp.STATE_PLAYING) { if (mA2dpSuspend && mPendingCiev) { if (mA2dpSuspend && mPendingCiev) { Loading @@ -2900,9 +2905,18 @@ final class HeadsetStateMachine extends StateMachine { } else { } else { //send incomming phone status to remote device //send incomming phone status to remote device log("A2dp is suspended, updating phone status if any"); log("A2dp is suspended, updating phone status if any"); phoneStateChangeNative( mPhoneState.getNumActiveCall(), Iterator<HeadsetCallState> it = mPendingCallStates.iterator(); mPhoneState.getNumHeldCall(),mPhoneState.getCallState(), if (it != null) { mPhoneState.getNumber(),mPhoneState.getType()); while (it.hasNext()) { HeadsetCallState callState = it.next(); phoneStateChangeNative( callState.mNumActive, callState.mNumHeld,callState.mCallState, callState.mNumber,callState.mType); it.remove(); } } else { Log.d(TAG, "There are no pending call state changes"); } } } mPendingCiev = false; mPendingCiev = false; } } Loading @@ -2919,6 +2933,7 @@ final class HeadsetStateMachine extends StateMachine { } } } } } } mA2dpPlayState = currState; } } private void processAnswerCall(BluetoothDevice device) { private void processAnswerCall(BluetoothDevice device) { Loading Loading @@ -3122,12 +3137,16 @@ final class HeadsetStateMachine extends StateMachine { private void processA2dpState(HeadsetCallState callState) { private void processA2dpState(HeadsetCallState callState) { log("mA2dpPlayState " + mA2dpPlayState + " mA2dpSuspend " + mA2dpSuspend ); log("mA2dpPlayState " + mA2dpPlayState + " mA2dpSuspend " + mA2dpSuspend ); if ((isInCall()) && (isConnected()) && if ((isInCall()) && (isConnected()) && (mA2dpState == BluetoothProfile.STATE_CONNECTED) && (!mA2dpSuspend)) { (mA2dpState == BluetoothProfile.STATE_CONNECTED)) { if (!mA2dpSuspend) { Log.d(TAG, "Suspend A2DP streaming"); mAudioManager.setParameters("A2dpSuspended=true"); mAudioManager.setParameters("A2dpSuspended=true"); mA2dpSuspend = true; mA2dpSuspend = true; } if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { if (mA2dpPlayState == BluetoothA2dp.STATE_PLAYING) { Log.d(TAG, "suspending A2DP stream for Call"); Log.d(TAG, "Cache the call state for future"); mPendingCiev = true; mPendingCiev = true; mPendingCallStates.add(callState); return ; return ; } } } } Loading