diff options
| -rw-r--r-- | core/java/android/bluetooth/BluetoothInputDevice.java | 13 | ||||
| -rw-r--r-- | core/java/android/bluetooth/BluetoothPan.java | 13 | ||||
| -rw-r--r-- | core/java/android/server/BluetoothEventLoop.java | 34 | ||||
| -rw-r--r-- | core/jni/android_bluetooth_common.h | 25 | ||||
| -rw-r--r-- | core/jni/android_server_BluetoothEventLoop.cpp | 50 |
5 files changed, 111 insertions, 24 deletions
diff --git a/core/java/android/bluetooth/BluetoothInputDevice.java b/core/java/android/bluetooth/BluetoothInputDevice.java index bc8a836183bc..a70de59a48f6 100644 --- a/core/java/android/bluetooth/BluetoothInputDevice.java +++ b/core/java/android/bluetooth/BluetoothInputDevice.java @@ -85,6 +85,19 @@ public final class BluetoothInputDevice { */ public static final int PRIORITY_UNDEFINED = -1; + /** + * Return codes for the connect and disconnect Bluez / Dbus calls. + */ + public static final int INPUT_DISCONNECT_FAILED_NOT_CONNECTED = 5000; + + public static final int INPUT_CONNECT_FAILED_ALREADY_CONNECTED = 5001; + + public static final int INPUT_CONNECT_FAILED_ATTEMPT_FAILED = 5002; + + public static final int INPUT_OPERATION_GENERIC_FAILURE = 5003; + + public static final int INPUT_OPERATION_SUCCESS = 5004; + private final IBluetooth mService; private final Context mContext; diff --git a/core/java/android/bluetooth/BluetoothPan.java b/core/java/android/bluetooth/BluetoothPan.java index 7dee25e4afa8..1f07349b4c13 100644 --- a/core/java/android/bluetooth/BluetoothPan.java +++ b/core/java/android/bluetooth/BluetoothPan.java @@ -70,6 +70,19 @@ public final class BluetoothPan { public static final int STATE_CONNECTED = 2; public static final int STATE_DISCONNECTING = 3; + /** + * Return codes for the connect and disconnect Bluez / Dbus calls. + */ + public static final int PAN_DISCONNECT_FAILED_NOT_CONNECTED = 1000; + + public static final int PAN_CONNECT_FAILED_ALREADY_CONNECTED = 1001; + + public static final int PAN_CONNECT_FAILED_ATTEMPT_FAILED = 1002; + + public static final int PAN_OPERATION_GENERIC_FAILURE = 1003; + + public static final int PAN_OPERATION_SUCCESS = 1004; + private final IBluetooth mService; private final Context mContext; diff --git a/core/java/android/server/BluetoothEventLoop.java b/core/java/android/server/BluetoothEventLoop.java index 539a696bdb8e..cd3bc3e7c32a 100644 --- a/core/java/android/server/BluetoothEventLoop.java +++ b/core/java/android/server/BluetoothEventLoop.java @@ -748,9 +748,9 @@ class BluetoothEventLoop { } } - private void onInputDeviceConnectionResult(String path, boolean result) { + private void onInputDeviceConnectionResult(String path, int result) { // Success case gets handled by Property Change signal - if (!result) { + if (result != BluetoothInputDevice.INPUT_OPERATION_SUCCESS) { String address = mBluetoothService.getAddressFromObjectPath(path); if (address == null) return; @@ -758,9 +758,18 @@ class BluetoothEventLoop { BluetoothDevice device = mAdapter.getRemoteDevice(address); int state = mBluetoothService.getInputDeviceState(device); if (state == BluetoothInputDevice.STATE_CONNECTING) { - connected = false; + if (result == BluetoothInputDevice.INPUT_CONNECT_FAILED_ALREADY_CONNECTED) { + connected = true; + } else { + connected = false; + } } else if (state == BluetoothInputDevice.STATE_DISCONNECTING) { - connected = true; + if (result == BluetoothInputDevice.INPUT_DISCONNECT_FAILED_NOT_CONNECTED) { + connected = false; + } else { + // There is no better way to handle this, this shouldn't happen + connected = true; + } } else { Log.e(TAG, "Error onInputDeviceConnectionResult. State is:" + state); } @@ -768,10 +777,10 @@ class BluetoothEventLoop { } } - private void onPanDeviceConnectionResult(String path, boolean result) { + private void onPanDeviceConnectionResult(String path, int result) { log ("onPanDeviceConnectionResult " + path + " " + result); // Success case gets handled by Property Change signal - if (!result) { + if (result != BluetoothPan.PAN_OPERATION_SUCCESS) { String address = mBluetoothService.getAddressFromObjectPath(path); if (address == null) return; @@ -779,9 +788,18 @@ class BluetoothEventLoop { BluetoothDevice device = mAdapter.getRemoteDevice(address); int state = mBluetoothService.getPanDeviceState(device); if (state == BluetoothPan.STATE_CONNECTING) { - connected = false; + if (result == BluetoothPan.PAN_CONNECT_FAILED_ALREADY_CONNECTED) { + connected = true; + } else { + connected = false; + } } else if (state == BluetoothPan.STATE_DISCONNECTING) { - connected = true; + if (result == BluetoothPan.PAN_DISCONNECT_FAILED_NOT_CONNECTED) { + connected = false; + } else { + // There is no better way to handle this, this shouldn't happen + connected = true; + } } else { Log.e(TAG, "Error onPanDeviceConnectionResult. State is: " + state + " result: "+ result); diff --git a/core/jni/android_bluetooth_common.h b/core/jni/android_bluetooth_common.h index 9222e1a7b61c..3364703d49e9 100644 --- a/core/jni/android_bluetooth_common.h +++ b/core/jni/android_bluetooth_common.h @@ -38,6 +38,7 @@ namespace android { #ifdef HAVE_BLUETOOTH #define BLUEZ_DBUS_BASE_PATH "/org/bluez" #define BLUEZ_DBUS_BASE_IFC "org.bluez" +#define BLUEZ_ERROR_IFC "org.bluez.Error" // It would be nicer to retrieve this from bluez using GetDefaultAdapter, // but this is only possible when the adapter is up (and hcid is running). @@ -171,6 +172,30 @@ void get_bdaddr_as_string(const bdaddr_t *ba, char *str); bool debug_no_encrypt(); + +// Result codes from Bluez DBus calls +#define BOND_RESULT_ERROR -1 +#define BOND_RESULT_SUCCESS 0 +#define BOND_RESULT_AUTH_FAILED 1 +#define BOND_RESULT_AUTH_REJECTED 2 +#define BOND_RESULT_AUTH_CANCELED 3 +#define BOND_RESULT_REMOTE_DEVICE_DOWN 4 +#define BOND_RESULT_DISCOVERY_IN_PROGRESS 5 +#define BOND_RESULT_AUTH_TIMEOUT 6 +#define BOND_RESULT_REPEATED_ATTEMPTS 7 + +#define PAN_DISCONNECT_FAILED_NOT_CONNECTED 1000 +#define PAN_CONNECT_FAILED_ALREADY_CONNECTED 1001 +#define PAN_CONNECT_FAILED_ATTEMPT_FAILED 1002 +#define PAN_OPERATION_GENERIC_FAILURE 1003 +#define PAN_OPERATION_SUCCESS 1004 + +#define INPUT_DISCONNECT_FAILED_NOT_CONNECTED 5000 +#define INPUT_CONNECT_FAILED_ALREADY_CONNECTED 5001 +#define INPUT_CONNECT_FAILED_ATTEMPT_FAILED 5002 +#define INPUT_OPERATION_GENERIC_FAILURE 5003 +#define INPUT_OPERATION_SUCCESS 5004 + #endif } /* namespace android */ diff --git a/core/jni/android_server_BluetoothEventLoop.cpp b/core/jni/android_server_BluetoothEventLoop.cpp index b0ba6955c3b6..fd12c2d736f8 100644 --- a/core/jni/android_server_BluetoothEventLoop.cpp +++ b/core/jni/android_server_BluetoothEventLoop.cpp @@ -134,11 +134,11 @@ static void classInitNative(JNIEnv* env, jclass clazz) { method_onInputDevicePropertyChanged = env->GetMethodID(clazz, "onInputDevicePropertyChanged", "(Ljava/lang/String;[Ljava/lang/String;)V"); method_onInputDeviceConnectionResult = env->GetMethodID(clazz, "onInputDeviceConnectionResult", - "(Ljava/lang/String;Z)V"); + "(Ljava/lang/String;I)V"); method_onPanDevicePropertyChanged = env->GetMethodID(clazz, "onPanDevicePropertyChanged", "(Ljava/lang/String;[Ljava/lang/String;)V"); method_onPanDeviceConnectionResult = env->GetMethodID(clazz, "onPanDeviceConnectionResult", - "(Ljava/lang/String;Z)V"); + "(Ljava/lang/String;I)V"); method_onRequestOobData = env->GetMethodID(clazz, "onRequestOobData", "(Ljava/lang/String;I)V"); @@ -1227,16 +1227,6 @@ success: #ifdef HAVE_BLUETOOTH -//TODO: Unify result codes in a header -#define BOND_RESULT_ERROR -1000 -#define BOND_RESULT_SUCCESS 0 -#define BOND_RESULT_AUTH_FAILED 1 -#define BOND_RESULT_AUTH_REJECTED 2 -#define BOND_RESULT_AUTH_CANCELED 3 -#define BOND_RESULT_REMOTE_DEVICE_DOWN 4 -#define BOND_RESULT_DISCOVERY_IN_PROGRESS 5 -#define BOND_RESULT_AUTH_TIMEOUT 6 -#define BOND_RESULT_REPEATED_ATTEMPTS 7 void onCreatePairedDeviceResult(DBusMessage *msg, void *user, void *n) { LOGV(__FUNCTION__); @@ -1406,11 +1396,25 @@ void onInputDeviceConnectionResult(DBusMessage *msg, void *user, void *n) { JNIEnv *env; nat->vm->GetEnv((void**)&env, nat->envVer); - bool result = JNI_TRUE; + jint result = INPUT_OPERATION_SUCCESS; if (dbus_set_error_from_message(&err, msg)) { + if (!strcmp(err.name, BLUEZ_ERROR_IFC ".ConnectionAttemptFailed")) { + result = INPUT_CONNECT_FAILED_ATTEMPT_FAILED; + } else if (!strcmp(err.name, BLUEZ_ERROR_IFC ".AlreadyConnected")) { + result = INPUT_CONNECT_FAILED_ALREADY_CONNECTED; + } else if (!strcmp(err.name, BLUEZ_ERROR_IFC ".Failed")) { + // TODO():This is flaky, need to change Bluez to add new error codes + if (!strcmp(err.message, "Transport endpoint is not connected")) { + result = INPUT_DISCONNECT_FAILED_NOT_CONNECTED; + } else { + result = INPUT_OPERATION_GENERIC_FAILURE; + } + } else { + result = INPUT_OPERATION_GENERIC_FAILURE; + } LOG_AND_FREE_DBUS_ERROR(&err); - result = JNI_FALSE; } + LOGV("... Device Path = %s, result = %d", path, result); jstring jPath = env->NewStringUTF(path); env->CallVoidMethod(nat->me, @@ -1431,11 +1435,25 @@ void onPanDeviceConnectionResult(DBusMessage *msg, void *user, void *n) { JNIEnv *env; nat->vm->GetEnv((void**)&env, nat->envVer); - bool result = JNI_TRUE; + jint result = PAN_OPERATION_SUCCESS; if (dbus_set_error_from_message(&err, msg)) { + if (!strcmp(err.name, BLUEZ_ERROR_IFC ".ConnectionAttemptFailed")) { + result = PAN_CONNECT_FAILED_ATTEMPT_FAILED; + } else if (!strcmp(err.name, BLUEZ_ERROR_IFC ".Failed")) { + // TODO():This is flaky, need to change Bluez to add new error codes + if (!strcmp(err.message, "Device already connected")) { + result = PAN_CONNECT_FAILED_ALREADY_CONNECTED; + } else if (!strcmp(err.message, "Device not connected")) { + result = PAN_DISCONNECT_FAILED_NOT_CONNECTED; + } else { + result = PAN_OPERATION_GENERIC_FAILURE; + } + } else { + result = PAN_OPERATION_GENERIC_FAILURE; + } LOG_AND_FREE_DBUS_ERROR(&err); - result = JNI_FALSE; } + LOGV("... Pan Device Path = %s, result = %d", path, result); jstring jPath = env->NewStringUTF(path); env->CallVoidMethod(nat->me, |