summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/bluetooth/BluetoothDeviceProfileState.java51
1 files changed, 46 insertions, 5 deletions
diff --git a/core/java/android/bluetooth/BluetoothDeviceProfileState.java b/core/java/android/bluetooth/BluetoothDeviceProfileState.java
index e460839deff0..1c53c45aa3b5 100644
--- a/core/java/android/bluetooth/BluetoothDeviceProfileState.java
+++ b/core/java/android/bluetooth/BluetoothDeviceProfileState.java
@@ -75,6 +75,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
public static final int DISCONNECT_A2DP_INCOMING = 53;
public static final int DISCONNECT_HID_OUTGOING = 54;
public static final int DISCONNECT_HID_INCOMING = 55;
+ public static final int DISCONNECT_PBAP_OUTGOING = 56;
public static final int UNPAIR = 100;
public static final int AUTO_CONNECT_PROFILES = 101;
@@ -94,6 +95,8 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
private BluetoothService mService;
private BluetoothA2dpService mA2dpService;
private BluetoothHeadset mHeadsetService;
+ private BluetoothPbap mPbapService;
+ private boolean mPbapServiceConnected;
private BluetoothDevice mDevice;
private int mHeadsetState = BluetoothProfile.STATE_DISCONNECTED;
@@ -201,6 +204,8 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
adapter.getProfileProxy(mContext, mBluetoothProfileServiceListener,
BluetoothProfile.HEADSET);
+ // TODO(): Convert PBAP to the new Profile APIs.
+ PbapServiceListener p = new PbapServiceListener();
}
private BluetoothProfile.ServiceListener mBluetoothProfileServiceListener =
@@ -217,6 +222,22 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
}
};
+ private class PbapServiceListener implements BluetoothPbap.ServiceListener {
+ public PbapServiceListener() {
+ mPbapService = new BluetoothPbap(mContext, this);
+ }
+ public void onServiceConnected() {
+ synchronized(BluetoothDeviceProfileState.this) {
+ mPbapServiceConnected = true;
+ }
+ }
+ public void onServiceDisconnected() {
+ synchronized(BluetoothDeviceProfileState.this) {
+ mPbapServiceConnected = false;
+ }
+ }
+ }
+
private class BondedDevice extends HierarchicalState {
@Override
protected void enter() {
@@ -255,6 +276,9 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
case DISCONNECT_HID_INCOMING:
transitionTo(mIncomingHid);
break;
+ case DISCONNECT_PBAP_OUTGOING:
+ processCommand(DISCONNECT_PBAP_OUTGOING);
+ break;
case UNPAIR:
if (mHeadsetState != BluetoothHeadset.STATE_DISCONNECTED) {
sendMessage(DISCONNECT_HFP_OUTGOING);
@@ -404,6 +428,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
deferMessage(deferMsg);
}
break; // ignore
+ case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
deferMessage(message);
@@ -478,6 +503,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
case CONNECT_HID_INCOMING:
case DISCONNECT_HID_INCOMING:
break; // ignore
+ case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
deferMessage(message);
@@ -582,6 +608,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
deferMessage(deferMsg);
}
break; // ignore
+ case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
deferMessage(message);
@@ -654,6 +681,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
case CONNECT_HID_INCOMING:
case DISCONNECT_HID_INCOMING:
break; // ignore
+ case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
deferMessage(message);
@@ -734,7 +762,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
case DISCONNECT_HID_INCOMING:
// Ignore, will be handled by Bluez
break;
-
+ case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
deferMessage(message);
@@ -792,6 +820,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
case DISCONNECT_A2DP_INCOMING:
// Ignore, will be handled by Bluez
break;
+ case DISCONNECT_PBAP_OUTGOING:
case UNPAIR:
case AUTO_CONNECT_PROFILES:
deferMessage(message);
@@ -818,7 +847,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
}
}
- synchronized void deferHeadsetMessage(int command) {
+ synchronized void deferProfileServiceMessage(int command) {
Message msg = new Message();
msg.what = command;
deferMessage(msg);
@@ -829,14 +858,14 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
switch(command) {
case CONNECT_HFP_OUTGOING:
if (mHeadsetService == null) {
- deferHeadsetMessage(command);
+ deferProfileServiceMessage(command);
} else {
return mHeadsetService.connectHeadsetInternal(mDevice);
}
break;
case CONNECT_HFP_INCOMING:
if (mHeadsetService == null) {
- deferHeadsetMessage(command);
+ deferProfileServiceMessage(command);
} else if (mHeadsetState == BluetoothHeadset.STATE_CONNECTING) {
return mHeadsetService.acceptIncomingConnect(mDevice);
} else if (mHeadsetState == BluetoothHeadset.STATE_DISCONNECTED) {
@@ -857,8 +886,13 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
return true;
case DISCONNECT_HFP_OUTGOING:
if (mHeadsetService == null) {
- deferHeadsetMessage(command);
+ deferProfileServiceMessage(command);
} else {
+ // Disconnect PBAP
+ // TODO(): Add PBAP to the state machine.
+ Message m = new Message();
+ m.what = DISCONNECT_PBAP_OUTGOING;
+ deferMessage(m);
if (mHeadsetService.getPriority(mDevice) ==
BluetoothHeadset.PRIORITY_AUTO_CONNECT) {
mHeadsetService.setPriority(mDevice, BluetoothHeadset.PRIORITY_ON);
@@ -890,6 +924,13 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine
mService.setInputDevicePriority(mDevice, BluetoothInputDevice.PRIORITY_ON);
}
return mService.disconnectInputDeviceInternal(mDevice);
+ case DISCONNECT_PBAP_OUTGOING:
+ if (!mPbapServiceConnected) {
+ deferProfileServiceMessage(command);
+ } else {
+ return mPbapService.disconnect();
+ }
+ break;
case UNPAIR:
return mService.removeBondInternal(mDevice.getAddress());
default: