To refresh/register/unregister all of the devices with same groupId
Since the LE audio have two or more devices in the same group and
the UI show their status at one preference, the UI need to register
callback for each of the devices, and also refresh the deviceList.
Bug: 278155752
Test: local test to pairing the device and check the battery part
Change-Id: I2fcde92a1f68b8437465b234820f7bad13dfc444
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;
+ }
}