summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaurus Cuelenaere <mcuelenaere@gmail.com>2010-08-16 20:12:06 +0000
committerMaurus Cuelenaere <mcuelenaere@gmail.com>2010-08-16 20:12:06 +0000
commit934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b (patch)
tree0aec8be568bea16b68ac87086387ba73089d931f
parente726e53da68d3ff53a79023d5dc5cfcc020fb864 (diff)
downloadrockbox-934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b.tar.gz
rockbox-934a5a5808c7a0b0dff469ad2c3a523e78a4ef4b.zip
Android port: add support for hardware keys
* Forward Java KeyEvents to C layer and translate them to Rockbox BUTTON_*. * Add a basic Android keymap git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27832 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--android/src/org/rockbox/RockboxFramebuffer.java24
-rw-r--r--apps/SOURCES2
-rw-r--r--apps/keymaps/keymap-android.c198
-rw-r--r--firmware/SOURCES3
-rw-r--r--firmware/export/config.h1
-rw-r--r--firmware/export/config/application.h4
-rw-r--r--firmware/target/hosted/android/app/android_keyevents.h97
-rwxr-xr-xfirmware/target/hosted/android/app/android_keyevents.sh9
-rw-r--r--firmware/target/hosted/android/app/button-application.c24
-rw-r--r--firmware/target/hosted/android/app/button-target.h43
-rw-r--r--firmware/target/hosted/android/button-android.c42
11 files changed, 413 insertions, 34 deletions
diff --git a/android/src/org/rockbox/RockboxFramebuffer.java b/android/src/org/rockbox/RockboxFramebuffer.java
index 32fbfef111..1734b4fab1 100644
--- a/android/src/org/rockbox/RockboxFramebuffer.java
+++ b/android/src/org/rockbox/RockboxFramebuffer.java
@@ -22,23 +22,28 @@
22package org.rockbox; 22package org.rockbox;
23 23
24import java.nio.ByteBuffer; 24import java.nio.ByteBuffer;
25
25import android.content.Context; 26import android.content.Context;
26import android.graphics.Bitmap; 27import android.graphics.Bitmap;
27import android.graphics.Canvas; 28import android.graphics.Canvas;
28import android.util.Log; 29import android.util.Log;
30import android.view.KeyEvent;
29import android.view.MotionEvent; 31import android.view.MotionEvent;
30import android.view.View; 32import android.view.View;
31 33
32public class RockboxFramebuffer extends View 34public class RockboxFramebuffer extends View
33{ 35{
34 private Bitmap btm; 36 private Bitmap btm;
35 private ByteBuffer native_buf; 37 private ByteBuffer native_buf;
36 38
37
38 public RockboxFramebuffer(Context c) 39 public RockboxFramebuffer(Context c)
39 { 40 {
40 super(c); 41 super(c);
41 btm = null; 42 btm = null;
43
44 /* Needed so we can catch KeyEvents */
45 setFocusable(true);
46 requestFocus();
42 } 47 }
43 48
44 public void onDraw(Canvas c) 49 public void onDraw(Canvas c)
@@ -55,7 +60,6 @@ public class RockboxFramebuffer extends View
55 60
56 public void java_lcd_update() 61 public void java_lcd_update()
57 { 62 {
58
59 btm.copyPixelsFromBuffer(native_buf); 63 btm.copyPixelsFromBuffer(native_buf);
60 postInvalidate(); 64 postInvalidate();
61 } 65 }
@@ -64,6 +68,7 @@ public class RockboxFramebuffer extends View
64 { 68 {
65 /* can't copy a partial buffer */ 69 /* can't copy a partial buffer */
66 btm.copyPixelsFromBuffer(native_buf); 70 btm.copyPixelsFromBuffer(native_buf);
71
67 postInvalidate(x, y, x+w, y+h); 72 postInvalidate(x, y, x+w, y+h);
68 } 73 }
69 74
@@ -90,7 +95,17 @@ public class RockboxFramebuffer extends View
90 pixelHandler((int)me.getX(), (int)me.getY()); 95 pixelHandler((int)me.getX(), (int)me.getY());
91 return true; 96 return true;
92 } 97 }
93 98
99 public boolean onKeyDown(int keyCode, KeyEvent event)
100 {
101 return buttonHandler(keyCode, true);
102 }
103
104 public boolean onKeyUp(int keyCode, KeyEvent event)
105 {
106 return buttonHandler(keyCode, false);
107 }
108
94 /* the two below should only be called from the activity thread */ 109 /* the two below should only be called from the activity thread */
95 public void suspend() 110 public void suspend()
96 { /* suspend, Rockbox will not make any lcd updates */ 111 { /* suspend, Rockbox will not make any lcd updates */
@@ -105,4 +120,5 @@ public class RockboxFramebuffer extends View
105 public native void set_lcd_active(int active); 120 public native void set_lcd_active(int active);
106 public native void pixelHandler(int x, int y); 121 public native void pixelHandler(int x, int y);
107 public native void touchHandler(int down); 122 public native void touchHandler(int down);
123 public native boolean buttonHandler(int keycode, boolean state);
108} 124}
diff --git a/apps/SOURCES b/apps/SOURCES
index d15ba5bf6a..a00239428c 100644
--- a/apps/SOURCES
+++ b/apps/SOURCES
@@ -293,4 +293,6 @@ keymaps/keymap-mini2440.c
293keymaps/keymap-vibe500.c 293keymaps/keymap-vibe500.c
294#elif CONFIG_KEYPAD == MPIO_HD200_PAD 294#elif CONFIG_KEYPAD == MPIO_HD200_PAD
295keymaps/keymap-mpio-hd200.c 295keymaps/keymap-mpio-hd200.c
296#elif CONFIG_KEYPAD == ANDROID_PAD
297keymaps/keymap-android.c
296#endif 298#endif
diff --git a/apps/keymaps/keymap-android.c b/apps/keymaps/keymap-android.c
new file mode 100644
index 0000000000..cbc20c3e67
--- /dev/null
+++ b/apps/keymaps/keymap-android.c
@@ -0,0 +1,198 @@
1/***************************************************************************
2 * __________ __ ___.
3 * Open \______ \ ____ ____ | | _\_ |__ _______ ___
4 * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ /
5 * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < <
6 * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \
7 * \/ \/ \/ \/ \/
8 * $Id$
9 *
10 * Copyright (C) 2010 Maurus Cuelenaere
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied.
19 *
20 ****************************************************************************/
21
22/* Button Code Definitions for Android targets */
23
24#include <stdio.h>
25#include <string.h>
26#include <stdlib.h>
27
28#include "config.h"
29#include "action.h"
30#include "button.h"
31#include "settings.h"
32
33/*
34 * The format of the list is as follows
35 * { Action Code, Button code, Prereq button code }
36 * if there's no need to check the previous button's value, use BUTTON_NONE
37 * Insert LAST_ITEM_IN_LIST at the end of each mapping
38 */
39
40static const struct button_mapping button_context_standard[] = {
41 { ACTION_STD_PREV, BUTTON_DPAD_UP, BUTTON_NONE },
42 { ACTION_STD_PREVREPEAT, BUTTON_DPAD_UP|BUTTON_REPEAT, BUTTON_NONE },
43 { ACTION_STD_NEXT, BUTTON_DPAD_DOWN, BUTTON_NONE },
44 { ACTION_STD_NEXTREPEAT, BUTTON_DPAD_DOWN|BUTTON_REPEAT, BUTTON_NONE },
45
46 { ACTION_STD_OK, BUTTON_DPAD_CENTER|BUTTON_REL, BUTTON_DPAD_CENTER },
47 { ACTION_STD_OK, BUTTON_DPAD_RIGHT|BUTTON_REL, BUTTON_DPAD_RIGHT },
48 { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE },
49 { ACTION_STD_CANCEL, BUTTON_DPAD_LEFT|BUTTON_REL, BUTTON_DPAD_LEFT },
50
51 { ACTION_STD_CONTEXT, BUTTON_MENU, BUTTON_NONE },
52
53 LAST_ITEM_IN_LIST
54}; /* button_context_standard */
55
56static const struct button_mapping button_context_wps[] = {
57 { ACTION_WPS_BROWSE, BUTTON_BACK, BUTTON_NONE },
58 { ACTION_WPS_MENU, BUTTON_MENU|BUTTON_REL, BUTTON_MENU },
59 { ACTION_WPS_CONTEXT, BUTTON_MENU|BUTTON_REPEAT, BUTTON_MENU },
60
61 LAST_ITEM_IN_LIST
62}; /* button_context_wps */
63
64static const struct button_mapping button_context_list[] = {
65 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
66}; /* button_context_list */
67
68static const struct button_mapping button_context_tree[] = {
69 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST)
70}; /* button_context_tree */
71
72static const struct button_mapping button_context_listtree_scroll_with_combo[] = {
73 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
74};
75
76static const struct button_mapping button_context_listtree_scroll_without_combo[] = {
77 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_TREE),
78};
79
80static const struct button_mapping button_context_settings[] = {
81 { ACTION_SETTINGS_INC, BUTTON_DPAD_RIGHT, BUTTON_NONE },
82 { ACTION_SETTINGS_INCREPEAT, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
83 { ACTION_SETTINGS_DEC, BUTTON_DPAD_LEFT, BUTTON_NONE },
84 { ACTION_SETTINGS_DECREPEAT, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE },
85 { ACTION_STD_OK, BUTTON_DPAD_CENTER, BUTTON_NONE },
86 { ACTION_STD_CANCEL, BUTTON_BACK, BUTTON_NONE },
87
88 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
89}; /* button_context_settings */
90
91static const struct button_mapping button_context_settings_right_is_inc[] = {
92
93 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
94}; /* button_context_settingsgraphical */
95
96static const struct button_mapping button_context_yesno[] = {
97 { ACTION_YESNO_ACCEPT, BUTTON_DPAD_CENTER, BUTTON_NONE },
98
99 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
100}; /* button_context_settings_yesno */
101
102static const struct button_mapping button_context_colorchooser[] = {
103 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS),
104}; /* button_context_colorchooser */
105
106static const struct button_mapping button_context_eq[] = {
107 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_CUSTOM|CONTEXT_SETTINGS),
108}; /* button_context_eq */
109
110/** Bookmark Screen **/
111static const struct button_mapping button_context_bmark[] = {
112 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_LIST),
113}; /* button_context_bmark */
114
115static const struct button_mapping button_context_time[] = {
116 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS),
117}; /* button_context_time */
118
119static const struct button_mapping button_context_quickscreen[] = {
120 { ACTION_STD_CANCEL, BUTTON_BACK|BUTTON_REL, BUTTON_NONE },
121
122 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
123}; /* button_context_quickscreen */
124
125static const struct button_mapping button_context_pitchscreen[] = {
126
127 { ACTION_PS_INC_SMALL, BUTTON_DPAD_RIGHT, BUTTON_NONE },
128 { ACTION_PS_INC_BIG, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
129 { ACTION_PS_DEC_SMALL, BUTTON_DPAD_LEFT, BUTTON_NONE },
130 { ACTION_PS_DEC_BIG, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE },
131 { ACTION_PS_EXIT, BUTTON_BACK, BUTTON_NONE },
132
133 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
134}; /* button_context_pitchcreen */
135
136static const struct button_mapping button_context_keyboard[] = {
137 { ACTION_KBD_PAGE_FLIP, BUTTON_MENU, BUTTON_NONE },
138 { ACTION_KBD_CURSOR_LEFT, BUTTON_DPAD_LEFT, BUTTON_NONE },
139 { ACTION_KBD_CURSOR_LEFT, BUTTON_DPAD_LEFT|BUTTON_REPEAT, BUTTON_NONE },
140 { ACTION_KBD_CURSOR_RIGHT, BUTTON_DPAD_RIGHT, BUTTON_NONE },
141 { ACTION_KBD_CURSOR_RIGHT, BUTTON_DPAD_RIGHT|BUTTON_REPEAT, BUTTON_NONE },
142
143 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_STD)
144}; /* button_context_keyboard */
145
146static const struct button_mapping button_context_radio[] = {
147 LAST_ITEM_IN_LIST__NEXTLIST(CONTEXT_SETTINGS)
148}; /* button_context_radio */
149
150const struct button_mapping* target_get_context_mapping(int context)
151{
152 switch (context)
153 {
154 case CONTEXT_STD:
155 return button_context_standard;
156 case CONTEXT_WPS:
157 return button_context_wps;
158
159 case CONTEXT_LIST:
160 return button_context_list;
161 case CONTEXT_MAINMENU:
162 case CONTEXT_TREE:
163 if (global_settings.hold_lr_for_scroll_in_list)
164 return button_context_listtree_scroll_without_combo;
165 else
166 return button_context_listtree_scroll_with_combo;
167 case CONTEXT_CUSTOM|CONTEXT_TREE:
168 return button_context_tree;
169
170 case CONTEXT_SETTINGS:
171 return button_context_settings;
172 case CONTEXT_CUSTOM|CONTEXT_SETTINGS:
173 case CONTEXT_SETTINGS_RECTRIGGER:
174 return button_context_settings_right_is_inc;
175
176 case CONTEXT_SETTINGS_COLOURCHOOSER:
177 return button_context_colorchooser;
178 case CONTEXT_SETTINGS_EQ:
179 return button_context_eq;
180
181 case CONTEXT_SETTINGS_TIME:
182 return button_context_time;
183
184 case CONTEXT_YESNOSCREEN:
185 return button_context_yesno;
186 case CONTEXT_FM:
187 return button_context_radio;
188 case CONTEXT_BOOKMARKSCREEN:
189 return button_context_bmark;
190 case CONTEXT_QUICKSCREEN:
191 return button_context_quickscreen;
192 case CONTEXT_PITCHSCREEN:
193 return button_context_pitchscreen;
194 case CONTEXT_KEYBOARD:
195 return button_context_keyboard;
196 }
197 return button_context_standard;
198}
diff --git a/firmware/SOURCES b/firmware/SOURCES
index f27a7dd140..19e51ac948 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -1708,6 +1708,9 @@ target/hosted/android/button-android.c
1708target/hosted/android/kernel-android.c 1708target/hosted/android/kernel-android.c
1709target/hosted/android/pcm-android.c 1709target/hosted/android/pcm-android.c
1710target/hosted/android/system-android.c 1710target/hosted/android/system-android.c
1711#ifdef APPLICATION
1712target/hosted/android/app/button-application.c
1713#endif
1711drivers/audio/android.c 1714drivers/audio/android.c
1712thread.c 1715thread.c
1713#endif 1716#endif
diff --git a/firmware/export/config.h b/firmware/export/config.h
index 3b59004549..409c9d9965 100644
--- a/firmware/export/config.h
+++ b/firmware/export/config.h
@@ -128,6 +128,7 @@
128#define PHILIPS_HDD6330_PAD 42 128#define PHILIPS_HDD6330_PAD 42
129#define PBELL_VIBE500_PAD 43 129#define PBELL_VIBE500_PAD 43
130#define MPIO_HD200_PAD 44 130#define MPIO_HD200_PAD 44
131#define ANDROID_PAD 45
131 132
132/* CONFIG_REMOTE_KEYPAD */ 133/* CONFIG_REMOTE_KEYPAD */
133#define H100_REMOTE 1 134#define H100_REMOTE 1
diff --git a/firmware/export/config/application.h b/firmware/export/config/application.h
index 71ee62356b..6a87d5f62a 100644
--- a/firmware/export/config/application.h
+++ b/firmware/export/config/application.h
@@ -75,7 +75,11 @@
75/* Define this if you do software codec */ 75/* Define this if you do software codec */
76#define CONFIG_CODEC SWCODEC 76#define CONFIG_CODEC SWCODEC
77 77
78#ifdef ANDROID
79#define CONFIG_KEYPAD ANDROID_PAD
80#else
78#define CONFIG_KEYPAD COWON_D2_PAD 81#define CONFIG_KEYPAD COWON_D2_PAD
82#endif
79 83
80#if (CONFIG_PLATFORM & PLATFORM_SDL) 84#if (CONFIG_PLATFORM & PLATFORM_SDL)
81/* Use SDL audio/pcm in a SDL app build */ 85/* Use SDL audio/pcm in a SDL app build */
diff --git a/firmware/target/hosted/android/app/android_keyevents.h b/firmware/target/hosted/android/app/android_keyevents.h
new file mode 100644
index 0000000000..82c525f396
--- /dev/null
+++ b/firmware/target/hosted/android/app/android_keyevents.h
@@ -0,0 +1,97 @@
1/* Ripped from http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob_plain;f=core/java/android/view/KeyEvent.java;hb=HEAD */
2#define KEYCODE_UNKNOWN 0
3#define KEYCODE_SOFT_LEFT 1
4#define KEYCODE_SOFT_RIGHT 2
5#define KEYCODE_HOME 3
6#define KEYCODE_BACK 4
7#define KEYCODE_CALL 5
8#define KEYCODE_ENDCALL 6
9#define KEYCODE_0 7
10#define KEYCODE_1 8
11#define KEYCODE_2 9
12#define KEYCODE_3 10
13#define KEYCODE_4 11
14#define KEYCODE_5 12
15#define KEYCODE_6 13
16#define KEYCODE_7 14
17#define KEYCODE_8 15
18#define KEYCODE_9 16
19#define KEYCODE_STAR 17
20#define KEYCODE_POUND 18
21#define KEYCODE_DPAD_UP 19
22#define KEYCODE_DPAD_DOWN 20
23#define KEYCODE_DPAD_LEFT 21
24#define KEYCODE_DPAD_RIGHT 22
25#define KEYCODE_DPAD_CENTER 23
26#define KEYCODE_VOLUME_UP 24
27#define KEYCODE_VOLUME_DOWN 25
28#define KEYCODE_POWER 26
29#define KEYCODE_CAMERA 27
30#define KEYCODE_CLEAR 28
31#define KEYCODE_A 29
32#define KEYCODE_B 30
33#define KEYCODE_C 31
34#define KEYCODE_D 32
35#define KEYCODE_E 33
36#define KEYCODE_F 34
37#define KEYCODE_G 35
38#define KEYCODE_H 36
39#define KEYCODE_I 37
40#define KEYCODE_J 38
41#define KEYCODE_K 39
42#define KEYCODE_L 40
43#define KEYCODE_M 41
44#define KEYCODE_N 42
45#define KEYCODE_O 43
46#define KEYCODE_P 44
47#define KEYCODE_Q 45
48#define KEYCODE_R 46
49#define KEYCODE_S 47
50#define KEYCODE_T 48
51#define KEYCODE_U 49
52#define KEYCODE_V 50
53#define KEYCODE_W 51
54#define KEYCODE_X 52
55#define KEYCODE_Y 53
56#define KEYCODE_Z 54
57#define KEYCODE_COMMA 55
58#define KEYCODE_PERIOD 56
59#define KEYCODE_ALT_LEFT 57
60#define KEYCODE_ALT_RIGHT 58
61#define KEYCODE_SHIFT_LEFT 59
62#define KEYCODE_SHIFT_RIGHT 60
63#define KEYCODE_TAB 61
64#define KEYCODE_SPACE 62
65#define KEYCODE_SYM 63
66#define KEYCODE_EXPLORER 64
67#define KEYCODE_ENVELOPE 65
68#define KEYCODE_ENTER 66
69#define KEYCODE_DEL 67
70#define KEYCODE_GRAVE 68
71#define KEYCODE_MINUS 69
72#define KEYCODE_EQUALS 70
73#define KEYCODE_LEFT_BRACKET 71
74#define KEYCODE_RIGHT_BRACKET 72
75#define KEYCODE_BACKSLASH 73
76#define KEYCODE_SEMICOLON 74
77#define KEYCODE_APOSTROPHE 75
78#define KEYCODE_SLASH 76
79#define KEYCODE_AT 77
80#define KEYCODE_NUM 78
81#define KEYCODE_HEADSETHOOK 79
82#define KEYCODE_FOCUS 80
83#define KEYCODE_PLUS 81
84#define KEYCODE_MENU 82
85#define KEYCODE_NOTIFICATION 83
86#define KEYCODE_SEARCH 84
87#define KEYCODE_MEDIA_PLAY_PAUSE 85
88#define KEYCODE_MEDIA_STOP 86
89#define KEYCODE_MEDIA_NEXT 87
90#define KEYCODE_MEDIA_PREVIOUS 88
91#define KEYCODE_MEDIA_REWIND 89
92#define KEYCODE_MEDIA_FAST_FORWARD 90
93#define KEYCODE_MUTE 91
94#define KEYCODE_PAGE_UP 92
95#define KEYCODE_PAGE_DOWN 93
96#define KEYCODE_PICTSYMBOLS 94
97#define KEYCODE_SWITCH_CHARSET 95
diff --git a/firmware/target/hosted/android/app/android_keyevents.sh b/firmware/target/hosted/android/app/android_keyevents.sh
new file mode 100755
index 0000000000..cd654ad01e
--- /dev/null
+++ b/firmware/target/hosted/android/app/android_keyevents.sh
@@ -0,0 +1,9 @@
1#!/bin/sh
2# Simple script that converts Android's KEYCODE_* ints to preprocessor #defines
3
4URL="http://android.git.kernel.org/?p=platform/frameworks/base.git;a=blob_plain;f=core/java/android/view/KeyEvent.java;hb=HEAD"
5
6echo "Processing $URL..."
7(echo "/* Ripped from $URL */";
8 curl $URL | grep "public static final int KEYCODE" | sed 's/^.*public static final int \(KEYCODE_.*\) *= *\([0-9]*\).*$/#define \1 \2/'
9) > `dirname $0`/android_keyevents.h
diff --git a/firmware/target/hosted/android/app/button-application.c b/firmware/target/hosted/android/app/button-application.c
index a27f769718..47798a6096 100644
--- a/firmware/target/hosted/android/app/button-application.c
+++ b/firmware/target/hosted/android/app/button-application.c
@@ -17,13 +17,31 @@
17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY 17 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
18 * KIND, either express or implied. 18 * KIND, either express or implied.
19 * 19 *
20 ***************************************************9*************************/ 20 *****************************************************************************/
21 21
22 22
23#include "button.h" 23#include "button.h"
24#include "android_keyevents.h"
24 25
25int key_to_button(int keyboard_key) 26int key_to_button(int keyboard_key)
26{ 27{
27 (void)keyboard_key; 28 switch (keyboard_key)
28 return BUTTON_NONE; 29 {
30 default:
31 return BUTTON_NONE;
32 case KEYCODE_BACK:
33 return BUTTON_BACK;
34 case KEYCODE_DPAD_UP:
35 return BUTTON_DPAD_UP;
36 case KEYCODE_DPAD_DOWN:
37 return BUTTON_DPAD_DOWN;
38 case KEYCODE_DPAD_LEFT:
39 return BUTTON_DPAD_LEFT;
40 case KEYCODE_DPAD_RIGHT:
41 return BUTTON_DPAD_RIGHT;
42 case KEYCODE_DPAD_CENTER:
43 return BUTTON_DPAD_CENTER;
44 case KEYCODE_MENU:
45 return BUTTON_MENU;
46 }
29} 47}
diff --git a/firmware/target/hosted/android/app/button-target.h b/firmware/target/hosted/android/app/button-target.h
index 329ed651af..6c7bd271e9 100644
--- a/firmware/target/hosted/android/app/button-target.h
+++ b/firmware/target/hosted/android/app/button-target.h
@@ -30,35 +30,32 @@ void button_init_device(void);
30int button_read_device(int *data); 30int button_read_device(int *data);
31 31
32/* Main unit's buttons */ 32/* Main unit's buttons */
33#define BUTTON_POWER 0x00000001 33#define BUTTON_MENU 0x00000001
34#define BUTTON_PLUS 0x00000002 34#define BUTTON_BACK 0x00000002
35#define BUTTON_MINUS 0x00000004 35#define BUTTON_DPAD_LEFT 0x00000004
36#define BUTTON_MENU 0x00000008 36#define BUTTON_DPAD_RIGHT 0x00000008
37#define BUTTON_DPAD_UP 0x00000010
38#define BUTTON_DPAD_DOWN 0x00000020
39#define BUTTON_DPAD_CENTER 0x00000040
37 40
38/* Compatibility hacks for flipping. Needs a somewhat better fix. */ 41/* Compatibility hacks for flipping. Needs a somewhat better fix. */
39#define BUTTON_LEFT BUTTON_MIDLEFT 42#define BUTTON_LEFT BUTTON_DPAD_LEFT
40#define BUTTON_RIGHT BUTTON_MIDRIGHT 43#define BUTTON_RIGHT BUTTON_DPAD_RIGHT
41#define BUTTON_UP BUTTON_TOPMIDDLE 44#define BUTTON_UP BUTTON_DPAD_UP
42#define BUTTON_DOWN BUTTON_BOTTOMMIDDLE 45#define BUTTON_DOWN BUTTON_DPAD_DOWN
43 46
44/* Touch Screen Area Buttons */ 47/* Touch Screen Area Buttons */
45#define BUTTON_TOPLEFT 0x00000010 48#define BUTTON_TOPLEFT 0x00001000
46#define BUTTON_TOPMIDDLE 0x00000020 49#define BUTTON_TOPMIDDLE 0x00002000
47#define BUTTON_TOPRIGHT 0x00000040 50#define BUTTON_TOPRIGHT 0x00004000
48#define BUTTON_MIDLEFT 0x00000080 51#define BUTTON_MIDLEFT 0x00008000
49#define BUTTON_CENTER 0x00000100 52#define BUTTON_CENTER 0x00010000
50#define BUTTON_MIDRIGHT 0x00000200 53#define BUTTON_MIDRIGHT 0x00020000
51#define BUTTON_BOTTOMLEFT 0x00000400 54#define BUTTON_BOTTOMLEFT 0x00040000
52#define BUTTON_BOTTOMMIDDLE 0x00000800 55#define BUTTON_BOTTOMMIDDLE 0x00080000
53#define BUTTON_BOTTOMRIGHT 0x00001000 56#define BUTTON_BOTTOMRIGHT 0x00100000
54
55#define BUTTON_MAIN 0x1FFF
56 57
57/* No remote */ 58/* No remote */
58#define BUTTON_REMOTE 0 59#define BUTTON_REMOTE 0
59
60/* Software power-off */
61#define POWEROFF_BUTTON BUTTON_POWER
62#define POWEROFF_COUNT 10
63 60
64#endif /* _BUTTON_TARGET_H_ */ 61#endif /* _BUTTON_TARGET_H_ */
diff --git a/firmware/target/hosted/android/button-android.c b/firmware/target/hosted/android/button-android.c
index 1172880908..50e347e714 100644
--- a/firmware/target/hosted/android/button-android.c
+++ b/firmware/target/hosted/android/button-android.c
@@ -22,12 +22,15 @@
22 22
23#include <jni.h> 23#include <jni.h>
24#include <stdbool.h> 24#include <stdbool.h>
25#include "button.h"
26#include "buttonmap.h"
25#include "config.h" 27#include "config.h"
26#include "kernel.h" 28#include "kernel.h"
27#include "system.h" 29#include "system.h"
28#include "touchscreen.h" 30#include "touchscreen.h"
29 31
30static int last_y, last_x; 32static int last_y, last_x;
33static int last_btns;
31 34
32static enum { 35static enum {
33 STATE_UNKNOWN, 36 STATE_UNKNOWN,
@@ -35,7 +38,6 @@ static enum {
35 STATE_DOWN, 38 STATE_DOWN,
36} last_state = STATE_UNKNOWN; 39} last_state = STATE_UNKNOWN;
37 40
38
39/* 41/*
40 * this writes in an interrupt-like fashion the last pixel coordinates 42 * this writes in an interrupt-like fashion the last pixel coordinates
41 * that the user pressed on the screen */ 43 * that the user pressed on the screen */
@@ -64,13 +66,45 @@ Java_org_rockbox_RockboxFramebuffer_touchHandler(JNIEnv*env, jobject this,
64 last_state = STATE_UP; 66 last_state = STATE_UP;
65} 67}
66 68
69/*
70 * this writes in an interrupt-like fashion the button events that the user
71 * generated by pressing/releasing them to a variable */
72JNIEXPORT bool JNICALL
73Java_org_rockbox_RockboxFramebuffer_buttonHandler(JNIEnv*env, jobject this,
74 int keycode, bool state)
75{
76 (void)env;
77 (void)this;
78
79 int button = key_to_button(keycode);
80
81 if (button == BUTTON_NONE)
82 return false;
83
84 if (state)
85 last_btns |= button;
86 else
87 last_btns &= ~button;
88
89 return true;
90}
91
67void button_init_device(void) 92void button_init_device(void)
68{ 93{
69} 94}
70 95
71int button_read_device(int *data) 96int button_read_device(int *data)
72{ 97{
73 /* get grid button/coordinates based on the current touchscreen mode */ 98 int btn = last_btns;
74 int btn = touchscreen_to_pixels(last_x, last_y, data); 99 /* Get grid button/coordinates based on the current touchscreen mode
75 return (last_state == STATE_DOWN ? btn : 0); 100 *
101 * Caveat: the caller seemingly depends on *data always being filled with
102 * the last known touchscreen position, so always call
103 * touchscreen_to_pixels() */
104 int touch = touchscreen_to_pixels(last_x, last_y, data);
105
106 if (last_state == STATE_DOWN)
107 btn |= touch;
108
109 return btn;
76} 110}