Loading android/app/src/com/android/bluetooth/hfp/HeadsetService.java +16 −6 Original line number Original line Diff line number Diff line Loading @@ -136,7 +136,7 @@ public class HeadsetService extends ProfileService { private VoiceRecognitionTimeoutEvent mVoiceRecognitionTimeoutEvent; private VoiceRecognitionTimeoutEvent mVoiceRecognitionTimeoutEvent; // Timeout when voice recognition is started by remote device // Timeout when voice recognition is started by remote device @VisibleForTesting static int sStartVrTimeoutMs = 5000; @VisibleForTesting static int sStartVrTimeoutMs = 5000; private ArrayList<HeadsetClccResponse> mHeadsetClccResponses = new ArrayList<>(); private ArrayList<StateMachineTask> mPendingClccResponses = new ArrayList<>(); private boolean mStarted; private boolean mStarted; private boolean mCreated; private boolean mCreated; private static HeadsetService sHeadsetService; private static HeadsetService sHeadsetService; Loading Loading @@ -328,6 +328,14 @@ public class HeadsetService extends ProfileService { } } } } private void doForEachConnectedStateMachine(List<StateMachineTask> tasks) { synchronized (mStateMachines) { for (StateMachineTask task : tasks) { doForEachConnectedStateMachine(task); } } } void onDeviceStateChanged(HeadsetDeviceState deviceState) { void onDeviceStateChanged(HeadsetDeviceState deviceState) { doForEachConnectedStateMachine( doForEachConnectedStateMachine( stateMachine -> stateMachine.sendMessage(HeadsetStateMachine.DEVICE_STATE_CHANGED, stateMachine -> stateMachine.sendMessage(HeadsetStateMachine.DEVICE_STATE_CHANGED, Loading Loading @@ -1854,18 +1862,20 @@ public class HeadsetService extends ProfileService { mSystemInterface.getAudioManager().setA2dpSuspended(false); mSystemInterface.getAudioManager().setA2dpSuspended(false); } } }); }); } } @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) private void clccResponse(int index, int direction, int status, int mode, boolean mpty, private void clccResponse(int index, int direction, int status, int mode, boolean mpty, String number, int type) { String number, int type) { enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "Need MODIFY_PHONE_STATE permission"); enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "Need MODIFY_PHONE_STATE permission"); mHeadsetClccResponses.add( mPendingClccResponses.add( new HeadsetClccResponse(index, direction, status, mode, mpty, number, type)); stateMachine -> stateMachine.sendMessage(HeadsetStateMachine.SEND_CLCC_RESPONSE, new HeadsetClccResponse(index, direction, status, mode, mpty, number, type))); if (index == CLCC_END_MARK_INDEX) { if (index == CLCC_END_MARK_INDEX) { doForEachConnectedStateMachine(stateMachine -> stateMachine.sendMessage( doForEachConnectedStateMachine(mPendingClccResponses); HeadsetStateMachine.SEND_CLCC_RESPONSE, mHeadsetClccResponses)); mPendingClccResponses.clear(); mHeadsetClccResponses.clear(); } } } } Loading android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java +6 −7 Original line number Original line Diff line number Diff line Loading @@ -869,7 +869,7 @@ public class HeadsetStateMachine extends StateMachine { mNativeInterface.notifyDeviceStatus(mDevice, (HeadsetDeviceState) message.obj); mNativeInterface.notifyDeviceStatus(mDevice, (HeadsetDeviceState) message.obj); break; break; case SEND_CLCC_RESPONSE: case SEND_CLCC_RESPONSE: processSendClccResponse((ArrayList<HeadsetClccResponse>) message.obj); processSendClccResponse((HeadsetClccResponse) message.obj); break; break; case CLCC_RSP_TIMEOUT: { case CLCC_RSP_TIMEOUT: { BluetoothDevice device = (BluetoothDevice) message.obj; BluetoothDevice device = (BluetoothDevice) message.obj; Loading Loading @@ -2029,17 +2029,16 @@ public class HeadsetStateMachine extends StateMachine { sendIndicatorIntent(device, indId, indValue); sendIndicatorIntent(device, indId, indValue); } } private void processSendClccResponse(ArrayList<HeadsetClccResponse> clccList) { private void processSendClccResponse(HeadsetClccResponse clcc) { if (!hasMessages(CLCC_RSP_TIMEOUT)) { if (!hasMessages(CLCC_RSP_TIMEOUT)) { return; return; } } if (clcc.mIndex == 0) { removeMessages(CLCC_RSP_TIMEOUT); removeMessages(CLCC_RSP_TIMEOUT); } for (HeadsetClccResponse clcc : clccList) { mNativeInterface.clccResponse(mDevice, clcc.mIndex, clcc.mDirection, clcc.mStatus, mNativeInterface.clccResponse(mDevice, clcc.mIndex, clcc.mDirection, clcc.mStatus, clcc.mMode, clcc.mMpty, clcc.mNumber, clcc.mType); clcc.mMode, clcc.mMpty, clcc.mNumber, clcc.mType); } } } private void processSendVendorSpecificResultCode(HeadsetVendorSpecificResultCode resultCode) { private void processSendVendorSpecificResultCode(HeadsetVendorSpecificResultCode resultCode) { String stringToSend = resultCode.mCommand + ": "; String stringToSend = resultCode.mCommand + ": "; Loading Loading
android/app/src/com/android/bluetooth/hfp/HeadsetService.java +16 −6 Original line number Original line Diff line number Diff line Loading @@ -136,7 +136,7 @@ public class HeadsetService extends ProfileService { private VoiceRecognitionTimeoutEvent mVoiceRecognitionTimeoutEvent; private VoiceRecognitionTimeoutEvent mVoiceRecognitionTimeoutEvent; // Timeout when voice recognition is started by remote device // Timeout when voice recognition is started by remote device @VisibleForTesting static int sStartVrTimeoutMs = 5000; @VisibleForTesting static int sStartVrTimeoutMs = 5000; private ArrayList<HeadsetClccResponse> mHeadsetClccResponses = new ArrayList<>(); private ArrayList<StateMachineTask> mPendingClccResponses = new ArrayList<>(); private boolean mStarted; private boolean mStarted; private boolean mCreated; private boolean mCreated; private static HeadsetService sHeadsetService; private static HeadsetService sHeadsetService; Loading Loading @@ -328,6 +328,14 @@ public class HeadsetService extends ProfileService { } } } } private void doForEachConnectedStateMachine(List<StateMachineTask> tasks) { synchronized (mStateMachines) { for (StateMachineTask task : tasks) { doForEachConnectedStateMachine(task); } } } void onDeviceStateChanged(HeadsetDeviceState deviceState) { void onDeviceStateChanged(HeadsetDeviceState deviceState) { doForEachConnectedStateMachine( doForEachConnectedStateMachine( stateMachine -> stateMachine.sendMessage(HeadsetStateMachine.DEVICE_STATE_CHANGED, stateMachine -> stateMachine.sendMessage(HeadsetStateMachine.DEVICE_STATE_CHANGED, Loading Loading @@ -1854,18 +1862,20 @@ public class HeadsetService extends ProfileService { mSystemInterface.getAudioManager().setA2dpSuspended(false); mSystemInterface.getAudioManager().setA2dpSuspended(false); } } }); }); } } @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) @RequiresPermission(android.Manifest.permission.MODIFY_PHONE_STATE) private void clccResponse(int index, int direction, int status, int mode, boolean mpty, private void clccResponse(int index, int direction, int status, int mode, boolean mpty, String number, int type) { String number, int type) { enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "Need MODIFY_PHONE_STATE permission"); enforceCallingOrSelfPermission(MODIFY_PHONE_STATE, "Need MODIFY_PHONE_STATE permission"); mHeadsetClccResponses.add( mPendingClccResponses.add( new HeadsetClccResponse(index, direction, status, mode, mpty, number, type)); stateMachine -> stateMachine.sendMessage(HeadsetStateMachine.SEND_CLCC_RESPONSE, new HeadsetClccResponse(index, direction, status, mode, mpty, number, type))); if (index == CLCC_END_MARK_INDEX) { if (index == CLCC_END_MARK_INDEX) { doForEachConnectedStateMachine(stateMachine -> stateMachine.sendMessage( doForEachConnectedStateMachine(mPendingClccResponses); HeadsetStateMachine.SEND_CLCC_RESPONSE, mHeadsetClccResponses)); mPendingClccResponses.clear(); mHeadsetClccResponses.clear(); } } } } Loading
android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java +6 −7 Original line number Original line Diff line number Diff line Loading @@ -869,7 +869,7 @@ public class HeadsetStateMachine extends StateMachine { mNativeInterface.notifyDeviceStatus(mDevice, (HeadsetDeviceState) message.obj); mNativeInterface.notifyDeviceStatus(mDevice, (HeadsetDeviceState) message.obj); break; break; case SEND_CLCC_RESPONSE: case SEND_CLCC_RESPONSE: processSendClccResponse((ArrayList<HeadsetClccResponse>) message.obj); processSendClccResponse((HeadsetClccResponse) message.obj); break; break; case CLCC_RSP_TIMEOUT: { case CLCC_RSP_TIMEOUT: { BluetoothDevice device = (BluetoothDevice) message.obj; BluetoothDevice device = (BluetoothDevice) message.obj; Loading Loading @@ -2029,17 +2029,16 @@ public class HeadsetStateMachine extends StateMachine { sendIndicatorIntent(device, indId, indValue); sendIndicatorIntent(device, indId, indValue); } } private void processSendClccResponse(ArrayList<HeadsetClccResponse> clccList) { private void processSendClccResponse(HeadsetClccResponse clcc) { if (!hasMessages(CLCC_RSP_TIMEOUT)) { if (!hasMessages(CLCC_RSP_TIMEOUT)) { return; return; } } if (clcc.mIndex == 0) { removeMessages(CLCC_RSP_TIMEOUT); removeMessages(CLCC_RSP_TIMEOUT); } for (HeadsetClccResponse clcc : clccList) { mNativeInterface.clccResponse(mDevice, clcc.mIndex, clcc.mDirection, clcc.mStatus, mNativeInterface.clccResponse(mDevice, clcc.mIndex, clcc.mDirection, clcc.mStatus, clcc.mMode, clcc.mMpty, clcc.mNumber, clcc.mType); clcc.mMode, clcc.mMpty, clcc.mNumber, clcc.mType); } } } private void processSendVendorSpecificResultCode(HeadsetVendorSpecificResultCode resultCode) { private void processSendVendorSpecificResultCode(HeadsetVendorSpecificResultCode resultCode) { String stringToSend = resultCode.mCommand + ": "; String stringToSend = resultCode.mCommand + ": "; Loading