Handle csip set member automatic pair in Setting

Move the set member handle to setting. SystemUI and Setting have the
individual settingLib instance. If we trigger pairing inside settingLib,
the action would be called twice. SystemUI does not contain the concept
to handle the pair interaction. Setting would take the action to
createBond for CSIP automatically.

Bug: 201758444
Bug: 150670922
Test: Pair the coordinated set devices, and check the set member pairing
would be done automatically without the pairing dialog

Change-Id: Idbdd21a1f15b04cc91cbc2d30a5cb4e9b24174b9
Merged-In: Idbdd21a1f15b04cc91cbc2d30a5cb4e9b24174b9
This commit is contained in:
Alice Kuo
2021-10-13 18:43:47 +08:00
parent c78fb83aee
commit 629611a43e
2 changed files with 46 additions and 26 deletions

View File

@@ -2290,6 +2290,7 @@
android:exported="true"> android:exported="true">
<intent-filter> <intent-filter>
<action android:name="android.bluetooth.device.action.PAIRING_REQUEST" /> <action android:name="android.bluetooth.device.action.PAIRING_REQUEST" />
<action android:name="android.bluetooth.action.CSIS_SET_MEMBER_AVAILABLE"/>
</intent-filter> </intent-filter>
</receiver> </receiver>

View File

@@ -16,12 +16,14 @@
package com.android.settings.bluetooth; package com.android.settings.bluetooth;
import android.bluetooth.BluetoothCsipSetCoordinator;
import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.PowerManager; import android.os.PowerManager;
import android.os.UserHandle; import android.os.UserHandle;
import android.text.TextUtils;
import com.android.settingslib.bluetooth.LocalBluetoothManager; import com.android.settingslib.bluetooth.LocalBluetoothManager;
@@ -36,38 +38,55 @@ public final class BluetoothPairingRequest extends BroadcastReceiver {
@Override @Override
public void onReceive(Context context, Intent intent) { public void onReceive(Context context, Intent intent) {
String action = intent.getAction(); String action = intent.getAction();
if (action == null || !action.equals(BluetoothDevice.ACTION_PAIRING_REQUEST)) { if (action == null) {
return; return;
} }
PowerManager powerManager = context.getSystemService(PowerManager.class);
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE); 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); final LocalBluetoothManager mBluetoothManager = Utils.getLocalBtManager(context);
// Skips consent pairing dialog if the device was recently associated with CDM if (TextUtils.equals(action, BluetoothDevice.ACTION_PAIRING_REQUEST)) {
if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT PowerManager powerManager = context.getSystemService(PowerManager.class);
&& (device.canBondWithoutDialog() int pairingVariant = intent.getIntExtra(BluetoothDevice.EXTRA_PAIRING_VARIANT,
|| mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) { BluetoothDevice.ERROR);
device.setPairingConfirmation(true); String deviceAddress = device != null ? device.getAddress() : null;
} else if (powerManager.isInteractive() && shouldShowDialog) { String deviceName = device != null ? device.getName() : null;
// Since the screen is on and the BT-related activity is in the foreground, boolean shouldShowDialog = LocalBluetoothPreferences.shouldShowDialogInForeground(
// just open the dialog context, deviceAddress, deviceName);
// 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); // Skips consent pairing dialog if the device was recently associated with CDM
} else { if (pairingVariant == BluetoothDevice.PAIRING_VARIANT_CONSENT
// Put up a notification that leads to the dialog && (device.canBondWithoutDialog()
intent.setClass(context, BluetoothPairingService.class); || mBluetoothManager.getCachedDeviceManager().isOngoingPairByCsip(device))) {
intent.setAction(BluetoothDevice.ACTION_PAIRING_REQUEST); device.setPairingConfirmation(true);
context.startServiceAsUser(intent, UserHandle.CURRENT); } 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);
}
} }
} }
} }