From a41041aeb431c259dc79a203821e81b00c63ebe9 Mon Sep 17 00:00:00 2001 From: Jonathan Gordon Date: Wed, 3 Nov 2010 14:34:57 +0000 Subject: Remote android button handling (again). do the press/unpress more like other targets (i.e correctly). The DPAD is special in that the press/unpress happens too quickly, so always post it with the BUTTON_REL. This means all keymaps using the dpad need to remember it will always have a BUTTON_REL (which also means they cant do repeats, which are impossible anyway). Also make the back button go back to the OS home from the rockbox main menu git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28475 a1c6a512-1295-4272-9138-f99709370657 --- apps/keymaps/keymap-android.c | 46 +++++++--------------- apps/root_menu.c | 8 ++++ .../target/hosted/android/app/button-application.c | 46 ++++++++++++++++------ firmware/target/hosted/android/app/button-target.h | 2 + firmware/target/hosted/android/button-android.c | 28 ++++++++----- 5 files changed, 75 insertions(+), 55 deletions(-) diff --git a/apps/keymaps/keymap-android.c b/apps/keymaps/keymap-android.c index cbc20c3e67..939adb8d0a 100644 --- a/apps/keymaps/keymap-android.c +++ b/apps/keymaps/keymap-android.c @@ -38,15 +38,14 @@ */ static const struct button_mapping button_context_standard[] = { - { ACTION_STD_PREV, BUTTON_DPAD_UP, BUTTON_NONE }, - { ACTION_STD_PREVREPEAT, BUTTON_DPAD_UP|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_NEXT, BUTTON_DPAD_DOWN, BUTTON_NONE }, - { ACTION_STD_NEXTREPEAT, BUTTON_DPAD_DOWN|BUTTON_REPEAT, BUTTON_NONE }, + { ACTION_STD_PREV, BUTTON_DPAD_UP|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_NEXT, BUTTON_DPAD_DOWN|BUTTON_REL, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_DPAD_CENTER|BUTTON_REL, BUTTON_DPAD_CENTER }, - { ACTION_STD_OK, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_DPAD_RIGHT }, - { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_DPAD_LEFT }, + { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REPEAT, BUTTON_BACK }, + { ACTION_STD_CANCEL, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_NONE }, { ACTION_STD_CONTEXT, BUTTON_MENU, BUTTON_NONE }, @@ -78,12 +77,10 @@ static const struct button_mapping button_context_listtree_scroll_without_combo[ }; static const struct button_mapping button_context_settings[] = { - { ACTION_SETTINGS_INC, BUTTON_DPAD_RIGHT, BUTTON_NONE }, - { ACTION_SETTINGS_INCREPEAT, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_SETTINGS_DEC, BUTTON_DPAD_LEFT, BUTTON_NONE }, - { ACTION_SETTINGS_DECREPEAT, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE }, - { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, + { ACTION_SETTINGS_INC, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_NONE }, + { ACTION_SETTINGS_DEC, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE }, + { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_settings */ @@ -124,24 +121,13 @@ static const struct button_mapping button_context_quickscreen[] = { static const struct button_mapping button_context_pitchscreen[] = { - { ACTION_PS_INC_SMALL, BUTTON_DPAD_RIGHT, BUTTON_NONE }, - { ACTION_PS_INC_BIG, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_DEC_SMALL, BUTTON_DPAD_LEFT, BUTTON_NONE }, - { ACTION_PS_DEC_BIG, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_PS_EXIT, BUTTON_BACK, BUTTON_NONE }, + { ACTION_PS_INC_SMALL, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_DEC_SMALL, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_NONE }, + { ACTION_PS_EXIT, BUTTON_BACK, BUTTON_NONE }, LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) }; /* button_context_pitchcreen */ -static const struct button_mapping button_context_keyboard[] = { - { ACTION_KBD_PAGE_FLIP, BUTTON_MENU, BUTTON_NONE }, - { ACTION_KBD_CURSOR_LEFT, BUTTON_DPAD_LEFT, BUTTON_NONE }, - { ACTION_KBD_CURSOR_LEFT, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE }, - { ACTION_KBD_CURSOR_RIGHT, BUTTON_DPAD_RIGHT, BUTTON_NONE }, - { ACTION_KBD_CURSOR_RIGHT, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE }, - - LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD) -}; /* button_context_keyboard */ static const struct button_mapping button_context_radio[] = { LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS) @@ -181,8 +167,6 @@ const struct button_mapping* target_get_context_mapping(int context) case CONTEXT_SETTINGS_TIME: return button_context_time; - case CONTEXT_YESNOSCREEN: - return button_context_yesno; case CONTEXT_FM: return button_context_radio; case CONTEXT_BOOKMARKSCREEN: @@ -191,8 +175,6 @@ const struct button_mapping* target_get_context_mapping(int context) return button_context_quickscreen; case CONTEXT_PITCHSCREEN: return button_context_pitchscreen; - case CONTEXT_KEYBOARD: - return button_context_keyboard; } return button_context_standard; } diff --git a/apps/root_menu.c b/apps/root_menu.c index 5a8d40f0b6..a65ceb51b9 100644 --- a/apps/root_menu.c +++ b/apps/root_menu.c @@ -639,7 +639,15 @@ void root_menu(void) case GO_TO_ROOT: if (last_screen != GO_TO_ROOT) selected = get_selection(last_screen); +#if (CONFIG_PLATFORM&PLATFORM_ANDROID) + /* When we are in the main menu we want the hardware BACK + * button to be handled by Android instead of rockbox */ + android_ignore_back_button(true); +#endif next_screen = do_menu(&root_menu_, &selected, NULL, false); +#if (CONFIG_PLATFORM&PLATFORM_ANDROID) + android_ignore_back_button(false); +#endif if (next_screen != GO_TO_PREVIOUS) last_screen = GO_TO_ROOT; break; diff --git a/firmware/target/hosted/android/app/button-application.c b/firmware/target/hosted/android/app/button-application.c index a7d75ef172..1586183f6f 100644 --- a/firmware/target/hosted/android/app/button-application.c +++ b/firmware/target/hosted/android/app/button-application.c @@ -23,26 +23,24 @@ #include "button.h" #include "android_keyevents.h" +static bool ignore_back_button = false; +void android_ignore_back_button(bool yes) +{ + ignore_back_button = yes; +} + int key_to_button(int keyboard_key) { switch (keyboard_key) { - default: - return BUTTON_NONE; case KEYCODE_BACK: - return BUTTON_BACK; - case KEYCODE_DPAD_UP: - return BUTTON_DPAD_UP; - case KEYCODE_DPAD_DOWN: - return BUTTON_DPAD_DOWN; - case KEYCODE_DPAD_LEFT: - return BUTTON_DPAD_LEFT; - case KEYCODE_DPAD_RIGHT: - return BUTTON_DPAD_RIGHT; - case KEYCODE_DPAD_CENTER: - return BUTTON_DPAD_CENTER; + return ignore_back_button ? BUTTON_NONE : BUTTON_BACK; case KEYCODE_MENU: return BUTTON_MENU; + case KEYCODE_DPAD_CENTER: + return BUTTON_DPAD_CENTER; + default: + return BUTTON_NONE; } } @@ -66,3 +64,25 @@ unsigned multimedia_to_button(int keyboard_key) return 0; } } + +unsigned dpad_to_button(int keyboard_key) +{ + switch (keyboard_key) + { + /* These buttons only post a single release event. + * doing otherwise will cause action.c to lock up waiting for + * a release (because android sends press/unpress to us too quickly + */ + case KEYCODE_DPAD_UP: + return BUTTON_DPAD_UP|BUTTON_REL; + case KEYCODE_DPAD_DOWN: + return BUTTON_DPAD_DOWN|BUTTON_REL; + case KEYCODE_DPAD_LEFT: + return BUTTON_DPAD_LEFT|BUTTON_REL; + case KEYCODE_DPAD_RIGHT: + return BUTTON_DPAD_RIGHT|BUTTON_REL; + default: + return BUTTON_NONE; + } +} + diff --git a/firmware/target/hosted/android/app/button-target.h b/firmware/target/hosted/android/app/button-target.h index ca306d4fef..6106b612f9 100644 --- a/firmware/target/hosted/android/app/button-target.h +++ b/firmware/target/hosted/android/app/button-target.h @@ -29,6 +29,8 @@ void button_init_device(void); int button_read_device(int *data); unsigned multimedia_to_button(int keyboard_key); +unsigned dpad_to_button(int keyboard_key); +void android_ignore_back_button(bool yes); /* Main unit's buttons */ #define BUTTON_MENU 0x00000001 diff --git a/firmware/target/hosted/android/button-android.c b/firmware/target/hosted/android/button-android.c index 9bf15c25a2..26b6b1380e 100644 --- a/firmware/target/hosted/android/button-android.c +++ b/firmware/target/hosted/android/button-android.c @@ -71,30 +71,40 @@ Java_org_rockbox_RockboxFramebuffer_buttonHandler(JNIEnv*env, jobject this, unsigned button = 0; if (!state) + { button = multimedia_to_button((int)keycode); - - if (button) - { /* multimeida buttons are handled differently */ - queue_post(&button_queue, button, 0); - return true; + if (!button) + button = dpad_to_button((int)keycode); + if (button) + queue_post(&button_queue, button, 0); } - button = key_to_button(keycode); + if (!button) + { + button = key_to_button(keycode); + } if (button == BUTTON_NONE) + { + last_btns = button; return false; + } if (state) { last_btns |= button; - last_button_tick = current_tick; } + else + { + last_btns &= (~button); + return false; + } + return true; } void button_init_device(void) { - last_button_tick = 0; } int button_read_device(int *data) @@ -110,7 +120,5 @@ int button_read_device(int *data) if (last_touch_state == STATE_DOWN) btn |= touch; - if (TIME_AFTER(current_tick, last_button_tick+5)) - last_btns = 0; return btn; } -- cgit v1.2.3