Add an API to set the link timeout.

This fixes the problem where the car dock is
powered on and off pretty quickly.

Change-Id: I8724641b8c337019f089b005cb236fc90549cf6f
This commit is contained in:
Jaikumar Ganesh
2010-03-09 15:31:24 -08:00
parent 529b2854de
commit b7e029d03c
3 changed files with 34 additions and 0 deletions

View File

@@ -374,6 +374,11 @@ class BluetoothEventLoop {
Intent intent = null;
if (propValues[1].equals("true")) {
intent = new Intent(BluetoothDevice.ACTION_ACL_CONNECTED);
// Set the link timeout to 8000 slots (5 sec timeout)
// for bluetooth docks.
if (mBluetoothService.isBluetoothDock(address)) {
mBluetoothService.setLinkTimeout(address, 8000);
}
} else {
intent = new Intent(BluetoothDevice.ACTION_ACL_DISCONNECTED);
}

View File

@@ -1910,6 +1910,13 @@ public class BluetoothService extends IBluetooth.Stub {
return path;
}
/*package */ void setLinkTimeout(String address, int num_slots) {
String path = getObjectPathFromAddress(address);
boolean result = setLinkTimeoutNative(path, num_slots);
if (!result) log("Set Link Timeout to:" + num_slots + " slots failed");
}
private static void log(String msg) {
Log.d(TAG, msg);
}
@@ -1953,4 +1960,5 @@ public class BluetoothService extends IBluetooth.Stub {
private native int addRfcommServiceRecordNative(String name, long uuidMsb, long uuidLsb,
short channel);
private native boolean removeServiceRecordNative(int handle);
private native boolean setLinkTimeoutNative(String path, int num_slots);
}

View File

@@ -861,6 +861,26 @@ static jboolean removeServiceRecordNative(JNIEnv *env, jobject object, jint hand
return JNI_FALSE;
}
static jboolean setLinkTimeoutNative(JNIEnv *env, jobject object, jstring object_path,
jint num_slots) {
LOGV(__FUNCTION__);
#ifdef HAVE_BLUETOOTH
native_data_t *nat = get_native_data(env, object);
if (nat) {
const char *c_object_path = env->GetStringUTFChars(object_path, NULL);
DBusMessage *reply = dbus_func_args(env, nat->conn,
get_adapter_path(env, object),
DBUS_ADAPTER_IFACE, "SetLinkTimeout",
DBUS_TYPE_OBJECT_PATH, &c_object_path,
DBUS_TYPE_UINT32, &num_slots,
DBUS_TYPE_INVALID);
env->ReleaseStringUTFChars(object_path, c_object_path);
return reply ? JNI_TRUE : JNI_FALSE;
}
#endif
return JNI_FALSE;
}
static JNINativeMethod sMethods[] = {
/* name, signature, funcPtr */
{"classInitNative", "()V", (void*)classInitNative},
@@ -905,6 +925,7 @@ static JNINativeMethod sMethods[] = {
{"discoverServicesNative", "(Ljava/lang/String;Ljava/lang/String;)Z", (void *)discoverServicesNative},
{"addRfcommServiceRecordNative", "(Ljava/lang/String;JJS)I", (void *)addRfcommServiceRecordNative},
{"removeServiceRecordNative", "(I)Z", (void *)removeServiceRecordNative},
{"setLinkTimeoutNative", "(Ljava/lang/String;I)Z", (void *)setLinkTimeoutNative},
};
int register_android_server_BluetoothService(JNIEnv *env) {