Merge "Use getConnectionState to determine which profiles to disconnect in AdapterService#disconnectAllEnabledProfiles()"
diff --git a/src/com/android/bluetooth/a2dpsink/A2dpSinkService.java b/src/com/android/bluetooth/a2dpsink/A2dpSinkService.java
index a6ece1c..efd827c 100644
--- a/src/com/android/bluetooth/a2dpsink/A2dpSinkService.java
+++ b/src/com/android/bluetooth/a2dpsink/A2dpSinkService.java
@@ -317,7 +317,16 @@
return deviceList;
}
- synchronized int getConnectionState(BluetoothDevice device) {
+ /**
+ * Get the current connection state of the profile
+ *
+ * @param device is the remote bluetooth device
+ * @return {@link BluetoothProfile#STATE_DISCONNECTED} if this profile is disconnected,
+ * {@link BluetoothProfile#STATE_CONNECTING} if this profile is being connected,
+ * {@link BluetoothProfile#STATE_CONNECTED} if this profile is connected, or
+ * {@link BluetoothProfile#STATE_DISCONNECTING} if this profile is being disconnected
+ */
+ public synchronized int getConnectionState(BluetoothDevice device) {
A2dpSinkStateMachine stateMachine = mDeviceStateMap.get(device);
return (stateMachine == null) ? BluetoothProfile.STATE_DISCONNECTED
: stateMachine.getState();
diff --git a/src/com/android/bluetooth/btservice/AdapterService.java b/src/com/android/bluetooth/btservice/AdapterService.java
index 09f2166..59d8bf3 100644
--- a/src/com/android/bluetooth/btservice/AdapterService.java
+++ b/src/com/android/bluetooth/btservice/AdapterService.java
@@ -2463,67 +2463,64 @@
return false;
}
- ParcelUuid[] remoteDeviceUuids = getRemoteUuids(device);
- ParcelUuid[] localDeviceUuids = mAdapterProperties.getUuids();
-
- if (mA2dpService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.A2DP, device)) {
+ if (mA2dpService != null && mA2dpService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting A2dp");
mA2dpService.disconnect(device);
}
- if (mA2dpSinkService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.A2DP_SINK, device)) {
+ if (mA2dpSinkService != null && mA2dpSinkService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting A2dp Sink");
mA2dpSinkService.disconnect(device);
}
- if (mHeadsetService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.HEADSET, device)) {
+ if (mHeadsetService != null && mHeadsetService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG,
"disconnectAllEnabledProfiles: Disconnecting Headset Profile");
mHeadsetService.disconnect(device);
}
- if (mHeadsetClientService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.HEADSET_CLIENT, device)) {
+ if (mHeadsetClientService != null && mHeadsetClientService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting HFP");
mHeadsetClientService.disconnect(device);
}
- if (mMapClientService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.MAP_CLIENT, device)) {
+ if (mMapClientService != null && mMapClientService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting MAP Client");
mMapClientService.disconnect(device);
}
- if (mMapService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.MAP, device)) {
+ if (mMapService != null && mMapService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting MAP");
mMapService.disconnect(device);
}
- if (mHidDeviceService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.HID_DEVICE, device)) {
+ if (mHidDeviceService != null && mHidDeviceService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting Hid Device Profile");
mHidDeviceService.disconnect(device);
}
- if (mHidHostService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.HID_HOST, device)) {
+ if (mHidHostService != null && mHidHostService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting Hid Host Profile");
mHidHostService.disconnect(device);
}
- if (mPanService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.PAN, device)) {
+ if (mPanService != null && mPanService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting Pan Profile");
mPanService.disconnect(device);
}
- if (mPbapClientService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.PBAP_CLIENT, device)) {
+ if (mPbapClientService != null && mPbapClientService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting Pbap Client");
mPbapClientService.disconnect(device);
}
- if (mPbapService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.PBAP, device)) {
+ if (mPbapService != null && mPbapService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting Pbap Server");
mPbapService.disconnect(device);
}
- if (mHearingAidService != null && isSupported(localDeviceUuids, remoteDeviceUuids,
- BluetoothProfile.HEARING_AID, device)) {
+ if (mHearingAidService != null && mHearingAidService.getConnectionState(device)
+ == BluetoothProfile.STATE_CONNECTED) {
Log.i(TAG, "disconnectAllEnabledProfiles: Disconnecting Hearing Aid Profile");
mHearingAidService.disconnect(device);
}
diff --git a/src/com/android/bluetooth/hearingaid/HearingAidService.java b/src/com/android/bluetooth/hearingaid/HearingAidService.java
index 5d013dd..c7da32e 100644
--- a/src/com/android/bluetooth/hearingaid/HearingAidService.java
+++ b/src/com/android/bluetooth/hearingaid/HearingAidService.java
@@ -442,7 +442,16 @@
return mDeviceHiSyncIdMap;
}
- int getConnectionState(BluetoothDevice device) {
+ /**
+ * Get the current connection state of the profile
+ *
+ * @param device is the remote bluetooth device
+ * @return {@link BluetoothProfile#STATE_DISCONNECTED} if this profile is disconnected,
+ * {@link BluetoothProfile#STATE_CONNECTING} if this profile is being connected,
+ * {@link BluetoothProfile#STATE_CONNECTED} if this profile is connected, or
+ * {@link BluetoothProfile#STATE_DISCONNECTING} if this profile is being disconnected
+ */
+ public int getConnectionState(BluetoothDevice device) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
synchronized (mStateMachines) {
HearingAidStateMachine sm = mStateMachines.get(device);
diff --git a/src/com/android/bluetooth/hfpclient/HeadsetClientService.java b/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
index 527a29e..23365f4 100644
--- a/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
+++ b/src/com/android/bluetooth/hfpclient/HeadsetClientService.java
@@ -543,7 +543,16 @@
return devices;
}
- private synchronized int getConnectionState(BluetoothDevice device) {
+ /**
+ * Get the current connection state of the profile
+ *
+ * @param device is the remote bluetooth device
+ * @return {@link BluetoothProfile#STATE_DISCONNECTED} if this profile is disconnected,
+ * {@link BluetoothProfile#STATE_CONNECTING} if this profile is being connected,
+ * {@link BluetoothProfile#STATE_CONNECTED} if this profile is connected, or
+ * {@link BluetoothProfile#STATE_DISCONNECTING} if this profile is being disconnected
+ */
+ public synchronized int getConnectionState(BluetoothDevice device) {
enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission");
HeadsetClientStateMachine sm = mStateMachineMap.get(device);
if (sm != null) {
diff --git a/src/com/android/bluetooth/hid/HidDeviceService.java b/src/com/android/bluetooth/hid/HidDeviceService.java
index d0a1970..6086175 100644
--- a/src/com/android/bluetooth/hid/HidDeviceService.java
+++ b/src/com/android/bluetooth/hid/HidDeviceService.java
@@ -36,6 +36,7 @@
import com.android.bluetooth.BluetoothMetricsProto;
import com.android.bluetooth.Utils;
+import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.MetricsLogger;
import com.android.bluetooth.btservice.ProfileService;
import com.android.internal.annotations.VisibleForTesting;
@@ -661,9 +662,10 @@
enforceCallingOrSelfPermission(
BLUETOOTH_PRIVILEGED, "Need BLUETOOTH_PRIVILEGED permission");
if (DBG) {
- Log.d(TAG, "setConnectionPolicy: device " + device
- + " and connectionPolicy " + connectionPolicy);
+ Log.d(TAG, "Saved connectionPolicy " + device + " = " + connectionPolicy);
}
+ AdapterService.getAdapterService().getDatabase()
+ .setProfileConnectionPolicy(device, BluetoothProfile.HID_DEVICE, connectionPolicy);
if (connectionPolicy == BluetoothProfile.CONNECTION_POLICY_FORBIDDEN) {
disconnect(device);
return true;
@@ -671,6 +673,28 @@
return false;
}
+ /**
+ * Get the connection policy of the profile.
+ *
+ * <p> The connection policy can be any of:
+ * {@link BluetoothProfile#CONNECTION_POLICY_ALLOWED},
+ * {@link BluetoothProfile#CONNECTION_POLICY_FORBIDDEN},
+ * {@link BluetoothProfile#CONNECTION_POLICY_UNKNOWN}
+ *
+ * @param device Bluetooth device
+ * @return connection policy of the device
+ * @hide
+ */
+ public int getConnectionPolicy(BluetoothDevice device) {
+ if (device == null) {
+ throw new IllegalArgumentException("Null device");
+ }
+ enforceCallingOrSelfPermission(
+ BLUETOOTH_PRIVILEGED, "Need BLUETOOTH_PRIVILEGED permission");
+ return AdapterService.getAdapterService().getDatabase()
+ .getProfileConnectionPolicy(device, BluetoothProfile.HID_DEVICE);
+ }
+
synchronized boolean reportError(BluetoothDevice device, byte error) {
enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH ADMIN permission");
if (DBG) {
diff --git a/src/com/android/bluetooth/hid/HidHostService.java b/src/com/android/bluetooth/hid/HidHostService.java
index fa1ef59..126752b 100644
--- a/src/com/android/bluetooth/hid/HidHostService.java
+++ b/src/com/android/bluetooth/hid/HidHostService.java
@@ -506,7 +506,16 @@
return true;
}
- int getConnectionState(BluetoothDevice device) {
+ /**
+ * Get the current connection state of the profile
+ *
+ * @param device is the remote bluetooth device
+ * @return {@link BluetoothProfile#STATE_DISCONNECTED} if this profile is disconnected,
+ * {@link BluetoothProfile#STATE_CONNECTING} if this profile is being connected,
+ * {@link BluetoothProfile#STATE_CONNECTED} if this profile is connected, or
+ * {@link BluetoothProfile#STATE_DISCONNECTING} if this profile is being disconnected
+ */
+ public int getConnectionState(BluetoothDevice device) {
if (DBG) Log.d(TAG, "getConnectionState: " + device.getAddress());
if (mInputDevices.get(device) == null) {
return BluetoothHidHost.STATE_DISCONNECTED;
diff --git a/src/com/android/bluetooth/map/BluetoothMapService.java b/src/com/android/bluetooth/map/BluetoothMapService.java
index ee2e3c2..57c30ba 100644
--- a/src/com/android/bluetooth/map/BluetoothMapService.java
+++ b/src/com/android/bluetooth/map/BluetoothMapService.java
@@ -595,6 +595,18 @@
return true;
}
+ /**
+ * Get the connection policy of the profile.
+ *
+ * <p> The connection policy can be any of:
+ * {@link BluetoothProfile#CONNECTION_POLICY_ALLOWED},
+ * {@link BluetoothProfile#CONNECTION_POLICY_FORBIDDEN},
+ * {@link BluetoothProfile#CONNECTION_POLICY_UNKNOWN}
+ *
+ * @param device Bluetooth device
+ * @return connection policy of the device
+ * @hide
+ */
int getConnectionPolicy(BluetoothDevice device) {
return AdapterService.getAdapterService().getDatabase()
.getProfileConnectionPolicy(device, BluetoothProfile.MAP);
diff --git a/src/com/android/bluetooth/pbap/BluetoothPbapService.java b/src/com/android/bluetooth/pbap/BluetoothPbapService.java
index 04680fa..630c4b6 100644
--- a/src/com/android/bluetooth/pbap/BluetoothPbapService.java
+++ b/src/com/android/bluetooth/pbap/BluetoothPbapService.java
@@ -56,6 +56,7 @@
import com.android.bluetooth.ObexServerSockets;
import com.android.bluetooth.R;
import com.android.bluetooth.Utils;
+import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.btservice.ProfileService;
import com.android.bluetooth.sdp.SdpManager;
import com.android.bluetooth.util.DevicePolicyUtils;
@@ -470,7 +471,9 @@
}
/**
- * Disconnects Pbap if connectionPolicy is {@link BluetoothProfile#CONNECTION_POLICY_FORBIDDEN}.
+ * Set connection policy of the profile and connects it if connectionPolicy is
+ * {@link BluetoothProfile#CONNECTION_POLICY_ALLOWED} or disconnects if connectionPolicy is
+ * {@link BluetoothProfile#CONNECTION_POLICY_FORBIDDEN}
*
* <p> The device should already be paired.
* Connection policy can be one of:
@@ -479,21 +482,42 @@
* {@link BluetoothProfile#CONNECTION_POLICY_UNKNOWN}
*
* @param device Paired bluetooth device
- * @param connectionPolicy determines whether pbap should be disconnected
- * @return true if pbap is disconnected, false otherwise
+ * @param connectionPolicy is the connection policy to set to for this profile
+ * @return true if connectionPolicy is set, false on error
*/
public boolean setConnectionPolicy(BluetoothDevice device, int connectionPolicy) {
enforceCallingOrSelfPermission(
BLUETOOTH_PRIVILEGED, "Need BLUETOOTH_PRIVILEGED permission");
if (DEBUG) {
- Log.d(TAG, "setConnectionPolicy: device " + device
- + " and connectionPolicy " + connectionPolicy);
+ Log.d(TAG, "Saved connectionPolicy " + device + " = " + connectionPolicy);
}
+ AdapterService.getAdapterService().getDatabase()
+ .setProfileConnectionPolicy(device, BluetoothProfile.PBAP, connectionPolicy);
if (connectionPolicy == BluetoothProfile.CONNECTION_POLICY_FORBIDDEN) {
disconnect(device);
- return true;
}
- return false;
+ return true;
+ }
+
+ /**
+ * Get the connection policy of the profile.
+ *
+ * <p> The connection policy can be any of:
+ * {@link BluetoothProfile#CONNECTION_POLICY_ALLOWED},
+ * {@link BluetoothProfile#CONNECTION_POLICY_FORBIDDEN},
+ * {@link BluetoothProfile#CONNECTION_POLICY_UNKNOWN}
+ *
+ * @param device Bluetooth device
+ * @return connection policy of the device
+ * @hide
+ */
+ public int getConnectionPolicy(BluetoothDevice device) {
+ if (device == null) {
+ throw new IllegalArgumentException("Null device");
+ }
+ enforceCallingOrSelfPermission(BLUETOOTH_ADMIN_PERM, "Need BLUETOOTH_ADMIN permission");
+ return AdapterService.getAdapterService().getDatabase()
+ .getProfileConnectionPolicy(device, BluetoothProfile.PBAP);
}
/**
@@ -745,7 +769,7 @@
}
if (permission == BluetoothDevice.ACCESS_ALLOWED) {
- stateMachine.sendMessage(PbapStateMachine.AUTHORIZED);
+ setConnectionPolicy(device, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
} else if (permission == BluetoothDevice.ACCESS_REJECTED) {
stateMachine.sendMessage(PbapStateMachine.REJECTED);
} else { // permission == BluetoothDevice.ACCESS_UNKNOWN
diff --git a/src/com/android/bluetooth/pbap/PbapStateMachine.java b/src/com/android/bluetooth/pbap/PbapStateMachine.java
index 0f53be5..254f425 100644
--- a/src/com/android/bluetooth/pbap/PbapStateMachine.java
+++ b/src/com/android/bluetooth/pbap/PbapStateMachine.java
@@ -296,6 +296,8 @@
}
broadcastStateTransitions();
MetricsLogger.logProfileConnectionEvent(BluetoothMetricsProto.ProfileId.PBAP);
+ mService.setConnectionPolicy(
+ mRemoteDevice, BluetoothProfile.CONNECTION_POLICY_ALLOWED);
}
@Override
diff --git a/src/com/android/bluetooth/pbapclient/PbapClientService.java b/src/com/android/bluetooth/pbapclient/PbapClientService.java
index 9446af1..aacd2c2 100644
--- a/src/com/android/bluetooth/pbapclient/PbapClientService.java
+++ b/src/com/android/bluetooth/pbapclient/PbapClientService.java
@@ -398,7 +398,16 @@
return deviceList;
}
- int getConnectionState(BluetoothDevice device) {
+ /**
+ * Get the current connection state of the profile
+ *
+ * @param device is the remote bluetooth device
+ * @return {@link BluetoothProfile#STATE_DISCONNECTED} if this profile is disconnected,
+ * {@link BluetoothProfile#STATE_CONNECTING} if this profile is being connected,
+ * {@link BluetoothProfile#STATE_CONNECTED} if this profile is connected, or
+ * {@link BluetoothProfile#STATE_DISCONNECTING} if this profile is being disconnected
+ */
+ public int getConnectionState(BluetoothDevice device) {
if (device == null) {
throw new IllegalArgumentException("Null device");
}