diff -Naur rockbox/android/src/org/rockbox/Helper/MediaButtonReceiver.java rockbox.mods/android/src/org/rockbox/Helper/MediaButtonReceiver.java --- rockbox/android/src/org/rockbox/Helper/MediaButtonReceiver.java 2011-01-31 21:16:03.000000000 -0600 +++ rockbox.mods/android/src/org/rockbox/Helper/MediaButtonReceiver.java 2011-02-01 09:46:02.000000000 -0600 @@ -80,11 +80,7 @@ if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) { KeyEvent key = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); - if (key.getAction() == KeyEvent.ACTION_UP) - { /* pass the pressed key to Rockbox */ - if (RockboxService.get_instance().get_fb().dispatchKeyEvent(key)) - abortBroadcast(); - } + RockboxService.get_instance().get_fb().dispatchKeyEvent(key) } } } diff -Naur rockbox/android/src/org/rockbox/RockboxFramebuffer.java rockbox.mods/android/src/org/rockbox/RockboxFramebuffer.java --- rockbox/android/src/org/rockbox/RockboxFramebuffer.java 2011-01-31 21:16:04.000000000 -0600 +++ rockbox.mods/android/src/org/rockbox/RockboxFramebuffer.java 2011-02-01 09:47:16.000000000 -0600 @@ -44,7 +44,7 @@ private MediaButtonReceiver media_monitor; private final DisplayMetrics metrics; private final ViewConfiguration view_config; - + private int wasKeypressed = 0; public RockboxFramebuffer(Context c, int lcd_width, int lcd_height, ByteBuffer native_fb) { @@ -102,11 +102,17 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { - return buttonHandler(keyCode, true); + if (wasKeypressed == 0) + { + wasKeypressed = 1; + return buttonHandler(keyCode, true); + } + return true; } public boolean onKeyUp(int keyCode, KeyEvent event) { + wasKeypressed = 0; return buttonHandler(keyCode, false); } diff -Naur rockbox/firmware/target/hosted/android/app/button-application.c rockbox.mods/firmware/target/hosted/android/app/button-application.c --- rockbox/firmware/target/hosted/android/app/button-application.c 2011-01-31 21:17:58.000000000 -0600 +++ rockbox.mods/firmware/target/hosted/android/app/button-application.c 2011-02-01 09:27:32.000000000 -0600 @@ -39,6 +39,14 @@ return BUTTON_MENU; case KEYCODE_DPAD_CENTER: return BUTTON_DPAD_CENTER; + 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; default: return BUTTON_NONE; } @@ -64,25 +72,4 @@ 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 -Naur rockbox/firmware/target/hosted/android/button-android.c rockbox.mods/firmware/target/hosted/android/button-android.c --- rockbox/firmware/target/hosted/android/button-android.c 2011-01-31 21:17:58.000000000 -0600 +++ rockbox.mods/firmware/target/hosted/android/button-android.c 2011-02-01 09:45:14.000000000 -0600 @@ -69,37 +69,33 @@ unsigned button = 0; - if (!state) + if (state) { button = multimedia_to_button((int)keycode); if (!button) - button = dpad_to_button((int)keycode); + button = key_to_button(keycode); if (button) queue_post(&button_queue, button, 0); } - if (!button) - { - button = key_to_button(keycode); - } - if (button == BUTTON_NONE) { last_btns = button; return false; } - if (state) + if (!state) { - last_btns |= button; + queue_post(&button_queue, BUTTON_REL, 0); + last_btns = 0; + return true; } else { - last_btns &= (~button); - return false; + return true; } - - return true; + + return false; } void button_init_device(void)