summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Pawlowski <jpawlowski@google.com>2021-11-09 14:26:00 +0000
committerGerrit Code Review <noreply-gerritcodereview@google.com>2021-11-09 14:26:00 +0000
commit4f11cf119bab855e2bcfa915e7bd21fa8eee9dd1 (patch)
treef0f318748f9bfce3a7ca57b9dda839717be0f278
parentf729c536de7fd60316d0cabfb25495c52cf3531d (diff)
parent9991bfba933e67dab54902337c5705103bc0d37b (diff)
downloadBluetooth-4f11cf119bab855e2bcfa915e7bd21fa8eee9dd1.tar.gz
Merge "PhonePolicy: Fix policies for LeAudio profiles"
-rw-r--r--src/com/android/bluetooth/btservice/PhonePolicy.java98
-rw-r--r--src/com/android/bluetooth/btservice/ServiceFactory.java10
-rw-r--r--src/com/android/bluetooth/csip/CsipSetCoordinatorService.java2
-rw-r--r--src/com/android/bluetooth/le_audio/LeAudioService.java6
-rw-r--r--src/com/android/bluetooth/vc/VolumeControlService.java2
5 files changed, 112 insertions, 6 deletions
diff --git a/src/com/android/bluetooth/btservice/PhonePolicy.java b/src/com/android/bluetooth/btservice/PhonePolicy.java
index 9529c5130..44bdd0f95 100644
--- a/src/com/android/bluetooth/btservice/PhonePolicy.java
+++ b/src/com/android/bluetooth/btservice/PhonePolicy.java
@@ -19,12 +19,14 @@ package com.android.bluetooth.btservice;
import android.annotation.RequiresPermission;
import android.bluetooth.BluetoothA2dp;
import android.bluetooth.BluetoothAdapter;
+import android.bluetooth.BluetoothCsipSetCoordinator;
import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothHeadset;
import android.bluetooth.BluetoothHearingAid;
import android.bluetooth.BluetoothLeAudio;
import android.bluetooth.BluetoothProfile;
import android.bluetooth.BluetoothUuid;
+import android.bluetooth.BluetoothVolumeControl;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
@@ -39,10 +41,13 @@ import android.util.Log;
import com.android.bluetooth.Utils;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.btservice.storage.DatabaseManager;
+import com.android.bluetooth.csip.CsipSetCoordinatorService;
import com.android.bluetooth.hearingaid.HearingAidService;
import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.hid.HidHostService;
+import com.android.bluetooth.le_audio.LeAudioService;
import com.android.bluetooth.pan.PanService;
+import com.android.bluetooth.vc.VolumeControlService;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
@@ -118,11 +123,21 @@ class PhonePolicy {
BluetoothProfile.A2DP, -1, // No-op argument
intent).sendToTarget();
break;
+ case BluetoothCsipSetCoordinator.ACTION_CSIS_CONNECTION_STATE_CHANGED:
+ mHandler.obtainMessage(MESSAGE_PROFILE_CONNECTION_STATE_CHANGED,
+ BluetoothProfile.CSIP_SET_COORDINATOR, -1, // No-op argument
+ intent).sendToTarget();
+ break;
case BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED:
mHandler.obtainMessage(MESSAGE_PROFILE_CONNECTION_STATE_CHANGED,
BluetoothProfile.LE_AUDIO, -1, // No-op argument
intent).sendToTarget();
break;
+ case BluetoothVolumeControl.ACTION_CONNECTION_STATE_CHANGED:
+ mHandler.obtainMessage(MESSAGE_PROFILE_CONNECTION_STATE_CHANGED,
+ BluetoothProfile.VOLUME_CONTROL, -1, // No-op argument
+ intent).sendToTarget();
+ break;
case BluetoothA2dp.ACTION_ACTIVE_DEVICE_CHANGED:
mHandler.obtainMessage(MESSAGE_PROFILE_ACTIVE_DEVICE_CHANGED,
BluetoothProfile.A2DP, -1, // No-op argument
@@ -242,6 +257,8 @@ class PhonePolicy {
filter.addAction(BluetoothHeadset.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(BluetoothA2dp.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(BluetoothLeAudio.ACTION_LE_AUDIO_CONNECTION_STATE_CHANGED);
+ filter.addAction(BluetoothCsipSetCoordinator.ACTION_CSIS_CONNECTION_STATE_CHANGED);
+ filter.addAction(BluetoothVolumeControl.ACTION_CONNECTION_STATE_CHANGED);
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_UUID);
filter.addAction(BluetoothAdapter.ACTION_STATE_CHANGED);
@@ -274,6 +291,11 @@ class PhonePolicy {
HeadsetService headsetService = mFactory.getHeadsetService();
PanService panService = mFactory.getPanService();
HearingAidService hearingAidService = mFactory.getHearingAidService();
+ LeAudioService leAudioService = mFactory.getLeAudioService();
+ CsipSetCoordinatorService csipSetCooridnatorService =
+ mFactory.getCsipSetCoordinatorService();
+ VolumeControlService volumeControlService =
+ mFactory.getVolumeControlService();
// Set profile priorities only for the profiles discovered on the remote device.
// This avoids needless auto-connect attempts to profiles non-existent on the remote device
@@ -302,6 +324,14 @@ class PhonePolicy {
BluetoothProfile.A2DP, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
}
+ if ((csipSetCooridnatorService != null)
+ && (Utils.arrayContains(uuids, BluetoothUuid.COORDINATED_SET))
+ && (csipSetCooridnatorService.getConnectionPolicy(device)
+ == BluetoothProfile.CONNECTION_POLICY_UNKNOWN)) {
+ mAdapterService.getDatabase().setProfileConnectionPolicy(device,
+ BluetoothProfile.CSIP_SET_COORDINATOR, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
+ }
+
if ((panService != null) && (Utils.arrayContains(uuids, BluetoothUuid.PANU) && (
panService.getConnectionPolicy(device)
== BluetoothProfile.CONNECTION_POLICY_UNKNOWN)
@@ -311,6 +341,14 @@ class PhonePolicy {
BluetoothProfile.PAN, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
}
+ if ((leAudioService != null) && Utils.arrayContains(uuids,
+ BluetoothUuid.LE_AUDIO) && (leAudioService.getConnectionPolicy(device)
+ == BluetoothProfile.CONNECTION_POLICY_UNKNOWN)) {
+ debugLog("setting le audio profile priority for device " + device);
+ mAdapterService.getDatabase().setProfileConnectionPolicy(device,
+ BluetoothProfile.LE_AUDIO, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
+ }
+
if ((hearingAidService != null) && Utils.arrayContains(uuids,
BluetoothUuid.HEARING_AID) && (hearingAidService.getConnectionPolicy(device)
== BluetoothProfile.CONNECTION_POLICY_UNKNOWN)) {
@@ -318,6 +356,14 @@ class PhonePolicy {
mAdapterService.getDatabase().setProfileConnectionPolicy(device,
BluetoothProfile.HEARING_AID, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
}
+
+ if ((volumeControlService != null) && Utils.arrayContains(uuids,
+ BluetoothUuid.VOLUME_CONTROL) && (volumeControlService.getConnectionPolicy(device)
+ == BluetoothProfile.CONNECTION_POLICY_UNKNOWN)) {
+ debugLog("setting volume control profile priority for device " + device);
+ mAdapterService.getDatabase().setProfileConnectionPolicy(device,
+ BluetoothProfile.VOLUME_CONTROL, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
+ }
}
@RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
@@ -326,7 +372,9 @@ class PhonePolicy {
debugLog("processProfileStateChanged, device=" + device + ", profile=" + profileId + ", "
+ prevState + " -> " + nextState);
if (((profileId == BluetoothProfile.A2DP) || (profileId == BluetoothProfile.HEADSET)
- || (profileId == BluetoothProfile.LE_AUDIO))) {
+ || (profileId == BluetoothProfile.LE_AUDIO)
+ || (profileId == BluetoothProfile.CSIP_SET_COORDINATOR)
+ || (profileId == BluetoothProfile.VOLUME_CONTROL))) {
if (nextState == BluetoothProfile.STATE_CONNECTED) {
switch (profileId) {
case BluetoothProfile.A2DP:
@@ -373,6 +421,9 @@ class PhonePolicy {
HeadsetService hsService = mFactory.getHeadsetService();
A2dpService a2dpService = mFactory.getA2dpService();
PanService panService = mFactory.getPanService();
+ LeAudioService leAudioService = mFactory.getLeAudioService();
+ CsipSetCoordinatorService csipSetCooridnatorService =
+ mFactory.getCsipSetCoordinatorService();
if (hsService != null) {
List<BluetoothDevice> hsConnDevList = hsService.getConnectedDevices();
@@ -384,11 +435,21 @@ class PhonePolicy {
allProfilesEmpty &= a2dpConnDevList.isEmpty();
atLeastOneProfileConnectedForDevice |= a2dpConnDevList.contains(device);
}
+ if (csipSetCooridnatorService != null) {
+ List<BluetoothDevice> csipConnDevList = csipSetCooridnatorService.getConnectedDevices();
+ allProfilesEmpty &= csipConnDevList.isEmpty();
+ atLeastOneProfileConnectedForDevice |= csipConnDevList.contains(device);
+ }
if (panService != null) {
List<BluetoothDevice> panConnDevList = panService.getConnectedDevices();
allProfilesEmpty &= panConnDevList.isEmpty();
atLeastOneProfileConnectedForDevice |= panConnDevList.contains(device);
}
+ if (leAudioService != null) {
+ List<BluetoothDevice> leAudioConnDevList = leAudioService.getConnectedDevices();
+ allProfilesEmpty &= leAudioConnDevList.isEmpty();
+ atLeastOneProfileConnectedForDevice |= leAudioConnDevList.contains(device);
+ }
if (!atLeastOneProfileConnectedForDevice) {
// Consider this device as fully disconnected, don't bother connecting others
@@ -505,6 +566,11 @@ class PhonePolicy {
HeadsetService hsService = mFactory.getHeadsetService();
A2dpService a2dpService = mFactory.getA2dpService();
PanService panService = mFactory.getPanService();
+ LeAudioService leAudioService = mFactory.getLeAudioService();
+ CsipSetCoordinatorService csipSetCooridnatorService =
+ mFactory.getCsipSetCoordinatorService();
+ VolumeControlService volumeControlService =
+ mFactory.getVolumeControlService();
if (hsService != null) {
if (!mHeadsetRetrySet.contains(device) && (hsService.getConnectionPolicy(device)
@@ -538,6 +604,36 @@ class PhonePolicy {
panService.connect(device);
}
}
+ if (leAudioService != null) {
+ List<BluetoothDevice> leAudioConnDevList = leAudioService.getConnectedDevices();
+ if (!leAudioConnDevList.contains(device) && (leAudioService.getConnectionPolicy(device)
+ == BluetoothProfile.CONNECTION_POLICY_ALLOWED)
+ && (leAudioService.getConnectionState(device)
+ == BluetoothProfile.STATE_DISCONNECTED)) {
+ debugLog("Retrying connection to LEAudio with device " + device);
+ leAudioService.connect(device);
+ }
+ }
+ if (csipSetCooridnatorService != null) {
+ List<BluetoothDevice> csipConnDevList = csipSetCooridnatorService.getConnectedDevices();
+ if (!csipConnDevList.contains(device) && (csipSetCooridnatorService.getConnectionPolicy(device)
+ == BluetoothProfile.CONNECTION_POLICY_ALLOWED)
+ && (csipSetCooridnatorService.getConnectionState(device)
+ == BluetoothProfile.STATE_DISCONNECTED)) {
+ debugLog("Retrying connection to CSIP with device " + device);
+ csipSetCooridnatorService.connect(device);
+ }
+ }
+ if (volumeControlService != null) {
+ List<BluetoothDevice> vcConnDevList = volumeControlService.getConnectedDevices();
+ if (!vcConnDevList.contains(device) && (volumeControlService.getConnectionPolicy(device)
+ == BluetoothProfile.CONNECTION_POLICY_ALLOWED)
+ && (volumeControlService.getConnectionState(device)
+ == BluetoothProfile.STATE_DISCONNECTED)) {
+ debugLog("Retrying connection to CSIP with device " + device);
+ volumeControlService.connect(device);
+ }
+ }
}
private static void debugLog(String msg) {
diff --git a/src/com/android/bluetooth/btservice/ServiceFactory.java b/src/com/android/bluetooth/btservice/ServiceFactory.java
index fd1b6d858..6842dc0de 100644
--- a/src/com/android/bluetooth/btservice/ServiceFactory.java
+++ b/src/com/android/bluetooth/btservice/ServiceFactory.java
@@ -18,6 +18,7 @@ package com.android.bluetooth.btservice;
import com.android.bluetooth.a2dp.A2dpService;
import com.android.bluetooth.avrcp.AvrcpTargetService;
+import com.android.bluetooth.csip.CsipSetCoordinatorService;
import com.android.bluetooth.hearingaid.HearingAidService;
import com.android.bluetooth.hfp.HeadsetService;
import com.android.bluetooth.hid.HidDeviceService;
@@ -25,6 +26,7 @@ import com.android.bluetooth.hid.HidHostService;
import com.android.bluetooth.le_audio.LeAudioService;
import com.android.bluetooth.mcp.McpService;
import com.android.bluetooth.pan.PanService;
+import com.android.bluetooth.vc.VolumeControlService;
// Factory class to create instances of static services. Useful in mocking the service objects.
public class ServiceFactory {
@@ -32,6 +34,10 @@ public class ServiceFactory {
return A2dpService.getA2dpService();
}
+ public CsipSetCoordinatorService getCsipSetCoordinatorService() {
+ return CsipSetCoordinatorService.getCsipSetCoordinatorService();
+ }
+
public HeadsetService getHeadsetService() {
return HeadsetService.getHeadsetService();
}
@@ -63,4 +69,8 @@ public class ServiceFactory {
public McpService getMcpService() {
return McpService.getMcpService();
}
+
+ public VolumeControlService getVolumeControlService() {
+ return VolumeControlService.getVolumeControlService();
+ }
}
diff --git a/src/com/android/bluetooth/csip/CsipSetCoordinatorService.java b/src/com/android/bluetooth/csip/CsipSetCoordinatorService.java
index 61f4cdf1a..7fe134524 100644
--- a/src/com/android/bluetooth/csip/CsipSetCoordinatorService.java
+++ b/src/com/android/bluetooth/csip/CsipSetCoordinatorService.java
@@ -284,7 +284,7 @@ public class CsipSetCoordinatorService extends ProfileService {
return true;
}
- List<BluetoothDevice> getConnectedDevices() {
+ public List<BluetoothDevice> getConnectedDevices() {
enforceCallingOrSelfPermission(BLUETOOTH_CONNECT, "Need BLUETOOTH_CONNECT permission");
synchronized (mStateMachines) {
List<BluetoothDevice> devices = new ArrayList<>();
diff --git a/src/com/android/bluetooth/le_audio/LeAudioService.java b/src/com/android/bluetooth/le_audio/LeAudioService.java
index 5983c3396..f803b3808 100644
--- a/src/com/android/bluetooth/le_audio/LeAudioService.java
+++ b/src/com/android/bluetooth/le_audio/LeAudioService.java
@@ -507,7 +507,7 @@ public class LeAudioService extends ProfileService {
return true;
}
- List<BluetoothDevice> getConnectedDevices() {
+ public List<BluetoothDevice> getConnectedDevices() {
synchronized (mStateMachines) {
List<BluetoothDevice> devices = new ArrayList<>();
for (LeAudioStateMachine sm : mStateMachines.values()) {
@@ -705,7 +705,7 @@ public class LeAudioService extends ProfileService {
* - If device stops supporting input
*/
boolean inActiveDeviceReplace = (device != mPreviousAudioInDevice);
- if (mPreviousAudioInDevice != null) {
+ if (inActiveDeviceReplace && (mPreviousAudioInDevice != null)) {
mAudioManager.setBluetoothLeAudioInDeviceConnectionState(
mPreviousAudioInDevice, BluetoothProfile.STATE_DISCONNECTED);
}
@@ -763,7 +763,7 @@ public class LeAudioService extends ProfileService {
* - If device stops supporting output
*/
boolean outActiveDeviceReplace = (device != mPreviousAudioOutDevice);
- if (mPreviousAudioOutDevice != null) {
+ if (outActiveDeviceReplace && (mPreviousAudioOutDevice != null)) {
boolean suppressNoisyIntent =
(getConnectionState(mPreviousAudioOutDevice) ==
BluetoothProfile.STATE_CONNECTED);
diff --git a/src/com/android/bluetooth/vc/VolumeControlService.java b/src/com/android/bluetooth/vc/VolumeControlService.java
index cb22e4d9b..b47a0ff73 100644
--- a/src/com/android/bluetooth/vc/VolumeControlService.java
+++ b/src/com/android/bluetooth/vc/VolumeControlService.java
@@ -260,7 +260,7 @@ public class VolumeControlService extends ProfileService {
}
@RequiresPermission(android.Manifest.permission.BLUETOOTH_PRIVILEGED)
- List<BluetoothDevice> getConnectedDevices() {
+ public List<BluetoothDevice> getConnectedDevices() {
enforceCallingOrSelfPermission(BLUETOOTH_PRIVILEGED,
"Need BLUETOOTH_PRIVILEGED permission");
synchronized (mStateMachines) {