Merge "Phone fails to switch channel mode from stereo to mono"
diff --git a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
index d66b8d8..765c5f8 100644
--- a/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/AbstractBluetoothDialogPreferenceController.java
@@ -219,11 +219,17 @@
      */
     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 6b243c6..b1b58e5 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothCodecDialogPreferenceController.java
@@ -93,8 +93,9 @@
         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 @@
         mCallback.onBluetoothCodecChanged();
     }
 
+    @Override
+    public void onHDAudioEnabled(boolean enabled) {
+        writeConfigurationValues(/* index= */ 0);
+    }
+
     private List<Integer> getIndexFromConfig(BluetoothCodecConfig[] configs) {
         List<Integer> 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 7dd2906..0f01e00 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 @@
 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 @@
         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 @@
 
         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));
+    }
 }