Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 28c7b7d4 authored by Christopher Lais's avatar Christopher Lais
Browse files

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
parent a04bce38
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -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:= \
+20 −3
Original line number Diff line number Diff line
@@ -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},
+6 −2
Original line number Diff line number Diff line
@@ -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();