diff options
author | Steve Kondik <shade@chemlab.org> | 2010-12-02 01:50:14 +0000 |
---|---|---|
committer | Gerrit Code Review <gerrit@review.cyanogenmod.com> | 2010-12-02 01:50:14 +0000 |
commit | 9196970fc8f503dcab546ca86f3c560bbf4590d6 (patch) | |
tree | 2f089e87f5bc1baefeaf37e760482badb7171a4e | |
parent | 366927ff8bbb696f12be295938ee2041b890b05c (diff) | |
parent | 28c7b7d46b4dff4cf680c54c9578577846879e21 (diff) | |
download | frameworks_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.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(); |