diff options
author | Christopher Lais <chris+android@zenthought.org> | 2010-12-01 19:41:31 -0600 |
---|---|---|
committer | Christopher Lais <chris+android@zenthought.org> | 2010-12-01 19:45:18 -0600 |
commit | 28c7b7d46b4dff4cf680c54c9578577846879e21 (patch) | |
tree | 103f03615498430fdc81323b2874e5014d960fac | |
parent | a04bce380373c621795d6739314a494dfa924129 (diff) | |
download | frameworks_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.mk | 4 | ||||
-rwxr-xr-x | core/jni/android_location_GpsLocationProvider.cpp | 23 | ||||
-rwxr-xr-x | location/java/com/android/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(); |