From 28c7b7d46b4dff4cf680c54c9578577846879e21 Mon Sep 17 00:00:00 2001 From: Christopher Lais Date: Wed, 1 Dec 2010 19:41:31 -0600 Subject: 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 --- core/jni/Android.mk | 4 ++++ core/jni/android_location_GpsLocationProvider.cpp | 23 +++++++++++++++++++--- .../internal/location/GpsLocationProvider.java | 8 ++++++-- 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(); -- cgit v1.1