summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java34
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java69
-rw-r--r--packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java23
3 files changed, 126 insertions, 0 deletions
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
index 21afde186a32..70baf1d84470 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/BluetoothEventManager.java
@@ -126,6 +126,9 @@ public class BluetoothEventManager {
addHandler(BluetoothDevice.ACTION_ACL_CONNECTED, new AclStateChangedHandler());
addHandler(BluetoothDevice.ACTION_ACL_DISCONNECTED, new AclStateChangedHandler());
+ addHandler(BluetoothCsipSetCoordinator.ACTION_CSIS_SET_MEMBER_AVAILABLE,
+ new SetMemberAvailableHandler());
+
registerAdapterIntentReceiver();
}
@@ -339,6 +342,12 @@ public class BluetoothEventManager {
}
int bondState = intent.getIntExtra(BluetoothDevice.EXTRA_BOND_STATE,
BluetoothDevice.ERROR);
+
+ if (mDeviceManager.onBondStateChangedIfProcess(device, bondState)) {
+ Log.d(TAG, "Should not update UI for the set member");
+ return;
+ }
+
CachedBluetoothDevice cachedDevice = mDeviceManager.findDevice(device);
if (cachedDevice == null) {
Log.w(TAG, "Got bonding state changed for " + device +
@@ -502,4 +511,29 @@ public class BluetoothEventManager {
dispatchAudioModeChanged();
}
}
+
+ private class SetMemberAvailableHandler implements Handler {
+ @Override
+ public void onReceive(Context context, Intent intent, BluetoothDevice device) {
+ final String action = intent.getAction();
+ if (device == null) {
+ Log.e(TAG, "SetMemberAvailableHandler: device is null");
+ return;
+ }
+
+ if (action == null) {
+ Log.e(TAG, "SetMemberAvailableHandler: action is null");
+ return;
+ }
+
+ final int groupId = intent.getIntExtra(BluetoothCsipSetCoordinator.EXTRA_CSIS_GROUP_ID,
+ BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ if (groupId == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+ Log.e(TAG, "SetMemberAvailableHandler: Invalid group id");
+ return;
+ }
+
+ mDeviceManager.onSetMemberAppear(device, groupId);
+ }
+ }
}
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
index 19c5a74280eb..02566155f1c9 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CachedBluetoothDeviceManager.java
@@ -45,6 +45,7 @@ public class CachedBluetoothDeviceManager {
HearingAidDeviceManager mHearingAidDeviceManager;
@VisibleForTesting
CsipDeviceManager mCsipDeviceManager;
+ BluetoothDevice mOngoingSetMemberPair;
CachedBluetoothDeviceManager(Context context, LocalBluetoothManager localBtManager) {
mContext = context;
@@ -337,6 +338,74 @@ public class CachedBluetoothDeviceManager {
}
}
+ /**
+ * Called when we found a set member of a group. The function will check the {@code groupId} if
+ * it exists and if there is a ongoing pair, the device would be ignored.
+ *
+ * @param device The found device
+ * @param groupId The group id of the found device
+ */
+ public synchronized void onSetMemberAppear(BluetoothDevice device, int groupId) {
+ Log.d(TAG, "onSetMemberAppear, groupId: " + groupId + " device: " + device.toString());
+
+ if (mOngoingSetMemberPair != null) {
+ Log.d(TAG, "Ongoing set memberPairing in process, drop it!");
+ return;
+ }
+
+ if (mCsipDeviceManager.onSetMemberAppear(device, groupId)) {
+ mOngoingSetMemberPair = device;
+ }
+ }
+
+ /**
+ * Called when the bond state change. If the bond state change is related with the
+ * ongoing set member pair, the cachedBluetoothDevice will be created but the UI
+ * would not be updated. For the other case, return {@code false} to go through the normal
+ * flow.
+ *
+ * @param device The device
+ * @param bondState The new bond state
+ *
+ * @return {@code true}, if the bond state change for the device is handled inside this
+ * function, and would not like to update the UI. If not, return {@code false}.
+ */
+ public synchronized boolean onBondStateChangedIfProcess(BluetoothDevice device, int bondState) {
+ if (mOngoingSetMemberPair == null || !mOngoingSetMemberPair.equals(device)) {
+ return false;
+ }
+
+ if (bondState == BluetoothDevice.BOND_BONDING) {
+ return true;
+ }
+
+ mOngoingSetMemberPair = null;
+ if (bondState != BluetoothDevice.BOND_NONE) {
+ if (findDevice(device) == null) {
+ final LocalBluetoothProfileManager profileManager = mBtManager.getProfileManager();
+ CachedBluetoothDevice newDevice =
+ new CachedBluetoothDevice(mContext, profileManager, device);
+ mCachedDevices.add(newDevice);
+ findDevice(device).connect();
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Check if the device is the one which is initial paired locally by CSIP. The setting
+ * would depned on it to accept the pairing request automatically
+ *
+ * @param device The device
+ *
+ * @return {@code true}, if the device is ongoing pair by CSIP. Otherwise, return
+ * {@code false}.
+ */
+ public boolean isOngoingPairByCsip(BluetoothDevice device) {
+ return !(mOngoingSetMemberPair == null) && mOngoingSetMemberPair.equals(device);
+ }
+
private void log(String msg) {
if (DEBUG) {
Log.d(TAG, msg);
diff --git a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java
index ebfe0d336a0a..347e14b91656 100644
--- a/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java
+++ b/packages/SettingsLib/src/com/android/settingslib/bluetooth/CsipDeviceManager.java
@@ -239,6 +239,29 @@ public class CsipDeviceManager {
return null;
}
+ /**
+ * Called when we found a set member of a group. The function will check bond state, and
+ * the {@code groupId} if it exists, and then create the bond.
+ *
+ * @param device The found device
+ * @param groupId The group id of the found device
+ *
+ * @return {@code true}, if the we create bond with the device. Otherwise, return
+ * {@code false}.
+ */
+ public boolean onSetMemberAppear(BluetoothDevice device, int groupId) {
+ if (device.getBondState() != BluetoothDevice.BOND_NONE) {
+ return false;
+ }
+
+ if (getCachedDevice(groupId) != null) {
+ device.createBond(BluetoothDevice.TRANSPORT_LE);
+ return true;
+ }
+
+ return false;
+ }
+
private void log(String msg) {
if (DEBUG) {
Log.d(TAG, msg);