Tizen, Android BT , BLE optimization - making similar to wifi, eth adapters
[platform/upstream/iotivity.git] / resource / csdk / connectivity / src / bt_le_adapter / android / caleutils.c
1 #include <jni.h>
2 #include <stdio.h>
3 #include <android/log.h>
4 #include "caleutils.h"
5 #include "logger.h"
6 #include "oic_malloc.h"
7 #include "uthreadpool.h"
8 #include "uarraylist.h"
9
10 #define TAG PCF("CA_LE_UTILS")
11
12 #define  LOGI(...) __android_log_print(ANDROID_LOG_INFO, LOG_TAG, __VA_ARGS__)
13 #define  LOGE(...) __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS__)
14
15 #define METHODID_OBJECTNONPARAM   "()Landroid/bluetooth/BluetoothAdapter;"
16 #define METHODID_STRINGNONPARAM   "()Ljava/lang/String;"
17 #define CLASSPATH_BT_ADPATER "android/bluetooth/BluetoothAdapter"
18
19 jobject CALEGetUuidFromString(JNIEnv *env, const char* uuid)
20 {
21
22     OIC_LOG_V(DEBUG, TAG, "CALEGetUuidFromString");
23
24     jclass jni_cid_UUID = (*env)->FindClass(env, "java/util/UUID");
25
26     jmethodID jni_mid_fromString = (*env)->GetStaticMethodID(env, jni_cid_UUID,
27             "fromString", "(Ljava/lang/String;)Ljava/util/UUID;");
28
29     jstring str_uuid = (*env)->NewStringUTF(env, uuid);
30
31     jobject jni_obj_uuid = (*env)->CallStaticObjectMethod(env, jni_cid_UUID,
32             jni_mid_fromString, str_uuid);
33     if (!jni_obj_uuid)
34     {
35         OIC_LOG_V(DEBUG, TAG, "Fail to get jni uuid object");
36         return NULL;
37     }
38
39     return jni_obj_uuid;
40 }
41
42 jobject CALEGetParcelUuid(JNIEnv *env, jobject uuid)
43 {
44     OIC_LOG_V(DEBUG, TAG, "CALEGetParcelUuid");
45
46     jclass jni_cid_ParcelUuid = (*env)->FindClass(env, "android/os/ParcelUuid");
47
48     jmethodID jni_mid_ParcelUuid = (*env)->GetMethodID(env, jni_cid_ParcelUuid,
49             "<init>", "(Ljava/util/UUID;)V");
50
51     jobject jni_ParcelUuid = (*env)->NewObject(env, jni_cid_ParcelUuid,
52             jni_mid_ParcelUuid, uuid);
53     if (!jni_ParcelUuid)
54     {
55         OIC_LOG_V(DEBUG, TAG, "Fail to get jni ParcelUuid");
56         return NULL;
57     }
58
59     return jni_ParcelUuid;
60 }
61
62 jstring CALEGetLocalDeviceAddress(JNIEnv* env)
63 {
64     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
65     if(!jni_cid_BTAdapter)
66     {
67         OIC_LOG(DEBUG, TAG, "[BLE][Native] getAddress: jni_cid_BTAdapter is null");
68         return NULL;
69     }
70
71     jmethodID jni_mid_getDefaultAdapter =
72             (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
73     if(!jni_mid_getDefaultAdapter)
74     {
75         OIC_LOG(DEBUG, TAG, "[BLE][Native] getAddress: jni_mid_getDefaultAdapter is null");
76         return NULL;
77     }
78
79     jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_BTAdapter, "getAddress", METHODID_STRINGNONPARAM);
80     if(!jni_mid_getAddress)
81     {
82         OIC_LOG(DEBUG, TAG, "[BLE][Native] getAddress: jni_mid_getAddress is null");
83         return NULL;
84     }
85
86     jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
87     if(!jni_obj_BTAdapter)
88     {
89         OIC_LOG(DEBUG, TAG, "[BLE][Native] getAddress: jni_obj_BTAdapter is null");
90         return NULL;
91     }
92
93     jstring jni_str_address = (jstring)(*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getAddress);
94     if(!jni_str_address)
95     {
96         OIC_LOG(DEBUG, TAG, "[BLE][Native] getAddress: jni_str_address is null");
97         return NULL;
98     }
99
100     return jni_str_address;
101 }
102
103 jobjectArray CALEBondedDevices(JNIEnv *env)
104 {
105     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
106     if(!jni_cid_BTAdapter)
107     {
108         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBondedDevices: jni_cid_BTAdapter is null");
109         return NULL;
110     }
111
112     jmethodID jni_mid_getDefaultAdapter =
113             (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
114
115     jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
116     if(!jni_obj_BTAdapter)
117     {
118         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBondedDevices: bluetooth adapter is null");
119         return NULL;
120     }
121
122     // Get a list of currently paired devices
123     jmethodID jni_mid_getBondedDevices = (*env)->GetMethodID(env, jni_cid_BTAdapter,
124             "getBondedDevices", "()Ljava/util/Set;");
125     if(!jni_mid_getBondedDevices)
126     {
127         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBondedDevices: jni_mid_getBondedDevicesr is null");
128         return NULL;
129     }
130
131     jobject jni_obj_setPairedDevices = (*env)->CallObjectMethod(env, jni_obj_BTAdapter, jni_mid_getBondedDevices);
132     if(!jni_obj_setPairedDevices)
133     {
134         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBondedDevices: jni_obj_setPairedDevices is null");
135         return NULL;
136     }
137
138     // Convert the set to an object array
139     // object[] array = Set<BluetoothDevice>.toArray();
140     jclass jni_cid_Set = (*env)->FindClass(env,  "java/util/Set");
141     jmethodID jni_mid_toArray = (*env)->GetMethodID(env, jni_cid_Set, "toArray", "()[Ljava/lang/Object;");
142
143     if(!jni_mid_toArray)
144     {
145         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBondedDevices: jni_mid_toArray is null");
146         return NULL;
147     }
148
149     jobjectArray jni_arrayPairedDevices = (jobjectArray)((*env)->CallObjectMethod(env,
150             jni_obj_setPairedDevices, jni_mid_toArray));
151     if(!jni_arrayPairedDevices)
152     {
153         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBondedDevices: jni_arrayPairedDevices is null");
154         return NULL;
155     }
156
157     return jni_arrayPairedDevices;
158 }
159
160 jint CALEGetBTStateOnInfo(JNIEnv *env)
161 {
162     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
163     if(!jni_cid_BTAdapter)
164     {
165         OIC_LOG(DEBUG, TAG, "[BLE][Native] getBTStateOnInfo: jni_cid_BTAdapter is null");
166         return -1;
167     }
168
169     jfieldID jni_fid_stateon = (*env)->GetStaticFieldID(env, jni_cid_BTAdapter, "STATE_ON", "I");
170     if (jni_fid_stateon == 0)
171     {
172         OIC_LOG(DEBUG, TAG, "[BLE][Native] get_field_state is 0");
173         return -1;
174     }
175     jint jni_int_val = (*env)->GetStaticIntField(env, jni_cid_BTAdapter, jni_fid_stateon);
176
177     OIC_LOG_V(DEBUG, TAG, "[BLE][Native] bluetooth STATE_ON state integer value : %d", jni_int_val);
178
179     return jni_int_val;
180 }
181
182 jboolean CALEIsEnableBTAdapter(JNIEnv *env)
183 {
184     jclass jni_cid_BTAdapter = (*env)->FindClass(env,  CLASSPATH_BT_ADPATER);
185     if(!jni_cid_BTAdapter)
186     {
187         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_BTAdapter: jni_cid_BTAdapter is null");
188         return FALSE;
189     }
190
191     jmethodID jni_mid_getDefaultAdapter =
192             (*env)->GetStaticMethodID(env, jni_cid_BTAdapter, "getDefaultAdapter", METHODID_OBJECTNONPARAM);
193     if(!jni_mid_getDefaultAdapter)
194     {
195         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getDefaultAdapter is null");
196         return FALSE;
197     }
198
199     jobject jni_obj_BTAdapter = (*env)->CallStaticObjectMethod(env, jni_cid_BTAdapter, jni_mid_getDefaultAdapter);
200     if(!jni_obj_BTAdapter)
201     {
202         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_obj_BTAdapter is null");
203         return FALSE;
204     }
205
206     // isEnable()
207     jmethodID jni_mid_isEnable = (*env)->GetMethodID(env, jni_cid_BTAdapter, "isEnabled",
208             "()Z");
209     if(!jni_mid_isEnable)
210     {
211         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_isEnable is null");
212         return FALSE;
213     }
214
215     jboolean jni_isEnable = (*env)->CallBooleanMethod(env, jni_obj_BTAdapter, jni_mid_isEnable);
216     OIC_LOG_V(DEBUG, TAG, "[BLE][Native] adapter state is %d", jni_isEnable);
217
218     return jni_isEnable;
219 }
220
221 jstring CALEGetAddressFromBTDevice(JNIEnv *env, jobject bluetoothDevice)
222 {
223     jclass jni_cid_device_list = (*env)->FindClass(env, "android/bluetooth/BluetoothDevice");
224     if(!jni_cid_device_list)
225     {
226         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_cid_device_list is null");
227         return NULL;
228     }
229
230     jmethodID jni_mid_getAddress = (*env)->GetMethodID(env, jni_cid_device_list, "getAddress",
231             "()Ljava/lang/String;");
232     if(!jni_mid_getAddress)
233     {
234         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_mid_getAddress is null");
235         return NULL;
236     }
237
238     jstring jni_address = (jstring)(*env)->CallObjectMethod(env, bluetoothDevice, jni_mid_getAddress);
239     if(!jni_address)
240     {
241         OIC_LOG(DEBUG, TAG, "[BLE][Native] jni_address is null");
242         return NULL;
243     }
244     return jni_address;
245 }