Skip to content

Commit 1627725

Browse files
committed
#1970 fix: dynamically build the key code list so key codes in new Android releases are automatically included.
1 parent 9728352 commit 1627725

2 files changed

Lines changed: 19 additions & 317 deletions

File tree

CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## [4.0.0 Beta 7](https://github.com/sds100/KeyMapper/releases/tag/v4.0.0-beta.07)
2+
3+
#### TO BE RELEASED
4+
5+
## Added
6+
7+
- #1970 dynamically build the key code list so key codes in new Android releases are automatically included.
8+
19
## [4.0.0 Beta 6](https://github.com/sds100/KeyMapper/releases/tag/v4.0.0-beta.06)
210

311
#### 4 January 2026

system/src/main/java/io/github/sds100/keymapper/system/inputevents/KeyEventUtils.kt

Lines changed: 11 additions & 317 deletions
Original file line numberDiff line numberDiff line change
@@ -4,323 +4,11 @@ import android.view.KeyEvent
44
import io.github.sds100.keymapper.common.utils.withFlag
55

66
object KeyEventUtils {
7-
private val KEYCODES: IntArray = intArrayOf(
8-
KeyEvent.KEYCODE_SOFT_LEFT,
9-
KeyEvent.KEYCODE_SOFT_RIGHT,
10-
KeyEvent.KEYCODE_HOME,
11-
KeyEvent.KEYCODE_BACK,
12-
KeyEvent.KEYCODE_CALL,
13-
KeyEvent.KEYCODE_ENDCALL,
14-
KeyEvent.KEYCODE_0,
15-
KeyEvent.KEYCODE_1,
16-
KeyEvent.KEYCODE_2,
17-
KeyEvent.KEYCODE_3,
18-
KeyEvent.KEYCODE_4,
19-
KeyEvent.KEYCODE_5,
20-
KeyEvent.KEYCODE_6,
21-
KeyEvent.KEYCODE_7,
22-
KeyEvent.KEYCODE_8,
23-
KeyEvent.KEYCODE_9,
24-
KeyEvent.KEYCODE_STAR,
25-
KeyEvent.KEYCODE_POUND,
26-
KeyEvent.KEYCODE_DPAD_UP,
27-
KeyEvent.KEYCODE_DPAD_DOWN,
28-
KeyEvent.KEYCODE_DPAD_LEFT,
29-
KeyEvent.KEYCODE_DPAD_RIGHT,
30-
KeyEvent.KEYCODE_DPAD_CENTER,
31-
KeyEvent.KEYCODE_VOLUME_UP,
32-
KeyEvent.KEYCODE_VOLUME_DOWN,
33-
KeyEvent.KEYCODE_POWER,
34-
KeyEvent.KEYCODE_CAMERA,
35-
KeyEvent.KEYCODE_CLEAR,
36-
KeyEvent.KEYCODE_A,
37-
KeyEvent.KEYCODE_B,
38-
KeyEvent.KEYCODE_C,
39-
KeyEvent.KEYCODE_D,
40-
KeyEvent.KEYCODE_E,
41-
KeyEvent.KEYCODE_F,
42-
KeyEvent.KEYCODE_G,
43-
KeyEvent.KEYCODE_H,
44-
KeyEvent.KEYCODE_I,
45-
KeyEvent.KEYCODE_J,
46-
KeyEvent.KEYCODE_K,
47-
KeyEvent.KEYCODE_L,
48-
KeyEvent.KEYCODE_M,
49-
KeyEvent.KEYCODE_N,
50-
KeyEvent.KEYCODE_O,
51-
KeyEvent.KEYCODE_P,
52-
KeyEvent.KEYCODE_Q,
53-
KeyEvent.KEYCODE_R,
54-
KeyEvent.KEYCODE_S,
55-
KeyEvent.KEYCODE_T,
56-
KeyEvent.KEYCODE_U,
57-
KeyEvent.KEYCODE_V,
58-
KeyEvent.KEYCODE_W,
59-
KeyEvent.KEYCODE_X,
60-
KeyEvent.KEYCODE_Y,
61-
KeyEvent.KEYCODE_Z,
62-
KeyEvent.KEYCODE_COMMA,
63-
KeyEvent.KEYCODE_PERIOD,
64-
KeyEvent.KEYCODE_ALT_LEFT,
65-
KeyEvent.KEYCODE_ALT_RIGHT,
66-
KeyEvent.KEYCODE_SHIFT_LEFT,
67-
KeyEvent.KEYCODE_SHIFT_RIGHT,
68-
KeyEvent.KEYCODE_TAB,
69-
KeyEvent.KEYCODE_SPACE,
70-
KeyEvent.KEYCODE_SYM,
71-
KeyEvent.KEYCODE_EXPLORER,
72-
KeyEvent.KEYCODE_ENVELOPE,
73-
KeyEvent.KEYCODE_ENTER,
74-
KeyEvent.KEYCODE_FORWARD_DEL,
75-
KeyEvent.KEYCODE_DEL,
76-
KeyEvent.KEYCODE_GRAVE,
77-
KeyEvent.KEYCODE_MINUS,
78-
KeyEvent.KEYCODE_EQUALS,
79-
KeyEvent.KEYCODE_LEFT_BRACKET,
80-
KeyEvent.KEYCODE_RIGHT_BRACKET,
81-
KeyEvent.KEYCODE_BACKSLASH,
82-
KeyEvent.KEYCODE_SEMICOLON,
83-
KeyEvent.KEYCODE_APOSTROPHE,
84-
KeyEvent.KEYCODE_SLASH,
85-
KeyEvent.KEYCODE_AT,
86-
KeyEvent.KEYCODE_HEADSETHOOK,
87-
KeyEvent.KEYCODE_FOCUS,
88-
KeyEvent.KEYCODE_PLUS,
89-
KeyEvent.KEYCODE_MENU,
90-
KeyEvent.KEYCODE_NOTIFICATION,
91-
KeyEvent.KEYCODE_SEARCH,
92-
KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE,
93-
KeyEvent.KEYCODE_MEDIA_STOP,
94-
KeyEvent.KEYCODE_MEDIA_NEXT,
95-
KeyEvent.KEYCODE_MEDIA_PREVIOUS,
96-
KeyEvent.KEYCODE_MEDIA_REWIND,
97-
KeyEvent.KEYCODE_MEDIA_FAST_FORWARD,
98-
KeyEvent.KEYCODE_PAGE_UP,
99-
KeyEvent.KEYCODE_PAGE_DOWN,
100-
KeyEvent.KEYCODE_PICTSYMBOLS,
101-
KeyEvent.KEYCODE_SWITCH_CHARSET,
102-
KeyEvent.KEYCODE_BUTTON_A,
103-
KeyEvent.KEYCODE_BUTTON_B,
104-
KeyEvent.KEYCODE_BUTTON_C,
105-
KeyEvent.KEYCODE_BUTTON_X,
106-
KeyEvent.KEYCODE_BUTTON_Y,
107-
KeyEvent.KEYCODE_BUTTON_Z,
108-
KeyEvent.KEYCODE_BUTTON_L1,
109-
KeyEvent.KEYCODE_BUTTON_R1,
110-
KeyEvent.KEYCODE_BUTTON_L2,
111-
KeyEvent.KEYCODE_BUTTON_R2,
112-
KeyEvent.KEYCODE_BUTTON_THUMBL,
113-
KeyEvent.KEYCODE_BUTTON_THUMBR,
114-
KeyEvent.KEYCODE_BUTTON_START,
115-
KeyEvent.KEYCODE_BUTTON_SELECT,
116-
KeyEvent.KEYCODE_BUTTON_MODE,
117-
KeyEvent.KEYCODE_ESCAPE,
118-
KeyEvent.KEYCODE_CTRL_LEFT,
119-
KeyEvent.KEYCODE_CTRL_RIGHT,
120-
KeyEvent.KEYCODE_CAPS_LOCK,
121-
KeyEvent.KEYCODE_SCROLL_LOCK,
122-
KeyEvent.KEYCODE_META_LEFT,
123-
KeyEvent.KEYCODE_META_RIGHT,
124-
KeyEvent.KEYCODE_FUNCTION,
125-
KeyEvent.KEYCODE_SYSRQ,
126-
KeyEvent.KEYCODE_BREAK,
127-
KeyEvent.KEYCODE_MOVE_HOME,
128-
KeyEvent.KEYCODE_MOVE_END,
129-
KeyEvent.KEYCODE_INSERT,
130-
KeyEvent.KEYCODE_FORWARD,
131-
KeyEvent.KEYCODE_MEDIA_PLAY,
132-
KeyEvent.KEYCODE_MEDIA_PAUSE,
133-
KeyEvent.KEYCODE_MEDIA_CLOSE,
134-
KeyEvent.KEYCODE_MEDIA_EJECT,
135-
KeyEvent.KEYCODE_MEDIA_RECORD,
136-
KeyEvent.KEYCODE_F1,
137-
KeyEvent.KEYCODE_F2,
138-
KeyEvent.KEYCODE_F3,
139-
KeyEvent.KEYCODE_F4,
140-
KeyEvent.KEYCODE_F5,
141-
KeyEvent.KEYCODE_F6,
142-
KeyEvent.KEYCODE_F7,
143-
KeyEvent.KEYCODE_F8,
144-
KeyEvent.KEYCODE_F9,
145-
KeyEvent.KEYCODE_F10,
146-
KeyEvent.KEYCODE_F11,
147-
KeyEvent.KEYCODE_F12,
148-
KeyEvent.KEYCODE_NUM,
149-
KeyEvent.KEYCODE_NUM_LOCK,
150-
KeyEvent.KEYCODE_NUMPAD_0,
151-
KeyEvent.KEYCODE_NUMPAD_1,
152-
KeyEvent.KEYCODE_NUMPAD_2,
153-
KeyEvent.KEYCODE_NUMPAD_3,
154-
KeyEvent.KEYCODE_NUMPAD_4,
155-
KeyEvent.KEYCODE_NUMPAD_5,
156-
KeyEvent.KEYCODE_NUMPAD_6,
157-
KeyEvent.KEYCODE_NUMPAD_7,
158-
KeyEvent.KEYCODE_NUMPAD_8,
159-
KeyEvent.KEYCODE_NUMPAD_9,
160-
KeyEvent.KEYCODE_NUMPAD_DIVIDE,
161-
KeyEvent.KEYCODE_NUMPAD_MULTIPLY,
162-
KeyEvent.KEYCODE_NUMPAD_SUBTRACT,
163-
KeyEvent.KEYCODE_NUMPAD_ADD,
164-
KeyEvent.KEYCODE_NUMPAD_DOT,
165-
KeyEvent.KEYCODE_NUMPAD_COMMA,
166-
KeyEvent.KEYCODE_NUMPAD_ENTER,
167-
KeyEvent.KEYCODE_NUMPAD_EQUALS,
168-
KeyEvent.KEYCODE_NUMPAD_LEFT_PAREN,
169-
KeyEvent.KEYCODE_NUMPAD_RIGHT_PAREN,
170-
KeyEvent.KEYCODE_MUTE,
171-
KeyEvent.KEYCODE_VOLUME_MUTE,
172-
KeyEvent.KEYCODE_INFO,
173-
KeyEvent.KEYCODE_CHANNEL_UP,
174-
KeyEvent.KEYCODE_CHANNEL_DOWN,
175-
KeyEvent.KEYCODE_ZOOM_IN,
176-
KeyEvent.KEYCODE_ZOOM_OUT,
177-
KeyEvent.KEYCODE_TV,
178-
KeyEvent.KEYCODE_WINDOW,
179-
KeyEvent.KEYCODE_GUIDE,
180-
KeyEvent.KEYCODE_DVR,
181-
KeyEvent.KEYCODE_BOOKMARK,
182-
KeyEvent.KEYCODE_CAPTIONS,
183-
KeyEvent.KEYCODE_SETTINGS,
184-
KeyEvent.KEYCODE_TV_POWER,
185-
KeyEvent.KEYCODE_TV_INPUT,
186-
KeyEvent.KEYCODE_STB_POWER,
187-
KeyEvent.KEYCODE_STB_INPUT,
188-
KeyEvent.KEYCODE_AVR_POWER,
189-
KeyEvent.KEYCODE_AVR_INPUT,
190-
KeyEvent.KEYCODE_PROG_RED,
191-
KeyEvent.KEYCODE_PROG_GREEN,
192-
KeyEvent.KEYCODE_PROG_YELLOW,
193-
KeyEvent.KEYCODE_PROG_BLUE,
194-
KeyEvent.KEYCODE_APP_SWITCH,
195-
KeyEvent.KEYCODE_BUTTON_1,
196-
KeyEvent.KEYCODE_BUTTON_2,
197-
KeyEvent.KEYCODE_BUTTON_3,
198-
KeyEvent.KEYCODE_BUTTON_4,
199-
KeyEvent.KEYCODE_BUTTON_5,
200-
KeyEvent.KEYCODE_BUTTON_6,
201-
KeyEvent.KEYCODE_BUTTON_7,
202-
KeyEvent.KEYCODE_BUTTON_8,
203-
KeyEvent.KEYCODE_BUTTON_9,
204-
KeyEvent.KEYCODE_BUTTON_10,
205-
KeyEvent.KEYCODE_BUTTON_11,
206-
KeyEvent.KEYCODE_BUTTON_12,
207-
KeyEvent.KEYCODE_BUTTON_13,
208-
KeyEvent.KEYCODE_BUTTON_14,
209-
KeyEvent.KEYCODE_BUTTON_15,
210-
KeyEvent.KEYCODE_BUTTON_16,
211-
KeyEvent.KEYCODE_LANGUAGE_SWITCH,
212-
KeyEvent.KEYCODE_MANNER_MODE,
213-
KeyEvent.KEYCODE_3D_MODE,
214-
KeyEvent.KEYCODE_CONTACTS,
215-
KeyEvent.KEYCODE_CALENDAR,
216-
KeyEvent.KEYCODE_MUSIC,
217-
KeyEvent.KEYCODE_CALCULATOR,
218-
KeyEvent.KEYCODE_ZENKAKU_HANKAKU,
219-
KeyEvent.KEYCODE_EISU,
220-
KeyEvent.KEYCODE_MUHENKAN,
221-
KeyEvent.KEYCODE_HENKAN,
222-
KeyEvent.KEYCODE_KATAKANA_HIRAGANA,
223-
KeyEvent.KEYCODE_YEN,
224-
KeyEvent.KEYCODE_RO,
225-
KeyEvent.KEYCODE_KANA,
226-
KeyEvent.KEYCODE_ASSIST,
227-
KeyEvent.KEYCODE_BRIGHTNESS_DOWN,
228-
KeyEvent.KEYCODE_BRIGHTNESS_UP,
229-
KeyEvent.KEYCODE_MEDIA_AUDIO_TRACK,
230-
KeyEvent.KEYCODE_PAIRING,
231-
KeyEvent.KEYCODE_MEDIA_TOP_MENU,
232-
KeyEvent.KEYCODE_11,
233-
KeyEvent.KEYCODE_12,
234-
KeyEvent.KEYCODE_LAST_CHANNEL,
235-
KeyEvent.KEYCODE_TV_DATA_SERVICE,
236-
KeyEvent.KEYCODE_VOICE_ASSIST,
237-
KeyEvent.KEYCODE_TV_RADIO_SERVICE,
238-
KeyEvent.KEYCODE_TV_TELETEXT,
239-
KeyEvent.KEYCODE_TV_NUMBER_ENTRY,
240-
KeyEvent.KEYCODE_TV_TERRESTRIAL_ANALOG,
241-
KeyEvent.KEYCODE_TV_TERRESTRIAL_DIGITAL,
242-
KeyEvent.KEYCODE_TV_SATELLITE,
243-
KeyEvent.KEYCODE_TV_SATELLITE_BS,
244-
KeyEvent.KEYCODE_TV_SATELLITE_CS,
245-
KeyEvent.KEYCODE_TV_SATELLITE_SERVICE,
246-
KeyEvent.KEYCODE_TV_NETWORK,
247-
KeyEvent.KEYCODE_TV_ANTENNA_CABLE,
248-
KeyEvent.KEYCODE_TV_INPUT_HDMI_1,
249-
KeyEvent.KEYCODE_TV_INPUT_HDMI_2,
250-
KeyEvent.KEYCODE_TV_INPUT_HDMI_3,
251-
KeyEvent.KEYCODE_TV_INPUT_HDMI_4,
252-
KeyEvent.KEYCODE_TV_INPUT_COMPOSITE_1,
253-
KeyEvent.KEYCODE_TV_INPUT_COMPOSITE_2,
254-
KeyEvent.KEYCODE_TV_INPUT_COMPONENT_1,
255-
KeyEvent.KEYCODE_TV_INPUT_COMPONENT_2,
256-
KeyEvent.KEYCODE_TV_INPUT_VGA_1,
257-
KeyEvent.KEYCODE_TV_AUDIO_DESCRIPTION,
258-
KeyEvent.KEYCODE_TV_AUDIO_DESCRIPTION_MIX_UP,
259-
KeyEvent.KEYCODE_TV_AUDIO_DESCRIPTION_MIX_DOWN,
260-
KeyEvent.KEYCODE_TV_ZOOM_MODE,
261-
KeyEvent.KEYCODE_TV_CONTENTS_MENU,
262-
KeyEvent.KEYCODE_TV_MEDIA_CONTEXT_MENU,
263-
KeyEvent.KEYCODE_TV_TIMER_PROGRAMMING,
264-
KeyEvent.KEYCODE_HELP,
265-
KeyEvent.KEYCODE_NAVIGATE_PREVIOUS,
266-
KeyEvent.KEYCODE_NAVIGATE_NEXT,
267-
KeyEvent.KEYCODE_NAVIGATE_IN,
268-
KeyEvent.KEYCODE_NAVIGATE_OUT,
269-
KeyEvent.KEYCODE_MEDIA_SKIP_FORWARD,
270-
KeyEvent.KEYCODE_MEDIA_SKIP_BACKWARD,
271-
KeyEvent.KEYCODE_MEDIA_STEP_FORWARD,
272-
KeyEvent.KEYCODE_MEDIA_STEP_BACKWARD,
273-
KeyEvent.KEYCODE_STEM_PRIMARY,
274-
KeyEvent.KEYCODE_STEM_1,
275-
KeyEvent.KEYCODE_STEM_2,
276-
KeyEvent.KEYCODE_STEM_3,
277-
KeyEvent.KEYCODE_DPAD_UP_LEFT,
278-
KeyEvent.KEYCODE_DPAD_DOWN_LEFT,
279-
KeyEvent.KEYCODE_DPAD_UP_RIGHT,
280-
KeyEvent.KEYCODE_DPAD_DOWN_RIGHT,
281-
KeyEvent.KEYCODE_SOFT_SLEEP,
282-
KeyEvent.KEYCODE_CUT,
283-
KeyEvent.KEYCODE_COPY,
284-
KeyEvent.KEYCODE_PASTE,
285-
KeyEvent.KEYCODE_SYSTEM_NAVIGATION_UP,
286-
KeyEvent.KEYCODE_SYSTEM_NAVIGATION_DOWN,
287-
KeyEvent.KEYCODE_SYSTEM_NAVIGATION_LEFT,
288-
KeyEvent.KEYCODE_SYSTEM_NAVIGATION_RIGHT,
289-
KeyEvent.KEYCODE_REFRESH,
290-
KeyEvent.KEYCODE_THUMBS_UP,
291-
KeyEvent.KEYCODE_THUMBS_DOWN,
292-
KeyEvent.KEYCODE_PROFILE_SWITCH,
293-
KeyEvent.KEYCODE_VIDEO_APP_1,
294-
KeyEvent.KEYCODE_VIDEO_APP_2,
295-
KeyEvent.KEYCODE_VIDEO_APP_3,
296-
KeyEvent.KEYCODE_VIDEO_APP_4,
297-
KeyEvent.KEYCODE_VIDEO_APP_5,
298-
KeyEvent.KEYCODE_VIDEO_APP_6,
299-
KeyEvent.KEYCODE_VIDEO_APP_7,
300-
KeyEvent.KEYCODE_VIDEO_APP_8,
301-
KeyEvent.KEYCODE_FEATURED_APP_1,
302-
KeyEvent.KEYCODE_FEATURED_APP_2,
303-
KeyEvent.KEYCODE_FEATURED_APP_3,
304-
KeyEvent.KEYCODE_FEATURED_APP_4,
305-
KeyEvent.KEYCODE_DEMO_APP_1,
306-
KeyEvent.KEYCODE_DEMO_APP_2,
307-
KeyEvent.KEYCODE_DEMO_APP_3,
308-
KeyEvent.KEYCODE_DEMO_APP_4,
309-
KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_DOWN,
310-
KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_UP,
311-
KeyEvent.KEYCODE_KEYBOARD_BACKLIGHT_TOGGLE,
312-
KeyEvent.KEYCODE_STYLUS_BUTTON_PRIMARY,
313-
KeyEvent.KEYCODE_STYLUS_BUTTON_SECONDARY,
314-
KeyEvent.KEYCODE_STYLUS_BUTTON_TERTIARY,
315-
KeyEvent.KEYCODE_STYLUS_BUTTON_TAIL,
316-
KeyEvent.KEYCODE_RECENT_APPS,
317-
KeyEvent.KEYCODE_MACRO_1,
318-
KeyEvent.KEYCODE_MACRO_2,
319-
KeyEvent.KEYCODE_MACRO_3,
320-
KeyEvent.KEYCODE_MACRO_4,
321-
KeyEvent.KEYCODE_EMOJI_PICKER,
322-
KeyEvent.KEYCODE_SCREENSHOT,
323-
).distinct().toIntArray()
7+
private val KEYCODES: IntArray by lazy { buildKeyCodeList() }
8+
9+
private fun buildKeyCodeList(): IntArray {
10+
return IntArray(KeyEvent.getMaxKeyCode()) { it }
11+
}
32412

32513
val MODIFIER_KEYCODES: Set<Int>
32614
get() = setOf(
@@ -387,9 +75,11 @@ object KeyEventUtils {
38775

38876
fun modifierKeycodeToMetaState(modifier: Int) = when (modifier) {
38977
KeyEvent.KEYCODE_ALT_LEFT -> KeyEvent.META_ALT_LEFT_ON.withFlag(KeyEvent.META_ALT_ON)
78+
39079
KeyEvent.KEYCODE_ALT_RIGHT -> KeyEvent.META_ALT_RIGHT_ON.withFlag(KeyEvent.META_ALT_ON)
39180

39281
KeyEvent.KEYCODE_SHIFT_LEFT -> KeyEvent.META_SHIFT_LEFT_ON.withFlag(KeyEvent.META_SHIFT_ON)
82+
39383
KeyEvent.KEYCODE_SHIFT_RIGHT -> KeyEvent.META_SHIFT_RIGHT_ON.withFlag(
39484
KeyEvent.META_SHIFT_ON,
39585
)
@@ -399,13 +89,17 @@ object KeyEventUtils {
39989
KeyEvent.KEYCODE_FUNCTION -> KeyEvent.META_FUNCTION_ON
40090

40191
KeyEvent.KEYCODE_CTRL_LEFT -> KeyEvent.META_CTRL_LEFT_ON.withFlag(KeyEvent.META_CTRL_ON)
92+
40293
KeyEvent.KEYCODE_CTRL_RIGHT -> KeyEvent.META_CTRL_RIGHT_ON.withFlag(KeyEvent.META_CTRL_ON)
40394

40495
KeyEvent.KEYCODE_META_LEFT -> KeyEvent.META_META_LEFT_ON.withFlag(KeyEvent.META_META_ON)
96+
40597
KeyEvent.KEYCODE_META_RIGHT -> KeyEvent.META_META_RIGHT_ON.withFlag(KeyEvent.META_META_ON)
40698

40799
KeyEvent.KEYCODE_CAPS_LOCK -> KeyEvent.META_CAPS_LOCK_ON
100+
408101
KeyEvent.KEYCODE_NUM_LOCK -> KeyEvent.META_NUM_LOCK_ON
102+
409103
KeyEvent.KEYCODE_SCROLL_LOCK -> KeyEvent.META_SCROLL_LOCK_ON
410104

411105
else -> throw Exception("can't convert modifier $modifier to meta state")

0 commit comments

Comments
 (0)