diff --git a/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java b/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java index 382a61e146a305c3a9d779c083cb3f4ddcc73b92..e4ce5e0f66bac7af3a03b5600e20108d900d409f 100644 --- a/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java +++ b/android/app/src/com/android/bluetooth/hfp/HeadsetStateMachine.java @@ -159,6 +159,8 @@ public class HeadsetStateMachine extends StateMachine { // Audio disconnect timeout retry count private int mAudioDisconnectRetry = 0; + static final int HFP_SET_AUDIO_POLICY = 1; + private BluetoothSinkAudioPolicy mHsClientAudioPolicy; // Keys are AT commands, and values are the company IDs. @@ -1964,90 +1966,87 @@ public class HeadsetStateMachine extends StateMachine { } /** - * Look for Android specific AT command starts with AT+ANDROID and try to process it + * Process Android specific AT commands. * - * @param atString AT command in string + * @param atString AT command after the "AT+" prefix. Starts with "ANDROID" * @param device Remote device that has sent this command - * @return true if the command is processed, false if not. */ - @VisibleForTesting - boolean checkAndProcessAndroidAt(String atString, BluetoothDevice device) { - log("checkAndProcessAndroidAt - atString = " + atString); + private void processAndroidAt(String atString, BluetoothDevice device) { + log("processAndroidSpecificAt - atString = " + atString); if (atString.equals("+ANDROID=?")) { // feature request type command processAndroidAtFeatureRequest(device); - mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_OK, 0); - return true; } else if (atString.startsWith("+ANDROID=")) { // set type command int equalIndex = atString.indexOf("="); String arg = atString.substring(equalIndex + 1); if (arg.isEmpty()) { - Log.w(TAG, "Android AT command is empty"); - return false; + Log.e(TAG, "Command Invalid!"); + mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_ERROR, 0); + return; } Object[] args = generateArgs(arg); - String type = (String) args[0]; - - if (type.equals(BluetoothSinkAudioPolicy.HFP_SET_SINK_AUDIO_POLICY_ID)) { - Log.d(TAG, "Processing command: " + atString); - if (processAndroidAtSinkAudioPolicy(args, device)) { - mNativeInterface.atResponseCode(device, - HeadsetHalConstants.AT_RESPONSE_OK, 0); - } else { - Log.w(TAG, "Invalid SinkAudioPolicy parameters!"); - mNativeInterface.atResponseCode(device, - HeadsetHalConstants.AT_RESPONSE_ERROR, 0); - } - return true; + if (!(args[0] instanceof Integer)) { + Log.e(TAG, "Type ID is invalid"); + mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_ERROR, 0); + return; + } + + int type = (Integer) args[0]; + + if (type == HFP_SET_AUDIO_POLICY) { + processAndroidAtSetAudioPolicy(args, device); } else { - Log.w(TAG, "Undefined Android command type: " + type); - return false; + Log.w(TAG, "Undefined AT+ANDROID command"); + mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_ERROR, 0); + return; } + } else { + Log.e(TAG, "Undefined AT+ANDROID command"); + mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_ERROR, 0); + return; } - - Log.w(TAG, "Unhandled +ANDROID command: " + atString); - return false; + mNativeInterface.atResponseCode(device, HeadsetHalConstants.AT_RESPONSE_OK, 0); } private void processAndroidAtFeatureRequest(BluetoothDevice device) { /* - replying with +ANDROID: (<feature1>, <feature2>, ...) - currently we only support one type of feature: SINKAUDIOPOLICY + replying with +ANDROID=1 + here, 1 is the feature id for audio policy + + currently we only support one type of feature */ mNativeInterface.atResponseString(device, BluetoothHeadset.VENDOR_RESULT_CODE_COMMAND_ANDROID - + ": (" + BluetoothSinkAudioPolicy.HFP_SET_SINK_AUDIO_POLICY_ID + ")"); + + ": " + HFP_SET_AUDIO_POLICY); } /** - * Process AT+ANDROID=SINKAUDIOPOLICY AT command + * Process AT+ANDROID AT command * * @param args command arguments after the equal sign * @param device Remote device that has sent this command - * @return true on success, false on error */ - @VisibleForTesting - boolean processAndroidAtSinkAudioPolicy(Object[] args, BluetoothDevice device) { + private void processAndroidAtSetAudioPolicy(Object[] args, BluetoothDevice device) { if (args.length != 4) { - Log.e(TAG, "processAndroidAtSinkAudioPolicy() args length must be 4: " + Log.e(TAG, "processAndroidAtSetAudioPolicy() args length must be 4: " + String.valueOf(args.length)); - return false; + return; } if (!(args[1] instanceof Integer) || !(args[2] instanceof Integer) || !(args[3] instanceof Integer)) { - Log.e(TAG, "processAndroidAtSinkAudioPolicy() argument types not matched"); - return false; + Log.e(TAG, "processAndroidAtSetAudioPolicy() argument types not matched"); + return; } if (!mDevice.equals(device)) { - Log.e(TAG, "processAndroidAtSinkAudioPolicy(): argument device " + device + Log.e(TAG, "processAndroidAtSetAudioPolicy(): argument device " + device + " doesn't match mDevice " + mDevice); - return false; + return; } int callEstablishPolicy = (Integer) args[1]; @@ -2059,7 +2058,6 @@ public class HeadsetStateMachine extends StateMachine { .setActiveDevicePolicyAfterConnection(connectingTimePolicy) .setInBandRingtonePolicy(inbandPolicy) .build()); - return true; } /** @@ -2131,9 +2129,6 @@ public class HeadsetStateMachine extends StateMachine { processAtCpbs(atCommand.substring(5), commandType, device); } else if (atCommand.startsWith("+CPBR")) { processAtCpbr(atCommand.substring(5), commandType, device); - } else if (atCommand.startsWith("+ANDROID") - && checkAndProcessAndroidAt(atCommand, device)) { - // Do nothing } else { processVendorSpecificAt(atCommand, device); } diff --git a/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java b/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java index b63078329b818e0fee994b83f5d37ea732613b5a..79cdb0bfdecfe8c0f2a75f736e733ce360ee7257 100644 --- a/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java +++ b/android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java @@ -188,6 +188,8 @@ public class HeadsetClientStateMachine extends StateMachine { private final boolean mClccPollDuringCall; + private static final int CALL_AUDIO_POLICY_FEATURE_ID = 1; + public int mAudioPolicyRemoteSupported; private BluetoothSinkAudioPolicy mHsClientAudioPolicy; private final int mConnectingTimePolicyProperty; @@ -1215,15 +1217,14 @@ public class HeadsetClientStateMachine extends StateMachine { break; case StackEvent.EVENT_TYPE_UNKNOWN_EVENT: - if (mVendorProcessor.isAndroidAtCommand(event.valueString) - && processAndroidSlcCommand(event.valueString, event.device)) { + if (mVendorProcessor.processEvent(event.valueString, event.device)) { + mQueuedActions.poll(); transitionTo(mConnected); } else { Log.e(TAG, "Unknown event :" + event.valueString + " for device " + event.device); } break; - case StackEvent.EVENT_TYPE_SUBSCRIBER_INFO: case StackEvent.EVENT_TYPE_CURRENT_CALLS: case StackEvent.EVENT_TYPE_OPERATOR_NAME: @@ -2026,44 +2027,6 @@ public class HeadsetClientStateMachine extends StateMachine { HfpClientConnectionService.onAudioStateChanged(device, newState, prevState); } - @VisibleForTesting - boolean processAndroidSlcCommand(String atString, BluetoothDevice device) { - if (!mCurrentDevice.equals(device) || atString.lastIndexOf("+ANDROID:") < 0) { - return false; - } - - // Check if it is +ANDROID: (<feature1>,...),(<feature2>, ...) the reply for AT+ANDROID=? - while (true) { - int indexUpperBucket = atString.indexOf("("); - int indexLowerBucket = atString.indexOf(")"); - - if (indexUpperBucket < 0 || indexLowerBucket < 0 - || indexUpperBucket >= indexLowerBucket) { - break; - } - String feature = atString.substring(indexUpperBucket + 1, indexLowerBucket); - Log.d(TAG, "processAndroidSlcCommand: feature=[" + feature + "]"); - processAndroidAtFeature(feature.split(",")); - - atString = atString.substring(indexLowerBucket + 1); - } - return true; - } - - private void processAndroidAtFeature(String[] args) { - if (args.length < 1) { - Log.e(TAG, "processAndroidAtFeature: Invalid feature length"); - return; - } - - String featureId = args[0]; - if (featureId.equals(BluetoothSinkAudioPolicy.HFP_SET_SINK_AUDIO_POLICY_ID)) { - Log.i(TAG, "processAndroidAtFeature:" - + BluetoothSinkAudioPolicy.HFP_SET_SINK_AUDIO_POLICY_ID + " supported"); - setAudioPolicyRemoteSupported(true); - } - } - // This method does not check for error condition (newState == prevState) private void broadcastConnectionState(BluetoothDevice device, int newState, int prevState) { logD("Connection state " + device + ": " + prevState + "->" + newState); @@ -2263,7 +2226,7 @@ public class HeadsetClientStateMachine extends StateMachine { private String createMaskString(BluetoothSinkAudioPolicy policies) { StringBuilder mask = new StringBuilder(); - mask.append(BluetoothSinkAudioPolicy.HFP_SET_SINK_AUDIO_POLICY_ID); + mask.append(Integer.toString(CALL_AUDIO_POLICY_FEATURE_ID)); mask.append("," + policies.getCallEstablishPolicy()); mask.append("," + policies.getActiveDevicePolicyAfterConnection()); mask.append("," + policies.getInBandRingtonePolicy()); diff --git a/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java b/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java index f1a39d289617ddbc591ca0242eb246a066c8bb26..a35f42f13d34ce5b5f8c7c1a233f23e67a3d0921 100644 --- a/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java +++ b/android/app/src/com/android/bluetooth/hfpclient/VendorCommandResponseProcessor.java @@ -127,7 +127,12 @@ class VendorCommandResponseProcessor { return true; } - private String getVendorIdFromAtCommand(String atString) { + public boolean processEvent(String atString, BluetoothDevice device) { + if (device == null) { + Log.w(TAG, "processVendorEvent device is null"); + return false; + } + // Get event code int indexOfEqual = atString.indexOf('='); int indexOfColon = atString.indexOf(':'); @@ -143,29 +148,13 @@ class VendorCommandResponseProcessor { // replace all white spaces eventCode = eventCode.replaceAll("\\s+", ""); - return eventCode; - } - - public boolean isAndroidAtCommand(String atString) { - String eventCode = getVendorIdFromAtCommand(atString); - Integer vendorId = SUPPORTED_VENDOR_EVENTS.get(eventCode); - if (vendorId == null) { - return false; - } - return vendorId == BluetoothAssignedNumbers.GOOGLE; - } - - public boolean processEvent(String atString, BluetoothDevice device) { - if (device == null) { - Log.w(TAG, "processVendorEvent device is null"); - return false; - } - - String eventCode = getVendorIdFromAtCommand(atString); Integer vendorId = SUPPORTED_VENDOR_EVENTS.get(eventCode); if (vendorId == null) { Log.e(TAG, "Invalid response: " + atString + ". " + eventCode); return false; + } else if (vendorId == BluetoothAssignedNumbers.GOOGLE) { + Log.i(TAG, "received +ANDROID event. Setting Audio policy to true"); + mService.setAudioPolicyRemoteSupported(device, true); } else { broadcastVendorSpecificEventIntent(vendorId, eventCode, atString, device); logD("process vendor event " + vendorId + ", " + eventCode + ", " diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java index 2a9648920e216883a4a1056827b8ad1dc5fc06ce..ca3067d8b3dd5eba7c0799db29ea5a9f9a0f9236 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfp/HeadsetStateMachineTest.java @@ -1439,118 +1439,18 @@ public class HeadsetStateMachineTest { /** * A test to validate received Android AT commands and processing */ + @Ignore("b/275668166") @Test - public void testCheckAndProcessAndroidAt() { - // Commands that will be handled - Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID=?" , mTestDevice)); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(1)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0); - Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID=SINKAUDIOPOLICY,1,1,1" , mTestDevice)); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(2)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0); - Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID=SINKAUDIOPOLICY,100,100,100" , mTestDevice)); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(3)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0); - Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID=SINKAUDIOPOLICY,1,2,3,4,5" , mTestDevice)); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(1)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0); - - // Commands with correct format but will not be handled - Assert.assertFalse(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID=" , mTestDevice)); - Assert.assertFalse(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID: PROBE,1,\"`AB\"" , mTestDevice)); - Assert.assertFalse(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID= PROBE,1,\"`AB\"" , mTestDevice)); - Assert.assertFalse(mHeadsetStateMachine.checkAndProcessAndroidAt( - "AT+ANDROID=PROBE,1,1,\"PQGHRSBCTU__\"" , mTestDevice)); - - // Incorrect format AT command - Assert.assertFalse(mHeadsetStateMachine.checkAndProcessAndroidAt( - "RANDOM FORMAT" , mTestDevice)); - - // Check no any AT result was sent for the failed ones - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(3)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(1)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_ERROR, 0); - } - - @Test - public void testCheckAndProcessAndroidAt_replyAndroidAtFeatureRequest() { - // Commands that will be handled - Assert.assertTrue(mHeadsetStateMachine.checkAndProcessAndroidAt( - "+ANDROID=?" , mTestDevice)); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS)).atResponseString( - mTestDevice, "+ANDROID: (SINKAUDIOPOLICY)"); - verify(mNativeInterface, timeout(ASYNC_CALL_TIMEOUT_MILLIS)).atResponseCode( - mTestDevice, HeadsetHalConstants.AT_RESPONSE_OK, 0); - } - - /** - * A end to end test to validate received Android AT commands and processing - */ - @Test - public void testCehckAndProcessAndroidAtFromStateMachine() { - // setAudioPolicyMetadata is invoked in HeadsetStateMachine.init() so start from 1 - int expectCallTimes = 1; - - // setup Audio Policy Feature + public void testProcessAndroidAt() { setUpConnectedState(); - + // setup Audio Policy Feature setUpAudioPolicy(); // receive and set android policy mHeadsetStateMachine.sendMessage(HeadsetStateMachine.STACK_EVENT, new HeadsetStackEvent(HeadsetStackEvent.EVENT_TYPE_UNKNOWN_AT, - "+ANDROID=SINKAUDIOPOLICY,1,1,1", mTestDevice)); - expectCallTimes++; - verify(mDatabaseManager, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(expectCallTimes)) + "+ANDROID=1,1,1,1", mTestDevice)); + verify(mDatabaseManager, timeout(ASYNC_CALL_TIMEOUT_MILLIS)) .setAudioPolicyMetadata(anyObject(), anyObject()); - - // receive and not set android policy - mHeadsetStateMachine.sendMessage(HeadsetStateMachine.STACK_EVENT, - new HeadsetStackEvent(HeadsetStackEvent.EVENT_TYPE_UNKNOWN_AT, - "AT+ANDROID=PROBE,1,1,\"PQGHRSBCTU__\"", mTestDevice)); - verify(mDatabaseManager, timeout(ASYNC_CALL_TIMEOUT_MILLIS).times(expectCallTimes)) - .setAudioPolicyMetadata(anyObject(), anyObject()); - } - - /** - * A test to verify whether the sink audio policy command is valid - */ - @Test - public void testProcessAndroidAtSinkAudioPolicy() { - // expected format - Assert.assertTrue(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0,0,0", mTestDevice)); - Assert.assertTrue(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0,0,1", mTestDevice)); - Assert.assertTrue(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0,1,0", mTestDevice)); - Assert.assertTrue(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,1,0,0", mTestDevice)); - Assert.assertTrue(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,1,1,1", mTestDevice)); - - // invalid format - Assert.assertFalse(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0", mTestDevice)); - Assert.assertFalse(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0,0", mTestDevice)); - Assert.assertFalse(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0,0,0,0", mTestDevice)); - Assert.assertFalse(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,NOT,INT,TYPE", mTestDevice)); - Assert.assertFalse(setSinkAudioPolicyArgs("RANDOM,VALUE-#$%,*(&^", mTestDevice)); - - // wrong device - BluetoothDevice device = mAdapter.getRemoteDevice("01:01:01:01:01:01"); - Assert.assertFalse(setSinkAudioPolicyArgs("SINKAUDIOPOLICY,0,0,0", device)); - } - - /** - * set sink audio policy - * @param arg body of the AT command - * @return the result from processAndroidAtSinkAudioPolicy - */ - private boolean setSinkAudioPolicyArgs(String arg, BluetoothDevice device) { - Object[] args = HeadsetStateMachine.generateArgs(arg); - return mHeadsetStateMachine.processAndroidAtSinkAudioPolicy(args, device); } /** diff --git a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java index bfda3f757bb72d7a29c8e5d46daaa2fd71f75d02..72b104ad5c7b77af42aa6ee2de1c5c00a7c19535 100644 --- a/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java +++ b/android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java @@ -293,61 +293,6 @@ public class HeadsetClientStateMachineTest { verify(mHeadsetService).updateInbandRinging(eq(mTestDevice), eq(false)); } - @Test - public void testProcessAndroidSlcCommand() { - initToConnectedState(); - - // True on correct AT command and BluetothDevice - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: (SINKAUDIOPOLICY)", mTestDevice)); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: ()", mTestDevice)); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: (,,,)", mTestDevice)); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: (SINKAUDIOPOLICY),(OTHERFEATURE)", mTestDevice)); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: (SINKAUDIOPOLICY),(OTHERFEATURE,1,2,3),(1,2,3)", mTestDevice)); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: 123", mTestDevice)); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: ", mTestDevice)); - - // False on incorrect AT command format - Assert.assertFalse(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID= (SINKAUDIOPOLICY)", mTestDevice)); - Assert.assertFalse(mHeadsetClientStateMachine.processAndroidSlcCommand( - "RANDOM ^%$# STRING", mTestDevice)); - Assert.assertFalse(mHeadsetClientStateMachine.processAndroidSlcCommand("", mTestDevice)); - - // False on incorrect BluetoothDevice - Assert.assertFalse(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: (SINKAUDIOPOLICY)", mAdapter.getRemoteDevice("05:04:01:02:03:00"))); - } - - @Test - public void testProcessAndroidSlcCommand_checkSinkAudioPolicy() { - initToConnectedState(); - - mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(false); - Assert.assertFalse(mHeadsetClientStateMachine.processAndroidSlcCommand( - "RANDOM ^%$# STRING", mTestDevice)); - Assert.assertEquals(BluetoothStatusCodes.FEATURE_NOT_SUPPORTED, - mHeadsetClientStateMachine.getAudioPolicyRemoteSupported()); - - mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(false); - Assert.assertFalse(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID= (SINKAUDIOPOLICY)", mTestDevice)); - Assert.assertEquals(BluetoothStatusCodes.FEATURE_NOT_SUPPORTED, - mHeadsetClientStateMachine.getAudioPolicyRemoteSupported()); - - mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(false); - Assert.assertTrue(mHeadsetClientStateMachine.processAndroidSlcCommand( - "+ANDROID: (SINKAUDIOPOLICY)", mTestDevice)); - Assert.assertEquals(BluetoothStatusCodes.FEATURE_SUPPORTED, - mHeadsetClientStateMachine.getAudioPolicyRemoteSupported()); - } - /** * Test that In Band Ringtone information is relayed from phone. */ @@ -529,32 +474,19 @@ public class HeadsetClientStateMachineTest { private void setUpAndroidAt(boolean androidAtSupported) { verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=?"); if (androidAtSupported) { - // inject Android AT features StackEvent unknownEvt = new StackEvent(StackEvent.EVENT_TYPE_UNKNOWN_EVENT); - unknownEvt.valueString = "+ANDROID: (SINKAUDIOPOLICY)"; + unknownEvt.valueString = "+ANDROID: 1"; unknownEvt.device = mTestDevice; mHeadsetClientStateMachine.sendMessage(StackEvent.STACK_EVENT, unknownEvt); TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); - - // receive CMD_RESULT OK after the Anroid AT command from remote - StackEvent cmdResEvt = new StackEvent(StackEvent.EVENT_TYPE_CMD_RESULT); - cmdResEvt.valueInt = StackEvent.CMD_RESULT_TYPE_OK; - cmdResEvt.device = mTestDevice; - mHeadsetClientStateMachine.sendMessage(StackEvent.STACK_EVENT, cmdResEvt); - TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); - - Assert.assertEquals(BluetoothStatusCodes.FEATURE_SUPPORTED, - mHeadsetClientStateMachine.getAudioPolicyRemoteSupported()); + verify(mHeadsetClientService).setAudioPolicyRemoteSupported(mTestDevice, true); + mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(true); } else { // receive CMD_RESULT CME_ERROR due to remote not supporting Android AT StackEvent cmdResEvt = new StackEvent(StackEvent.EVENT_TYPE_CMD_RESULT); cmdResEvt.valueInt = StackEvent.CMD_RESULT_TYPE_CME_ERROR; cmdResEvt.device = mTestDevice; mHeadsetClientStateMachine.sendMessage(StackEvent.STACK_EVENT, cmdResEvt); - TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); - - Assert.assertEquals(BluetoothStatusCodes.FEATURE_NOT_SUPPORTED, - mHeadsetClientStateMachine.getAudioPolicyRemoteSupported()); } } @@ -918,24 +850,23 @@ public class HeadsetClientStateMachineTest { // Expect: Should not send +ANDROID to remote mHeadsetClientStateMachine.mCurrentDevice = mTestDevice; mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(false); - verify(mNativeInterface, never()).sendAndroidAt(mTestDevice, - "+ANDROID=SINKAUDIOPOLICY,1,0,0"); + verify(mNativeInterface, never()).sendAndroidAt(mTestDevice, "+ANDROID=1,1,0,0"); // Case 2: if remote is supported and mForceSetAudioPolicyProperty is false - // Expect: Should send +ANDROID=SINKAUDIOPOLICY,1,0,0 to remote + // Expect: Should send +ANDROID:1,1,0,0 to remote mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(true); mHeadsetClientStateMachine.setForceSetAudioPolicyProperty(false); mHeadsetClientStateMachine.setAudioRouteAllowed(true); - verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=SINKAUDIOPOLICY,1,0,0"); + verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=1,1,0,0"); mHeadsetClientStateMachine.setAudioRouteAllowed(false); - verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=SINKAUDIOPOLICY,2,0,0"); + verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=1,2,0,0"); // Case 3: if remote is supported and mForceSetAudioPolicyProperty is true - // Expect: Should send +ANDROID=SINKAUDIOPOLICY,1,2,1 to remote + // Expect: Should send +ANDROID:1,1,2,1 to remote mHeadsetClientStateMachine.setForceSetAudioPolicyProperty(true); mHeadsetClientStateMachine.setAudioRouteAllowed(true); - verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=SINKAUDIOPOLICY,1,2,1"); + verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=1,1,2,1"); } @Test @@ -1175,8 +1106,7 @@ public class HeadsetClientStateMachineTest { BluetoothSinkAudioPolicy dummyAudioPolicy = new BluetoothSinkAudioPolicy.Builder().build(); mHeadsetClientStateMachine.setAudioPolicy(dummyAudioPolicy); - verify(mNativeInterface, never()).sendAndroidAt(mTestDevice, - "+ANDROID=SINKAUDIOPOLICY,0,0,0"); + verify(mNativeInterface, never()).sendAndroidAt(mTestDevice, "+ANDROID:1,0,0,0"); } @SmallTest @@ -1200,14 +1130,13 @@ public class HeadsetClientStateMachineTest { // Test if not support audio policy feature mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(false); mHeadsetClientStateMachine.setAudioPolicy(dummyAudioPolicy); - verify(mNativeInterface, never()).sendAndroidAt(mTestDevice, - "+ANDROID=SINKAUDIOPOLICY,1,2,1"); + verify(mNativeInterface, never()).sendAndroidAt(mTestDevice, "+ANDROID=1,1,2,1"); Assert.assertEquals(0, mHeadsetClientStateMachine.mQueuedActions.size()); // Test setAudioPolicy mHeadsetClientStateMachine.setAudioPolicyRemoteSupported(true); mHeadsetClientStateMachine.setAudioPolicy(dummyAudioPolicy); - verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=SINKAUDIOPOLICY,1,2,1"); + verify(mNativeInterface).sendAndroidAt(mTestDevice, "+ANDROID=1,1,2,1"); Assert.assertEquals(1, mHeadsetClientStateMachine.mQueuedActions.size()); mHeadsetClientStateMachine.mQueuedActions.clear(); @@ -1337,7 +1266,7 @@ public class HeadsetClientStateMachineTest { @Test public void testProcessStackEvent_Unknown_onConnectingState() { - String atCommand = "+ANDROID: (SINKAUDIOPOLICY)"; + String atCommand = "+ANDROID: 1"; initToConnectingState(); StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_UNKNOWN_EVENT); @@ -1499,7 +1428,7 @@ public class HeadsetClientStateMachineTest { } private void initToConnectedState() { - String atCommand = "+ANDROID: (SINKAUDIOPOLICY)"; + String atCommand = "+ANDROID: 1"; initToConnectingState(); StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_UNKNOWN_EVENT); event.valueString = atCommand; diff --git a/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java b/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java index db44bc2e532d041579e1e255a3c512452997c323..4b2f852e2f589fe8f73de1f7b3e1f444a50ae212 100644 --- a/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java +++ b/framework/java/android/bluetooth/BluetoothSinkAudioPolicy.java @@ -107,12 +107,6 @@ public final class BluetoothSinkAudioPolicy implements Parcelable { @SystemApi public static final int POLICY_NOT_ALLOWED = 2; - /** - * The feature ID used in the HFP AT command. - * @hide - */ - public static final String HFP_SET_SINK_AUDIO_POLICY_ID = "SINKAUDIOPOLICY"; - @AudioPolicyValues private final int mCallEstablishPolicy; @AudioPolicyValues private final int mConnectingTimePolicy; @AudioPolicyValues private final int mInBandRingtonePolicy;