diff --git a/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java b/src/com/android/settings/bluetooth/BluetoothDetailsProfilesController.java index 5dabb7aea05..988a13ca799 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 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll mManager = manager; mProfileManager = mManager.getProfileManager(); mCachedDevice = device; - mAllOfCachedDevices = getAllOfCachedBluetoothDevices(); + mAllOfCachedDevices = Utils.getAllOfCachedBluetoothDevices(mContext, mCachedDevice); lifecycle.addObserver(this); } @@ -319,20 +318,6 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll return result; } - private List getAllOfCachedBluetoothDevices() { - List 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 @@ public class BluetoothDetailsProfilesController extends BluetoothDetailsControll 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 7bf9fdbce23..e30bbfb398a 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.OnStart; 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 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr @VisibleForTesting LayoutPreference mLayoutPreference; private CachedBluetoothDevice mCachedDevice; - private List mLeAudioDevices; + private List mAllOfCachedDevices; @VisibleForTesting Handler mHandler = new Handler(Looper.getMainLooper()); @VisibleForTesting @@ -129,12 +127,8 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr 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 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr 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 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr LocalBluetoothManager bluetoothManager) { mCachedDevice = cachedBluetoothDevice; mProfileManager = bluetoothManager.getProfileManager(); - mLeAudioDevices = getAllOfLeAudioDevices(); - + mAllOfCachedDevices = Utils.getAllOfCachedBluetoothDevices(mContext, mCachedDevice); } @VisibleForTesting @@ -234,26 +224,11 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr updateBatteryLayout(R.id.bt_battery_right, BluetoothUtils.META_INT_ERROR); } - private List getAllOfLeAudioDevices() { - if (mCachedDevice == null) { - return null; - } - List 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 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr 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 @@ public class LeAudioBluetoothDetailsHeaderController extends BasePreferenceContr @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 46d8e70a416..79a2de0b38a 100644 --- a/src/com/android/settings/bluetooth/Utils.java +++ b/src/com/android/settings/bluetooth/Utils.java @@ -19,6 +19,7 @@ package com.android.settings.bluetooth; 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.R; 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 @@ public final class Utils { } 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 getAllOfCachedBluetoothDevices(Context context, + CachedBluetoothDevice cachedBluetoothDevice) { + List 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; + } }