From b92eabd38b6c06d598e85dcfc6e2244631efa11f Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Sun, 31 Oct 2010 13:12:01 +0000 Subject: Use a native yes/no dialog instead of rockbox's internal one on android git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28415 a1c6a512-1295-4272-9138-f99709370657 --- apps/SOURCES | 4 ++ apps/hosted/yesno.c | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+) create mode 100644 apps/hosted/yesno.c (limited to 'apps') diff --git a/apps/SOURCES b/apps/SOURCES index cb5e6ef876..c3020ecb2f 100644 --- a/apps/SOURCES +++ b/apps/SOURCES @@ -89,7 +89,11 @@ gui/statusbar.c #ifdef HAVE_LCD_BITMAP gui/statusbar-skinned.c #endif +#if (CONFIG_PLATFORM&PLATFORM_ANDROID) +hosted/yesno.c +#else gui/yesno.c +#endif gui/viewport.c gui/skin_engine/skin_backdrops.c diff --git a/apps/hosted/yesno.c b/apps/hosted/yesno.c new file mode 100644 index 0000000000..1e05e193f7 --- /dev/null +++ b/apps/hosted/yesno.c @@ -0,0 +1,110 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2010 Jonathan Gordon + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#include "config.h" + +#if (CONFIG_PLATFORM&PLATFORM_ANDROID) +#include +#include +#include +#include +#include "yesno.h" +#include "settings.h" +#include "lang.h" + +extern JNIEnv *env_ptr; +static jclass RockboxYesno_class = NULL; +static jobject RockboxYesno_instance = NULL; +static jmethodID yesno_func, result_ready, yesno_result; + +static void yesno_init(void) +{ + JNIEnv e = *env_ptr; + jmethodID yesno_is_usable; + if (RockboxYesno_class == NULL) + { + /* get the class and its constructor */ + RockboxYesno_class = e->FindClass(env_ptr, + "org/rockbox/RockboxYesno"); + jmethodID constructor = e->GetMethodID(env_ptr, + RockboxYesno_class, + "", "()V"); + RockboxYesno_instance = e->NewObject(env_ptr, + RockboxYesno_class, + 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"); + while (!e->CallBooleanMethod(env_ptr, RockboxYesno_instance, + yesno_is_usable)) + sleep(HZ/10); +} + +jstring build_message(const struct text_message *message) +{ + char msg[1024] = ""; + JNIEnv e = *env_ptr; + int i; + for(i=0; inb_lines; i++) + { + char* text = P2STR((unsigned char *)message->message_lines[i]); + if (i>0) + strlcat(msg, "\n", 1024); + strlcat(msg, text, 1024); + } + /* make sure the questions end in a ?, for some reason they dont! */ + if (!strrchr(msg, '?')) + strlcat(msg, "?", 1024); + return e->NewStringUTF(env_ptr, msg); +} + +enum yesno_res gui_syncyesno_run(const struct text_message * main_message, + const struct text_message * yes_message, + const struct text_message * no_message) +{ + (void)yes_message; + (void)no_message; + yesno_init(); + + JNIEnv e = *env_ptr; + jstring message = build_message(main_message); + jboolean ret; + + e->CallVoidMethod(env_ptr, RockboxYesno_instance, yesno_func, message); + e->ReleaseStringUTFChars(env_ptr, message, NULL); + + + do { + sleep(HZ/10); + ret = e->CallBooleanMethod(env_ptr, RockboxYesno_instance, result_ready); + } while (!ret); + + ret = e->CallBooleanMethod(env_ptr, RockboxYesno_instance, yesno_result); + return ret ? YESNO_YES : YESNO_NO; +} + +#endif -- cgit v1.2.3