Handle csip set member automatic pair in Setting am: 629611a43e am: eb412a0614
Original change: https://android-review.googlesource.com/c/platform/packages/apps/Settings/+/1903834
Change-Id: Ibb8140b8af96036750457a6866eb9ba410bc0b84
diff --git a/AndroidManifest.xml b/AndroidManifest.xml
index 5f91278..3212755 100644
--- a/AndroidManifest.xml
+++ b/AndroidManifest.xml
@@ -2326,6 +2326,7 @@
android:exported="true">
<intent-filter>
<action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
+ <action android:name="android.bluetooth.action.CSIS_SET_MEMBER_AVAILABLE"/>
</intent-filter>
</receiver>
diff --git a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
index 4ea4338..6b80256 100644
--- a/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
+++ b/src/com/android/settings/bluetooth/BluetoothPairingRequest.java
@@ -16,12 +16,14 @@
package com.android.settings.bluetooth;
+import android.bluetooth.BluetoothCsipSetCoordinator;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.PowerManager;
import android.os.UserHandle;
+import android.text.TextUtils;
import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -36,38 +38,55 @@
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
- if (action == null || !action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) {
+ if (action == null) {
return;
}
- PowerManager powerManager = context.getSystemService(PowerManager.class);
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
- int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
- BluetoothDevice.ERROR);
- String deviceAddress = device != null ? device.getAddress() : null;
- String deviceName = device != null ? device.getName() : null;
- boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground(
- context, deviceAddress, deviceName);
-
final LocalBluetoothManager mBluetoothManager = Utils.getLocalBtManager(context);
- // Skips consent pairing dialog if the device was recently associated with CDM
- if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT
- && (device.canBondWithoutDialog()
- || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) {
- device.setPairingConfirmation(true);
- } else if (powerManager.isInteractive() && shouldShowDialog) {
- // Since the screen is on and the BT-related activity is in the foreground,
- // just open the dialog
- // convert broadcast intent into activity intent (same action string)
- Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context, intent,
- BluetoothDevice.EXTRA_PAIRING_INITIATOR_FOREGROUND);
+ if (TextUtils.equals(action, BluetoothDevice.ACTION_PAIRING_REQUEST)) {
+ PowerManager powerManager = context.getSystemService(PowerManager.class);
+ int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
+ BluetoothDevice.ERROR);
+ String deviceAddress = device != null ? device.getAddress() : null;
+ String deviceName = device != null ? device.getName() : null;
+ boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground(
+ context, deviceAddress, deviceName);
- context.startActivityAsUser(pairingIntent, UserHandle.CURRENT);
- } else {
- // Put up a notification that leads to the dialog
- intent.setClass(context, BluetoothPairingService.class);
- intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
- context.startServiceAsUser(intent, UserHandle.CURRENT);
+ // Skips consent pairing dialog if the device was recently associated with CDM
+ if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT
+ && (device.canBondWithoutDialog()
+ || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) {
+ device.setPairingConfirmation(true);
+ } else if (powerManager.isInteractive() && shouldShowDialog) {
+ // Since the screen is on and the BT-related activity is in the foreground,
+ // just open the dialog
+ // convert broadcast intent into activity intent (same action string)
+ Intent pairingIntent = BluetoothPairingService.getPairingDialogIntent(context,
+ intent, BluetoothDevice.EXTRA_PAIRING_INITIATOR_FOREGROUND);
+
+ context.startActivityAsUser(pairingIntent, UserHandle.CURRENT);
+ } else {
+ // Put up a notification that leads to the dialog
+ intent.setClass(context, BluetoothPairingService.class);
+ intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST);
+ context.startServiceAsUser(intent, UserHandle.CURRENT);
+ }
+ } else if (TextUtils.equals(action,
+ BluetoothCsipSetCoordinator.ACTION_CSIS_SET_MEMBER_AVAILABLE)) {
+ if (device == null) {
+ return;
+ }
+
+ final int groupId = intent.getIntExtra(BluetoothCsipSetCoordinator.EXTRA_CSIS_GROUP_ID,
+ BluetoothCsipSetCoordinator.GROUP_ID_INVALID);
+ if (groupId == BluetoothCsipSetCoordinator.GROUP_ID_INVALID) {
+ return;
+ }
+
+ if (mBluetoothManager.getCachedDeviceManager().shouldPairByCsip(device, groupId)) {
+ device.createBond(BluetoothDevice.TRANSPORT_LE);
+ }
}
}
}