com_android_bluetooth_btservice_AdapterService.cpp revision 6eb32d5f7c30f04da45c3da0974bbb63725a0978
1ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/*
2ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Copyright (C) 2012 The Android Open Source Project
3ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *
4ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Licensed under the Apache License, Version 2.0 (the "License");
5ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * you may not use this file except in compliance with the License.
6ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * You may obtain a copy of the License at
7ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *
8ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *      http://www.apache.org/licenses/LICENSE-2.0
9ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu *
10ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * Unless required by applicable law or agreed to in writing, software
11ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * distributed under the License is distributed on an "AS IS" BASIS,
12ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * See the License for the specific language governing permissions and
14ede67c26e7b2564ea35db6d9b3027a269c150e13Zhihai Xu * limitations under the License.
15ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */
16ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
17ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#define LOG_TAG "BluetoothServiceJni"
186c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie#include "com_android_bluetooth.h"
19cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie#include "hardware/bt_sock.h"
20ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "utils/Log.h"
21ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "utils/misc.h"
22ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "cutils/properties.h"
23ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include "android_runtime/AndroidRuntime.h"
24dc8c533e030e6b8625da3dc75c8f768a3242fe16Ruben Brunk#include "android_runtime/Log.h"
25ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
26ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <string.h>
27ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <pthread.h>
28ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
29ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <sys/stat.h>
30ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh#include <fcntl.h>
31ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
32ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshnamespace android {
33ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
346c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie#define ADDITIONAL_NREFS 50
35ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_stateChangeCallback;
36ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_adapterPropertyChangedCallback;
37ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_devicePropertyChangedCallback;
38ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_deviceFoundCallback;
39ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_pinRequestCallback;
40ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_sspRequestCallback;
41ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_bondStateChangeCallback;
4201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamystatic jmethodID method_aclStateChangeCallback;
43ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jmethodID method_discoveryStateChangeCallback;
441e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jmethodID method_setWakeAlarm;
451e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jmethodID method_acquireWakeLock;
461e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jmethodID method_releaseWakeLock;
47f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadhamstatic jmethodID method_energyInfo;
48ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
49ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic const bt_interface_t *sBluetoothInterface = NULL;
50cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xiestatic const btsock_interface_t *sBluetoothSocketInterface = NULL;
51ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic JNIEnv *callbackEnv = NULL;
52ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
531e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic jobject sJniAdapterServiceObj;
54ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jobject sJniCallbacksObj;
55ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jfieldID sJniCallbacksField;
56ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
57cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
586c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xieconst bt_interface_t* getBluetoothInterface() {
596c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    return sBluetoothInterface;
606c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie}
616c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie
626c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew XieJNIEnv* getCallbackEnv() {
63b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    return callbackEnv;
646c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie}
656c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie
666c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xievoid checkAndClearExceptionFromCallback(JNIEnv* env,
67ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                               const char* methodName) {
68ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (env->ExceptionCheck()) {
69c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("An exception was thrown by callback '%s'.", methodName);
70ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        LOGE_EX(env);
71ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        env->ExceptionClear();
72ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
73ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
74ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
75ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic bool checkCallbackThread() {
76ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    JNIEnv* env = AndroidRuntime::getJNIEnv();
77676cb1bdd1c14c7af56562bab51f168e7f8f6d62Matthew Xie    if (callbackEnv != env || callbackEnv == NULL) {
78c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Callback env check fail: env: %p, callback: %p", env, callbackEnv);
79676cb1bdd1c14c7af56562bab51f168e7f8f6d62Matthew Xie        return false;
80676cb1bdd1c14c7af56562bab51f168e7f8f6d62Matthew Xie    }
81ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return true;
82ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
83ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
84ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void adapter_state_change_callback(bt_state_t status) {
85ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
86c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
87ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
88ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
89c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s: Status is: %d", __FUNCTION__, status);
90ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
91ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_stateChangeCallback, (jint)status);
92ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
93ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
94ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
95ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
96ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic int get_properties(int num_properties, bt_property_t *properties, jintArray *types,
97ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                        jobjectArray *props) {
98edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    jbyteArray propVal;
99ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    for (int i = 0; i < num_properties; i++) {
100b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        propVal = callbackEnv->NewByteArray(properties[i].len);
101b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        if (propVal == NULL) goto Fail;
102b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
103b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        callbackEnv->SetByteArrayRegion(propVal, 0, properties[i].len,
104b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom                                             (jbyte*)properties[i].val);
105b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        callbackEnv->SetObjectArrayElement(*props, i, propVal);
106b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        // Delete reference to propVal
107b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        callbackEnv->DeleteLocalRef(propVal);
108b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        callbackEnv->SetIntArrayRegion(*types, i, 1, (jint *)&properties[i].type);
109ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
110ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return 0;
111ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail:
112ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (propVal) callbackEnv->DeleteLocalRef(propVal);
113c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGE("Error while allocation of array in %s", __FUNCTION__);
114ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return -1;
115ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
116ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
117ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void adapter_properties_callback(bt_status_t status, int num_properties,
118ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                        bt_property_t *properties) {
119ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jobjectArray props;
120ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jintArray types;
121edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    jbyteArray val;
122edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    jclass mclass;
123edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
124ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
125c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
126ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
127ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
128ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
129c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s: Status is: %d, Properties: %d", __FUNCTION__, status, num_properties);
130ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
131ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (status != BT_STATUS_SUCCESS) {
132c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("%s: Status %d is incorrect", __FUNCTION__, status);
133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
134ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
136edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    val = (jbyteArray) callbackEnv->NewByteArray(num_properties);
137edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    if (val == NULL) {
138e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("%s: Error allocating byteArray", __FUNCTION__);
139edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M        return;
140edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    }
141edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
142edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    mclass = callbackEnv->GetObjectClass(val);
143edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
144edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    /* (BT) Initialize the jobjectArray and jintArray here itself and send the
145edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M     initialized array pointers alone to get_properties */
146edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
147edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    props = callbackEnv->NewObjectArray(num_properties, mclass,
148edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M                                             NULL);
149edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    if (props == NULL) {
150e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("%s: Error allocating object Array for properties", __FUNCTION__);
151edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M        return;
152edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    }
153edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
154edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    types = (jintArray)callbackEnv->NewIntArray(num_properties);
155edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
156edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    if (types == NULL) {
157e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("%s: Error allocating int Array for values", __FUNCTION__);
158edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M        return;
159edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    }
160edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    // Delete the reference to val and mclass
161edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    callbackEnv->DeleteLocalRef(mclass);
162edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    callbackEnv->DeleteLocalRef(val);
163edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
164ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh    if (get_properties(num_properties, properties, &types, &props) < 0) {
165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (props) callbackEnv->DeleteLocalRef(props);
166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (types) callbackEnv->DeleteLocalRef(types);
167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_adapterPropertyChangedCallback, types,
171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                props);
172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
1736c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(props);
1746c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(types);
175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return;
176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
178ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
179ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void remote_device_properties_callback(bt_status_t status, bt_bdaddr_t *bd_addr,
180ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                              int num_properties, bt_property_t *properties) {
181ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
182c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
183ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
184ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
185ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
186c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s: Status is: %d, Properties: %d", __FUNCTION__, status, num_properties);
187ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
188ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (status != BT_STATUS_SUCCESS) {
189c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("%s: Status %d is incorrect", __FUNCTION__, status);
190ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
191ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
192ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
1936c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->PushLocalFrame(ADDITIONAL_NREFS);
1946c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie
1956c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    jobjectArray props;
1966c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    jbyteArray addr;
1976c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    jintArray types;
198edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    jbyteArray val;
199edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    jclass mclass;
200edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
201edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    val = (jbyteArray) callbackEnv->NewByteArray(num_properties);
202edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    if (val == NULL) {
203e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("%s: Error allocating byteArray", __FUNCTION__);
204edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M        return;
205edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    }
206edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
207edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    mclass = callbackEnv->GetObjectClass(val);
208edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
209edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    /* Initialize the jobjectArray and jintArray here itself and send the
210edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M     initialized array pointers alone to get_properties */
211edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
212edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    props = callbackEnv->NewObjectArray(num_properties, mclass,
213edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M                                             NULL);
214edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    if (props == NULL) {
215e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("%s: Error allocating object Array for properties", __FUNCTION__);
216edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M        return;
217edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    }
218edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
219edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    types = (jintArray)callbackEnv->NewIntArray(num_properties);
220edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M
221edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    if (types == NULL) {
222e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("%s: Error allocating int Array for values", __FUNCTION__);
223edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M        return;
224edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    }
225edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    // Delete the reference to val and mclass
226edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    callbackEnv->DeleteLocalRef(mclass);
227edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    callbackEnv->DeleteLocalRef(val);
2286c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie
229ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
230ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) goto Fail;
231ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr) callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
232ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
233ff68148a7fb74947ea5e7a337161108363cbe9f5Jaikumar Ganesh    if (get_properties(num_properties, properties, &types, &props) < 0) {
234ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (props) callbackEnv->DeleteLocalRef(props);
235ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (types) callbackEnv->DeleteLocalRef(types);
2366c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie        callbackEnv->PopLocalFrame(NULL);
237ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
238ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
239ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
240ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_devicePropertyChangedCallback, addr,
241ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                types, props);
242ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
2436c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(props);
2446c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(types);
245edb14a4944d66ca9255b2ab9b384c583b626fd94Syed Ibrahim M    callbackEnv->DeleteLocalRef(addr);
2466c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->PopLocalFrame(NULL);
247ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return;
248ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
249ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail:
250c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGE("Error while allocation byte array in %s", __FUNCTION__);
251ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
252ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
253ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
254ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void device_found_callback(int num_properties, bt_property_t *properties) {
255ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyteArray addr = NULL;
256ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int addr_index;
257ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
258ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    for (int i = 0; i < num_properties; i++) {
259ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (properties[i].type == BT_PROPERTY_BDADDR) {
260ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            addr = callbackEnv->NewByteArray(properties[i].len);
261ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            if (addr) {
262ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                callbackEnv->SetByteArrayRegion(addr, 0, properties[i].len,
263ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                (jbyte*)properties[i].val);
264ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                addr_index = i;
265ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            } else {
266c55a9837c004044051b71bb47182ace156691283Matthew Xie                ALOGE("Address is NULL (unable to allocate) in %s", __FUNCTION__);
267ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                return;
268ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            }
269ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
270ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
271ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
272c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Address is NULL in %s", __FUNCTION__);
273ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
274ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
275ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
276c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s: Properties: %d, Address: %s", __FUNCTION__, num_properties,
277ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        (const char *)properties[addr_index].val);
278ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
279ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    remote_device_properties_callback(BT_STATUS_SUCCESS, (bt_bdaddr_t *)properties[addr_index].val,
280ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                      num_properties, properties);
281ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
282ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_deviceFoundCallback, addr);
283ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
2846c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(addr);
285ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
286ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
287ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void bond_state_changed_callback(bt_status_t status, bt_bdaddr_t *bd_addr,
288ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                        bt_bond_state_t state) {
289ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyteArray addr;
290ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int i;
291ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
292c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
293ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
294ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
295ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!bd_addr) {
296c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Address is null in %s", __FUNCTION__);
297ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
298ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
299ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
300ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
301c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Address allocation failed in %s", __FUNCTION__);
302ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
303ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
304ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr);
305ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
306ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_bondStateChangeCallback, (jint) status,
307ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                addr, (jint)state);
308ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
3096c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(addr);
310ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
311ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
31201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamystatic void acl_state_changed_callback(bt_status_t status, bt_bdaddr_t *bd_addr,
31301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy                                       bt_acl_state_t state)
31401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy{
31501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    jbyteArray addr;
31601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    int i;
31701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    if (!checkCallbackThread()) {
318e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
31901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy       return;
32001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    }
32101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    if (!bd_addr) {
322e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie        ALOGE("Address is null in %s", __FUNCTION__);
32301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy        return;
32401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    }
32501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
32601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    if (addr == NULL) {
327e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie       ALOGE("Address allocation failed in %s", __FUNCTION__);
32801a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy       return;
32901a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    }
33001a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr);
33101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy
33201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_aclStateChangeCallback, (jint) status,
33301a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy                                addr, (jint)state);
33401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
33501a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    callbackEnv->DeleteLocalRef(addr);
33601a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy}
33701a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy
338ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void discovery_state_changed_callback(bt_discovery_state_t state) {
339ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyteArray addr;
340ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
341c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
342ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
343ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
344ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
345c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s: DiscoveryState:%d ", __FUNCTION__, state);
346ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
347ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_discoveryStateChangeCallback,
348ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                (jint)state);
349ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
350ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
351ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
352ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
353244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bondestatic void pin_request_callback(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint32_t cod,
354244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde        bool min_16_digits) {
355ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyteArray addr, devname;
356ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
357c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
358ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
359ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
360ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!bd_addr) {
361c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Address is null in %s", __FUNCTION__);
362ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
363ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
364ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
365ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
366ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) goto Fail;
36761c4100eb0606f8ba630f5c45d07a88d612fbc85Matthew Xie    callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte*)bd_addr);
368ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
369ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    devname = callbackEnv->NewByteArray(sizeof(bt_bdname_t));
370ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (devname == NULL) goto Fail;
371ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
372ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->SetByteArrayRegion(devname, 0, sizeof(bt_bdname_t), (jbyte*)bdname);
373ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
374244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_pinRequestCallback, addr, devname, cod,
375244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde            min_16_digits);
376ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
377ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
3786c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(addr);
3796c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(devname);
380ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return;
381ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
382ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail:
383ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr) callbackEnv->DeleteLocalRef(addr);
384ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (devname) callbackEnv->DeleteLocalRef(devname);
385c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGE("Error while allocating in: %s", __FUNCTION__);
386ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
387ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
388ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void ssp_request_callback(bt_bdaddr_t *bd_addr, bt_bdname_t *bdname, uint32_t cod,
389ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                 bt_ssp_variant_t pairing_variant, uint32_t pass_key) {
390ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyteArray addr, devname;
391ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!checkCallbackThread()) {
392c55a9837c004044051b71bb47182ace156691283Matthew Xie       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
393ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh       return;
394ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
395ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!bd_addr) {
396c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Address is null in %s", __FUNCTION__);
397ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return;
398ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
399ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
400ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = callbackEnv->NewByteArray(sizeof(bt_bdaddr_t));
401ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) goto Fail;
402ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->SetByteArrayRegion(addr, 0, sizeof(bt_bdaddr_t), (jbyte *)bd_addr);
403ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
404ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    devname = callbackEnv->NewByteArray(sizeof(bt_bdname_t));
405ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (devname == NULL) goto Fail;
406ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->SetByteArrayRegion(devname, 0, sizeof(bt_bdname_t), (jbyte*)bdname);
407ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
408ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callbackEnv->CallVoidMethod(sJniCallbacksObj, method_sspRequestCallback, addr, devname, cod,
409ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                (jint) pairing_variant, pass_key);
410ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
411ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
4126c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(addr);
4136c91bc0a163cc7600c40d7fb979777fd911d1ef1Matthew Xie    callbackEnv->DeleteLocalRef(devname);
414ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return;
415ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
416ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar GaneshFail:
417ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr) callbackEnv->DeleteLocalRef(addr);
418ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (devname) callbackEnv->DeleteLocalRef(devname);
419ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
420c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGE("Error while allocating in: %s", __FUNCTION__);
421ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
422ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
423ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void callback_thread_event(bt_cb_thread_evt event) {
424ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    JavaVM* vm = AndroidRuntime::getJavaVM();
425ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (event  == ASSOCIATE_JVM) {
426ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        JavaVMAttachArgs args;
427ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        char name[] = "BT Service Callback Thread";
428b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        args.version = JNI_VERSION_1_6;
429ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        args.name = name;
430ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        args.group = NULL;
431ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        vm->AttachCurrentThread(&callbackEnv, &args);
432c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGV("Callback thread attached: %p", callbackEnv);
433ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    } else if (event == DISASSOCIATE_JVM) {
434ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (!checkCallbackThread()) {
435c55a9837c004044051b71bb47182ace156691283Matthew Xie            ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
436ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return;
437ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
438ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        vm->DetachCurrentThread();
439ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
440ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
441ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
44203b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void dut_mode_recv_callback (uint16_t opcode, uint8_t *buf, uint8_t len) {
44303b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
44403b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
44503b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Battastatic void le_test_mode_recv_callback (bt_status_t status, uint16_t packet_count) {
44603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta
44703b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    ALOGV("%s: status:%d packet_count:%d ", __FUNCTION__, status, packet_count);
44803b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta}
449f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham
450f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadhamstatic void energy_info_recv_callback(bt_activity_energy_info *p_energy_info)
451f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham{
452f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    if (!checkCallbackThread()) {
453f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham       ALOGE("Callback: '%s' is not called on the correct thread", __FUNCTION__);
454f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham       return;
455f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    }
456f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham
457d981566d5912bfd66fc265508e5b0c43dce76f82Prerepa Viswanadham    callbackEnv->CallVoidMethod(sJniAdapterServiceObj, method_energyInfo, p_energy_info->status,
458f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham        p_energy_info->ctrl_state, p_energy_info->tx_time, p_energy_info->rx_time,
459f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham        p_energy_info->idle_time, p_energy_info->energy_used);
460f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham
461f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    checkAndClearExceptionFromCallback(callbackEnv, __FUNCTION__);
462f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham}
463f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham
4641e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic bt_callbacks_t sBluetoothCallbacks = {
465ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    sizeof(sBluetoothCallbacks),
466ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    adapter_state_change_callback,
467ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    adapter_properties_callback,
468ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    remote_device_properties_callback,
469ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    device_found_callback,
470ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    discovery_state_changed_callback,
471ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    pin_request_callback,
472ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    ssp_request_callback,
473ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    bond_state_changed_callback,
47401a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    acl_state_changed_callback,
475ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    callback_thread_event,
47603b8386de26ba6500af2d66687bff9b01f2cbbd7Ganesh Ganapathi Batta    dut_mode_recv_callback,
477f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    le_test_mode_recv_callback,
478f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    energy_info_recv_callback
479ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh};
480ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
4811e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// The callback to call when the wake alarm fires.
4821e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic alarm_cb sAlarmCallback;
4831e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
4841e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// The data to pass to the wake alarm callback.
4851e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic void *sAlarmCallbackData;
4861e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
487beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavatistatic JavaVMAttachArgs sAttachArgs = {
488beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati  .version = JNI_VERSION_1_6,
489beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati  .name = "bluedroid wake/alarm thread",
490beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati  .group = NULL
491beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati};
492beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati
4935a60e47497f21f64e6d79420dc4c56c1907df22akschulzstatic bool set_wake_alarm_callout(uint64_t delay_millis, bool should_wake,
4945a60e47497f21f64e6d79420dc4c56c1907df22akschulz        alarm_cb cb, void *data) {
4951e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    JNIEnv *env;
4961e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    JavaVM *vm = AndroidRuntime::getJavaVM();
4971e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
4981e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
4991e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (status != JNI_OK && status != JNI_EDETACHED) {
5001e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to get environment for JNI call", __func__);
5011e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        return false;
5021e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5031e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
504beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati    if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
5051e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to attach thread to VM", __func__);
5061e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        return false;
5071e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5081e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
509717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach    sAlarmCallback = cb;
510717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach    sAlarmCallbackData = data;
511717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach
5121e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jboolean jshould_wake = should_wake ? JNI_TRUE : JNI_FALSE;
5135a60e47497f21f64e6d79420dc4c56c1907df22akschulz    jboolean ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_setWakeAlarm,
5145a60e47497f21f64e6d79420dc4c56c1907df22akschulz            (jlong)delay_millis, jshould_wake);
515717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach    if (!ret) {
516717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach        sAlarmCallback = NULL;
517717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach        sAlarmCallbackData = NULL;
5181e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5191e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5201e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (status == JNI_EDETACHED) {
5211e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        vm->DetachCurrentThread();
5221e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5231e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5241e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    return !!ret;
5251e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati}
5261e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5271e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic int acquire_wake_lock_callout(const char *lock_name) {
5281e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    JNIEnv *env;
5291e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    JavaVM *vm = AndroidRuntime::getJavaVM();
5301e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
5311e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (status != JNI_OK && status != JNI_EDETACHED) {
5321e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to get environment for JNI call", __func__);
5331e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        return BT_STATUS_FAIL;
5341e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
535beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati    if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
5361e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to attach thread to VM", __func__);
5371e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        return BT_STATUS_FAIL;
5381e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5391e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5401e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jboolean ret = JNI_FALSE;
5411e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jstring lock_name_jni = env->NewStringUTF(lock_name);
5421e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (lock_name_jni) {
5431e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_acquireWakeLock, lock_name_jni);
5441e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        env->DeleteLocalRef(lock_name_jni);
5451e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    } else {
5461e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to allocate string: %s", __func__, lock_name);
5471e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5481e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5491e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (status == JNI_EDETACHED) {
5501e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        vm->DetachCurrentThread();
5511e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5521e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5531e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
5541e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati}
5551e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5561e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic int release_wake_lock_callout(const char *lock_name) {
5571e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    JNIEnv *env;
5581e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    JavaVM *vm = AndroidRuntime::getJavaVM();
5591e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jint status = vm->GetEnv((void **)&env, JNI_VERSION_1_6);
5601e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5611e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (status != JNI_OK && status != JNI_EDETACHED) {
5621e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to get environment for JNI call", __func__);
5631e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        return BT_STATUS_FAIL;
5641e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
565beccdc6d1647c56c91ddfd14f7990371168fb870Sharvil Nanavati    if (status == JNI_EDETACHED && vm->AttachCurrentThread(&env, &sAttachArgs) != 0) {
5661e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to attach thread to VM", __func__);
5671e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        return BT_STATUS_FAIL;
5681e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5691e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jboolean ret = JNI_FALSE;
5701e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    jstring lock_name_jni = env->NewStringUTF(lock_name);
5711e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (lock_name_jni) {
5721e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ret = env->CallBooleanMethod(sJniAdapterServiceObj, method_releaseWakeLock, lock_name_jni);
5731e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        env->DeleteLocalRef(lock_name_jni);
5741e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    } else {
5751e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ALOGE("%s unable to allocate string: %s", __func__, lock_name);
5761e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5771e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    if (status == JNI_EDETACHED) {
5781e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        vm->DetachCurrentThread();
5791e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    }
5801e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    return ret ? BT_STATUS_SUCCESS : BT_STATUS_FAIL;
5811e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati}
5821e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5831e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// Called by Java code when alarm is fired. A wake lock is held by the caller
5841e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati// over the duration of this callback.
5851e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic void alarmFiredNative(JNIEnv *env, jobject obj) {
586717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach    if (sAlarmCallback) {
587717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach        sAlarmCallback(sAlarmCallbackData);
588717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach    } else {
589717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach        ALOGE("%s() - Alarm fired with callback not set!", __FUNCTION__);
590717be4e8209e4c24d8a1e395f65f86aee5bb0e69Andre Eisenbach    }
5911e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati}
5921e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
5931e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavatistatic bt_os_callouts_t sBluetoothOsCallouts = {
5941e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    sizeof(sBluetoothOsCallouts),
5951e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    set_wake_alarm_callout,
5961e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    acquire_wake_lock_callout,
5971e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    release_wake_lock_callout,
5981e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati};
5991e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
600bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde
6012c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
602ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic void classInitNative(JNIEnv* env, jclass clazz) {
603ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int err;
604ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    hw_module_t* module;
605ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
606ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jclass jniCallbackClass =
607ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        env->FindClass("com/android/bluetooth/btservice/JniCallbacks");
608ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    sJniCallbacksField = env->GetFieldID(clazz, "mJniCallbacks",
609ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        "Lcom/android/bluetooth/btservice/JniCallbacks;");
610ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
611ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_stateChangeCallback = env->GetMethodID(jniCallbackClass, "stateChangeCallback", "(I)V");
612ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
613ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_adapterPropertyChangedCallback = env->GetMethodID(jniCallbackClass,
614ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                             "adapterPropertyChangedCallback",
615ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                             "([I[[B)V");
616ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_discoveryStateChangeCallback = env->GetMethodID(jniCallbackClass,
617ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                           "discoveryStateChangeCallback", "(I)V");
618ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
619ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_devicePropertyChangedCallback = env->GetMethodID(jniCallbackClass,
620ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                            "devicePropertyChangedCallback",
621ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                            "([B[I[[B)V");
622ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_deviceFoundCallback = env->GetMethodID(jniCallbackClass, "deviceFoundCallback", "([B)V");
623ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_pinRequestCallback = env->GetMethodID(jniCallbackClass, "pinRequestCallback",
624244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde                                                 "([B[BIZ)V");
625ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_sspRequestCallback = env->GetMethodID(jniCallbackClass, "sspRequestCallback",
626ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                 "([B[BIII)V");
627ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
628ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    method_bondStateChangeCallback = env->GetMethodID(jniCallbackClass,
629ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                     "bondStateChangeCallback", "(I[BI)V");
630ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
63101a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy    method_aclStateChangeCallback = env->GetMethodID(jniCallbackClass,
63201a8cf98f070a6996b2e8974edc229ac402f3f0cKausik Sinnaswamy                                                    "aclStateChangeCallback", "(I[BI)V");
6331e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
6341e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    method_setWakeAlarm = env->GetMethodID(clazz, "setWakeAlarm", "(JZ)Z");
6351e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    method_acquireWakeLock = env->GetMethodID(clazz, "acquireWakeLock", "(Ljava/lang/String;)Z");
6361e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    method_releaseWakeLock = env->GetMethodID(clazz, "releaseWakeLock", "(Ljava/lang/String;)Z");
637f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    method_energyInfo = env->GetMethodID(clazz, "energyInfoCallback", "(IIJJJJ)V");
6381e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
639ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    char value[PROPERTY_VALUE_MAX];
640ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    property_get("bluetooth.mock_stack", value, "");
641ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
642ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    const char *id = (strcmp(value, "1")? BT_STACK_MODULE_ID : BT_STACK_TEST_MODULE_ID);
643ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
644ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    err = hw_get_module(id, (hw_module_t const**)&module);
645ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
646ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (err == 0) {
647ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        hw_device_t* abstraction;
648ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        err = module->methods->open(module, id, &abstraction);
649ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (err == 0) {
650ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            bluetooth_module_t* btStack = (bluetooth_module_t *)abstraction;
651ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            sBluetoothInterface = btStack->get_bluetooth_interface();
652ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        } else {
653c55a9837c004044051b71bb47182ace156691283Matthew Xie           ALOGE("Error while opening Bluetooth library");
654ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
655ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    } else {
656c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("No Bluetooth Library found");
657ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
658ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
659ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
660ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic bool initNative(JNIEnv* env, jobject obj) {
661c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
662ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
6631e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    sJniAdapterServiceObj = env->NewGlobalRef(obj);
664ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    sJniCallbacksObj = env->NewGlobalRef(env->GetObjectField(obj, sJniCallbacksField));
665ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
666ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (sBluetoothInterface) {
667ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        int ret = sBluetoothInterface->init(&sBluetoothCallbacks);
668ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (ret != BT_STATUS_SUCCESS) {
6691e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati            ALOGE("Error while setting the callbacks: %d\n", ret);
6701e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati            sBluetoothInterface = NULL;
6711e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati            return JNI_FALSE;
6721e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        }
6731e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        ret = sBluetoothInterface->set_os_callouts(&sBluetoothOsCallouts);
6741e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati        if (ret != BT_STATUS_SUCCESS) {
6751e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati            ALOGE("Error while setting Bluetooth callouts: %d\n", ret);
6761e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati            sBluetoothInterface->cleanup();
677ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            sBluetoothInterface = NULL;
678ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh            return JNI_FALSE;
679ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
6801e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati
681cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        if ( (sBluetoothSocketInterface = (btsock_interface_t *)
682cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie                  sBluetoothInterface->get_profile_interface(BT_PROFILE_SOCKETS_ID)) == NULL) {
683c55a9837c004044051b71bb47182ace156691283Matthew Xie                ALOGE("Error getting socket interface");
684cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        }
6852c0df0560ad5ae3fd6022b17b17a6a70143e216aHemant Gupta
686ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return JNI_TRUE;
687ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
688ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return JNI_FALSE;
689ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
690ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
691ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic bool cleanupNative(JNIEnv *env, jobject obj) {
692c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
693ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
694ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
695ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
696ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
697ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    sBluetoothInterface->cleanup();
698e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie    ALOGI("%s: return from cleanup",__FUNCTION__);
6996654f5c903de510a70f9e72cd5ad7837b615d93ffredc
700ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    env->DeleteGlobalRef(sJniCallbacksObj);
7011e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    env->DeleteGlobalRef(sJniAdapterServiceObj);
702ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return JNI_TRUE;
703ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
704ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
705ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean enableNative(JNIEnv* env, jobject obj) {
706c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
707ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
708ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
709ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
710ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
711ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->enable();
7128812b408f52e55394195c4827eb587a610b054c9Matthew Xie    result = (ret == BT_STATUS_SUCCESS || ret == BT_STATUS_DONE) ? JNI_TRUE : JNI_FALSE;
713ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
714ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
715ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
716ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean disableNative(JNIEnv* env, jobject obj) {
717c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
718ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
719ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
720ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
721ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
722ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->disable();
723ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao    /* Retrun JNI_FALSE only when BTIF explicitly reports
724ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao       BT_STATUS_FAIL. It is fine for the BT_STATUS_NOT_READY
725ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao       case which indicates that stack had not been enabled.
726ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao    */
727ad9fff218081d2f49471487d37387c764d69ed29YK Jeffrey Chao    result = (ret == BT_STATUS_FAIL) ? JNI_FALSE : JNI_TRUE;
728ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
729ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
730ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
731ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean startDiscoveryNative(JNIEnv* env, jobject obj) {
732c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
733ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
734ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
735ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
736ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
737ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->start_discovery();
738ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
739ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
740ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
741ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
742ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean cancelDiscoveryNative(JNIEnv* env, jobject obj) {
743c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
744ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
745ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
746ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
747ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
748ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->cancel_discovery();
749ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
750ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
751ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
752ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
753db681f3973bd8a088a878fd6f41d4330cdbc5522Andre Eisenbachstatic jboolean createBondNative(JNIEnv* env, jobject obj, jbyteArray address, jint transport) {
754c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
755ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
756ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *addr;
757ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
758ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
759ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
760ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
761ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
762ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
763ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
764ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return result;
765ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
766ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
767db681f3973bd8a088a878fd6f41d4330cdbc5522Andre Eisenbach    int ret = sBluetoothInterface->create_bond((bt_bdaddr_t *)addr, transport);
768b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
769ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
770ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
771ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
772ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
773ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
774ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean removeBondNative(JNIEnv* env, jobject obj, jbyteArray address) {
775c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
776ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
777ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *addr;
778ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result;
779ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return JNI_FALSE;
780ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
781ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
782ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
783ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
784ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return JNI_FALSE;
785ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
786ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
787ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->remove_bond((bt_bdaddr_t *)addr);
788b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
789ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
790ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
791ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
792ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
793ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
794ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean cancelBondNative(JNIEnv* env, jobject obj, jbyteArray address) {
795c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
796ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
797ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *addr;
798ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result;
799ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return JNI_FALSE;
800ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
801ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
802ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
803ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
804ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return JNI_FALSE;
805ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
806ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
807ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->cancel_bond((bt_bdaddr_t *)addr);
808b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
809ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
810ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
811ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
812ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
813ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
8141e3e1ddf939bf71616245e1e100964568053d665Andre Eisenbachstatic int getConnectionStateNative(JNIEnv* env, jobject obj, jbyteArray address) {
8153636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    ALOGV("%s:",__FUNCTION__);
8163636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    if (!sBluetoothInterface) return JNI_FALSE;
8173636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach
8183636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    jbyte *addr = env->GetByteArrayElements(address, NULL);
8193636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    if (addr == NULL) {
8203636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach        jniThrowIOException(env, EINVAL);
8213636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach        return JNI_FALSE;
8223636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    }
8233636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach
8243636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    int ret = sBluetoothInterface->get_connection_state((bt_bdaddr_t *)addr);
8253636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach    env->ReleaseByteArrayElements(address, addr, 0);
8263636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach
8271e3e1ddf939bf71616245e1e100964568053d665Andre Eisenbach    return ret;
8283636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach}
8293636f3319fc403e3bf995b6de71dc5e3f2864661Andre Eisenbach
830ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean pinReplyNative(JNIEnv *env, jobject obj, jbyteArray address, jboolean accept,
831ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                               jint len, jbyteArray pinArray) {
832c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
833ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
834ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *addr, *pinPtr = NULL;
835ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
836ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
837ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
838ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
839ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
840ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
841ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return result;
842ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
843ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
844ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (accept) {
845ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        pinPtr = env->GetByteArrayElements(pinArray, NULL);
846ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        if (pinPtr == NULL) {
847ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh           jniThrowIOException(env, EINVAL);
848b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom           env->ReleaseByteArrayElements(address, addr, 0);
849ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh           return result;
850ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        }
851ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
852ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
853ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->pin_reply((bt_bdaddr_t*)addr, accept, len,
854ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                              (bt_pin_code_t *) pinPtr);
855b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
856b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(pinArray, pinPtr, 0);
857ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
858ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
859ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
860ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
861ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
862ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean sspReplyNative(JNIEnv *env, jobject obj, jbyteArray address,
863581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh                               jint type, jboolean accept, jint passkey) {
864c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
865ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
866ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *addr;
867ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
868ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
869ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
870ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
871ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
872ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
873ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return result;
874ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
875ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
876581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh    int ret = sBluetoothInterface->ssp_reply((bt_bdaddr_t *)addr,
877581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh         (bt_ssp_variant_t) type, accept, passkey);
878b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
879ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
880ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
881ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
882ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
883ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
884ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean setAdapterPropertyNative(JNIEnv *env, jobject obj, jint type, jbyteArray value) {
885c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
886ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
887ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *val;
888ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
889ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
890ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
891ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    val = env->GetByteArrayElements(value, NULL);
892ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    bt_property_t prop;
893ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    prop.type = (bt_property_type_t) type;
894ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    prop.len = env->GetArrayLength(value);
895ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    prop.val = val;
896ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
897ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->set_adapter_property(&prop);
898b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(value, val, 0);
899ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
900ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
901ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
902ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
903ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
904ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean getAdapterPropertiesNative(JNIEnv *env, jobject obj) {
905c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
906ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
907ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
908ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
909ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
910ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->get_adapter_properties();
911ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
912ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
913ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
914ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
915ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
916ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean getAdapterPropertyNative(JNIEnv *env, jobject obj, jint type) {
917c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
918ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
919ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
920ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
921ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
922ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->get_adapter_property((bt_property_type_t) type);
923ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
924ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
925ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
926ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
927ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
928ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean getDevicePropertyNative(JNIEnv *env, jobject obj, jbyteArray address, jint type) {
929c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
930ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
931ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *addr = NULL;
932ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
933ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
934ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
935ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
936ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
937ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
938ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return result;
939ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
940ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
941ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->get_remote_device_property((bt_bdaddr_t *)addr,
942ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                                              (bt_property_type_t) type);
943b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
944ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
945ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
946ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
947ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
948ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
949ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic jboolean setDevicePropertyNative(JNIEnv *env, jobject obj, jbyteArray address,
950ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                        jint type, jbyteArray value) {
951c55a9837c004044051b71bb47182ace156691283Matthew Xie    ALOGV("%s:",__FUNCTION__);
952ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
953ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jbyte *val, *addr;
954ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    jboolean result = JNI_FALSE;
955ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (!sBluetoothInterface) return result;
956ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
957ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    val = env->GetByteArrayElements(value, NULL);
958ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (val == NULL) {
959ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
960ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return result;
961ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
962ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
963ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    addr = env->GetByteArrayElements(address, NULL);
964ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    if (addr == NULL) {
965b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        env->ReleaseByteArrayElements(value, val, 0);
966ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        jniThrowIOException(env, EINVAL);
967ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh        return result;
968ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    }
969ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
970ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
971ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    bt_property_t prop;
972ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    prop.type = (bt_property_type_t) type;
973ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    prop.len = env->GetArrayLength(value);
974ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    prop.val = val;
975ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
976ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    int ret = sBluetoothInterface->set_remote_device_property((bt_bdaddr_t *)addr, &prop);
977b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(value, val, 0);
978b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
979ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
980ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
981ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
982ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return result;
983ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
984ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
985c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredcstatic jboolean getRemoteServicesNative(JNIEnv *env, jobject obj, jbyteArray address) {
986e469f16e5a7d99471d7db1b216d422e8d12cc4cfMatthew Xie    ALOGV("%s:",__FUNCTION__);
987c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc
988c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    jbyte *addr = NULL;
989c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    jboolean result = JNI_FALSE;
990c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    if (!sBluetoothInterface) return result;
991c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc
992c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    addr = env->GetByteArrayElements(address, NULL);
993c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    if (addr == NULL) {
994c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        jniThrowIOException(env, EINVAL);
995c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc        return result;
996c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    }
997c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc
998c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    int ret = sBluetoothInterface->get_remote_services((bt_bdaddr_t *)addr);
999b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    env->ReleaseByteArrayElements(address, addr, 0);
1000c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
1001c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    return result;
1002c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc}
1003c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc
1004cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xiestatic int connectSocketNative(JNIEnv *env, jobject object, jbyteArray address, jint type,
1005cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie                                   jbyteArray uuidObj, jint channel, jint flag) {
1006cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    jbyte *addr = NULL, *uuid = NULL;
1007cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    int socket_fd;
1008cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    bt_status_t status;
1009cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1010b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if (!sBluetoothSocketInterface) return -1;
1011cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1012cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    addr = env->GetByteArrayElements(address, NULL);
1013cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (!addr) {
1014c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("failed to get Bluetooth device address");
1015cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        goto Fail;
1016cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1017cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1018bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    if(uuidObj != NULL) {
1019bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        uuid = env->GetByteArrayElements(uuidObj, NULL);
1020bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        if (!uuid) {
1021bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde            ALOGE("failed to get uuid");
1022bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde            goto Fail;
1023bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        }
1024cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1025cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1026cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if ( (status = sBluetoothSocketInterface->connect((bt_bdaddr_t *) addr, (btsock_type_t) type,
1027cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie                       (const uint8_t*) uuid, channel, &socket_fd, flag)) != BT_STATUS_SUCCESS) {
1028c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Socket connection failed: %d", status);
1029cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        goto Fail;
1030cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1031cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1032cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1033cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (socket_fd < 0) {
1034bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        ALOGE("Fail to create file descriptor on socket fd");
1035cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        goto Fail;
1036cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1037cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    env->ReleaseByteArrayElements(address, addr, 0);
1038cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    env->ReleaseByteArrayElements(uuidObj, uuid, 0);
1039cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    return socket_fd;
1040cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1041cc80b2261351dc74ad1bed237b0423c12d340514Matthew XieFail:
1042cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (addr) env->ReleaseByteArrayElements(address, addr, 0);
1043cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (uuid) env->ReleaseByteArrayElements(uuidObj, uuid, 0);
1044cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1045cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    return -1;
1046cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie}
1047cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1048cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xiestatic int createSocketChannelNative(JNIEnv *env, jobject object, jint type,
1049244e9c62a85a4b94e21bf1a8dee456e22bc767c4Casper Bonde                                     jstring name_str, jbyteArray uuidObj,
10505a60e47497f21f64e6d79420dc4c56c1907df22akschulz                                     jint channel, jint flag) {
1051bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    const char *service_name = NULL;
1052cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    jbyte *uuid = NULL;
1053cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    int socket_fd;
1054cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    bt_status_t status;
1055cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1056b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if (!sBluetoothSocketInterface) return -1;
1057cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
10588799f44e07ff7cde70a8d58893e995d3a9fa1e76Matthew Xie    ALOGV("%s: SOCK FLAG = %x", __FUNCTION__, flag);
10598799f44e07ff7cde70a8d58893e995d3a9fa1e76Matthew Xie
1060bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    if(name_str != NULL) {
1061bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        service_name = env->GetStringUTFChars(name_str, NULL);
1062bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    }
1063cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1064bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    if(uuidObj != NULL) {
1065bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        uuid = env->GetByteArrayElements(uuidObj, NULL);
1066bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        if (!uuid) {
1067bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde            ALOGE("failed to get uuid");
1068bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde            goto Fail;
1069bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        }
1070cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1071cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if ( (status = sBluetoothSocketInterface->listen((btsock_type_t) type, service_name,
1072cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie                       (const uint8_t*) uuid, channel, &socket_fd, flag)) != BT_STATUS_SUCCESS) {
1073c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Socket listen failed: %d", status);
1074cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        goto Fail;
1075cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1076cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1077cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (socket_fd < 0) {
1078c55a9837c004044051b71bb47182ace156691283Matthew Xie        ALOGE("Fail to creat file descriptor on socket fd");
1079cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie        goto Fail;
1080cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    }
1081cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (service_name) env->ReleaseStringUTFChars(name_str, service_name);
1082cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (uuid) env->ReleaseByteArrayElements(uuidObj, uuid, 0);
1083cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    return socket_fd;
1084cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
1085cc80b2261351dc74ad1bed237b0423c12d340514Matthew XieFail:
1086cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (service_name) env->ReleaseStringUTFChars(name_str, service_name);
1087cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    if (uuid) env->ReleaseByteArrayElements(uuidObj, uuid, 0);
1088cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    return -1;
1089cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie}
1090cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie
10919d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xustatic jboolean configHciSnoopLogNative(JNIEnv* env, jobject obj, jboolean enable) {
10929d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu    ALOGV("%s:",__FUNCTION__);
10939d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu
10949d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu    jboolean result = JNI_FALSE;
10959d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu
10969d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu    if (!sBluetoothInterface) return result;
10979d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu
10989d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu    int ret = sBluetoothInterface->config_hci_snoop_log(enable);
10999d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu
11009d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
11019d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu
11029d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu    return result;
11039d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu}
11049d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu
1105f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadhamstatic int readEnergyInfo()
1106f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham{
1107f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    ALOGV("%s:",__FUNCTION__);
1108f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    jboolean result = JNI_FALSE;
1109f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    if (!sBluetoothInterface) return result;
1110f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    int ret = sBluetoothInterface->read_energy_info();
1111f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    result = (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
1112f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    return result;
1113f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham}
1114f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham
1115f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbachstatic void dumpNative(JNIEnv *env, jobject obj, jobject fdObj)
1116f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach{
1117f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach    ALOGV("%s()", __FUNCTION__);
1118f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach    if (!sBluetoothInterface) return;
1119f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach
1120f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach    int fd = jniGetFDFromFileDescriptor(env, fdObj);
1121f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach    if (fd < 0) return;
1122f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach
1123f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach    sBluetoothInterface->dump(fd);
1124f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach}
1125f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach
11266eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panickerstatic jboolean factoryResetNative(JNIEnv *env, jobject obj) {
11276eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker    ALOGV("%s:", __FUNCTION__);
11286eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker    if (!sBluetoothInterface) return JNI_FALSE;
11296eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker    int ret = sBluetoothInterface->config_clear();
11306eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker    return (ret == BT_STATUS_SUCCESS) ? JNI_TRUE : JNI_FALSE;
11316eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker}
11326eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker
1133ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshstatic JNINativeMethod sMethods[] = {
1134b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    /* name, signature, funcPtr */
1135ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"classInitNative", "()V", (void *) classInitNative},
1136ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"initNative", "()Z", (void *) initNative},
1137ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"cleanupNative", "()V", (void*) cleanupNative},
1138ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"enableNative", "()Z",  (void*) enableNative},
1139ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"disableNative", "()Z",  (void*) disableNative},
1140ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"setAdapterPropertyNative", "(I[B)Z", (void*) setAdapterPropertyNative},
1141ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"getAdapterPropertiesNative", "()Z", (void*) getAdapterPropertiesNative},
1142ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"getAdapterPropertyNative", "(I)Z", (void*) getAdapterPropertyNative},
1143ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"getDevicePropertyNative", "([BI)Z", (void*) getDevicePropertyNative},
1144ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"setDevicePropertyNative", "([BI[B)Z", (void*) setDevicePropertyNative},
1145ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"startDiscoveryNative", "()Z", (void*) startDiscoveryNative},
1146ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"cancelDiscoveryNative", "()Z", (void*) cancelDiscoveryNative},
1147db681f3973bd8a088a878fd6f41d4330cdbc5522Andre Eisenbach    {"createBondNative", "([BI)Z", (void*) createBondNative},
1148ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"removeBondNative", "([B)Z", (void*) removeBondNative},
1149ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"cancelBondNative", "([B)Z", (void*) cancelBondNative},
11501e3e1ddf939bf71616245e1e100964568053d665Andre Eisenbach    {"getConnectionStateNative", "([B)I", (void*) getConnectionStateNative},
1151ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    {"pinReplyNative", "([BZI[B)Z", (void*) pinReplyNative},
1152581bb31a8165ff0f9c7d638cfe4a81aaaafa2dedJaikumar Ganesh    {"sspReplyNative", "([BIZI)Z", (void*) sspReplyNative},
1153c55ac7d42cf2d78c7edc67abf6c66813245b2c93fredc    {"getRemoteServicesNative", "([B)Z", (void*) getRemoteServicesNative},
1154cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    {"connectSocketNative", "([BI[BII)I", (void*) connectSocketNative},
1155cc80b2261351dc74ad1bed237b0423c12d340514Matthew Xie    {"createSocketChannelNative", "(ILjava/lang/String;[BII)I",
11569d80b509f715a3c3f2ebd0de373d427fc31a6e6cZhihai Xu     (void*) createSocketChannelNative},
11571e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    {"configHciSnoopLogNative", "(Z)Z", (void*) configHciSnoopLogNative},
11581e9f8a14e120e8786711abdd4a965236191c87adSharvil Nanavati    {"alarmFiredNative", "()V", (void *) alarmFiredNative},
1159f6eff2b71e9bc206f995e847e384507fb1c3e239Prerepa Viswanadham    {"readEnergyInfo", "()I", (void*) readEnergyInfo},
1160f5f90873574eefe5f50a7b383fcd8fefb961f66cAndre Eisenbach    {"dumpNative", "(Ljava/io/FileDescriptor;)V", (void*) dumpNative},
11616eb32d5f7c30f04da45c3da0974bbb63725a0978Ajay Panicker    {"factoryResetNative", "()Z", (void*)factoryResetNative}
1162ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh};
1163ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
1164ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshint register_com_android_bluetooth_btservice_AdapterService(JNIEnv* env)
1165ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh{
1166ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh    return jniRegisterNativeMethods(env, "com/android/bluetooth/btservice/AdapterService",
1167ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh                                    sMethods, NELEM(sMethods));
1168ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
1169ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
1170ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh} /* namespace android */
1171ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
1172ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh
1173ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh/*
1174ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh * JNI Initialization
1175ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh */
1176ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganeshjint JNI_OnLoad(JavaVM *jvm, void *reserved)
1177ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh{
1178b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    JNIEnv *e;
1179b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    int status;
1180b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1181b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    ALOGV("Bluetooth Adapter Service : loading JNI\n");
1182b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1183b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    // Check JNI version
1184b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if (jvm->GetEnv((void **)&e, JNI_VERSION_1_6)) {
1185b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("JNI version mismatch error");
1186b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1187b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1188b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1189b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_btservice_AdapterService(e)) < 0) {
1190b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("jni adapter service registration failure, status: %d", status);
1191b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1192b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1193b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1194b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_hfp(e)) < 0) {
1195b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("jni hfp registration failure, status: %d", status);
1196b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1197aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta    }
1198aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta
1199aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta    if ((status = android::register_com_android_bluetooth_hfpclient(e)) < 0) {
1200aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta        ALOGE("jni hfp client registration failure, status: %d", status);
1201aebc726105204f8a7b977eb3556c14b5ba18a5caHemant Gupta        return JNI_ERR;
1202b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1203b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1204b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_a2dp(e)) < 0) {
1205c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood        ALOGE("jni a2dp source registration failure: %d", status);
1206c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood        return JNI_ERR;
1207c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood    }
1208c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood
1209c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood    if ((status = android::register_com_android_bluetooth_a2dp_sink(e)) < 0) {
1210c030f08f419d596c4aa216c9cca9867e7b5486f0Mike Lockwood        ALOGE("jni a2dp sink registration failure: %d", status);
1211b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1212b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1213b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1214c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu    if ((status = android::register_com_android_bluetooth_avrcp(e)) < 0) {
1215066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood        ALOGE("jni avrcp target registration failure: %d", status);
1216066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood        return JNI_ERR;
1217066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood    }
1218066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood
1219066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood    if ((status = android::register_com_android_bluetooth_avrcp_controller(e)) < 0) {
1220066ad9e16a548218b139424f758b92db7af34af2Mike Lockwood        ALOGE("jni avrcp controller registration failure: %d", status);
1221c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu        return JNI_ERR;
1222c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu    }
1223c1c259c0ace7195240f1443c805995bfe8692a72Zhihai Xu
1224b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_hid(e)) < 0) {
1225b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("jni hid registration failure: %d", status);
1226b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1227b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1228b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1229b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_hdp(e)) < 0) {
1230b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("jni hdp registration failure: %d", status);
1231b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1232b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1233b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1234b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_pan(e)) < 0) {
1235b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("jni pan registration failure: %d", status);
1236b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1237b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1238b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom
1239b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    if ((status = android::register_com_android_bluetooth_gatt(e)) < 0) {
1240b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        ALOGE("jni gatt registration failure: %d", status);
1241b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom        return JNI_ERR;
1242b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    }
1243bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde
1244bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    if ((status = android::register_com_android_bluetooth_sdp(e)) < 0) {
1245bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        ALOGE("jni sdp registration failure: %d", status);
1246bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde        return JNI_ERR;
1247bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde    }
1248bbb4110b455b3aa29106d5b4f0a37e1be8e09475Casper Bonde
1249b241cda1eec2fbefd6d21e0819532f7a76947635Brian Carlstrom    return JNI_VERSION_1_6;
1250ff4f17bf64978d0738c66e1b6dd70be8664efc24Jaikumar Ganesh}
1251