summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Lais <chris+android@zenthought.org>2010-12-01 19:41:31 -0600
committerChristopher Lais <chris+android@zenthought.org>2010-12-01 19:45:18 -0600
commit28c7b7d46b4dff4cf680c54c9578577846879e21 (patch)
tree103f03615498430fdc81323b2874e5014d960fac
parenta04bce380373c621795d6739314a494dfa924129 (diff)
downloadframeworks_base-28c7b7d46b4dff4cf680c54c9578577846879e21.zip
frameworks_base-28c7b7d46b4dff4cf680c54c9578577846879e21.tar.gz
frameworks_base-28c7b7d46b4dff4cf680c54c9578577846879e21.tar.bz2
GPS: Retry inject XTRA on failure; immediately for some devices.
Some proprietary location libraries like to get interrupted while injecting xtra data when other processes that use RPC calls are starting during boot. This patch retries inject_xtra_data immediately several times on such devices (set with BOARD_USE_BROKEN_INJECT_XTRA_HACK:=true) and retries at the normal interval on devices without that flag set. Change-Id: I11e4b96721cc223863b17146e6b49684e27ad225
-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();