diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
index 5dabb7a..988a13c 100644
--- a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
+++ b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.bluetooth;
 
-import android.bluetooth.BluetoothCsipSetCoordinator;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
@@ -89,7 +88,7 @@
         mManager = manager;
         mProfileManager = mManager.getProfileManager();
         mCachedDevice = device;
-        mAllOfCachedDevices = getAllOfCachedBluetoothDevices();
+        mAllOfCachedDevices = Utils.getAllOfCachedBluetoothDevices(mContext, mCachedDevice);
         lifecycle.addObserver(this);
     }
 
@@ -319,20 +318,6 @@
         return result;
     }
 
-    private List<CachedBluetoothDevice> getAllOfCachedBluetoothDevices() {
-        List<CachedBluetoothDevice> cachedBluetoothDevices = new ArrayList<>();
-        if (mCachedDevice == null) {
-            return cachedBluetoothDevices;
-        }
-        cachedBluetoothDevices.add(mCachedDevice);
-        if (mCachedDevice.getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
-            for (CachedBluetoothDevice member : mCachedDevice.getMemberDevice()) {
-                cachedBluetoothDevices.add(member);
-            }
-        }
-        return cachedBluetoothDevices;
-    }
-
     /**
      * Disable the Le Audio profile, VCP, and CSIP for each of the Le Audio devices.
      *
@@ -480,7 +465,7 @@
         for (CachedBluetoothDevice item : mAllOfCachedDevices) {
             item.unregisterCallback(this);
         }
-        mAllOfCachedDevices = getAllOfCachedBluetoothDevices();
+        mAllOfCachedDevices = Utils.getAllOfCachedBluetoothDevices(mContext, mCachedDevice);
         for (CachedBluetoothDevice item : mAllOfCachedDevices) {
             item.registerCallback(this);
         }
diff --git a/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java b/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java
index 7bf9fdb..e30bbfb 100644
--- a/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java
+++ b/src/com/android/settings/bluetooth/LeAudioBluetoothDetailsHeaderController.java
@@ -16,7 +16,6 @@
 
 package com.android.settings.bluetooth;
 
-import android.bluetooth.BluetoothCsipSetCoordinator;
 import android.bluetooth.BluetoothLeAudio;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
@@ -48,7 +47,6 @@
 import com.android.settingslib.core.lifecycle.events.OnStop;
 import com.android.settingslib.widget.LayoutPreference;
 
-import java.util.ArrayList;
 import java.util.List;
 
 /**
@@ -91,7 +89,7 @@
     @VisibleForTesting
     LayoutPreference mLayoutPreference;
     private CachedBluetoothDevice mCachedDevice;
-    private List<CachedBluetoothDevice> mLeAudioDevices;
+    private List<CachedBluetoothDevice> mAllOfCachedDevices;
     @VisibleForTesting
     Handler mHandler = new Handler(Looper.getMainLooper());
     @VisibleForTesting
@@ -129,12 +127,8 @@
             return;
         }
         mIsRegisterCallback = true;
-        if (mLeAudioDevices != null && !mLeAudioDevices.isEmpty()) {
-            for (CachedBluetoothDevice item : mLeAudioDevices) {
-                item.registerCallback(this);
-            }
-        } else {
-            mCachedDevice.registerCallback(this);
+        for (CachedBluetoothDevice item : mAllOfCachedDevices) {
+            item.registerCallback(this);
         }
         refresh();
     }
@@ -144,13 +138,10 @@
         if (!mIsRegisterCallback) {
             return;
         }
-        if (mLeAudioDevices != null && !mLeAudioDevices.isEmpty()) {
-            for (CachedBluetoothDevice item : mLeAudioDevices) {
-                item.unregisterCallback(this);
-            }
-        } else {
-            mCachedDevice.unregisterCallback(this);
+        for (CachedBluetoothDevice item : mAllOfCachedDevices) {
+            item.unregisterCallback(this);
         }
+
         mIsRegisterCallback = false;
     }
 
@@ -162,8 +153,7 @@
             LocalBluetoothManager bluetoothManager) {
         mCachedDevice = cachedBluetoothDevice;
         mProfileManager = bluetoothManager.getProfileManager();
-        mLeAudioDevices = getAllOfLeAudioDevices();
-
+        mAllOfCachedDevices = Utils.getAllOfCachedBluetoothDevices(mContext, mCachedDevice);
     }
 
     @VisibleForTesting
@@ -234,26 +224,11 @@
         updateBatteryLayout(R.id.bt_battery_right, BluetoothUtils.META_INT_ERROR);
     }
 
-    private List<CachedBluetoothDevice> getAllOfLeAudioDevices() {
-        if (mCachedDevice == null) {
-            return null;
-        }
-        List<CachedBluetoothDevice> leAudioDevices = new ArrayList<>();
-        leAudioDevices.add(mCachedDevice);
-        if (mCachedDevice.getGroupId() != BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
-            for (CachedBluetoothDevice member : mCachedDevice.getMemberDevice()) {
-                leAudioDevices.add(member);
-            }
-        }
-        Log.d(TAG, "mLeAudioDevices is " + mLeAudioDevices);
-        return leAudioDevices;
-    }
-
     private void updateBatteryLayout() {
         // Init the battery layouts.
         hideAllOfBatteryLayouts();
         LeAudioProfile leAudioProfile = mProfileManager.getLeAudioProfile();
-        if (mLeAudioDevices == null || mLeAudioDevices.isEmpty()) {
+        if (mAllOfCachedDevices.isEmpty()) {
             Log.e(TAG, "There is no LeAudioProfile.");
             return;
         }
@@ -267,7 +242,7 @@
             return;
         }
 
-        for (CachedBluetoothDevice cachedDevice : mLeAudioDevices) {
+        for (CachedBluetoothDevice cachedDevice : mAllOfCachedDevices) {
             int deviceId = leAudioProfile.getAudioLocation(cachedDevice.getDevice());
             Log.d(TAG, "LeAudioDevices:" + cachedDevice.getDevice().getAnonymizedAddress()
                     + ", deviceId:" + deviceId);
@@ -322,7 +297,15 @@
 
     @Override
     public void onDeviceAttributesChanged() {
-        if (mCachedDevice != null) {
+        for (CachedBluetoothDevice item : mAllOfCachedDevices) {
+            item.unregisterCallback(this);
+        }
+        mAllOfCachedDevices = Utils.getAllOfCachedBluetoothDevices(mContext, mCachedDevice);
+        for (CachedBluetoothDevice item : mAllOfCachedDevices) {
+            item.registerCallback(this);
+        }
+
+        if (!mAllOfCachedDevices.isEmpty()) {
             refresh();
         }
     }
diff --git a/src/com/android/settings/bluetooth/Utils.java b/src/com/android/settings/bluetooth/Utils.java
index 46d8e70..79a2de0 100644
--- a/src/com/android/settings/bluetooth/Utils.java
+++ b/src/com/android/settings/bluetooth/Utils.java
@@ -19,6 +19,7 @@
 import static android.os.Process.BLUETOOTH_UID;
 
 import android.app.settings.SettingsEnums;
+import android.bluetooth.BluetoothCsipSetCoordinator;
 import android.bluetooth.BluetoothDevice;
 import android.bluetooth.BluetoothProfile;
 import android.content.Context;
@@ -39,9 +40,12 @@
 import com.android.settings.overlay.FeatureFactory;
 import com.android.settingslib.bluetooth.BluetoothUtils;
 import com.android.settingslib.bluetooth.BluetoothUtils.ErrorListener;
+import com.android.settingslib.bluetooth.CachedBluetoothDevice;
 import com.android.settingslib.bluetooth.LocalBluetoothManager;
 import com.android.settingslib.bluetooth.LocalBluetoothManager.BluetoothManagerCallback;
 
+import java.util.ArrayList;
+import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.FutureTask;
 
@@ -225,4 +229,47 @@
         }
         throw new NameNotFoundException("Could not find main bluetooth package");
     }
+
+    /**
+     * Returns all cachedBluetoothDevices with the same groupId.
+     * @param cachedBluetoothDevice The main cachedBluetoothDevice.
+     * @return all cachedBluetoothDevices with the same groupId.
+     */
+    public static List<CachedBluetoothDevice> getAllOfCachedBluetoothDevices(Context context,
+            CachedBluetoothDevice cachedBluetoothDevice) {
+        List<CachedBluetoothDevice> cachedBluetoothDevices = new ArrayList<>();
+        if (cachedBluetoothDevice == null) {
+            Log.e(TAG, "getAllOfCachedBluetoothDevices: no cachedBluetoothDevice");
+            return cachedBluetoothDevices;
+        }
+        int deviceGroupId = cachedBluetoothDevice.getGroupId();
+        if (deviceGroupId == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+            cachedBluetoothDevices.add(cachedBluetoothDevice);
+            return cachedBluetoothDevices;
+        }
+
+        final LocalBluetoothManager localBtMgr = Utils.getLocalBtManager(context);
+        if (localBtMgr == null) {
+            Log.e(TAG, "getAllOfCachedBluetoothDevices: no LocalBluetoothManager");
+            return cachedBluetoothDevices;
+        }
+        CachedBluetoothDevice mainDevice =
+                localBtMgr.getCachedDeviceManager().getCachedDevicesCopy().stream()
+                        .filter(cachedDevice -> cachedDevice.getGroupId() == deviceGroupId)
+                        .findFirst().orElse(null);
+        if (mainDevice == null) {
+            Log.e(TAG, "getAllOfCachedBluetoothDevices: groupId = " + deviceGroupId
+                    + ", no main device.");
+            return cachedBluetoothDevices;
+        }
+        cachedBluetoothDevice = mainDevice;
+        cachedBluetoothDevices.add(cachedBluetoothDevice);
+        for (CachedBluetoothDevice member : cachedBluetoothDevice.getMemberDevice()) {
+            cachedBluetoothDevices.add(member);
+        }
+        Log.d(TAG, "getAllOfCachedBluetoothDevices: groupId = " + deviceGroupId
+                + " , cachedBluetoothDevice = " + cachedBluetoothDevice
+                + " , deviceList = " + cachedBluetoothDevices);
+        return cachedBluetoothDevices;
+    }
 }
