diff options
| author | Jaikumar Ganesh <jaikumar@google.com> | 2011-09-09 15:19:43 -0700 |
|---|---|---|
| committer | Android (Google) Code Review <android-gerrit@google.com> | 2011-09-09 15:19:43 -0700 |
| commit | 6d172e60bb5c7dcaf1558e875bfbfe8cfe24b073 (patch) | |
| tree | 0789be5b6097295d2bb45b2e2fd65c36f181a52f /core/java/android/server | |
| parent | 4eb37f8a2cd9c2ed96d7f0742e180e5aca619ccb (diff) | |
| parent | b5d2d4526cd2c0117b7a33b1297ac683c37ac5c7 (diff) | |
Merge "Add error codes for channel disconnection / connection."
Diffstat (limited to 'core/java/android/server')
| -rw-r--r-- | core/java/android/server/BluetoothEventLoop.java | 17 | ||||
| -rw-r--r-- | core/java/android/server/BluetoothHealthProfileHandler.java | 46 | ||||
| -rwxr-xr-x | core/java/android/server/BluetoothService.java | 13 |
3 files changed, 56 insertions, 20 deletions
diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java index e4f2d3229c8e..56da69d4bae7 100644 --- a/core/java/android/server/BluetoothEventLoop.java +++ b/core/java/android/server/BluetoothEventLoop.java @@ -20,6 +20,7 @@ import android.bluetooth.BluetoothA2dp; import android.bluetooth.BluetoothAdapter; import android.bluetooth.BluetoothClass; import android.bluetooth.BluetoothDevice; +import android.bluetooth.BluetoothHealth; import android.bluetooth.BluetoothInputDevice; import android.bluetooth.BluetoothPan; import android.bluetooth.BluetoothProfile; @@ -974,6 +975,22 @@ class BluetoothEventLoop { } /** + * Called by native code for the async response to a Connect + * method call to org.bluez.Health + * + * @param chanCode The internal id of the channel + * @param result Result code of the operation. + */ + private void onHealthDeviceConnectionResult(int chanCode, int result) { + log ("onHealthDeviceConnectionResult " + chanCode + " " + result); + // Success case gets handled by Property Change signal + if (result != BluetoothHealth.HEALTH_OPERATION_SUCCESS) { + mBluetoothService.onHealthDeviceChannelConnectionError(chanCode, + BluetoothHealth.STATE_CHANNEL_DISCONNECTED); + } + } + + /** * Called by native code on a DeviceDisconnected signal from * org.bluez.NetworkServer. * diff --git a/core/java/android/server/BluetoothHealthProfileHandler.java b/core/java/android/server/BluetoothHealthProfileHandler.java index a6ada2bf3548..2d80de4528bf 100644 --- a/core/java/android/server/BluetoothHealthProfileHandler.java +++ b/core/java/android/server/BluetoothHealthProfileHandler.java @@ -84,7 +84,6 @@ final class BluetoothHealthProfileHandler { result = 31 * result + (mChannelPath == null ? 0 : mChannelPath.hashCode()); result = 31 * result + mDevice.hashCode(); result = 31 * result + mConfig.hashCode(); - result = 31 * result + mState; result = 31 * result + mChannelType; return result; } @@ -152,7 +151,7 @@ final class BluetoothHealthProfileHandler { String channelType = getStringChannelType(chan.mChannelType); if (!mBluetoothService.createChannelNative(deviceObjectPath, configPath, - channelType)) { + channelType, chan.hashCode())) { int prevState = chan.mState; int state = BluetoothHealth.STATE_CHANNEL_DISCONNECTED; callHealthChannelCallback(chan.mConfig, chan.mDevice, prevState, state, null, @@ -258,7 +257,7 @@ final class BluetoothHealthProfileHandler { boolean disconnectChannel(BluetoothDevice device, BluetoothHealthAppConfiguration config, int id) { - HealthChannel chan = findChannelById(device, config, id); + HealthChannel chan = findChannelById(id); if (chan == null) { return false; } @@ -273,7 +272,8 @@ final class BluetoothHealthProfileHandler { callHealthChannelCallback(config, device, prevState, chan.mState, null, chan.hashCode()); - if (!mBluetoothService.destroyChannelNative(deviceObjectPath, chan.mChannelPath)) { + if (!mBluetoothService.destroyChannelNative(deviceObjectPath, chan.mChannelPath, + chan.hashCode())) { prevState = chan.mState; chan.mState = BluetoothHealth.STATE_CHANNEL_CONNECTED; callHealthChannelCallback(config, device, prevState, chan.mState, @@ -284,8 +284,7 @@ final class BluetoothHealthProfileHandler { } } - private HealthChannel findChannelById(BluetoothDevice device, - BluetoothHealthAppConfiguration config, int id) { + private HealthChannel findChannelById(int id) { for (HealthChannel chan : mHealthChannels) { if (chan.hashCode() == id) return chan; } @@ -384,6 +383,15 @@ final class BluetoothHealthProfileHandler { } } + /*package*/ void onHealthDeviceChannelConnectionError(int chanCode, + int state) { + HealthChannel channel = findChannelById(chanCode); + if (channel == null) errorLog("No record of this channel:" + chanCode); + + callHealthChannelCallback(channel.mConfig, channel.mDevice, channel.mState, state, null, + chanCode); + } + private BluetoothHealthAppConfiguration findHealthApplication( BluetoothDevice device, String channelPath) { BluetoothHealthAppConfiguration config = null; @@ -424,9 +432,19 @@ final class BluetoothHealthProfileHandler { config = findHealthApplication(device, channelPath); if (exists) { + channel = findConnectingChannel(device, config); + if (channel == null) { + channel = new HealthChannel(device, config, null, false, + channelPath); + channel.mState = BluetoothHealth.STATE_CHANNEL_DISCONNECTED; + mHealthChannels.add(channel); + } + channel.mChannelPath = channelPath; + fd = mBluetoothService.getChannelFdNative(channelPath); if (fd == null) { errorLog("Error obtaining fd for channel:" + channelPath); + disconnectChannel(device, config, channel.hashCode()); return; } boolean mainChannel = @@ -440,18 +458,10 @@ final class BluetoothHealthProfileHandler { } if (mainChannelPath.equals(channelPath)) mainChannel = true; } - channel = findConnectingChannel(device, config); - if (channel != null) { - channel.mChannelFd = fd; - channel.mMainChannel = mainChannel; - channel.mChannelPath = channelPath; - prevState = channel.mState; - } else { - channel = new HealthChannel(device, config, fd, mainChannel, - channelPath); - mHealthChannels.add(channel); - prevState = BluetoothHealth.STATE_CHANNEL_DISCONNECTED; - } + + channel.mChannelFd = fd; + channel.mMainChannel = mainChannel; + prevState = channel.mState; state = BluetoothHealth.STATE_CHANNEL_CONNECTED; } else { channel = findChannelByPath(device, channelPath); diff --git a/core/java/android/server/BluetoothService.java b/core/java/android/server/BluetoothService.java index 03180ca59c77..00d33316e2cb 100755 --- a/core/java/android/server/BluetoothService.java +++ b/core/java/android/server/BluetoothService.java @@ -2255,6 +2255,14 @@ public class BluetoothService extends IBluetooth.Stub { } } + /*package*/ void onHealthDeviceChannelConnectionError(int channelCode, + int newState) { + synchronized(mBluetoothHealthProfileHandler) { + mBluetoothHealthProfileHandler.onHealthDeviceChannelConnectionError(channelCode, + newState); + } + } + public int getHealthDeviceConnectionState(BluetoothDevice device) { mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM, "Need BLUETOOTH permission"); @@ -2785,8 +2793,9 @@ public class BluetoothService extends IBluetooth.Stub { String channelType); native String registerHealthApplicationNative(int dataType, String role, String name); native boolean unregisterHealthApplicationNative(String path); - native boolean createChannelNative(String devicePath, String appPath, String channelType); - native boolean destroyChannelNative(String devicePath, String channelpath); + native boolean createChannelNative(String devicePath, String appPath, String channelType, + int code); + native boolean destroyChannelNative(String devicePath, String channelpath, int code); native String getMainChannelNative(String path); native String getChannelApplicationNative(String channelPath); native ParcelFileDescriptor getChannelFdNative(String channelPath); |
