From ef7a75c394e64893a20e1bd14a35a9f07e06a246 Mon Sep 17 00:00:00 2001 From: SongFerngWang Date: Thu, 18 May 2023 15:59:41 +0800 Subject: [PATCH] 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 --- .../BluetoothDetailsProfilesController.java | 19 +------ ...AudioBluetoothDetailsHeaderController.java | 53 +++++++------------ src/com/android/settings/bluetooth/Utils.java | 47 ++++++++++++++++ 3 files changed, 67 insertions(+), 52 deletions(-) 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; + } }