summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Martitz <kugel@rockbox.org>2010-11-06 01:01:01 +0000
committerThomas Martitz <kugel@rockbox.org>2010-11-06 01:01:01 +0000
commit988bdc1cc4d4cbe88da848de80d79aeac195464e (patch)
tree123bbcdd00fbe1ed9d43b304ccb13e8346980564
parentbe51be6a9917574db9cf8fe69089cdb44d5b1eb3 (diff)
downloadrockbox-988bdc1cc4d4cbe88da848de80d79aeac195464e.tar.gz
rockbox-988bdc1cc4d4cbe88da848de80d79aeac195464e.tar.bz2
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.java14
-rw-r--r--android/src/org/rockbox/RockboxYesno.java35
-rw-r--r--apps/hosted/keyboard.c66
-rw-r--r--apps/hosted/yesno.c37
-rw-r--r--firmware/export/config.h3
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