diff --git a/core/java/android/bluetooth/BluetoothDeviceProfileState.java b/core/java/android/bluetooth/BluetoothDeviceProfileState.java index 8e655e213d624..df1d960126626 100644 --- a/core/java/android/bluetooth/BluetoothDeviceProfileState.java +++ b/core/java/android/bluetooth/BluetoothDeviceProfileState.java @@ -67,10 +67,11 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine private static final int DISCONNECT_HFP_INCOMING = 6; public static final int DISCONNECT_A2DP_OUTGOING = 7; public static final int DISCONNECT_A2DP_INCOMING = 8; + public static final int DISCONNECT_PBAP_OUTGOING = 9; - public static final int UNPAIR = 9; - public static final int AUTO_CONNECT_PROFILES = 10; - public static final int TRANSITION_TO_STABLE = 11; + public static final int UNPAIR = 100; + public static final int AUTO_CONNECT_PROFILES = 101; + public static final int TRANSITION_TO_STABLE = 102; private static final int AUTO_CONNECT_DELAY = 6000; // 6 secs @@ -84,7 +85,9 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine private BluetoothService mService; private BluetoothA2dpService mA2dpService; private BluetoothHeadset mHeadsetService; + private BluetoothPbap mPbapService; private boolean mHeadsetServiceConnected; + private boolean mPbapServiceConnected; private BluetoothDevice mDevice; private int mHeadsetState; @@ -176,6 +179,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine mContext.registerReceiver(mBroadcastReceiver, filter); HeadsetServiceListener l = new HeadsetServiceListener(); + PbapServiceListener p = new PbapServiceListener(); } private class HeadsetServiceListener implements BluetoothHeadset.ServiceListener { @@ -194,6 +198,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() { @@ -224,6 +244,9 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine case DISCONNECT_A2DP_INCOMING: transitionTo(mIncomingA2dp); break; + case DISCONNECT_PBAP_OUTGOING: + processCommand(DISCONNECT_PBAP_OUTGOING); + break; case UNPAIR: if (mHeadsetState != BluetoothHeadset.STATE_DISCONNECTED) { sendMessage(DISCONNECT_HFP_OUTGOING); @@ -342,6 +365,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine deferMessage(deferMsg); } break; + case DISCONNECT_PBAP_OUTGOING: case UNPAIR: case AUTO_CONNECT_PROFILES: deferMessage(message); @@ -409,6 +433,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine // If this causes incoming HFP to fail, it is more of a headset problem // since both connections are incoming ones. break; + case DISCONNECT_PBAP_OUTGOING: case UNPAIR: case AUTO_CONNECT_PROFILES: deferMessage(message); @@ -496,6 +521,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); @@ -561,6 +587,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); @@ -588,7 +615,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); @@ -604,7 +631,7 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine break; case CONNECT_HFP_INCOMING: if (!mHeadsetServiceConnected) { - deferHeadsetMessage(command); + deferProfileServiceMessage(command); } else if (mHeadsetState == BluetoothHeadset.STATE_CONNECTING) { return mHeadsetService.acceptIncomingConnect(mDevice); } else if (mHeadsetState == BluetoothHeadset.STATE_DISCONNECTED) { @@ -621,8 +648,13 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine return true; case DISCONNECT_HFP_OUTGOING: if (!mHeadsetServiceConnected) { - 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); @@ -645,6 +677,13 @@ public final class BluetoothDeviceProfileState extends HierarchicalStateMachine return mA2dpService.disconnectSinkInternal(mDevice); } break; + case DISCONNECT_PBAP_OUTGOING: + if (!mPbapServiceConnected) { + deferProfileServiceMessage(command); + } else { + return mPbapService.disconnect(); + } + break; case UNPAIR: return mService.removeBondInternal(mDevice.getAddress()); default: