1 /******************************************************************
3 * Copyright 2014 Samsung Electronics All Rights Reserved.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
19 ******************************************************************/
23 #include <android/log.h>
25 #include "caleutils.h"
27 #include "cathreadpool.h"
28 #include "uarraylist.h"
29 #include "caadapterutils.h"
31 #define TAG PCF("OIC_CA_LE_UTILS")
33 jobject CALEGetUuidFromString(JNIEnv *env, const char* uuid)
35 VERIFY_NON_NULL_RET(uuid, TAG, "uuid is null", NULL);
36 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
38 jclass jni_cid_UUID = (*env)->FindClass(env, "java/util/UUID");
41 OIC_LOG(ERROR, TAG, "jni_cid_UUID is not available");
45 jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_UUID, "fromString",
46 "(Ljava/lang/String;)"
48 if (!jni_mid_fromString)
50 OIC_LOG(ERROR, TAG, "jni_mid_fromString is not available");
54 jstring str_uuid = (*env)->NewStringUTF(env, uuid);
57 OIC_LOG(ERROR, TAG, "str_uuid is not available");
61 jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_UUID, jni_mid_fromString,
65 OIC_LOG(ERROR, TAG, "Fail to get jni uuid object");
72 CACheckJNIException(env);
76 jobject CALEGetParcelUuid(JNIEnv *env, jobject uuid)
78 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
79 VERIFY_NON_NULL_RET(uuid, TAG, "uuid is null", NULL);
81 jclass jni_cid_ParcelUuid = (*env)->FindClass(env, "android/os/ParcelUuid");
82 if (!jni_cid_ParcelUuid)
84 OIC_LOG(ERROR, TAG, "jni_cid_ParcelUuid is not available");
88 jmethodID jni_mid_ParcelUuid = (*env)->GetMethodID(env, jni_cid_ParcelUuid, "<init>",
89 "(Ljava/util/UUID;)V");
90 if (!jni_mid_ParcelUuid)
92 OIC_LOG(ERROR, TAG, "jni_mid_ParcelUuid is not available");
96 jobject jni_ParcelUuid = (*env)->NewObject(env, jni_cid_ParcelUuid, jni_mid_ParcelUuid, uuid);
99 OIC_LOG(ERROR, TAG, "Fail to get jni ParcelUuid");
103 return jni_ParcelUuid;
105 CACheckJNIException(env);
109 jobject CALEGetParcelUuidFromString(JNIEnv *env, const char* uuid)
111 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
112 VERIFY_NON_NULL_RET(uuid, TAG, "uuid is null", NULL);
114 jclass jni_cid_ParcelUuid = (*env)->FindClass(env, "android/os/ParcelUuid");
115 if (!jni_cid_ParcelUuid)
117 OIC_LOG(ERROR, TAG, "jni_cid_ParcelUuid is not available");
121 jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_ParcelUuid,
123 "(Ljava/lang/String;)"
124 "Landroid/os/ParcelUuid;");
125 if (!jni_mid_fromString)
127 OIC_LOG(ERROR, TAG, "jni_mid_fromString is not available");
131 jstring str_uuid = (*env)->NewStringUTF(env, uuid);
134 OIC_LOG(ERROR, TAG, "str_uuid is not available");
138 jobject jni_obj_parcelUuid = (*env)->CallStaticObjectMethod(env, jni_cid_ParcelUuid,
141 if (!jni_obj_parcelUuid)
143 OIC_LOG(ERROR, TAG, "Fail to get jni uuid object");
147 return jni_obj_parcelUuid;
149 CACheckJNIException(env);
153 jbyteArray CALEGetManufacturerData(JNIEnv *env, const char* uuid)
155 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
156 VERIFY_NON_NULL_RET(uuid, TAG, "uuid is null", NULL);
158 jbyteArray jni_byte_Data = (*env)->NewByteArray(env, 2);
159 uint8_t data_array[2];
162 // OIC_GATT_CUSTOM_UUID
163 data_array[0] = 66, data_array[1] = 9;
165 else if(uuid[7] == '4')
167 // OIC_GATT_CUSTOM_UUID2
168 data_array[0] = 66, data_array[1] = 4;
172 // OIC_GATT_CUSTOM_UUID3
173 data_array[0] = 66, data_array[1] = 12;
175 (*env)->SetByteArrayRegion(env, jni_byte_Data, 0, 2, data_array);
176 return jni_byte_Data;
180 bool CALEIsBondedDevice(JNIEnv *env, jobject bluetoothDevice)
182 VERIFY_NON_NULL_RET(env, TAG, "env is null", false);
183 VERIFY_NON_NULL_RET(bluetoothDevice, TAG, "bluetoothDevice is null", false);
185 jmethodID jni_mid_getBondState = CAGetJNIMethodID(env, "android/bluetooth/BluetoothDevice",
188 if (!jni_mid_getBondState)
190 OIC_LOG(ERROR, TAG, "jni_mid_getBondState is null");
194 jint jni_bondState = (jint)(*env)->CallIntMethod(env, bluetoothDevice, jni_mid_getBondState);
195 CACheckJNIException(env);
196 OIC_LOG_V(DEBUG, TAG, "bond state is %d", jni_bondState);
198 if (BOND_BONDED == jni_bondState)
200 OIC_LOG(DEBUG, TAG, "remote device is bonded");
205 OIC_LOG(DEBUG, TAG, "remote device is not bonded");
212 jobjectArray CALEGetBondedDevices(JNIEnv *env)
214 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
216 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
217 if (!jni_cid_BTAdapter)
219 OIC_LOG(ERROR, TAG, "getBondedDevices: jni_cid_BTAdapter is null");
223 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
225 METHODID_OBJECTNONPARAM);
226 CACheckJNIException(env);
227 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
228 jni_mid_getDefaultAdapter);
229 if (!jni_obj_BTAdapter)
231 OIC_LOG(ERROR, TAG, "getBondedDevices: bluetooth adapter is null");
235 // Get a list of currently paired devices
236 jmethodID jni_mid_getBondedDevices = (*env)->GetMethodID(env, jni_cid_BTAdapter,
238 "()Ljava/util/Set;");
239 if (!jni_mid_getBondedDevices)
241 OIC_LOG(ERROR, TAG, "getBondedDevices: jni_mid_getBondedDevicesr is null");
245 jobject jni_obj_setPairedDevices = (*env)->CallObjectMethod(env, jni_obj_BTAdapter,
246 jni_mid_getBondedDevices);
247 if (!jni_obj_setPairedDevices)
249 OIC_LOG(ERROR, TAG, "getBondedDevices: jni_obj_setPairedDevices is null");
253 jmethodID jni_mid_toArray = CAGetJNIMethodID(env, "java/util/Set", "toArray",
254 "()[Ljava/lang/Object;");
255 if (!jni_mid_toArray)
257 OIC_LOG(ERROR, TAG, "getBondedDevices: jni_mid_toArray is null");
261 jobjectArray jni_arrayPairedDevices = (jobjectArray)(
262 (*env)->CallObjectMethod(env, jni_obj_setPairedDevices, jni_mid_toArray));
263 if (!jni_arrayPairedDevices)
265 OIC_LOG(ERROR, TAG, "getBondedDevices: jni_arrayPairedDevices is null");
269 return jni_arrayPairedDevices;
272 CACheckJNIException(env);
276 jint CALEGetBTStateOnInfo(JNIEnv *env)
278 VERIFY_NON_NULL_RET(env, TAG, "env is null", -1);
280 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
281 if (!jni_cid_BTAdapter)
283 OIC_LOG(ERROR, TAG, "getBTStateOnInfo: jni_cid_BTAdapter is null");
284 CACheckJNIException(env);
288 jfieldID jni_fid_stateon = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_ON", "I");
289 if (!jni_fid_stateon)
291 OIC_LOG(ERROR, TAG, "get_field_state is not available");
292 CACheckJNIException(env);
296 jint jni_int_val = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, jni_fid_stateon);
297 CACheckJNIException(env);
298 OIC_LOG_V(DEBUG, TAG, "bluetooth.STATE_ON state integer value : %d", jni_int_val);
303 CAResult_t CALECheckPlatformVersion(JNIEnv *env, uint16_t level)
305 jint jni_int_sdk = CALEGetBuildVersion(env);
306 if (jni_int_sdk < level)
308 OIC_LOG(ERROR, TAG, "it is not supported");
309 return CA_NOT_SUPPORTED;
315 jint CALEGetBuildVersion(JNIEnv *env)
317 VERIFY_NON_NULL_RET(env, TAG, "env is null", -1);
319 // VERSION is a nested class within android.os.Build (hence "$" rather than "/")
320 jclass jni_cls_version = (*env)->FindClass(env, "android/os/Build$VERSION");
321 if (!jni_cls_version)
323 OIC_LOG(ERROR, TAG, "jni_cls_version is null");
324 CACheckJNIException(env);
328 jfieldID jni_fid_sdk = (*env)->GetStaticFieldID(env, jni_cls_version, "SDK_INT", "I");
331 OIC_LOG(ERROR, TAG, "jni_fid_sdk is null");
332 CACheckJNIException(env);
336 jint jni_int_sdk = (*env)->GetStaticIntField(env, jni_cls_version, jni_fid_sdk);
337 CACheckJNIException(env);
338 OIC_LOG_V(DEBUG, TAG, "sdk version is %d", jni_int_sdk);
343 jint CALEGetBuildVersionCodeForName(JNIEnv *env, const char* versionName)
345 VERIFY_NON_NULL_RET(env, TAG, "env is null", -1);
346 VERIFY_NON_NULL_RET(versionName, TAG, "versionName is null", -1);
348 // VERSION is a nested class within android.os.Build (hence "$" rather than "/")
349 jclass jni_cls_version = (*env)->FindClass(env, "android/os/Build$VERSION_CODES");
350 if (!jni_cls_version)
352 OIC_LOG(ERROR, TAG, "jni_cls_version is null");
353 CACheckJNIException(env);
357 jfieldID jni_fid_version = (*env)->GetStaticFieldID(env, jni_cls_version, versionName, "I");
358 if (!jni_fid_version)
360 OIC_LOG(ERROR, TAG, "jni_fid_version is null");
361 CACheckJNIException(env);
365 jint jni_int_version = (*env)->GetStaticIntField(env, jni_cls_version, jni_fid_version);
366 CACheckJNIException(env);
367 OIC_LOG_V(DEBUG, TAG, "version [%s] is %d",versionName, jni_int_version);
369 return jni_int_version;
372 jboolean CALEIsEnableBTAdapter(JNIEnv *env)
374 VERIFY_NON_NULL_RET(env, TAG, "env is null", JNI_FALSE);
376 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
377 if (!jni_cid_BTAdapter)
379 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter: jni_cid_BTAdapter is null");
380 CACheckJNIException(env);
384 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
386 METHODID_OBJECTNONPARAM);
387 if (!jni_mid_getDefaultAdapter)
389 OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
390 CACheckJNIException(env);
391 (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
395 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
396 jni_mid_getDefaultAdapter);
397 if (!jni_obj_BTAdapter)
399 OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
400 CACheckJNIException(env);
401 (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
406 jmethodID jni_mid_isEnable = (*env)->GetMethodID(env, jni_cid_BTAdapter, "isEnabled", "()Z");
407 if (!jni_mid_isEnable)
409 OIC_LOG(ERROR, TAG, "jni_mid_isEnable is null");
410 CACheckJNIException(env);
411 (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
412 (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
416 jboolean jni_isEnable = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_isEnable);
417 CACheckJNIException(env);
418 OIC_LOG_V(DEBUG, TAG, "adapter state is %d", jni_isEnable);
420 (*env)->DeleteLocalRef(env, jni_cid_BTAdapter);
421 (*env)->DeleteLocalRef(env, jni_obj_BTAdapter);
425 jstring CALEGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
427 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
428 VERIFY_NON_NULL_RET(bluetoothDevice, TAG, "bluetoothDevice is null", NULL);
430 jmethodID jni_mid_getAddress = CAGetJNIMethodID(env, "android/bluetooth/BluetoothDevice",
432 "()Ljava/lang/String;");
433 if (!jni_mid_getAddress)
435 OIC_LOG(ERROR, TAG, "jni_mid_getAddress is null");
439 jstring jni_address = (jstring)(*env)->CallObjectMethod(env, bluetoothDevice,
443 OIC_LOG(ERROR, TAG, "jni_address is null");
444 CACheckJNIException(env);
451 jint CALEGetConstantsValue(JNIEnv *env, const char* classType, const char* name)
453 VERIFY_NON_NULL_RET(env, TAG, "env", -1);
454 VERIFY_NON_NULL_RET(classType, TAG, "classType", -1);
455 VERIFY_NON_NULL_RET(name, TAG, "name", -1);
457 jclass jni_cid = (*env)->FindClass(env, classType);
460 OIC_LOG(ERROR, TAG, "jni_cid is null");
461 CACheckJNIException(env);
465 jfieldID jni_fieldID = (*env)->GetStaticFieldID(env, jni_cid,
469 OIC_LOG(ERROR, TAG, "jni_fieldID is null");
470 CACheckJNIException(env);
474 jint jni_id = (*env)->GetStaticIntField(env, jni_cid, jni_fieldID);
475 CACheckJNIException(env);
479 jobject CALEGetRemoteDevice(JNIEnv *env, jstring address)
481 OIC_LOG(DEBUG, TAG, "CALEGetRemoteDevice");
483 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
484 VERIFY_NON_NULL_RET(address, TAG, "address is null", NULL);
486 jclass jni_cid_BTAdapter = (*env)->FindClass(env, CLASSPATH_BT_ADAPTER);
487 if (!jni_cid_BTAdapter)
489 OIC_LOG(ERROR, TAG, "jni_cid_BTAdapter is null");
493 // get remote bt adapter method
494 jmethodID jni_mid_getDefaultAdapter = (*env)->GetStaticMethodID(env, jni_cid_BTAdapter,
496 METHODID_OBJECTNONPARAM);
497 if (!jni_mid_getDefaultAdapter)
499 OIC_LOG(ERROR, TAG, "jni_mid_getDefaultAdapter is null");
503 // gat bt adapter object
504 jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter,
505 jni_mid_getDefaultAdapter);
506 if (!jni_obj_BTAdapter)
508 OIC_LOG(ERROR, TAG, "jni_obj_BTAdapter is null");
512 jmethodID jni_mid_getRemoteDevice = (*env)->GetMethodID(env, jni_cid_BTAdapter,
514 METHODID_BT_REMOTE_DEVICE);
515 if (!jni_mid_getRemoteDevice)
517 OIC_LOG(ERROR, TAG, "jni_mid_getRemoteDevice is null");
521 jobject jni_obj_device = (*env)->CallObjectMethod(env, jni_obj_BTAdapter,
522 jni_mid_getRemoteDevice,
526 OIC_LOG(ERROR, TAG, "jni_obj_device is null");
529 return jni_obj_device;
532 CACheckJNIException(env);
536 jstring CALEGetAddressFromGatt(JNIEnv *env, jobject gatt)
538 OIC_LOG(DEBUG, TAG, "CALEGetAddressFromGatt");
540 VERIFY_NON_NULL_RET(env, TAG, "env is null", NULL);
541 VERIFY_NON_NULL_RET(gatt, TAG, "gatt is null", NULL);
543 jmethodID jni_mid_getDevice = CAGetJNIMethodID(env, CLASSPATH_BT_GATT, "getDevice",
545 if (!jni_mid_getDevice)
547 OIC_LOG(ERROR, TAG, "jni_mid_getDevice is null");
551 jobject jni_obj_device = (*env)->CallObjectMethod(env, gatt, jni_mid_getDevice);
554 OIC_LOG(ERROR, TAG, "jni_obj_device is null");
555 CACheckJNIException(env);
559 jstring jni_address = CALEGetAddressFromBTDevice(env, jni_obj_device);
562 OIC_LOG(ERROR, TAG, "jni_address is null");