From 07b367571789c46bfbadbc3f05e7e5c1c0f9ac87 Mon Sep 17 00:00:00 2001 From: Tim Peng Date: Fri, 20 Aug 2021 05:43:29 +0000 Subject: [PATCH] Phone fails to switch channel mode from stereo to mono -Set codec to SBC when HD audio is off Bug: 194349060 Test: make -j50 RunSettingsRoboTests Change-Id: Iae4aa3f1d77350f5b4d91e7a687e048091c1daea --- ...ctBluetoothDialogPreferenceController.java | 8 ++++- ...etoothCodecDialogPreferenceController.java | 10 ++++-- ...thCodecDialogPreferenceControllerTest.java | 36 +++++++++++++++++++ 3 files changed, 51 insertions(+), 3 deletions(-) diff --git a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java index d66b8d8dc86..765c5f85ef6 100644 --- a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java +++ b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java @@ -219,11 +219,17 @@ public abstract class AbstractBluetoothDialogPreferenceController extends */ public void onHDAudioEnabled(boolean enabled) {} - static int getHighestCodec(BluetoothCodecConfig[] configs) { + static int getHighestCodec(BluetoothA2dp bluetoothA2dp, BluetoothDevice activeDevice, + BluetoothCodecConfig[] configs) { if (configs == null) { Log.d(TAG, "Unable to get highest codec. Configs are empty"); return BluetoothCodecConfig.SOURCE_CODEC_TYPE_INVALID; } + // If HD audio is not enabled, SBC is the only one available codec. + if (bluetoothA2dp.isOptionalCodecsEnabled(activeDevice) + != BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED) { + return BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC; + } for (int i = 0; i < CODEC_TYPES.length; i++) { for (int j = 0; j < configs.length; j++) { if ((configs[j].getCodecType() == CODEC_TYPES[i])) { diff --git a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java index 6b243c600f1..b1b58e55c55 100644 --- a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java +++ b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java @@ -93,8 +93,9 @@ public class BluetoothCodecDialogPreferenceController extends int codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_DEFAULT; switch (index) { case 0: - codecTypeValue = getHighestCodec(getSelectableConfigs( - mBluetoothA2dp.getActiveDevice())); + final BluetoothDevice activeDevice = mBluetoothA2dp.getActiveDevice(); + codecTypeValue = getHighestCodec(mBluetoothA2dp, activeDevice, + getSelectableConfigs(activeDevice)); codecPriorityValue = BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST; break; case 1: @@ -147,6 +148,11 @@ public class BluetoothCodecDialogPreferenceController extends mCallback.onBluetoothCodecChanged(); } + @Override + public void onHDAudioEnabled(boolean enabled) { + writeConfigurationValues(/* index= */ 0); + } + private List getIndexFromConfig(BluetoothCodecConfig[] configs) { List indexArray = new ArrayList<>(); for (int i = 0; i < configs.length; i++) { diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java index 7dd29069416..0f01e00a3f4 100644 --- a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java +++ b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceControllerTest.java @@ -19,6 +19,7 @@ package com.android.settings.development.bluetooth; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.eq; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -108,6 +109,8 @@ public class BluetoothCodecDialogPreferenceControllerTest { BluetoothCodecConfig[] mCodecConfigs = {mCodecConfigAAC, mCodecConfigSBC}; mCodecStatus = new BluetoothCodecStatus(mCodecConfigSBC, null, mCodecConfigs); when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus); + when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice)).thenReturn( + BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED); mController.onBluetoothServiceConnected(mBluetoothA2dp); mController.writeConfigurationValues(0); @@ -172,4 +175,37 @@ public class BluetoothCodecDialogPreferenceControllerTest { verify(mCallback).onBluetoothCodecChanged(); } + + @Test + public void onHDAudioEnabled_optionalCodecEnabled_setsCodecTypeAsAAC() { + BluetoothCodecConfig[] mCodecConfigs = {mCodecConfigAAC, mCodecConfigSBC}; + mCodecStatus = new BluetoothCodecStatus(mCodecConfigAAC, + /* codecsLocalCapabilities= */ null, + mCodecConfigs); + when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus); + when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice)).thenReturn( + BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED); + mController.onBluetoothServiceConnected(mBluetoothA2dp); + + mController.onHDAudioEnabled(/* enabled= */ true); + + verify(mBluetoothA2dpConfigStore, atLeastOnce()).setCodecType( + eq(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC)); + } + @Test + public void onHDAudioEnabled_optionalCodecDisabled_setsCodecTypeAsSBC() { + BluetoothCodecConfig[] mCodecConfigs = {mCodecConfigAAC, mCodecConfigSBC}; + mCodecStatus = new BluetoothCodecStatus(mCodecConfigAAC, + /* codecsLocalCapabilities= */ null, + mCodecConfigs); + when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus); + when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice)).thenReturn( + BluetoothA2dp.OPTIONAL_CODECS_PREF_DISABLED); + mController.onBluetoothServiceConnected(mBluetoothA2dp); + + mController.onHDAudioEnabled(/* enabled= */ false); + + verify(mBluetoothA2dpConfigStore, atLeastOnce()).setCodecType( + eq(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC)); + } }