Loading android/app/src/com/android/bluetooth/hfpclient/HeadsetClientHalConstants.java +1 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ public final class HeadsetClientHalConstants { static final int AUDIO_STATE_CONNECTING = 1; static final int AUDIO_STATE_CONNECTED = 2; static final int AUDIO_STATE_CONNECTED_MSBC = 3; static final int AUDIO_STATE_CONNECTED_LC3 = 4; // match up with bthf_client_vr_state_t enum of bt_hf_client.h static final int VR_STATE_STOPPED = 0; Loading android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java +30 −10 Original line number Diff line number Diff line Loading @@ -197,7 +197,10 @@ public class HeadsetClientStateMachine extends StateMachine { private final int mInBandRingtonePolicyProperty; private final boolean mForceSetAudioPolicyProperty; private boolean mAudioWbs; @VisibleForTesting boolean mAudioWbs; @VisibleForTesting boolean mAudioSWB; private int mVoiceRecognitionActive; private final BluetoothAdapter mAdapter; Loading Loading @@ -237,6 +240,7 @@ public class HeadsetClientStateMachine extends StateMachine { } ProfileService.println(sb, " mAudioState: " + mAudioState); ProfileService.println(sb, " mAudioWbs: " + mAudioWbs); ProfileService.println(sb, " mAudioSWB: " + mAudioSWB); ProfileService.println(sb, " mIndicatorNetworkState: " + mIndicatorNetworkState); ProfileService.println(sb, " mIndicatorNetworkType: " + mIndicatorNetworkType); ProfileService.println(sb, " mIndicatorNetworkSignal: " + mIndicatorNetworkSignal); Loading Loading @@ -893,6 +897,7 @@ public class HeadsetClientStateMachine extends StateMachine { mAdapter = BluetoothAdapter.getDefaultAdapter(); mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED; mAudioWbs = false; mAudioSWB = false; mVoiceRecognitionActive = HeadsetClientHalConstants.VR_STATE_STOPPED; mAudioRouteAllowed = context.getResources().getBoolean( Loading Loading @@ -1030,6 +1035,7 @@ public class HeadsetClientStateMachine extends StateMachine { mInBandRing = false; mAudioWbs = false; mAudioSWB = false; // will be set on connect Loading Loading @@ -1344,6 +1350,7 @@ public class HeadsetClientStateMachine extends StateMachine { public void enter() { logD("Enter Connected: " + getCurrentMessage().what); mAudioWbs = false; mAudioSWB = false; mCommandedSpeakerVolume = -1; if (mPrevState == mConnecting) { Loading Loading @@ -1782,10 +1789,11 @@ public class HeadsetClientStateMachine extends StateMachine { } switch (state) { case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC: mAudioWbs = true; // fall through case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED: case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED, HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3, HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC: mAudioSWB = state == HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3; mAudioWbs = state == HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC; if (DBG) { Log.d(TAG, "mAudioRouteAllowed=" + mAudioRouteAllowed); } Loading Loading @@ -1820,8 +1828,13 @@ public class HeadsetClientStateMachine extends StateMachine { final int amVol = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); final int hfVol = amToHfVol(amVol); logD("hfp_enable=true mAudioSWB is " + mAudioSWB); logD("hfp_enable=true mAudioWbs is " + mAudioWbs); if (mAudioWbs) { if (mAudioSWB) { logD("Setting sampling rate as 32000"); mAudioManager.setHfpSamplingRate(32000); } else if (mAudioWbs) { logD("Setting sampling rate as 16000"); mAudioManager.setHfpSamplingRate(16000); } else { Loading Loading @@ -2007,11 +2020,18 @@ public class HeadsetClientStateMachine extends StateMachine { @VisibleForTesting void broadcastAudioState(BluetoothDevice device, int newState, int prevState) { BluetoothStatsLog.write(BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED, int sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_CVSD; if (mAudioSWB) { sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_LC3; } else if (mAudioWbs) { sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_MSBC; } BluetoothStatsLog.write( BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED, AdapterService.getAdapterService().obfuscateAddress(device), getConnectionStateFromAudioState(newState), mAudioWbs ? BluetoothHfpProtoEnums.SCO_CODEC_MSBC : BluetoothHfpProtoEnums.SCO_CODEC_CVSD, getConnectionStateFromAudioState(newState), sco_codec, AdapterService.getAdapterService().getMetricId(device)); Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED); intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState); Loading android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -1573,6 +1573,38 @@ public class HeadsetClientStateMachineTest { IsInstanceOf.instanceOf(HeadsetClientStateMachine.Connected.class)); } @Test public void testProcessStackEvent_CodecSelection_onConnectedState() { initToConnectedState(); Assert.assertThat( mHeadsetClientStateMachine.getCurrentState(), IsInstanceOf.instanceOf(HeadsetClientStateMachine.Connected.class)); // Trigger a MSBC codec stack event. Expect to mAudioWbs = true. mHeadsetClientStateMachine.mAudioWbs = false; mHeadsetClientStateMachine.mAudioSWB = false; StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED); event.valueInt = HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC; event.device = mTestDevice; mHeadsetClientStateMachine.sendMessage( mHeadsetClientStateMachine.obtainMessage(StackEvent.STACK_EVENT, event)); TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); Assert.assertTrue(mHeadsetClientStateMachine.mAudioWbs); Assert.assertFalse(mHeadsetClientStateMachine.mAudioSWB); // Trigger a LC3 codec stack event. Expect to mAudioSWB = true. mHeadsetClientStateMachine.mAudioWbs = false; mHeadsetClientStateMachine.mAudioSWB = false; event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED); event.valueInt = HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3; event.device = mTestDevice; mHeadsetClientStateMachine.sendMessage( mHeadsetClientStateMachine.obtainMessage(StackEvent.STACK_EVENT, event)); TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); Assert.assertFalse(mHeadsetClientStateMachine.mAudioWbs); Assert.assertTrue(mHeadsetClientStateMachine.mAudioSWB); } /** * Allow/disallow connection to any device * Loading Loading
android/app/src/com/android/bluetooth/hfpclient/HeadsetClientHalConstants.java +1 −0 Original line number Diff line number Diff line Loading @@ -36,6 +36,7 @@ public final class HeadsetClientHalConstants { static final int AUDIO_STATE_CONNECTING = 1; static final int AUDIO_STATE_CONNECTED = 2; static final int AUDIO_STATE_CONNECTED_MSBC = 3; static final int AUDIO_STATE_CONNECTED_LC3 = 4; // match up with bthf_client_vr_state_t enum of bt_hf_client.h static final int VR_STATE_STOPPED = 0; Loading
android/app/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachine.java +30 −10 Original line number Diff line number Diff line Loading @@ -197,7 +197,10 @@ public class HeadsetClientStateMachine extends StateMachine { private final int mInBandRingtonePolicyProperty; private final boolean mForceSetAudioPolicyProperty; private boolean mAudioWbs; @VisibleForTesting boolean mAudioWbs; @VisibleForTesting boolean mAudioSWB; private int mVoiceRecognitionActive; private final BluetoothAdapter mAdapter; Loading Loading @@ -237,6 +240,7 @@ public class HeadsetClientStateMachine extends StateMachine { } ProfileService.println(sb, " mAudioState: " + mAudioState); ProfileService.println(sb, " mAudioWbs: " + mAudioWbs); ProfileService.println(sb, " mAudioSWB: " + mAudioSWB); ProfileService.println(sb, " mIndicatorNetworkState: " + mIndicatorNetworkState); ProfileService.println(sb, " mIndicatorNetworkType: " + mIndicatorNetworkType); ProfileService.println(sb, " mIndicatorNetworkSignal: " + mIndicatorNetworkSignal); Loading Loading @@ -893,6 +897,7 @@ public class HeadsetClientStateMachine extends StateMachine { mAdapter = BluetoothAdapter.getDefaultAdapter(); mAudioState = BluetoothHeadsetClient.STATE_AUDIO_DISCONNECTED; mAudioWbs = false; mAudioSWB = false; mVoiceRecognitionActive = HeadsetClientHalConstants.VR_STATE_STOPPED; mAudioRouteAllowed = context.getResources().getBoolean( Loading Loading @@ -1030,6 +1035,7 @@ public class HeadsetClientStateMachine extends StateMachine { mInBandRing = false; mAudioWbs = false; mAudioSWB = false; // will be set on connect Loading Loading @@ -1344,6 +1350,7 @@ public class HeadsetClientStateMachine extends StateMachine { public void enter() { logD("Enter Connected: " + getCurrentMessage().what); mAudioWbs = false; mAudioSWB = false; mCommandedSpeakerVolume = -1; if (mPrevState == mConnecting) { Loading Loading @@ -1782,10 +1789,11 @@ public class HeadsetClientStateMachine extends StateMachine { } switch (state) { case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC: mAudioWbs = true; // fall through case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED: case HeadsetClientHalConstants.AUDIO_STATE_CONNECTED, HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3, HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC: mAudioSWB = state == HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3; mAudioWbs = state == HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC; if (DBG) { Log.d(TAG, "mAudioRouteAllowed=" + mAudioRouteAllowed); } Loading Loading @@ -1820,8 +1828,13 @@ public class HeadsetClientStateMachine extends StateMachine { final int amVol = mAudioManager.getStreamVolume(AudioManager.STREAM_VOICE_CALL); final int hfVol = amToHfVol(amVol); logD("hfp_enable=true mAudioSWB is " + mAudioSWB); logD("hfp_enable=true mAudioWbs is " + mAudioWbs); if (mAudioWbs) { if (mAudioSWB) { logD("Setting sampling rate as 32000"); mAudioManager.setHfpSamplingRate(32000); } else if (mAudioWbs) { logD("Setting sampling rate as 16000"); mAudioManager.setHfpSamplingRate(16000); } else { Loading Loading @@ -2007,11 +2020,18 @@ public class HeadsetClientStateMachine extends StateMachine { @VisibleForTesting void broadcastAudioState(BluetoothDevice device, int newState, int prevState) { BluetoothStatsLog.write(BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED, int sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_CVSD; if (mAudioSWB) { sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_LC3; } else if (mAudioWbs) { sco_codec = BluetoothHfpProtoEnums.SCO_CODEC_MSBC; } BluetoothStatsLog.write( BluetoothStatsLog.BLUETOOTH_SCO_CONNECTION_STATE_CHANGED, AdapterService.getAdapterService().obfuscateAddress(device), getConnectionStateFromAudioState(newState), mAudioWbs ? BluetoothHfpProtoEnums.SCO_CODEC_MSBC : BluetoothHfpProtoEnums.SCO_CODEC_CVSD, getConnectionStateFromAudioState(newState), sco_codec, AdapterService.getAdapterService().getMetricId(device)); Intent intent = new Intent(BluetoothHeadsetClient.ACTION_AUDIO_STATE_CHANGED); intent.putExtra(BluetoothProfile.EXTRA_PREVIOUS_STATE, prevState); Loading
android/app/tests/unit/src/com/android/bluetooth/hfpclient/HeadsetClientStateMachineTest.java +32 −0 Original line number Diff line number Diff line Loading @@ -1573,6 +1573,38 @@ public class HeadsetClientStateMachineTest { IsInstanceOf.instanceOf(HeadsetClientStateMachine.Connected.class)); } @Test public void testProcessStackEvent_CodecSelection_onConnectedState() { initToConnectedState(); Assert.assertThat( mHeadsetClientStateMachine.getCurrentState(), IsInstanceOf.instanceOf(HeadsetClientStateMachine.Connected.class)); // Trigger a MSBC codec stack event. Expect to mAudioWbs = true. mHeadsetClientStateMachine.mAudioWbs = false; mHeadsetClientStateMachine.mAudioSWB = false; StackEvent event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED); event.valueInt = HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_MSBC; event.device = mTestDevice; mHeadsetClientStateMachine.sendMessage( mHeadsetClientStateMachine.obtainMessage(StackEvent.STACK_EVENT, event)); TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); Assert.assertTrue(mHeadsetClientStateMachine.mAudioWbs); Assert.assertFalse(mHeadsetClientStateMachine.mAudioSWB); // Trigger a LC3 codec stack event. Expect to mAudioSWB = true. mHeadsetClientStateMachine.mAudioWbs = false; mHeadsetClientStateMachine.mAudioSWB = false; event = new StackEvent(StackEvent.EVENT_TYPE_AUDIO_STATE_CHANGED); event.valueInt = HeadsetClientHalConstants.AUDIO_STATE_CONNECTED_LC3; event.device = mTestDevice; mHeadsetClientStateMachine.sendMessage( mHeadsetClientStateMachine.obtainMessage(StackEvent.STACK_EVENT, event)); TestUtils.waitForLooperToFinishScheduledTask(mHandlerThread.getLooper()); Assert.assertFalse(mHeadsetClientStateMachine.mAudioWbs); Assert.assertTrue(mHeadsetClientStateMachine.mAudioSWB); } /** * Allow/disallow connection to any device * Loading