1
0
Fork 0
forked from len0rd/rockbox

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
This commit is contained in:
Thomas Martitz 2010-11-06 01:01:01 +00:00
parent be51be6a99
commit 988bdc1cc4
5 changed files with 74 additions and 81 deletions

View file

@ -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;

View file

@ -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);
}

View file

@ -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;
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;");
}
/* need to get it every time incase the activity died/restarted */
kbd_is_usable = e->GetMethodID(env_ptr, RockboxKeyboardInput_class,
"is_usable", "()Z");
}
/* need to get it every time incase the activity died/restarted */
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);
wakeup_wait(&kbd_wakeup, TIMEOUT_BLOCK);
retchars = e->GetStringUTFChars(env_ptr, ret, 0);
if (retchars[0])
strncpy(text, retchars, buflen);
e->ReleaseStringUTFChars(env_ptr, ret, retchars);
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)

View file

@ -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");
}
/* need to get it every time incase the activity died/restarted */
yesno_is_usable = e->GetMethodID(env_ptr, RockboxYesno_class,
"is_usable", "()Z");
}
/* need to get it every time incase the activity died/restarted */
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);
wakeup_wait(&yesno_wakeup, TIMEOUT_BLOCK);
e->DeleteLocalRef(env_ptr, message);
ret = e->CallBooleanMethod(env_ptr, RockboxYesno_instance, yesno_result);
return ret ? YESNO_YES : YESNO_NO;
}

View file

@ -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