diff options
author | Thomas Martitz <kugel@rockbox.org> | 2010-11-06 01:01:01 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2010-11-06 01:01:01 +0000 |
commit | 988bdc1cc4d4cbe88da848de80d79aeac195464e (patch) | |
tree | 123bbcdd00fbe1ed9d43b304ccb13e8346980564 | |
parent | be51be6a9917574db9cf8fe69089cdb44d5b1eb3 (diff) | |
download | rockbox-988bdc1cc4d4cbe88da848de80d79aeac195464e.tar.gz rockbox-988bdc1cc4d4cbe88da848de80d79aeac195464e.zip |
Android: Use wakeup objects instead of polling for the dialog results in the keyboard and yesno dialog, allowing a lot of code to be removed.
First part of FS#11708
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28512 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r-- | android/src/org/rockbox/RockboxKeyboardInput.java | 14 | ||||
-rw-r--r-- | android/src/org/rockbox/RockboxYesno.java | 35 | ||||
-rw-r--r-- | apps/hosted/keyboard.c | 66 | ||||
-rw-r--r-- | apps/hosted/yesno.c | 37 | ||||
-rw-r--r-- | firmware/export/config.h | 3 |
5 files changed, 74 insertions, 81 deletions
diff --git a/android/src/org/rockbox/RockboxKeyboardInput.java b/android/src/org/rockbox/RockboxKeyboardInput.java index 3024b6b685..210cbbd258 100644 --- a/android/src/org/rockbox/RockboxKeyboardInput.java +++ b/android/src/org/rockbox/RockboxKeyboardInput.java @@ -43,21 +43,13 @@ public class RockboxKeyboardInput { public void onComplete(int resultCode, Intent data) { - if (resultCode == Activity.RESULT_OK) - { - result = data.getStringExtra("value"); - } - else { - result = ""; - } + put_result(resultCode == Activity.RESULT_OK, + data.getStringExtra("value")); } }); } - public String get_result() - { - return result; - } + private native void put_result(boolean accepted, String new_string); public boolean is_usable() { return RockboxService.get_instance().get_activity() != null; diff --git a/android/src/org/rockbox/RockboxYesno.java b/android/src/org/rockbox/RockboxYesno.java index f6554715be..aa5e83d749 100644 --- a/android/src/org/rockbox/RockboxYesno.java +++ b/android/src/org/rockbox/RockboxYesno.java @@ -26,15 +26,8 @@ import android.content.Intent; public class RockboxYesno { - private boolean result; - private boolean have_result; - - public RockboxYesno() - { - have_result = false; - } - - public void yesno_display(String text) + @SuppressWarnings("unused") + private void yesno_display(String text) { RockboxActivity a = (RockboxActivity) RockboxService.get_instance().get_activity(); Intent kbd = new Intent(a, YesnoActivity.class); @@ -43,30 +36,16 @@ public class RockboxYesno { public void onComplete(int resultCode, Intent data) { - if (resultCode == Activity.RESULT_OK) - { - result = true; - have_result = true; - } - else { - result = false; - have_result = true; - } + put_result(resultCode == Activity.RESULT_OK); } }); } - public boolean result_ready() - { - return have_result; - } - public boolean get_result() - { - return result; - } - - public boolean is_usable() + @SuppressWarnings("unused") + private boolean is_usable() { return RockboxService.get_instance().get_activity() != null; } + + private native void put_result(boolean result); } diff --git a/apps/hosted/keyboard.c b/apps/hosted/keyboard.c index 2b77825af0..6cc14d654f 100644 --- a/apps/hosted/keyboard.c +++ b/apps/hosted/keyboard.c @@ -23,21 +23,40 @@ #if (CONFIG_PLATFORM&PLATFORM_ANDROID) #include <jni.h> #include <stdbool.h> -#include <stdio.h> -#include <string.h> -#include <system.h> +#include "string-extra.h" +#include "kernel.h" -extern JNIEnv *env_ptr; -static jclass RockboxKeyboardInput_class; -static jobject RockboxKeyboardInput_instance; -static jmethodID kbd_inputfunc, kbd_result; +extern JNIEnv *env_ptr; +static jclass RockboxKeyboardInput_class; +static jobject RockboxKeyboardInput_instance; +static jmethodID kbd_inputfunc; +static struct wakeup kbd_wakeup; +static bool accepted; +static jstring new_string; + +JNIEXPORT void JNICALL +Java_org_rockbox_RockboxKeyboardInput_put_1result(JNIEnv *env, jobject this, + jboolean _accepted, + jstring _new_string) +{ + (void)env;(void)this; + + accepted = (bool)_accepted; + if (accepted) + { + new_string = _new_string; + (*env)->NewGlobalRef(env, new_string); /* prevet GC'ing */ + } + wakeup_signal(&kbd_wakeup); +} static void kdb_init(void) { JNIEnv e = *env_ptr; - jmethodID kbd_is_usable; + static jmethodID kbd_is_usable; if (RockboxKeyboardInput_class == NULL) { + wakeup_init(&kbd_wakeup); /* get the class and its constructor */ RockboxKeyboardInput_class = e->FindClass(env_ptr, "org/rockbox/RockboxKeyboardInput"); @@ -49,12 +68,11 @@ static void kdb_init(void) constructor); kbd_inputfunc = e->GetMethodID(env_ptr, RockboxKeyboardInput_class, "kbd_input", "(Ljava/lang/String;)V"); - kbd_result = e->GetMethodID(env_ptr, RockboxKeyboardInput_class, - "get_result", "()Ljava/lang/String;"); + kbd_is_usable = e->GetMethodID(env_ptr, RockboxKeyboardInput_class, + "is_usable", "()Z"); } + /* need to get it every time incase the activity died/restarted */ - kbd_is_usable = e->GetMethodID(env_ptr, RockboxKeyboardInput_class, - "is_usable", "()Z"); while (!e->CallBooleanMethod(env_ptr, RockboxKeyboardInput_instance, kbd_is_usable)) sleep(HZ/10); @@ -64,24 +82,22 @@ int kbd_input(char* text, int buflen) { JNIEnv e = *env_ptr; jstring str = e->NewStringUTF(env_ptr, text); - jobject ret; - const char* retchars; + const char *utf8_string; kdb_init(); e->CallVoidMethod(env_ptr, RockboxKeyboardInput_instance,kbd_inputfunc,str); - do { - sleep(HZ/10); - ret = e->CallObjectMethod(env_ptr, RockboxKeyboardInput_instance, - kbd_result); - } while (!ret); - - retchars = e->GetStringUTFChars(env_ptr, ret, 0); - if (retchars[0]) - strncpy(text, retchars, buflen); - e->ReleaseStringUTFChars(env_ptr, ret, retchars); + wakeup_wait(&kbd_wakeup, TIMEOUT_BLOCK); + + if (accepted) + { + utf8_string = e->GetStringUTFChars(env_ptr, new_string, 0); + strlcpy(text, utf8_string, buflen); + e->ReleaseStringUTFChars(env_ptr, new_string, utf8_string); + e->DeleteGlobalRef(env_ptr, new_string); + } - return text[0] ? 0 : 1; /* return 0 on success */ + return !accepted; /* return 0 on success */ } int load_kbd(unsigned char* filename) diff --git a/apps/hosted/yesno.c b/apps/hosted/yesno.c index 9858e66438..2a8c02edd5 100644 --- a/apps/hosted/yesno.c +++ b/apps/hosted/yesno.c @@ -24,22 +24,34 @@ #include <jni.h> #include <stdbool.h> #include <stdio.h> -#include <system.h> #include "yesno.h" #include "settings.h" #include "lang.h" +#include "kernel.h" extern JNIEnv *env_ptr; static jclass RockboxYesno_class = NULL; static jobject RockboxYesno_instance = NULL; -static jmethodID yesno_func, result_ready, yesno_result; +static jmethodID yesno_func; +static struct wakeup yesno_wakeup; +static bool ret; + +JNIEXPORT void JNICALL +Java_org_rockbox_RockboxYesno_put_1result(JNIEnv *env, jobject this, jboolean result) +{ + (void)env; + (void)this; + ret = (bool)result; + wakeup_signal(&yesno_wakeup); +} static void yesno_init(void) { JNIEnv e = *env_ptr; - jmethodID yesno_is_usable; + static jmethodID yesno_is_usable; if (RockboxYesno_class == NULL) { + wakeup_init(&yesno_wakeup); /* get the class and its constructor */ RockboxYesno_class = e->FindClass(env_ptr, "org/rockbox/RockboxYesno"); @@ -51,14 +63,10 @@ static void yesno_init(void) constructor); yesno_func = e->GetMethodID(env_ptr, RockboxYesno_class, "yesno_display", "(Ljava/lang/String;)V"); - yesno_result = e->GetMethodID(env_ptr, RockboxYesno_class, - "get_result", "()Z"); - result_ready = e->GetMethodID(env_ptr, RockboxYesno_class, - "result_ready", "()Z"); + yesno_is_usable = e->GetMethodID(env_ptr, RockboxYesno_class, + "is_usable", "()Z"); } /* need to get it every time incase the activity died/restarted */ - yesno_is_usable = e->GetMethodID(env_ptr, RockboxYesno_class, - "is_usable", "()Z"); while (!e->CallBooleanMethod(env_ptr, RockboxYesno_instance, yesno_is_usable)) sleep(HZ/10); @@ -92,16 +100,13 @@ enum yesno_res gui_syncyesno_run(const struct text_message * main_message, JNIEnv e = *env_ptr; jstring message = build_message(main_message); - jboolean ret; e->CallVoidMethod(env_ptr, RockboxYesno_instance, yesno_func, message); - - do { - sleep(HZ/10); - ret = e->CallBooleanMethod(env_ptr, RockboxYesno_instance, result_ready); - } while (!ret); - ret = e->CallBooleanMethod(env_ptr, RockboxYesno_instance, yesno_result); + wakeup_wait(&yesno_wakeup, TIMEOUT_BLOCK); + + e->DeleteLocalRef(env_ptr, message); + return ret ? YESNO_YES : YESNO_NO; } diff --git a/firmware/export/config.h b/firmware/export/config.h index d005aae976..3a7328315b 100644 --- a/firmware/export/config.h +++ b/firmware/export/config.h @@ -721,7 +721,8 @@ Lyre prototype 1 */ #if defined(HAVE_USBSTACK) || (CONFIG_CPU == JZ4732) \ || (CONFIG_CPU == AS3525) || (CONFIG_CPU == AS3525v2) \ - || defined(CPU_S5L870X) || (CONFIG_CPU == S3C2440) + || defined(CPU_S5L870X) || (CONFIG_CPU == S3C2440) \ + || defined(APPLICATION) #define HAVE_WAKEUP_OBJECTS #endif |