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