summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteve Kondik <shade@chemlab.org>2010-12-02 01:50:14 +0000
committerGerrit Code Review <gerrit@review.cyanogenmod.com>2010-12-02 01:50:14 +0000
commit9196970fc8f503dcab546ca86f3c560bbf4590d6 (patch)
tree2f089e87f5bc1baefeaf37e760482badb7171a4e
parent366927ff8bbb696f12be295938ee2041b890b05c (diff)
parent28c7b7d46b4dff4cf680c54c9578577846879e21 (diff)
downloadframeworks_base-9196970fc8f503dcab546ca86f3c560bbf4590d6.zip
frameworks_base-9196970fc8f503dcab546ca86f3c560bbf4590d6.tar.gz
frameworks_base-9196970fc8f503dcab546ca86f3c560bbf4590d6.tar.bz2
Merge "GPS: Retry inject XTRA on failure; immediately for some devices." into froyo
-rw-r--r--core/jni/Android.mk4
-rwxr-xr-xcore/jni/android_location_GpsLocationProvider.cpp23
-rwxr-xr-xlocation/java/com/android/internal/location/GpsLocationProvider.java8
3 files changed, 30 insertions, 5 deletions
diff --git a/core/jni/Android.mk b/core/jni/Android.mk
index b752ecf..ac188b8 100644
--- a/core/jni/Android.mk
+++ b/core/jni/Android.mk
@@ -19,6 +19,10 @@ ifneq ($(USE_CUSTOM_RUNTIME_HEAP_MAX),)
LOCAL_CFLAGS += -DCUSTOM_RUNTIME_HEAP_MAX=$(USE_CUSTOM_RUNTIME_HEAP_MAX)
endif
+ifneq ($(BOARD_USE_BROKEN_INJECT_XTRA_HACK),)
+ LOCAL_CFLAGS += -DUSE_BROKEN_INJECT_XTRA_HACK=1
+endif
+
LOCAL_CFLAGS += -DGL_GLEXT_PROTOTYPES -DEGL_EGLEXT_PROTOTYPES
LOCAL_SRC_FILES:= \
diff --git a/core/jni/android_location_GpsLocationProvider.cpp b/core/jni/android_location_GpsLocationProvider.cpp
index f60fe6d..52a4171 100755
--- a/core/jni/android_location_GpsLocationProvider.cpp
+++ b/core/jni/android_location_GpsLocationProvider.cpp
@@ -429,13 +429,30 @@ static jboolean android_location_GpsLocationProvider_supports_xtra(JNIEnv* env,
return (sGpsXtraInterface != NULL);
}
-static void android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj,
+#ifdef USE_BROKEN_INJECT_XTRA_HACK
+static jboolean android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj,
jbyteArray data, jint length)
{
+ int ret = -1, tries;
jbyte* bytes = env->GetByteArrayElements(data, 0);
- sGpsXtraInterface->inject_xtra_data((char *)bytes, length);
+ for (tries = 0; tries < 5 && ret; ++tries) {
+ LOGV("Injecting XTRA data (try %d)\n", tries);
+ ret = sGpsXtraInterface->inject_xtra_data((char *)bytes, length);
+ }
+ env->ReleaseByteArrayElements(data, bytes, 0);
+ return (ret != 0);
+}
+#else
+static jboolean android_location_GpsLocationProvider_inject_xtra_data(JNIEnv* env, jobject obj,
+ jbyteArray data, jint length)
+{
+ int ret;
+ jbyte* bytes = env->GetByteArrayElements(data, 0);
+ ret = sGpsXtraInterface->inject_xtra_data((char *)bytes, length);
env->ReleaseByteArrayElements(data, bytes, 0);
+ return (ret != 0);
}
+#endif
static void android_location_GpsLocationProvider_agps_data_conn_open(JNIEnv* env, jobject obj, jstring apn)
{
@@ -525,7 +542,7 @@ static JNINativeMethod sMethods[] = {
{"native_inject_time", "(JJI)V", (void*)android_location_GpsLocationProvider_inject_time},
{"native_inject_location", "(DDF)V", (void*)android_location_GpsLocationProvider_inject_location},
{"native_supports_xtra", "()Z", (void*)android_location_GpsLocationProvider_supports_xtra},
- {"native_inject_xtra_data", "([BI)V", (void*)android_location_GpsLocationProvider_inject_xtra_data},
+ {"native_inject_xtra_data", "([BI)Z", (void*)android_location_GpsLocationProvider_inject_xtra_data},
{"native_agps_data_conn_open", "(Ljava/lang/String;)V", (void*)android_location_GpsLocationProvider_agps_data_conn_open},
{"native_agps_data_conn_closed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_closed},
{"native_agps_data_conn_failed", "()V", (void*)android_location_GpsLocationProvider_agps_data_conn_failed},
diff --git a/location/java/com/android/internal/location/GpsLocationProvider.java b/location/java/com/android/internal/location/GpsLocationProvider.java
index be562f1..15c4b4b 100755
--- a/location/java/com/android/internal/location/GpsLocationProvider.java
+++ b/location/java/com/android/internal/location/GpsLocationProvider.java
@@ -540,7 +540,11 @@ public class GpsLocationProvider implements LocationProviderInterface {
if (DEBUG) {
Log.d(TAG, "calling native_inject_xtra_data");
}
- native_inject_xtra_data(data, data.length);
+ if (!native_inject_xtra_data(data, data.length)) {
+ // try again later
+ mHandler.removeMessages(DOWNLOAD_XTRA_DATA);
+ mHandler.sendMessageDelayed(Message.obtain(mHandler, DOWNLOAD_XTRA_DATA), RETRY_INTERVAL);
+ }
} else {
// try again later
mHandler.removeMessages(DOWNLOAD_XTRA_DATA);
@@ -1460,7 +1464,7 @@ public class GpsLocationProvider implements LocationProviderInterface {
// XTRA Support
private native void native_inject_time(long time, long timeReference, int uncertainty);
private native boolean native_supports_xtra();
- private native void native_inject_xtra_data(byte[] data, int length);
+ private native boolean native_inject_xtra_data(byte[] data, int length);
// DEBUG Support
private native String native_get_internal_state();