bluetooth: Refactor BT Audio Codec list

* Show only selectable codecs to the user
* Removed redundant 'abstract' layer
* Disable codec selection when BluetoothA2dp, active device unavailable
  or HD Audio disabled.

Bug: 329809288
Bug: 346490998
Flag: EXEMPT - refactor
Test: atest SettingsRoboTests:com.android.settings.development.bluetooth.BluetoothCodecListPreferenceControllerTest
Merged-In: I56ebfeaf2cfa22ec253db897d7b7e96d1f8eee61
Change-Id: I23714715d9257479f5eac1a172ba1804da7e64e3
diff --git a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
index 5897965..d65a231 100644
--- a/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
+++ b/src/com/android/settings/development/DevelopmentSettingsDashboardFragment.java
@@ -62,7 +62,6 @@
 import com.android.settings.development.autofill.AutofillLoggingLevelPreferenceController;
 import com.android.settings.development.autofill.AutofillResetOptionsPreferenceController;
 import com.android.settings.development.bluetooth.AbstractBluetoothDialogPreferenceController;
-import com.android.settings.development.bluetooth.AbstractBluetoothListPreferenceController;
 import com.android.settings.development.bluetooth.AbstractBluetoothPreferenceController;
 import com.android.settings.development.bluetooth.BluetoothBitPerSampleDialogPreferenceController;
 import com.android.settings.development.bluetooth.BluetoothChannelModeDialogPreferenceController;
@@ -811,8 +810,8 @@
                 ((AbstractBluetoothDialogPreferenceController) controller).onHDAudioEnabled(
                         enabled);
             }
-            if (controller instanceof AbstractBluetoothListPreferenceController) {
-                ((AbstractBluetoothListPreferenceController) controller).onHDAudioEnabled(enabled);
+            if (controller instanceof BluetoothCodecListPreferenceController) {
+                ((BluetoothCodecListPreferenceController) controller).onHDAudioEnabled(enabled);
             }
         }
     }
diff --git a/src/com/android/settings/development/bluetooth/AbstractBluetoothListPreferenceController.java b/src/com/android/settings/development/bluetooth/AbstractBluetoothListPreferenceController.java
deleted file mode 100644
index 362a5cd..0000000
--- a/src/com/android/settings/development/bluetooth/AbstractBluetoothListPreferenceController.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.bluetooth;
-
-import static android.bluetooth.BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
-
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothCodecConfig;
-import android.bluetooth.BluetoothCodecStatus;
-import android.bluetooth.BluetoothDevice;
-import android.content.Context;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-import androidx.annotation.Nullable;
-import androidx.preference.ListPreference;
-import androidx.preference.Preference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.development.BluetoothA2dpConfigStore;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import java.util.List;
-
-/** Abstract class for Bluetooth A2DP config list controller in developer option. */
-public abstract class AbstractBluetoothListPreferenceController
-        extends AbstractBluetoothPreferenceController
-        implements Preference.OnPreferenceChangeListener {
-
-    private static final String TAG = "AbstrBtListPrefCtrl";
-
-    protected static final int DEFAULT_VALUE_INT = 1000;
-
-    @Nullable protected ListPreference mListPreference;
-
-    protected String mDefaultEntry;
-    protected String mDefaultValue;
-
-    @Nullable protected final BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
-
-    public AbstractBluetoothListPreferenceController(
-            @NonNull Context context,
-            @Nullable Lifecycle lifecycle,
-            @Nullable BluetoothA2dpConfigStore store) {
-        super(context, lifecycle, store);
-
-        mDefaultEntry = mContext.getString(R.string.bluetooth_audio_codec_default_selection);
-        mDefaultValue = String.valueOf(DEFAULT_VALUE_INT);
-
-        mBluetoothA2dpConfigStore = store;
-    }
-
-    @Override
-    public void displayPreference(@NonNull PreferenceScreen screen) {
-        super.displayPreference(screen);
-        mListPreference = screen.findPreference(getPreferenceKey());
-    }
-
-    @Override
-    public boolean onPreferenceChange(@Nullable Preference preference, @NonNull Object newValue) {
-        Log.d(TAG, "onPreferenceChange: newValue=" + (String) newValue);
-        if (mListPreference == null) {
-            Log.e(TAG, "onPreferenceChange: List preference is null");
-            return false;
-        }
-        updateState(mListPreference);
-        return true;
-    }
-
-    @Override
-    public void updateState(@Nullable Preference preference) {
-        setupDefaultListPreference();
-    }
-
-    @Override
-    public void onBluetoothServiceConnected(@NonNull BluetoothA2dp bluetoothA2dp) {
-        super.onBluetoothServiceConnected(bluetoothA2dp);
-        initConfigStore();
-    }
-
-    @Override
-    protected void onDeveloperOptionsSwitchDisabled() {
-        super.onDeveloperOptionsSwitchDisabled();
-        Log.d(TAG, "onDeveloperOptionsSwitchDisabled");
-        if (mListPreference == null) {
-            Log.e(TAG, "onDeveloperOptionsSwitchDisabled: List preference is null");
-            return;
-        }
-        updateState(mListPreference);
-    }
-
-    /**
-     * Method to notify controller when the HD audio(optional codec) state is changed.
-     *
-     * @param enabled Is {@code true} when the setting is enabled.
-     */
-    public void onHDAudioEnabled(boolean enabled) {}
-
-    /**
-     * Updates the new value to the {@link BluetoothA2dpConfigStore}.
-     *
-     * @param entryValue the new setting entry value
-     */
-    protected abstract void writeConfigurationValues(String entryValue);
-
-    /**
-     * Gets the current bluetooth codec status.
-     *
-     * @return {@link BluetoothCodecStatus}.
-     */
-    @Nullable
-    protected BluetoothCodecStatus getBluetoothCodecStatus() {
-        final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
-        if (bluetoothA2dp == null) {
-            Log.e(
-                    TAG,
-                    "getBluetoothCodecStatus: Unable to get codec status. Bluetooth A2dp is null.");
-            return null;
-        }
-        final BluetoothDevice activeDevice = getA2dpActiveDevice();
-        if (activeDevice == null) {
-            Log.e(TAG, "getBluetoothCodecStatus: Unable to get codec status. No active device.");
-            return null;
-        }
-        final BluetoothCodecStatus codecStatus = bluetoothA2dp.getCodecStatus(activeDevice);
-        if (codecStatus == null) {
-            Log.e(TAG, "getBluetoothCodecStatus: Codec status is null");
-            return null;
-        }
-        return codecStatus;
-    }
-
-    /**
-     * Gets the current bluetooth codec config.
-     *
-     * @return {@link BluetoothCodecConfig}.
-     */
-    @Nullable
-    protected BluetoothCodecConfig getCurrentCodecConfig() {
-        final BluetoothCodecStatus codecStatus = getBluetoothCodecStatus();
-        if (codecStatus == null) {
-            Log.e(
-                    TAG,
-                    "getCurrentCodecConfig: Unable to get current codec config. Codec status is"
-                            + " null");
-            return null;
-        }
-
-        return codecStatus.getCodecConfig();
-    }
-
-    /**
-     * Sets the {@link ListPreference}. This method adds the default entry and the entry value
-     * automatically.
-     *
-     * @param entries list of String entries for the {@link ListPreference}.
-     * @param entryValues list of String entry values for the {@link ListPreference}.
-     * @param selectedEntry currently selected entry.
-     * @param selectedValue currently selected entry value.
-     */
-    protected void setupListPreference(
-            List<String> entries,
-            List<String> entryValues,
-            String selectedEntry,
-            String selectedValue) {
-        if (entries.size() != entryValues.size()) {
-            Log.e(
-                    TAG,
-                    ("setupListPreference: size of entries: " + entries.size())
-                            + (", size of entryValues" + entryValues.size()));
-            setupDefaultListPreference();
-            return;
-        }
-        if (entries.isEmpty() || entryValues.isEmpty()) {
-            Log.e(TAG, "setupListPreference: entries or entryValues empty");
-            setupDefaultListPreference();
-            return;
-        }
-        entries.add(0, mDefaultEntry);
-        entryValues.add(0, mDefaultValue);
-
-        if (mListPreference == null) {
-            Log.e(TAG, "setupListPreference: List preference is null");
-            return;
-        }
-        mListPreference.setEntries(entries.toArray(new String[entries.size()]));
-        mListPreference.setEntryValues(entryValues.toArray(new String[entryValues.size()]));
-        mListPreference.setValue(selectedValue);
-        mListPreference.setSummary(selectedEntry);
-    }
-
-    /**
-     * Check HD Audio enabled.
-     *
-     * @return true if HD Audio is enabled.
-     */
-    protected boolean isHDAudioEnabled() {
-        final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
-        if (bluetoothA2dp == null) {
-            Log.e(TAG, "isHDAudioEnabled: Unable to get codec status. BluetoothA2dp is null.");
-            return false;
-        }
-        BluetoothDevice activeDevice = getA2dpActiveDevice();
-        if (activeDevice == null) {
-            Log.e(TAG, "isHDAudioEnabled: Unable to get codec status. No active device.");
-            return false;
-        }
-        return (bluetoothA2dp.isOptionalCodecsEnabled(activeDevice)
-                == BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
-    }
-
-    private void setupDefaultListPreference() {
-        Log.d(
-                TAG,
-                "setupDefaultListPreference: mDefaultEntry="
-                        + mDefaultEntry
-                        + ", mDefaultValue="
-                        + mDefaultValue);
-        if (mListPreference == null) {
-            Log.e(TAG, "setupListPreference: List preference is null");
-            return;
-        }
-        mListPreference.setEntries(new String[] {mDefaultEntry});
-        mListPreference.setEntryValues(new String[] {mDefaultValue});
-        mListPreference.setValue(mDefaultValue);
-        mListPreference.setSummary(mDefaultEntry);
-    }
-
-    private void initConfigStore() {
-        final BluetoothCodecConfig config = getCurrentCodecConfig();
-        if (config == null) {
-            Log.e(TAG, "initConfigStore: Current codec config is null.");
-            return;
-        }
-        if (mBluetoothA2dpConfigStore == null) {
-            Log.e(TAG, "initConfigStore: Bluetooth A2dp Config Store is null.");
-            return;
-        }
-        mBluetoothA2dpConfigStore.setCodecType(config.getExtendedCodecType());
-        mBluetoothA2dpConfigStore.setSampleRate(config.getSampleRate());
-        mBluetoothA2dpConfigStore.setBitsPerSample(config.getBitsPerSample());
-        mBluetoothA2dpConfigStore.setChannelMode(config.getChannelMode());
-        mBluetoothA2dpConfigStore.setCodecPriority(CODEC_PRIORITY_HIGHEST);
-        mBluetoothA2dpConfigStore.setCodecSpecific1Value(config.getCodecSpecific1());
-    }
-}
diff --git a/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java b/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java
index 9808807..72da505 100644
--- a/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java
+++ b/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceController.java
@@ -26,9 +26,11 @@
 
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
+import androidx.preference.ListPreference;
 import androidx.preference.Preference;
 import androidx.preference.PreferenceScreen;
 
+import com.android.internal.annotations.VisibleForTesting;
 import com.android.settings.development.BluetoothA2dpConfigStore;
 import com.android.settings.development.Flags;
 import com.android.settingslib.core.lifecycle.Lifecycle;
@@ -38,13 +40,15 @@
 import java.util.List;
 
 /** List preference controller to set the Bluetooth A2DP codec */
-public class BluetoothCodecListPreferenceController
-        extends AbstractBluetoothListPreferenceController {
+public class BluetoothCodecListPreferenceController extends AbstractBluetoothPreferenceController
+        implements Preference.OnPreferenceChangeListener {
 
     private static final String KEY = "bluetooth_audio_codec_settings_list";
     private static final String TAG = "BtExtCodecCtr";
 
     @Nullable private final Callback mCallback;
+    @Nullable protected final BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
+    @Nullable protected ListPreference mListPreference;
 
     public BluetoothCodecListPreferenceController(
             @NonNull Context context,
@@ -53,6 +57,7 @@
             @Nullable Callback callback) {
         super(context, lifecycle, store);
         mCallback = callback;
+        mBluetoothA2dpConfigStore = store;
     }
 
     @Override
@@ -79,32 +84,38 @@
             return false;
         }
 
+        if (mListPreference == null) {
+            Log.e(TAG, "onPreferenceChange: List preference is null");
+            return false;
+        }
+
         Log.d(TAG, "onPreferenceChange: newValue=" + (String) newValue);
         final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
         if (bluetoothA2dp == null) {
             Log.e(TAG, "onPreferenceChange: bluetoothA2dp is null");
+            setListPreferenceEnabled(false);
             return false;
         }
 
-        writeConfigurationValues((String) newValue);
+        if (!writeConfigurationValues((String) newValue)) {
+            Log.e(TAG, "onPreferenceChange: Configuration failed");
+            return false;
+        }
 
         if (mBluetoothA2dpConfigStore == null) {
             Log.e(TAG, "onPreferenceChange: Bluetooth A2dp Config Store is null");
             return false;
         }
-        BluetoothCodecConfig codecConfig;
-        if (Flags.a2dpOffloadCodecExtensibilitySettings()) {
-            codecConfig = mBluetoothA2dpConfigStore.createCodecConfigFromCodecType();
-        } else {
-            codecConfig = mBluetoothA2dpConfigStore.createCodecConfig();
-        }
 
         final BluetoothDevice activeDevice = getA2dpActiveDevice();
         if (activeDevice == null) {
             Log.e(TAG, "onPreferenceChange: active device is null");
+            setListPreferenceEnabled(false);
             return false;
         }
 
+        BluetoothCodecConfig codecConfig =
+                mBluetoothA2dpConfigStore.createCodecConfigFromCodecType();
         Log.d(TAG, "onPreferenceChange: setCodecConfigPreference: " + codecConfig.toString());
         bluetoothA2dp.setCodecConfigPreference(activeDevice, codecConfig);
         if (mCallback != null) {
@@ -121,64 +132,74 @@
             return;
         }
 
+        if (!isHDAudioEnabled()) {
+            Log.d(TAG, "updateState: HD Audio is disabled");
+            setListPreferenceEnabled(false);
+            return;
+        }
+
+        final BluetoothCodecStatus codecStatus = getBluetoothCodecStatus();
+        if (codecStatus == null) {
+            Log.e(TAG, "updateState: Bluetooth Codec Status is null");
+            return;
+        }
+
+        final BluetoothCodecConfig currentCodecConfig = codecStatus.getCodecConfig();
+        if (currentCodecConfig == null) {
+            Log.e(TAG, "updateState: currentCodecConfig is null");
+            return;
+        }
+
         final List<String> codecIds = new ArrayList<>();
         final List<String> labels = new ArrayList<>();
-        String selectedCodecId = mDefaultValue;
-        String selectedLabel = mDefaultEntry;
-
-        if (isHDAudioEnabled()) {
-            final BluetoothCodecStatus codecStatus = getBluetoothCodecStatus();
-            if (codecStatus == null) {
-                Log.e(TAG, "updateState: Bluetooth Codec Status is null");
-                return;
+        String selectedCodecId = null;
+        String selectedLabel = null;
+        final List<BluetoothCodecConfig> codecConfigs =
+                codecStatus.getCodecsSelectableCapabilities();
+        for (BluetoothCodecConfig config : codecConfigs) {
+            BluetoothCodecType codecType = config.getExtendedCodecType();
+            if (codecType == null) {
+                Log.e(TAG, "codec type for config:" + config + " is null");
+                continue;
             }
-
-            final BluetoothCodecConfig currentCodecConfig = codecStatus.getCodecConfig();
-            if (currentCodecConfig == null) {
-                Log.e(TAG, "updateState: currentCodecConfig is null");
-                return;
+            labels.add(codecType.getCodecName());
+            codecIds.add(String.valueOf(codecType.getCodecId()));
+            if (currentCodecConfig != null
+                    && currentCodecConfig.getExtendedCodecType().equals(codecType)) {
+                selectedCodecId = codecIds.get(codecIds.size() - 1);
+                selectedLabel = labels.get(labels.size() - 1);
+                Log.d(
+                        TAG,
+                        "updateState: Selecting codec: "
+                                + selectedLabel
+                                + ", id: "
+                                + selectedCodecId);
             }
-
-            final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
-            if (bluetoothA2dp == null) {
-                Log.e(TAG, "updateState: bluetoothA2dp is null");
-                return;
-            }
-
-            final Collection<BluetoothCodecType> codecTypes =
-                    bluetoothA2dp.getSupportedCodecTypes();
-            for (BluetoothCodecType codecType : codecTypes) {
-                labels.add(codecType.getCodecName());
-                codecIds.add(String.valueOf(codecType.getCodecId()));
-                if (currentCodecConfig != null
-                        && currentCodecConfig.getExtendedCodecType().equals(codecType)) {
-                    selectedCodecId = codecIds.get(codecIds.size() - 1);
-                    selectedLabel = labels.get(labels.size() - 1);
-                    Log.d(
-                            TAG,
-                            "updateState: Current config: "
-                                    + selectedLabel
-                                    + ", id: "
-                                    + selectedCodecId);
-                }
-            }
-
-            setupListPreference(labels, codecIds, selectedLabel, selectedCodecId);
         }
+        setupListPreference(labels, codecIds, selectedLabel, selectedCodecId);
     }
 
     @Override
+    public void onBluetoothServiceConnected(@NonNull BluetoothA2dp bluetoothA2dp) {
+        super.onBluetoothServiceConnected(bluetoothA2dp);
+        initConfigStore();
+    }
+
     public void onHDAudioEnabled(boolean enabled) {
         Log.d(TAG, "onHDAudioEnabled: enabled=" + enabled);
         if (mListPreference == null) {
             Log.e(TAG, "onHDAudioEnabled: List preference is null");
             return;
         }
-        mListPreference.setEnabled(enabled);
+        setListPreferenceEnabled(enabled);
+        if (!enabled) {
+            mListPreference.setValue(null);
+            mListPreference.setSummary(null);
+        }
     }
 
-    @Override
-    protected void writeConfigurationValues(String entryValue) {
+    @VisibleForTesting
+    boolean writeConfigurationValues(String entryValue) {
         long codecIdValue = getCodecIdFromEntryValue(entryValue);
         BluetoothCodecType selectedCodecType = null;
         BluetoothCodecConfig selectedCodecConfig = null;
@@ -186,7 +207,7 @@
         final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
         if (bluetoothA2dp == null) {
             Log.e(TAG, "writeConfigurationValues: bluetoothA2dp is null");
-            return;
+            return false;
         }
 
         final Collection<BluetoothCodecType> codecTypes = bluetoothA2dp.getSupportedCodecTypes();
@@ -202,14 +223,14 @@
                     "writeConfigurationValues: No selectable codec ID: "
                             + codecIdValue
                             + " found. Unable to change codec");
-            return;
+            return false;
         }
 
         Log.d(TAG, "writeConfigurationValues: Selected codec: " + selectedCodecType.toString());
         final BluetoothCodecStatus codecStatus = getBluetoothCodecStatus();
         if (codecStatus == null) {
             Log.e(TAG, "writeConfigurationValues: Bluetooth Codec Status is null");
-            return;
+            return false;
         }
 
         final List<BluetoothCodecConfig> codecConfigs =
@@ -218,8 +239,9 @@
             BluetoothCodecType codecType = config.getExtendedCodecType();
             if (codecType == null) {
                 Log.e(TAG, "codec type for config:" + config + " is null");
+                continue;
             }
-            if (codecType != null && codecType.equals(selectedCodecType)) {
+            if (codecType.equals(selectedCodecType)) {
                 selectedCodecConfig = config;
             }
         }
@@ -229,12 +251,12 @@
                     TAG,
                     "writeConfigurationValues: No selectable codec config for codec: "
                             + selectedCodecType.toString());
-            return;
+            return false;
         }
 
         if (mBluetoothA2dpConfigStore == null) {
             Log.e(TAG, "writeConfigurationValues: Bluetooth A2dp Config Store is null");
-            return;
+            return false;
         }
 
         mBluetoothA2dpConfigStore.setCodecType(selectedCodecType);
@@ -248,13 +270,145 @@
         mBluetoothA2dpConfigStore.setChannelMode(
                 AbstractBluetoothDialogPreferenceController.getHighestChannelMode(
                         selectedCodecConfig));
+        return true;
     }
 
     private long getCodecIdFromEntryValue(String entryValue) {
         long codecType = BluetoothCodecType.CODEC_ID_SBC;
-        if (entryValue.isEmpty() || Long.valueOf(entryValue) == DEFAULT_VALUE_INT) {
+        if (entryValue.isEmpty()) {
             return codecType;
         }
         return Long.valueOf(entryValue);
     }
+
+    private void setListPreferenceEnabled(boolean enable) {
+        if (mListPreference != null) {
+            mListPreference.setEnabled(enable);
+        }
+    }
+
+    @Nullable
+    @VisibleForTesting
+    BluetoothCodecStatus getBluetoothCodecStatus() {
+        final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
+        if (bluetoothA2dp == null) {
+            Log.e(
+                    TAG,
+                    "getBluetoothCodecStatus: Unable to get codec status. Bluetooth A2dp is null.");
+            return null;
+        }
+        final BluetoothDevice activeDevice = getA2dpActiveDevice();
+        if (activeDevice == null) {
+            Log.e(TAG, "getBluetoothCodecStatus: Unable to get codec status. No active device.");
+            return null;
+        }
+        final BluetoothCodecStatus codecStatus = bluetoothA2dp.getCodecStatus(activeDevice);
+        if (codecStatus == null) {
+            Log.e(TAG, "getBluetoothCodecStatus: Codec status is null");
+            return null;
+        }
+        return codecStatus;
+    }
+
+    @Nullable
+    @VisibleForTesting
+    BluetoothCodecConfig getCurrentCodecConfig() {
+        final BluetoothCodecStatus codecStatus = getBluetoothCodecStatus();
+        if (codecStatus == null) {
+            Log.e(
+                    TAG,
+                    "getCurrentCodecConfig: Unable to get current codec config. Codec status is"
+                            + " null");
+            return null;
+        }
+
+        return codecStatus.getCodecConfig();
+    }
+
+    @VisibleForTesting
+    boolean isHDAudioEnabled() {
+        final BluetoothA2dp bluetoothA2dp = mBluetoothA2dp;
+        if (bluetoothA2dp == null) {
+            Log.e(TAG, "isHDAudioEnabled: Unable to get codec status. BluetoothA2dp is null.");
+            return false;
+        }
+        BluetoothDevice activeDevice = getA2dpActiveDevice();
+        if (activeDevice == null) {
+            Log.e(TAG, "isHDAudioEnabled: Unable to get codec status. No active device.");
+            return false;
+        }
+        return (bluetoothA2dp.isOptionalCodecsEnabled(activeDevice)
+                == BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
+    }
+
+    @VisibleForTesting
+    void initConfigStore() {
+        final BluetoothCodecConfig config = getCurrentCodecConfig();
+        if (config == null) {
+            Log.e(TAG, "initConfigStore: Current codec config is null.");
+            return;
+        }
+        if (mBluetoothA2dpConfigStore == null) {
+            Log.e(TAG, "initConfigStore: Bluetooth A2dp Config Store is null.");
+            return;
+        }
+        mBluetoothA2dpConfigStore.setCodecType(config.getExtendedCodecType());
+        mBluetoothA2dpConfigStore.setSampleRate(config.getSampleRate());
+        mBluetoothA2dpConfigStore.setBitsPerSample(config.getBitsPerSample());
+        mBluetoothA2dpConfigStore.setChannelMode(config.getChannelMode());
+        mBluetoothA2dpConfigStore.setCodecPriority(BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST);
+        mBluetoothA2dpConfigStore.setCodecSpecific1Value(config.getCodecSpecific1());
+    }
+
+    @VisibleForTesting
+    void setupDefaultListPreference() {
+        Log.d(TAG, "setupDefaultListPreference");
+        if (mListPreference == null) {
+            Log.e(TAG, "setupDefaultListPreference: List preference is null");
+            return;
+        }
+        mListPreference.setValue(null);
+        mListPreference.setSummary(null);
+        setListPreferenceEnabled(false);
+    }
+
+    /**
+     * Sets the {@link ListPreference}.
+     *
+     * @param entries list of String entries for the {@link ListPreference}.
+     * @param entryValues list of String entry values for the {@link ListPreference}.
+     * @param selectedEntry currently selected entry.
+     * @param selectedValue currently selected entry value.
+     */
+    @VisibleForTesting
+    void setupListPreference(
+            List<String> entries,
+            List<String> entryValues,
+            @Nullable String selectedEntry,
+            @Nullable String selectedValue) {
+        if (mListPreference == null) {
+            Log.e(TAG, "setupListPreference: List preference is null");
+            return;
+        }
+
+        if (entries.size() != entryValues.size()) {
+            Log.e(
+                    TAG,
+                    ("setupListPreference: size of entries: " + entries.size())
+                            + (", size of entryValues" + entryValues.size()));
+            setupDefaultListPreference();
+            return;
+        }
+        if (entries.isEmpty() || entryValues.isEmpty()) {
+            Log.e(TAG, "setupListPreference: entries or entryValues empty");
+            setupDefaultListPreference();
+            return;
+        }
+
+        mListPreference.setEntries(entries.toArray(new String[entries.size()]));
+        mListPreference.setEntryValues(entryValues.toArray(new String[entryValues.size()]));
+        mListPreference.setValue(selectedValue);
+        mListPreference.setSummary(selectedEntry);
+        setListPreferenceEnabled(true);
+    }
 }
diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/AbstractBluetoothListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/AbstractBluetoothListPreferenceControllerTest.java
deleted file mode 100644
index 8abc633..0000000
--- a/tests/robotests/src/com/android/settings/development/bluetooth/AbstractBluetoothListPreferenceControllerTest.java
+++ /dev/null
@@ -1,240 +0,0 @@
-/*
- * Copyright (C) 2023 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.settings.development.bluetooth;
-
-import static android.bluetooth.BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST;
-
-import static com.google.common.truth.Truth.assertThat;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.eq;
-import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-import android.bluetooth.BluetoothA2dp;
-import android.bluetooth.BluetoothAdapter;
-import android.bluetooth.BluetoothCodecConfig;
-import android.bluetooth.BluetoothCodecStatus;
-import android.bluetooth.BluetoothDevice;
-import android.bluetooth.BluetoothProfile;
-import android.content.Context;
-
-import androidx.lifecycle.LifecycleOwner;
-import androidx.preference.ListPreference;
-import androidx.preference.PreferenceScreen;
-
-import com.android.settings.R;
-import com.android.settings.development.BluetoothA2dpConfigStore;
-import com.android.settingslib.core.lifecycle.Lifecycle;
-
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Mock;
-import org.mockito.MockitoAnnotations;
-import org.robolectric.RobolectricTestRunner;
-import org.robolectric.RuntimeEnvironment;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-@RunWith(RobolectricTestRunner.class)
-public class AbstractBluetoothListPreferenceControllerTest {
-
-    private static final String DEVICE_ADDRESS = "00:11:22:33:44:55";
-
-    private static String DEFAULT_ENTRY;
-    private static final String DEFAULT_ENTRY_VALUE = "1000";
-
-    @Mock private BluetoothA2dp mBluetoothA2dp;
-    @Mock private BluetoothAdapter mBluetoothAdapter;
-    @Mock private PreferenceScreen mScreen;
-
-    private AbstractBluetoothListPreferenceController mController;
-    private ListPreference mPreference;
-    private BluetoothA2dpConfigStore mBluetoothA2dpConfigStore;
-    private BluetoothCodecStatus mCodecStatus;
-    private BluetoothCodecConfig mCodecConfigAAC;
-    private BluetoothCodecConfig mCodecConfigSBC;
-    private BluetoothCodecConfig[] mCodecConfigs = new BluetoothCodecConfig[2];
-    private BluetoothDevice mActiveDevice;
-    private Context mContext;
-    private LifecycleOwner mLifecycleOwner;
-    private Lifecycle mLifecycle;
-
-    @Before
-    public void setup() {
-        MockitoAnnotations.initMocks(this);
-        mContext = RuntimeEnvironment.application;
-        mLifecycleOwner = () -> mLifecycle;
-        mLifecycle = new Lifecycle(mLifecycleOwner);
-        mBluetoothA2dpConfigStore = spy(new BluetoothA2dpConfigStore());
-        mActiveDevice = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(DEVICE_ADDRESS);
-        mController =
-                spy(
-                        new AbstractBluetoothListPreferenceControllerImpl(
-                                mContext, mLifecycle, mBluetoothA2dpConfigStore));
-        mController.mBluetoothAdapter = mBluetoothAdapter;
-        mPreference = spy(new ListPreference(mContext));
-
-        mCodecConfigAAC =
-                new BluetoothCodecConfig.Builder()
-                        .setCodecType(BluetoothCodecConfig.SOURCE_CODEC_TYPE_AAC)
-                        .build();
-        mCodecConfigSBC =
-                new BluetoothCodecConfig.Builder()
-                        .setCodecType(BluetoothCodecConfig.SOURCE_CODEC_TYPE_SBC)
-                        .build();
-        mCodecConfigs[0] = mCodecConfigAAC;
-        mCodecConfigs[1] = mCodecConfigSBC;
-
-        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(mPreference);
-        mController.displayPreference(mScreen);
-        when(mBluetoothAdapter.getActiveDevices(eq(BluetoothProfile.A2DP)))
-                .thenReturn(Arrays.asList(mActiveDevice));
-
-        DEFAULT_ENTRY = mContext.getString(R.string.bluetooth_audio_codec_default_selection);
-    }
-
-    private void verifySetupDefaultListPreference() {
-        List<String> entries = new ArrayList<>(1);
-        entries.add(DEFAULT_ENTRY);
-        List<String> entryValues = new ArrayList<>(1);
-        entryValues.add(DEFAULT_ENTRY_VALUE);
-
-        verify(mPreference).setEntries(entries.toArray(new String[entries.size()]));
-        verify(mPreference).setEntryValues(entryValues.toArray(new String[entryValues.size()]));
-        verify(mPreference).setValue(DEFAULT_ENTRY_VALUE);
-        verify(mPreference).setSummary(DEFAULT_ENTRY);
-    }
-
-    @Test
-    public void onPreferenceChange_shouldSetupDefaultListPreference() {
-        mController.onPreferenceChange(mPreference, "" /* new value */);
-        verifySetupDefaultListPreference();
-    }
-
-    @Test
-    public void setupListPreference_wrongSize_shouldSetupDefaultListPreference() {
-        List<String> entries = new ArrayList<>(1);
-        entries.add(DEFAULT_ENTRY);
-        List<String> entryValues = new ArrayList<>(2);
-        entryValues.add(DEFAULT_ENTRY_VALUE);
-        entryValues.add(DEFAULT_ENTRY_VALUE);
-
-        mController.setupListPreference(entries, entryValues, "", "");
-        verifySetupDefaultListPreference();
-    }
-
-    @Test
-    public void setupListPreference_listEmpty_shouldSetupDefaultListPreference() {
-        List<String> entries = new ArrayList<>(1);
-        entries.add(DEFAULT_ENTRY);
-        List<String> entryValues = new ArrayList<>();
-
-        mController.setupListPreference(entries, entryValues, "", "");
-        verifySetupDefaultListPreference();
-    }
-
-    @Test
-    public void getBluetoothCodecStatus_errorChecking() {
-        mController.onBluetoothServiceConnected(null);
-        assertThat(mController.getBluetoothCodecStatus()).isNull();
-
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-
-        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(null);
-        assertThat(mController.getBluetoothCodecStatus()).isNull();
-    }
-
-    @Test
-    public void getCurrentCodecConfig_errorChecking() {
-        mController.onBluetoothServiceConnected(null);
-        assertThat(mController.getCurrentCodecConfig()).isNull();
-
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(null);
-        assertThat(mController.getCurrentCodecConfig()).isNull();
-    }
-
-    @Test
-    public void getCurrentCodecConfig_verifyConfig() {
-        mCodecStatus = new BluetoothCodecStatus.Builder().setCodecConfig(mCodecConfigAAC).build();
-        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-
-        assertThat(mController.getCurrentCodecConfig()).isEqualTo(mCodecConfigAAC);
-    }
-
-    @Test
-    public void isHDAudioEnabled_errorChecking() {
-        mController.onBluetoothServiceConnected(null);
-        assertFalse(mController.isHDAudioEnabled());
-
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
-                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_DISABLED);
-        assertFalse(mController.isHDAudioEnabled());
-    }
-
-    @Test
-    public void isHDAudioEnabled_verifyEnabled() {
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
-                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
-        assertTrue(mController.isHDAudioEnabled());
-    }
-
-    @Test
-    public void onBluetoothServiceConnected_verifyBluetoothA2dpConfigStore() {
-        mCodecStatus =
-                new BluetoothCodecStatus.Builder()
-                        .setCodecConfig(mCodecConfigAAC)
-                        .setCodecsSelectableCapabilities(Arrays.asList(mCodecConfigs))
-                        .build();
-        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-
-        verify(mBluetoothA2dpConfigStore).setCodecType(mCodecConfigAAC.getExtendedCodecType());
-        verify(mBluetoothA2dpConfigStore).setSampleRate(mCodecConfigAAC.getSampleRate());
-        verify(mBluetoothA2dpConfigStore).setBitsPerSample(mCodecConfigAAC.getBitsPerSample());
-        verify(mBluetoothA2dpConfigStore).setChannelMode(mCodecConfigAAC.getChannelMode());
-        verify(mBluetoothA2dpConfigStore).setCodecPriority(CODEC_PRIORITY_HIGHEST);
-        verify(mBluetoothA2dpConfigStore)
-                .setCodecSpecific1Value(mCodecConfigAAC.getCodecSpecific1());
-    }
-
-    private static class AbstractBluetoothListPreferenceControllerImpl
-            extends AbstractBluetoothListPreferenceController {
-
-        private AbstractBluetoothListPreferenceControllerImpl(
-                Context context, Lifecycle lifecycle, BluetoothA2dpConfigStore store) {
-            super(context, lifecycle, store);
-        }
-
-        @Override
-        public String getPreferenceKey() {
-            return "KEY";
-        }
-
-        @Override
-        protected void writeConfigurationValues(String entryValue) {}
-    }
-}
diff --git a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java
index fab867f..4ac5dff 100644
--- a/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java
+++ b/tests/robotests/src/com/android/settings/development/bluetooth/BluetoothCodecListPreferenceControllerTest.java
@@ -18,12 +18,12 @@
 
 import static com.google.common.truth.Truth.assertThat;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.atLeastOnce;
 import static org.mockito.Mockito.eq;
 import static org.mockito.Mockito.spy;
-import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
@@ -35,7 +35,7 @@
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
-import android.platform.test.annotations.RequiresFlagsEnabled;
+import android.platform.test.annotations.EnableFlags;
 
 import androidx.lifecycle.LifecycleOwner;
 import androidx.preference.ListPreference;
@@ -89,6 +89,9 @@
     private LifecycleOwner mLifecycleOwner;
     private Lifecycle mLifecycle;
 
+    private static String TEST_ENTRY = "TEST_ENTRY";
+    private static final String TEST_ENTRY_VALUE = "1000";
+
     @Before
     public void setup() {
         MockitoAnnotations.initMocks(this);
@@ -181,21 +184,10 @@
         when(mBluetoothA2dp.getSupportedCodecTypes()).thenReturn(mCodecTypes);
     }
 
-    @Test
-    public void writeConfigurationValues_selectDefault() {
-        mCodecStatus =
-                new BluetoothCodecStatus.Builder()
-                        .setCodecConfig(mCodecConfigSBC)
-                        .setCodecsSelectableCapabilities(mCodecConfigs)
-                        .build();
-        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
-        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
-                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
-
-        mController.onBluetoothServiceConnected(mBluetoothA2dp);
-
-        mController.writeConfigurationValues(String.valueOf(mController.DEFAULT_VALUE_INT));
-        verify(mBluetoothA2dpConfigStore, times(2)).setCodecType(mCodecTypeSBC);
+    private void verifySetupDefaultListPreference() {
+        assertTrue(mPreference.getValue() == null);
+        assertTrue(mPreference.getSummary() == null);
+        assertTrue(mPreference.isEnabled() == false);
     }
 
     @Test
@@ -208,19 +200,24 @@
         when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
         mController.onBluetoothServiceConnected(mBluetoothA2dp);
 
-        mController.writeConfigurationValues(String.valueOf(mCodecTypeSBC.getCodecId()));
+        assertTrue(
+                mController.writeConfigurationValues(String.valueOf(mCodecTypeSBC.getCodecId())));
         verify(mBluetoothA2dpConfigStore, atLeastOnce()).setCodecType(mCodecTypeSBC);
 
-        mController.writeConfigurationValues(String.valueOf(mCodecTypeAAC.getCodecId()));
+        assertTrue(
+                mController.writeConfigurationValues(String.valueOf(mCodecTypeAAC.getCodecId())));
         verify(mBluetoothA2dpConfigStore).setCodecType(mCodecTypeAAC);
 
-        mController.writeConfigurationValues(String.valueOf(mCodecTypeAPTX.getCodecId()));
+        assertTrue(
+                mController.writeConfigurationValues(String.valueOf(mCodecTypeAPTX.getCodecId())));
         verify(mBluetoothA2dpConfigStore).setCodecType(mCodecTypeAPTX);
 
-        mController.writeConfigurationValues(String.valueOf(mCodecTypeLDAC.getCodecId()));
+        assertTrue(
+                mController.writeConfigurationValues(String.valueOf(mCodecTypeLDAC.getCodecId())));
         verify(mBluetoothA2dpConfigStore).setCodecType(mCodecTypeLDAC);
 
-        mController.writeConfigurationValues(String.valueOf(mCodecTypeOPUS.getCodecId()));
+        assertTrue(
+                mController.writeConfigurationValues(String.valueOf(mCodecTypeOPUS.getCodecId())));
         verify(mBluetoothA2dpConfigStore).setCodecType(mCodecTypeOPUS);
     }
 
@@ -233,7 +230,8 @@
                         .build();
         when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
         mController.onBluetoothServiceConnected(mBluetoothA2dp);
-        mController.writeConfigurationValues(String.valueOf(mCodecTypeAAC.getCodecId()));
+        assertTrue(
+                mController.writeConfigurationValues(String.valueOf(mCodecTypeAAC.getCodecId())));
 
         verify(mBluetoothA2dpConfigStore, atLeastOnce())
                 .setCodecPriority(BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST);
@@ -246,12 +244,112 @@
     }
 
     @Test
-    @RequiresFlagsEnabled(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
+    @EnableFlags(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
     public void onPreferenceChange_notifyPreference() {
         assertFalse(
                 mController.onPreferenceChange(
                         mPreference, String.valueOf(mCodecTypeAAC.getCodecId())));
+        assertFalse(mPreference.isEnabled());
 
+        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
+                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigAAC)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
+
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+
+        assertTrue(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeAAC.getCodecId())));
+
+        verify(mCallback).onBluetoothCodecChanged();
+        assertTrue(mPreference.isEnabled());
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
+    public void onPreferenceChange_listPreferenceIsNull() {
+        when(mScreen.findPreference(mController.getPreferenceKey())).thenReturn(null);
+        assertFalse(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeAAC.getCodecId())));
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
+    public void onPreferenceChange_unknownCodecId() {
+        assertFalse(mController.onPreferenceChange(mPreference, String.valueOf(TEST_ENTRY_VALUE)));
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
+    public void onPreferenceChange_codecSelection() {
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
+        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
+                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigAAC)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
+        assertTrue(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeAAC.getCodecId())));
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigSBC)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        assertTrue(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeSBC.getCodecId())));
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigLDAC)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        assertTrue(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeLDAC.getCodecId())));
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigAPTX)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        assertTrue(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeAPTX.getCodecId())));
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigOPUS)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        assertTrue(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeOPUS.getCodecId())));
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
+    public void updateState_notifyPreference() {
+        assertFalse(
+                mController.onPreferenceChange(
+                        mPreference, String.valueOf(mCodecTypeAAC.getCodecId())));
+
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigAAC)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
+        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
+                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
         mController.onBluetoothServiceConnected(mBluetoothA2dp);
 
         assertTrue(
@@ -266,4 +364,96 @@
         mController.onHDAudioEnabled(/* enabled= */ true);
         assertThat(mPreference.isEnabled()).isTrue();
     }
+
+    @Test
+    public void setupListPreference_wrongSize_shouldSetupDefaultListPreference() {
+        List<String> entries = new ArrayList<>(1);
+        entries.add(TEST_ENTRY);
+        List<String> entryValues = new ArrayList<>(2);
+        entryValues.add(TEST_ENTRY_VALUE);
+        entryValues.add(TEST_ENTRY_VALUE);
+
+        mController.setupListPreference(entries, entryValues, "", "");
+        verifySetupDefaultListPreference();
+    }
+
+    @Test
+    public void setupListPreference_listEmpty_shouldSetupDefaultListPreference() {
+        List<String> entries = new ArrayList<>(1);
+        entries.add(TEST_ENTRY);
+        List<String> entryValues = new ArrayList<>();
+
+        mController.setupListPreference(entries, entryValues, "", "");
+        verifySetupDefaultListPreference();
+    }
+
+    @Test
+    public void getBluetoothCodecStatus_errorChecking() {
+        mController.onBluetoothServiceConnected(null);
+        assertThat(mController.getBluetoothCodecStatus()).isNull();
+
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(null);
+        assertThat(mController.getBluetoothCodecStatus()).isNull();
+    }
+
+    @Test
+    public void getCurrentCodecConfig_errorChecking() {
+        mController.onBluetoothServiceConnected(null);
+        assertThat(mController.getCurrentCodecConfig()).isNull();
+
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(null);
+        assertThat(mController.getCurrentCodecConfig()).isNull();
+    }
+
+    @Test
+    public void getCurrentCodecConfig_verifyConfig() {
+        mCodecStatus = new BluetoothCodecStatus.Builder().setCodecConfig(mCodecConfigAAC).build();
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+
+        assertThat(mController.getCurrentCodecConfig()).isEqualTo(mCodecConfigAAC);
+    }
+
+    @Test
+    public void isHDAudioEnabled_errorChecking() {
+        mController.onBluetoothServiceConnected(null);
+        assertFalse(mController.isHDAudioEnabled());
+
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
+                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_DISABLED);
+        assertFalse(mController.isHDAudioEnabled());
+    }
+
+    @Test
+    public void isHDAudioEnabled_verifyEnabled() {
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+        when(mBluetoothA2dp.isOptionalCodecsEnabled(mActiveDevice))
+                .thenReturn(BluetoothA2dp.OPTIONAL_CODECS_PREF_ENABLED);
+        assertTrue(mController.isHDAudioEnabled());
+    }
+
+    @Test
+    @EnableFlags(Flags.FLAG_A2DP_OFFLOAD_CODEC_EXTENSIBILITY_SETTINGS)
+    public void onBluetoothServiceConnected_verifyBluetoothA2dpConfigStore() {
+        mCodecStatus =
+                new BluetoothCodecStatus.Builder()
+                        .setCodecConfig(mCodecConfigAAC)
+                        .setCodecsSelectableCapabilities(mCodecConfigs)
+                        .build();
+        when(mBluetoothA2dp.getCodecStatus(mActiveDevice)).thenReturn(mCodecStatus);
+        mController.onBluetoothServiceConnected(mBluetoothA2dp);
+
+        verify(mBluetoothA2dpConfigStore).setCodecType(mCodecConfigAAC.getExtendedCodecType());
+        verify(mBluetoothA2dpConfigStore).setSampleRate(mCodecConfigAAC.getSampleRate());
+        verify(mBluetoothA2dpConfigStore).setBitsPerSample(mCodecConfigAAC.getBitsPerSample());
+        verify(mBluetoothA2dpConfigStore).setChannelMode(mCodecConfigAAC.getChannelMode());
+        verify(mBluetoothA2dpConfigStore)
+                .setCodecPriority(BluetoothCodecConfig.CODEC_PRIORITY_HIGHEST);
+        verify(mBluetoothA2dpConfigStore)
+                .setCodecSpecific1Value(mCodecConfigAAC.getCodecSpecific1());
+    }
 }