summaryrefslogtreecommitdiffstats
path: root/jni
diff options
context:
space:
mode:
authorNitin Arora <niarora@codeaurora.org>2015-03-11 15:45:26 -0700
committerAndre Eisenbach <eisenbach@google.com>2015-04-15 23:30:10 -0700
commitf19f1ac64a5fefb248ab15b918d009b926c99dde (patch)
tree8b5e76134add97468a8d4801fb51d12dd5573003 /jni
parentdbe4c2517804b3e32587310b76f1c977b8749d8b (diff)
downloadandroid_packages_apps_Bluetooth-f19f1ac64a5fefb248ab15b918d009b926c99dde.tar.gz
android_packages_apps_Bluetooth-f19f1ac64a5fefb248ab15b918d009b926c99dde.tar.bz2
android_packages_apps_Bluetooth-f19f1ac64a5fefb248ab15b918d009b926c99dde.zip
Bluetooth LE background operation mode (1/2)
Changes to BluetoothAdapter state machine for handling new states BLE_STATE_ON and intermediate states BLE_TURNING_ON and BLE_TURNING_OFF. Also includes the actions required while migrating in and out of these states including start and stop of GATT services and other profiles. Change-Id: I08d6ff05c2cefe559d5bb5789a1a488afefbe544
Diffstat (limited to 'jni')
-rw-r--r--jni/com_android_bluetooth_avrcp.cpp47
-rw-r--r--[-rwxr-xr-x]jni/com_android_bluetooth_hid.cpp0
-rw-r--r--jni/com_android_bluetooth_pan.cpp9
3 files changed, 42 insertions, 14 deletions
diff --git a/jni/com_android_bluetooth_avrcp.cpp b/jni/com_android_bluetooth_avrcp.cpp
index e9a7bc90d..b28a43e30 100644
--- a/jni/com_android_bluetooth_avrcp.cpp
+++ b/jni/com_android_bluetooth_avrcp.cpp
@@ -59,13 +59,18 @@ static void btavrcp_remote_features_callback(bt_bdaddr_t* bd_addr, btrc_remote_f
}
addr = sCallbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
if (!addr) {
- ALOGE("Fail to new jbyteArray bd addr for connection state");
+ ALOGE("Unable to allocate byte array for bd_addr");
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
return;
}
- sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getRcFeatures, addr, (jint)features);
+ if (mCallbacksObj) {
+ sCallbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*) bd_addr);
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getRcFeatures, addr, (jint)features);
+ } else {
+ ALOGE("%s: mCallbacksObj is null", __FUNCTION__);
+ }
+
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
/* TODO: I think we leak the addr object, we should add a
* sCallbackEnv->DeleteLocalRef(addr) */
@@ -79,7 +84,11 @@ static void btavrcp_get_play_status_callback() {
return;
}
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getPlayStatus);
+ if (mCallbacksObj) {
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getPlayStatus);
+ } else {
+ ALOGE("%s: mCallbacksObj is null", __FUNCTION__);
+ }
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
@@ -99,7 +108,11 @@ static void btavrcp_get_element_attr_callback(uint8_t num_attr, btrc_media_attr_
return;
}
sCallbackEnv->SetIntArrayRegion(attrs, 0, num_attr, (jint *)p_attrs);
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getElementAttr, (jbyte)num_attr, attrs);
+ if (mCallbacksObj) {
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_getElementAttr, (jbyte)num_attr, attrs);
+ } else {
+ ALOGE("%s: mCallbacksObj is null", __FUNCTION__);
+ }
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
sCallbackEnv->DeleteLocalRef(attrs);
}
@@ -111,9 +124,12 @@ static void btavrcp_register_notification_callback(btrc_event_id_t event_id, uin
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
return;
}
-
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_registerNotification,
+ if (mCallbacksObj) {
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_registerNotification,
(jint)event_id, (jint)param);
+ } else {
+ ALOGE("%s: mCallbacksObj is null", __FUNCTION__);
+ }
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
@@ -124,9 +140,13 @@ static void btavrcp_volume_change_callback(uint8_t volume, uint8_t ctype) {
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
return;
}
+ if (mCallbacksObj) {
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_volumeChangeCallback, (jint)volume,
+ (jint)ctype);
+ } else {
+ ALOGE("%s: mCallbacksObj is null", __FUNCTION__);
+ }
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_volumeChangeCallback, (jint)volume,
- (jint)ctype);
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
@@ -137,9 +157,12 @@ static void btavrcp_passthrough_command_callback(int id, int pressed) {
ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
return;
}
-
- sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handlePassthroughCmd, (jint)id,
- (jint)pressed);
+ if (mCallbacksObj) {
+ sCallbackEnv->CallVoidMethod(mCallbacksObj, method_handlePassthroughCmd,
+ (jint)id, (jint)pressed);
+ } else {
+ ALOGE("%s: mCallbacksObj is null", __FUNCTION__);
+ }
checkAndClearExceptionFromCallback(sCallbackEnv, __FUNCTION__);
}
diff --git a/jni/com_android_bluetooth_hid.cpp b/jni/com_android_bluetooth_hid.cpp
index adff0f58a..adff0f58a 100755..100644
--- a/jni/com_android_bluetooth_hid.cpp
+++ b/jni/com_android_bluetooth_hid.cpp
diff --git a/jni/com_android_bluetooth_pan.cpp b/jni/com_android_bluetooth_pan.cpp
index 500fd91e6..d2b2f6e05 100644
--- a/jni/com_android_bluetooth_pan.cpp
+++ b/jni/com_android_bluetooth_pan.cpp
@@ -134,14 +134,19 @@ static void initializeNative(JNIEnv *env, jobject object) {
return;
}
+ mCallbacksObj = env->NewGlobalRef(object);
+
bt_status_t status;
if ( (status = sPanIf->init(&sBluetoothPanCallbacks)) != BT_STATUS_SUCCESS) {
error("Failed to initialize Bluetooth PAN, status: %d", status);
sPanIf = NULL;
+ if (mCallbacksObj != NULL) {
+ ALOGW("initialization failed: Cleaning up Bluetooth PAN callback object");
+ env->DeleteGlobalRef(mCallbacksObj);
+ mCallbacksObj = NULL;
+ }
return;
}
-
- mCallbacksObj = env->NewGlobalRef(object);
}
static void cleanupNative(JNIEnv *env, jobject object) {