1 /*
2  * Copyright (C) 2018 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.car.keventreader;
17 
18 import android.os.Parcel;
19 import android.os.Parcelable;
20 
21 import java.util.HashMap;
22 import java.util.Map;
23 import java.util.Objects;
24 
25 public final class KeypressEvent implements Parcelable {
26     private static final Map<Integer, String> KEYCODE_NAME_MAP = new HashMap<Integer, String>();
27     static {
28         KEYCODE_NAME_MAP.put(0, "RESERVED");
29         KEYCODE_NAME_MAP.put(1, "ESC");
30         KEYCODE_NAME_MAP.put(2, "1");
31         KEYCODE_NAME_MAP.put(3, "2");
32         KEYCODE_NAME_MAP.put(4, "3");
33         KEYCODE_NAME_MAP.put(5, "4");
34         KEYCODE_NAME_MAP.put(6, "5");
35         KEYCODE_NAME_MAP.put(7, "6");
36         KEYCODE_NAME_MAP.put(8, "7");
37         KEYCODE_NAME_MAP.put(9, "8");
38         KEYCODE_NAME_MAP.put(10, "9");
39         KEYCODE_NAME_MAP.put(11, "0");
40         KEYCODE_NAME_MAP.put(12, "MINUS");
41         KEYCODE_NAME_MAP.put(13, "EQUAL");
42         KEYCODE_NAME_MAP.put(14, "BACKSPACE");
43         KEYCODE_NAME_MAP.put(15, "TAB");
44         KEYCODE_NAME_MAP.put(16, "Q");
45         KEYCODE_NAME_MAP.put(17, "W");
46         KEYCODE_NAME_MAP.put(18, "E");
47         KEYCODE_NAME_MAP.put(19, "R");
48         KEYCODE_NAME_MAP.put(20, "T");
49         KEYCODE_NAME_MAP.put(21, "Y");
50         KEYCODE_NAME_MAP.put(22, "U");
51         KEYCODE_NAME_MAP.put(23, "I");
52         KEYCODE_NAME_MAP.put(24, "O");
53         KEYCODE_NAME_MAP.put(25, "P");
54         KEYCODE_NAME_MAP.put(26, "LEFTBRACE");
55         KEYCODE_NAME_MAP.put(27, "RIGHTBRACE");
56         KEYCODE_NAME_MAP.put(28, "ENTER");
57         KEYCODE_NAME_MAP.put(29, "LEFTCTRL");
58         KEYCODE_NAME_MAP.put(30, "A");
59         KEYCODE_NAME_MAP.put(31, "S");
60         KEYCODE_NAME_MAP.put(32, "D");
61         KEYCODE_NAME_MAP.put(33, "F");
62         KEYCODE_NAME_MAP.put(34, "G");
63         KEYCODE_NAME_MAP.put(35, "H");
64         KEYCODE_NAME_MAP.put(36, "J");
65         KEYCODE_NAME_MAP.put(37, "K");
66         KEYCODE_NAME_MAP.put(38, "L");
67         KEYCODE_NAME_MAP.put(39, "SEMICOLON");
68         KEYCODE_NAME_MAP.put(40, "APOSTROPHE");
69         KEYCODE_NAME_MAP.put(41, "GRAVE");
70         KEYCODE_NAME_MAP.put(42, "LEFTSHIFT");
71         KEYCODE_NAME_MAP.put(43, "BACKSLASH");
72         KEYCODE_NAME_MAP.put(44, "Z");
73         KEYCODE_NAME_MAP.put(45, "X");
74         KEYCODE_NAME_MAP.put(46, "C");
75         KEYCODE_NAME_MAP.put(47, "V");
76         KEYCODE_NAME_MAP.put(48, "B");
77         KEYCODE_NAME_MAP.put(49, "N");
78         KEYCODE_NAME_MAP.put(50, "M");
79         KEYCODE_NAME_MAP.put(51, "COMMA");
80         KEYCODE_NAME_MAP.put(52, "DOT");
81         KEYCODE_NAME_MAP.put(53, "SLASH");
82         KEYCODE_NAME_MAP.put(54, "RIGHTSHIFT");
83         KEYCODE_NAME_MAP.put(55, "KPASTERISK");
84         KEYCODE_NAME_MAP.put(56, "LEFTALT");
85         KEYCODE_NAME_MAP.put(57, "SPACE");
86         KEYCODE_NAME_MAP.put(58, "CAPSLOCK");
87         KEYCODE_NAME_MAP.put(59, "F1");
88         KEYCODE_NAME_MAP.put(60, "F2");
89         KEYCODE_NAME_MAP.put(61, "F3");
90         KEYCODE_NAME_MAP.put(62, "F4");
91         KEYCODE_NAME_MAP.put(63, "F5");
92         KEYCODE_NAME_MAP.put(64, "F6");
93         KEYCODE_NAME_MAP.put(65, "F7");
94         KEYCODE_NAME_MAP.put(66, "F8");
95         KEYCODE_NAME_MAP.put(67, "F9");
96         KEYCODE_NAME_MAP.put(68, "F10");
97         KEYCODE_NAME_MAP.put(69, "NUMLOCK");
98         KEYCODE_NAME_MAP.put(70, "SCROLLLOCK");
99         KEYCODE_NAME_MAP.put(71, "KP7");
100         KEYCODE_NAME_MAP.put(72, "KP8");
101         KEYCODE_NAME_MAP.put(73, "KP9");
102         KEYCODE_NAME_MAP.put(74, "KPMINUS");
103         KEYCODE_NAME_MAP.put(75, "KP4");
104         KEYCODE_NAME_MAP.put(76, "KP5");
105         KEYCODE_NAME_MAP.put(77, "KP6");
106         KEYCODE_NAME_MAP.put(78, "KPPLUS");
107         KEYCODE_NAME_MAP.put(79, "KP1");
108         KEYCODE_NAME_MAP.put(80, "KP2");
109         KEYCODE_NAME_MAP.put(81, "KP3");
110         KEYCODE_NAME_MAP.put(82, "KP0");
111         KEYCODE_NAME_MAP.put(83, "KPDOT");
112         KEYCODE_NAME_MAP.put(85, "ZENKAKUHANKAKU");
113         KEYCODE_NAME_MAP.put(86, "102ND");
114         KEYCODE_NAME_MAP.put(87, "F11");
115         KEYCODE_NAME_MAP.put(88, "F12");
116         KEYCODE_NAME_MAP.put(89, "RO");
117         KEYCODE_NAME_MAP.put(90, "KATAKANA");
118         KEYCODE_NAME_MAP.put(91, "HIRAGANA");
119         KEYCODE_NAME_MAP.put(92, "HENKAN");
120         KEYCODE_NAME_MAP.put(93, "KATAKANAHIRAGANA");
121         KEYCODE_NAME_MAP.put(94, "MUHENKAN");
122         KEYCODE_NAME_MAP.put(95, "KPJPCOMMA");
123         KEYCODE_NAME_MAP.put(96, "KPENTER");
124         KEYCODE_NAME_MAP.put(97, "RIGHTCTRL");
125         KEYCODE_NAME_MAP.put(98, "KPSLASH");
126         KEYCODE_NAME_MAP.put(99, "SYSRQ");
127         KEYCODE_NAME_MAP.put(100, "RIGHTALT");
128         KEYCODE_NAME_MAP.put(101, "LINEFEED");
129         KEYCODE_NAME_MAP.put(102, "HOME");
130         KEYCODE_NAME_MAP.put(103, "UP");
131         KEYCODE_NAME_MAP.put(104, "PAGEUP");
132         KEYCODE_NAME_MAP.put(105, "LEFT");
133         KEYCODE_NAME_MAP.put(106, "RIGHT");
134         KEYCODE_NAME_MAP.put(107, "END");
135         KEYCODE_NAME_MAP.put(108, "DOWN");
136         KEYCODE_NAME_MAP.put(109, "PAGEDOWN");
137         KEYCODE_NAME_MAP.put(110, "INSERT");
138         KEYCODE_NAME_MAP.put(111, "DELETE");
139         KEYCODE_NAME_MAP.put(112, "MACRO");
140         KEYCODE_NAME_MAP.put(113, "MUTE");
141         KEYCODE_NAME_MAP.put(114, "VOLUMEDOWN");
142         KEYCODE_NAME_MAP.put(115, "VOLUMEUP");
143         KEYCODE_NAME_MAP.put(116, "POWER");
144         KEYCODE_NAME_MAP.put(117, "KPEQUAL");
145         KEYCODE_NAME_MAP.put(118, "KPPLUSMINUS");
146         KEYCODE_NAME_MAP.put(119, "PAUSE");
147         KEYCODE_NAME_MAP.put(120, "SCALE");
148         KEYCODE_NAME_MAP.put(121, "KPCOMMA");
149         KEYCODE_NAME_MAP.put(122, "HANGEUL");
150         KEYCODE_NAME_MAP.put(123, "HANJA");
151         KEYCODE_NAME_MAP.put(124, "YEN");
152         KEYCODE_NAME_MAP.put(125, "LEFTMETA");
153         KEYCODE_NAME_MAP.put(126, "RIGHTMETA");
154         KEYCODE_NAME_MAP.put(127, "COMPOSE");
155         KEYCODE_NAME_MAP.put(128, "STOP");
156         KEYCODE_NAME_MAP.put(129, "AGAIN");
157         KEYCODE_NAME_MAP.put(130, "PROPS");
158         KEYCODE_NAME_MAP.put(131, "UNDO");
159         KEYCODE_NAME_MAP.put(132, "FRONT");
160         KEYCODE_NAME_MAP.put(133, "COPY");
161         KEYCODE_NAME_MAP.put(134, "OPEN");
162         KEYCODE_NAME_MAP.put(135, "PASTE");
163         KEYCODE_NAME_MAP.put(136, "FIND");
164         KEYCODE_NAME_MAP.put(137, "CUT");
165         KEYCODE_NAME_MAP.put(138, "HELP");
166         KEYCODE_NAME_MAP.put(139, "MENU");
167         KEYCODE_NAME_MAP.put(140, "CALC");
168         KEYCODE_NAME_MAP.put(141, "SETUP");
169         KEYCODE_NAME_MAP.put(142, "SLEEP");
170         KEYCODE_NAME_MAP.put(143, "WAKEUP");
171         KEYCODE_NAME_MAP.put(144, "FILE");
172         KEYCODE_NAME_MAP.put(145, "SENDFILE");
173         KEYCODE_NAME_MAP.put(146, "DELETEFILE");
174         KEYCODE_NAME_MAP.put(147, "XFER");
175         KEYCODE_NAME_MAP.put(148, "PROG1");
176         KEYCODE_NAME_MAP.put(149, "PROG2");
177         KEYCODE_NAME_MAP.put(150, "WWW");
178         KEYCODE_NAME_MAP.put(151, "MSDOS");
179         KEYCODE_NAME_MAP.put(152, "SCREENLOCK");
180         KEYCODE_NAME_MAP.put(153, "ROTATE_DISPLAY");
181         KEYCODE_NAME_MAP.put(154, "CYCLEWINDOWS");
182         KEYCODE_NAME_MAP.put(155, "MAIL");
183         KEYCODE_NAME_MAP.put(156, "BOOKMARKS");
184         KEYCODE_NAME_MAP.put(157, "COMPUTER");
185         KEYCODE_NAME_MAP.put(158, "BACK");
186         KEYCODE_NAME_MAP.put(159, "FORWARD");
187         KEYCODE_NAME_MAP.put(160, "CLOSECD");
188         KEYCODE_NAME_MAP.put(161, "EJECTCD");
189         KEYCODE_NAME_MAP.put(162, "EJECTCLOSECD");
190         KEYCODE_NAME_MAP.put(163, "NEXTSONG");
191         KEYCODE_NAME_MAP.put(164, "PLAYPAUSE");
192         KEYCODE_NAME_MAP.put(165, "PREVIOUSSONG");
193         KEYCODE_NAME_MAP.put(166, "STOPCD");
194         KEYCODE_NAME_MAP.put(167, "RECORD");
195         KEYCODE_NAME_MAP.put(168, "REWIND");
196         KEYCODE_NAME_MAP.put(169, "PHONE");
197         KEYCODE_NAME_MAP.put(170, "ISO");
198         KEYCODE_NAME_MAP.put(171, "CONFIG");
199         KEYCODE_NAME_MAP.put(172, "HOMEPAGE");
200         KEYCODE_NAME_MAP.put(173, "REFRESH");
201         KEYCODE_NAME_MAP.put(174, "EXIT");
202         KEYCODE_NAME_MAP.put(175, "MOVE");
203         KEYCODE_NAME_MAP.put(176, "EDIT");
204         KEYCODE_NAME_MAP.put(177, "SCROLLUP");
205         KEYCODE_NAME_MAP.put(178, "SCROLLDOWN");
206         KEYCODE_NAME_MAP.put(179, "KPLEFTPAREN");
207         KEYCODE_NAME_MAP.put(180, "KPRIGHTPAREN");
208         KEYCODE_NAME_MAP.put(181, "NEW");
209         KEYCODE_NAME_MAP.put(182, "REDO");
210         KEYCODE_NAME_MAP.put(183, "F13");
211         KEYCODE_NAME_MAP.put(184, "F14");
212         KEYCODE_NAME_MAP.put(185, "F15");
213         KEYCODE_NAME_MAP.put(186, "F16");
214         KEYCODE_NAME_MAP.put(187, "F17");
215         KEYCODE_NAME_MAP.put(188, "F18");
216         KEYCODE_NAME_MAP.put(189, "F19");
217         KEYCODE_NAME_MAP.put(190, "F20");
218         KEYCODE_NAME_MAP.put(191, "F21");
219         KEYCODE_NAME_MAP.put(192, "F22");
220         KEYCODE_NAME_MAP.put(193, "F23");
221         KEYCODE_NAME_MAP.put(194, "F24");
222         KEYCODE_NAME_MAP.put(200, "PLAYCD");
223         KEYCODE_NAME_MAP.put(201, "PAUSECD");
224         KEYCODE_NAME_MAP.put(202, "PROG3");
225         KEYCODE_NAME_MAP.put(203, "PROG4");
226         KEYCODE_NAME_MAP.put(204, "DASHBOARD");
227         KEYCODE_NAME_MAP.put(205, "SUSPEND");
228         KEYCODE_NAME_MAP.put(206, "CLOSE");
229         KEYCODE_NAME_MAP.put(207, "PLAY");
230         KEYCODE_NAME_MAP.put(208, "FASTFORWARD");
231         KEYCODE_NAME_MAP.put(209, "BASSBOOST");
232         KEYCODE_NAME_MAP.put(210, "PRINT");
233         KEYCODE_NAME_MAP.put(211, "HP");
234         KEYCODE_NAME_MAP.put(212, "CAMERA");
235         KEYCODE_NAME_MAP.put(213, "SOUND");
236         KEYCODE_NAME_MAP.put(214, "QUESTION");
237         KEYCODE_NAME_MAP.put(215, "EMAIL");
238         KEYCODE_NAME_MAP.put(216, "CHAT");
239         KEYCODE_NAME_MAP.put(217, "SEARCH");
240         KEYCODE_NAME_MAP.put(218, "CONNECT");
241         KEYCODE_NAME_MAP.put(219, "FINANCE");
242         KEYCODE_NAME_MAP.put(220, "SPORT");
243         KEYCODE_NAME_MAP.put(221, "SHOP");
244         KEYCODE_NAME_MAP.put(222, "ALTERASE");
245         KEYCODE_NAME_MAP.put(223, "CANCEL");
246         KEYCODE_NAME_MAP.put(224, "BRIGHTNESSDOWN");
247         KEYCODE_NAME_MAP.put(225, "BRIGHTNESSUP");
248         KEYCODE_NAME_MAP.put(226, "MEDIA");
249         KEYCODE_NAME_MAP.put(227, "SWITCHVIDEOMODE");
250         KEYCODE_NAME_MAP.put(228, "KBDILLUMTOGGLE");
251         KEYCODE_NAME_MAP.put(229, "KBDILLUMDOWN");
252         KEYCODE_NAME_MAP.put(230, "KBDILLUMUP");
253         KEYCODE_NAME_MAP.put(231, "SEND");
254         KEYCODE_NAME_MAP.put(232, "REPLY");
255         KEYCODE_NAME_MAP.put(233, "FORWARDMAIL");
256         KEYCODE_NAME_MAP.put(234, "SAVE");
257         KEYCODE_NAME_MAP.put(235, "DOCUMENTS");
258         KEYCODE_NAME_MAP.put(236, "BATTERY");
259         KEYCODE_NAME_MAP.put(237, "BLUETOOTH");
260         KEYCODE_NAME_MAP.put(238, "WLAN");
261         KEYCODE_NAME_MAP.put(239, "UWB");
262         KEYCODE_NAME_MAP.put(240, "UNKNOWN");
263         KEYCODE_NAME_MAP.put(241, "VIDEO_NEXT");
264         KEYCODE_NAME_MAP.put(242, "VIDEO_PREV");
265         KEYCODE_NAME_MAP.put(243, "BRIGHTNESS_CYCLE");
266         KEYCODE_NAME_MAP.put(244, "BRIGHTNESS_AUTO");
267         KEYCODE_NAME_MAP.put(245, "DISPLAY_OFF");
268         KEYCODE_NAME_MAP.put(246, "WWAN");
269         KEYCODE_NAME_MAP.put(247, "RFKILL");
270         KEYCODE_NAME_MAP.put(248, "MICMUTE");
271         KEYCODE_NAME_MAP.put(0x160, "OK");
272         KEYCODE_NAME_MAP.put(0x161, "SELECT");
273         KEYCODE_NAME_MAP.put(0x162, "GOTO");
274         KEYCODE_NAME_MAP.put(0x163, "CLEAR");
275         KEYCODE_NAME_MAP.put(0x164, "POWER2");
276         KEYCODE_NAME_MAP.put(0x165, "OPTION");
277         KEYCODE_NAME_MAP.put(0x166, "INFO");
278         KEYCODE_NAME_MAP.put(0x167, "TIME");
279         KEYCODE_NAME_MAP.put(0x168, "VENDOR");
280         KEYCODE_NAME_MAP.put(0x169, "ARCHIVE");
281         KEYCODE_NAME_MAP.put(0x16a, "PROGRAM");
282         KEYCODE_NAME_MAP.put(0x16b, "CHANNEL");
283         KEYCODE_NAME_MAP.put(0x16c, "FAVORITES");
284         KEYCODE_NAME_MAP.put(0x16d, "EPG");
285         KEYCODE_NAME_MAP.put(0x16e, "PVR");
286         KEYCODE_NAME_MAP.put(0x16f, "MHP");
287         KEYCODE_NAME_MAP.put(0x170, "LANGUAGE");
288         KEYCODE_NAME_MAP.put(0x171, "TITLE");
289         KEYCODE_NAME_MAP.put(0x172, "SUBTITLE");
290         KEYCODE_NAME_MAP.put(0x173, "ANGLE");
291         KEYCODE_NAME_MAP.put(0x174, "ZOOM");
292         KEYCODE_NAME_MAP.put(0x175, "MODE");
293         KEYCODE_NAME_MAP.put(0x176, "KEYBOARD");
294         KEYCODE_NAME_MAP.put(0x177, "SCREEN");
295         KEYCODE_NAME_MAP.put(0x178, "PC");
296         KEYCODE_NAME_MAP.put(0x179, "TV");
297         KEYCODE_NAME_MAP.put(0x17a, "TV2");
298         KEYCODE_NAME_MAP.put(0x17b, "VCR");
299         KEYCODE_NAME_MAP.put(0x17c, "VCR2");
300         KEYCODE_NAME_MAP.put(0x17d, "SAT");
301         KEYCODE_NAME_MAP.put(0x17e, "SAT2");
302         KEYCODE_NAME_MAP.put(0x17f, "CD");
303         KEYCODE_NAME_MAP.put(0x180, "TAPE");
304         KEYCODE_NAME_MAP.put(0x181, "RADIO");
305         KEYCODE_NAME_MAP.put(0x182, "TUNER");
306         KEYCODE_NAME_MAP.put(0x183, "PLAYER");
307         KEYCODE_NAME_MAP.put(0x184, "TEXT");
308         KEYCODE_NAME_MAP.put(0x185, "DVD");
309         KEYCODE_NAME_MAP.put(0x186, "AUX");
310         KEYCODE_NAME_MAP.put(0x187, "MP3");
311         KEYCODE_NAME_MAP.put(0x188, "AUDIO");
312         KEYCODE_NAME_MAP.put(0x189, "VIDEO");
313         KEYCODE_NAME_MAP.put(0x18a, "DIRECTORY");
314         KEYCODE_NAME_MAP.put(0x18b, "LIST");
315         KEYCODE_NAME_MAP.put(0x18c, "MEMO");
316         KEYCODE_NAME_MAP.put(0x18d, "CALENDAR");
317         KEYCODE_NAME_MAP.put(0x18e, "RED");
318         KEYCODE_NAME_MAP.put(0x18f, "GREEN");
319         KEYCODE_NAME_MAP.put(0x190, "YELLOW");
320         KEYCODE_NAME_MAP.put(0x191, "BLUE");
321         KEYCODE_NAME_MAP.put(0x192, "CHANNELUP");
322         KEYCODE_NAME_MAP.put(0x193, "CHANNELDOWN");
323         KEYCODE_NAME_MAP.put(0x194, "FIRST");
324         KEYCODE_NAME_MAP.put(0x195, "LAST");
325         KEYCODE_NAME_MAP.put(0x196, "AB");
326         KEYCODE_NAME_MAP.put(0x197, "NEXT");
327         KEYCODE_NAME_MAP.put(0x198, "RESTART");
328         KEYCODE_NAME_MAP.put(0x199, "SLOW");
329         KEYCODE_NAME_MAP.put(0x19a, "SHUFFLE");
330         KEYCODE_NAME_MAP.put(0x19b, "BREAK");
331         KEYCODE_NAME_MAP.put(0x19c, "PREVIOUS");
332         KEYCODE_NAME_MAP.put(0x19d, "DIGITS");
333         KEYCODE_NAME_MAP.put(0x19e, "TEEN");
334         KEYCODE_NAME_MAP.put(0x19f, "TWEN");
335         KEYCODE_NAME_MAP.put(0x1a0, "VIDEOPHONE");
336         KEYCODE_NAME_MAP.put(0x1a1, "GAMES");
337         KEYCODE_NAME_MAP.put(0x1a2, "ZOOMIN");
338         KEYCODE_NAME_MAP.put(0x1a3, "ZOOMOUT");
339         KEYCODE_NAME_MAP.put(0x1a4, "ZOOMRESET");
340         KEYCODE_NAME_MAP.put(0x1a5, "WORDPROCESSOR");
341         KEYCODE_NAME_MAP.put(0x1a6, "EDITOR");
342         KEYCODE_NAME_MAP.put(0x1a7, "SPREADSHEET");
343         KEYCODE_NAME_MAP.put(0x1a8, "GRAPHICSEDITOR");
344         KEYCODE_NAME_MAP.put(0x1a9, "PRESENTATION");
345         KEYCODE_NAME_MAP.put(0x1aa, "DATABASE");
346         KEYCODE_NAME_MAP.put(0x1ab, "NEWS");
347         KEYCODE_NAME_MAP.put(0x1ac, "VOICEMAIL");
348         KEYCODE_NAME_MAP.put(0x1ad, "ADDRESSBOOK");
349         KEYCODE_NAME_MAP.put(0x1ae, "MESSENGER");
350         KEYCODE_NAME_MAP.put(0x1af, "DISPLAYTOGGLE");
351         KEYCODE_NAME_MAP.put(0x1b0, "SPELLCHECK");
352         KEYCODE_NAME_MAP.put(0x1b1, "LOGOFF");
353         KEYCODE_NAME_MAP.put(0x1b2, "DOLLAR");
354         KEYCODE_NAME_MAP.put(0x1b3, "EURO");
355         KEYCODE_NAME_MAP.put(0x1b4, "FRAMEBACK");
356         KEYCODE_NAME_MAP.put(0x1b5, "FRAMEFORWARD");
357         KEYCODE_NAME_MAP.put(0x1b6, "CONTEXT_MENU");
358         KEYCODE_NAME_MAP.put(0x1b7, "MEDIA_REPEAT");
359         KEYCODE_NAME_MAP.put(0x1b8, "10CHANNELSUP");
360         KEYCODE_NAME_MAP.put(0x1b9, "10CHANNELSDOWN");
361         KEYCODE_NAME_MAP.put(0x1ba, "IMAGES");
362         KEYCODE_NAME_MAP.put(0x1c0, "DEL_EOL");
363         KEYCODE_NAME_MAP.put(0x1c1, "DEL_EOS");
364         KEYCODE_NAME_MAP.put(0x1c2, "INS_LINE");
365         KEYCODE_NAME_MAP.put(0x1c3, "DEL_LINE");
366         KEYCODE_NAME_MAP.put(0x1d0, "FN");
367         KEYCODE_NAME_MAP.put(0x1d1, "FN_ESC");
368         KEYCODE_NAME_MAP.put(0x1d2, "FN_F1");
369         KEYCODE_NAME_MAP.put(0x1d3, "FN_F2");
370         KEYCODE_NAME_MAP.put(0x1d4, "FN_F3");
371         KEYCODE_NAME_MAP.put(0x1d5, "FN_F4");
372         KEYCODE_NAME_MAP.put(0x1d6, "FN_F5");
373         KEYCODE_NAME_MAP.put(0x1d7, "FN_F6");
374         KEYCODE_NAME_MAP.put(0x1d8, "FN_F7");
375         KEYCODE_NAME_MAP.put(0x1d9, "FN_F8");
376         KEYCODE_NAME_MAP.put(0x1da, "FN_F9");
377         KEYCODE_NAME_MAP.put(0x1db, "FN_F10");
378         KEYCODE_NAME_MAP.put(0x1dc, "FN_F11");
379         KEYCODE_NAME_MAP.put(0x1dd, "FN_F12");
380         KEYCODE_NAME_MAP.put(0x1de, "FN_1");
381         KEYCODE_NAME_MAP.put(0x1df, "FN_2");
382         KEYCODE_NAME_MAP.put(0x1e0, "FN_D");
383         KEYCODE_NAME_MAP.put(0x1e1, "FN_E");
384         KEYCODE_NAME_MAP.put(0x1e2, "FN_F");
385         KEYCODE_NAME_MAP.put(0x1e3, "FN_S");
386         KEYCODE_NAME_MAP.put(0x1e4, "FN_B");
387         KEYCODE_NAME_MAP.put(0x1f1, "BRL_DOT1");
388         KEYCODE_NAME_MAP.put(0x1f2, "BRL_DOT2");
389         KEYCODE_NAME_MAP.put(0x1f3, "BRL_DOT3");
390         KEYCODE_NAME_MAP.put(0x1f4, "BRL_DOT4");
391         KEYCODE_NAME_MAP.put(0x1f5, "BRL_DOT5");
392         KEYCODE_NAME_MAP.put(0x1f6, "BRL_DOT6");
393         KEYCODE_NAME_MAP.put(0x1f7, "BRL_DOT7");
394         KEYCODE_NAME_MAP.put(0x1f8, "BRL_DOT8");
395         KEYCODE_NAME_MAP.put(0x1f9, "BRL_DOT9");
396         KEYCODE_NAME_MAP.put(0x1fa, "BRL_DOT10");
397         KEYCODE_NAME_MAP.put(0x200, "NUMERIC_0");
398         KEYCODE_NAME_MAP.put(0x201, "NUMERIC_1");
399         KEYCODE_NAME_MAP.put(0x202, "NUMERIC_2");
400         KEYCODE_NAME_MAP.put(0x203, "NUMERIC_3");
401         KEYCODE_NAME_MAP.put(0x204, "NUMERIC_4");
402         KEYCODE_NAME_MAP.put(0x205, "NUMERIC_5");
403         KEYCODE_NAME_MAP.put(0x206, "NUMERIC_6");
404         KEYCODE_NAME_MAP.put(0x207, "NUMERIC_7");
405         KEYCODE_NAME_MAP.put(0x208, "NUMERIC_8");
406         KEYCODE_NAME_MAP.put(0x209, "NUMERIC_9");
407         KEYCODE_NAME_MAP.put(0x20a, "NUMERIC_STAR");
408         KEYCODE_NAME_MAP.put(0x20b, "NUMERIC_POUND");
409         KEYCODE_NAME_MAP.put(0x20c, "NUMERIC_A");
410         KEYCODE_NAME_MAP.put(0x20d, "NUMERIC_B");
411         KEYCODE_NAME_MAP.put(0x20e, "NUMERIC_C");
412         KEYCODE_NAME_MAP.put(0x20f, "NUMERIC_D");
413         KEYCODE_NAME_MAP.put(0x210, "CAMERA_FOCUS");
414         KEYCODE_NAME_MAP.put(0x211, "WPS_BUTTON");
415         KEYCODE_NAME_MAP.put(0x212, "TOUCHPAD_TOGGLE");
416         KEYCODE_NAME_MAP.put(0x213, "TOUCHPAD_ON");
417         KEYCODE_NAME_MAP.put(0x214, "TOUCHPAD_OFF");
418         KEYCODE_NAME_MAP.put(0x215, "CAMERA_ZOOMIN");
419         KEYCODE_NAME_MAP.put(0x216, "CAMERA_ZOOMOUT");
420         KEYCODE_NAME_MAP.put(0x217, "CAMERA_UP");
421         KEYCODE_NAME_MAP.put(0x218, "CAMERA_DOWN");
422         KEYCODE_NAME_MAP.put(0x219, "CAMERA_LEFT");
423         KEYCODE_NAME_MAP.put(0x21a, "CAMERA_RIGHT");
424         KEYCODE_NAME_MAP.put(0x21b, "ATTENDANT_ON");
425         KEYCODE_NAME_MAP.put(0x21c, "ATTENDANT_OFF");
426         KEYCODE_NAME_MAP.put(0x21d, "ATTENDANT_TOGGLE");
427         KEYCODE_NAME_MAP.put(0x21e, "LIGHTS_TOGGLE");
428         KEYCODE_NAME_MAP.put(0x230, "ALS_TOGGLE");
429         KEYCODE_NAME_MAP.put(0x240, "BUTTONCONFIG");
430         KEYCODE_NAME_MAP.put(0x241, "TASKMANAGER");
431         KEYCODE_NAME_MAP.put(0x242, "JOURNAL");
432         KEYCODE_NAME_MAP.put(0x243, "CONTROLPANEL");
433         KEYCODE_NAME_MAP.put(0x244, "APPSELECT");
434         KEYCODE_NAME_MAP.put(0x245, "SCREENSAVER");
435         KEYCODE_NAME_MAP.put(0x246, "VOICECOMMAND");
436         KEYCODE_NAME_MAP.put(0x247, "ASSISTANT");
437         KEYCODE_NAME_MAP.put(0x250, "BRIGHTNESS_MIN");
438         KEYCODE_NAME_MAP.put(0x251, "BRIGHTNESS_MAX");
439         KEYCODE_NAME_MAP.put(0x260, "KBDINPUTASSIST_PREV");
440         KEYCODE_NAME_MAP.put(0x261, "KBDINPUTASSIST_NEXT");
441         KEYCODE_NAME_MAP.put(0x262, "KBDINPUTASSIST_PREVGROUP");
442         KEYCODE_NAME_MAP.put(0x263, "KBDINPUTASSIST_NEXTGROUP");
443         KEYCODE_NAME_MAP.put(0x264, "KBDINPUTASSIST_ACCEPT");
444         KEYCODE_NAME_MAP.put(0x265, "KBDINPUTASSIST_CANCEL");
445         KEYCODE_NAME_MAP.put(0x266, "RIGHT_UP");
446         KEYCODE_NAME_MAP.put(0x267, "RIGHT_DOWN");
447         KEYCODE_NAME_MAP.put(0x268, "LEFT_UP");
448         KEYCODE_NAME_MAP.put(0x269, "LEFT_DOWN");
449         KEYCODE_NAME_MAP.put(0x26a, "ROOT_MENU");
450         KEYCODE_NAME_MAP.put(0x26b, "MEDIA_TOP_MENU");
451         KEYCODE_NAME_MAP.put(0x26c, "NUMERIC_11");
452         KEYCODE_NAME_MAP.put(0x26d, "NUMERIC_12");
453         KEYCODE_NAME_MAP.put(0x26e, "AUDIO_DESC");
454         KEYCODE_NAME_MAP.put(0x26f, "3D_MODE");
455         KEYCODE_NAME_MAP.put(0x270, "NEXT_FAVORITE");
456         KEYCODE_NAME_MAP.put(0x271, "STOP_RECORD");
457         KEYCODE_NAME_MAP.put(0x272, "PAUSE_RECORD");
458         KEYCODE_NAME_MAP.put(0x273, "VOD");
459         KEYCODE_NAME_MAP.put(0x274, "UNMUTE");
460         KEYCODE_NAME_MAP.put(0x275, "FASTREVERSE");
461         KEYCODE_NAME_MAP.put(0x276, "SLOWREVERSE");
462         KEYCODE_NAME_MAP.put(0x277, "DATA");
463         KEYCODE_NAME_MAP.put(0x278, "ONSCREEN_KEYBOARD");
464         KEYCODE_NAME_MAP.put(113, "MIN_INTERESTING");
465         KEYCODE_NAME_MAP.put(0x2ff, "MAX");
466         KEYCODE_NAME_MAP.put(0x100, "MISC");
467         KEYCODE_NAME_MAP.put(0x100, "0");
468         KEYCODE_NAME_MAP.put(0x101, "1");
469         KEYCODE_NAME_MAP.put(0x102, "2");
470         KEYCODE_NAME_MAP.put(0x103, "3");
471         KEYCODE_NAME_MAP.put(0x104, "4");
472         KEYCODE_NAME_MAP.put(0x105, "5");
473         KEYCODE_NAME_MAP.put(0x106, "6");
474         KEYCODE_NAME_MAP.put(0x107, "7");
475         KEYCODE_NAME_MAP.put(0x108, "8");
476         KEYCODE_NAME_MAP.put(0x109, "9");
477         KEYCODE_NAME_MAP.put(0x110, "MOUSE");
478         KEYCODE_NAME_MAP.put(0x110, "LEFT");
479         KEYCODE_NAME_MAP.put(0x111, "RIGHT");
480         KEYCODE_NAME_MAP.put(0x112, "MIDDLE");
481         KEYCODE_NAME_MAP.put(0x113, "SIDE");
482         KEYCODE_NAME_MAP.put(0x114, "EXTRA");
483         KEYCODE_NAME_MAP.put(0x115, "FORWARD");
484         KEYCODE_NAME_MAP.put(0x116, "BACK");
485         KEYCODE_NAME_MAP.put(0x117, "TASK");
486         KEYCODE_NAME_MAP.put(0x120, "JOYSTICK");
487         KEYCODE_NAME_MAP.put(0x120, "TRIGGER");
488         KEYCODE_NAME_MAP.put(0x121, "THUMB");
489         KEYCODE_NAME_MAP.put(0x122, "THUMB2");
490         KEYCODE_NAME_MAP.put(0x123, "TOP");
491         KEYCODE_NAME_MAP.put(0x124, "TOP2");
492         KEYCODE_NAME_MAP.put(0x125, "PINKIE");
493         KEYCODE_NAME_MAP.put(0x126, "BASE");
494         KEYCODE_NAME_MAP.put(0x127, "BASE2");
495         KEYCODE_NAME_MAP.put(0x128, "BASE3");
496         KEYCODE_NAME_MAP.put(0x129, "BASE4");
497         KEYCODE_NAME_MAP.put(0x12a, "BASE5");
498         KEYCODE_NAME_MAP.put(0x12b, "BASE6");
499         KEYCODE_NAME_MAP.put(0x12f, "DEAD");
500         KEYCODE_NAME_MAP.put(0x130, "GAMEPAD");
501         KEYCODE_NAME_MAP.put(0x130, "SOUTH");
502         KEYCODE_NAME_MAP.put(0x131, "EAST");
503         KEYCODE_NAME_MAP.put(0x132, "C");
504         KEYCODE_NAME_MAP.put(0x133, "NORTH");
505         KEYCODE_NAME_MAP.put(0x134, "WEST");
506         KEYCODE_NAME_MAP.put(0x135, "Z");
507         KEYCODE_NAME_MAP.put(0x136, "TL");
508         KEYCODE_NAME_MAP.put(0x137, "TR");
509         KEYCODE_NAME_MAP.put(0x138, "TL2");
510         KEYCODE_NAME_MAP.put(0x139, "TR2");
511         KEYCODE_NAME_MAP.put(0x13a, "SELECT");
512         KEYCODE_NAME_MAP.put(0x13b, "START");
513         KEYCODE_NAME_MAP.put(0x13c, "MODE");
514         KEYCODE_NAME_MAP.put(0x13d, "THUMBL");
515         KEYCODE_NAME_MAP.put(0x13e, "THUMBR");
516         KEYCODE_NAME_MAP.put(0x140, "DIGI");
517         KEYCODE_NAME_MAP.put(0x140, "TOOL_PEN");
518         KEYCODE_NAME_MAP.put(0x141, "TOOL_RUBBER");
519         KEYCODE_NAME_MAP.put(0x142, "TOOL_BRUSH");
520         KEYCODE_NAME_MAP.put(0x143, "TOOL_PENCIL");
521         KEYCODE_NAME_MAP.put(0x144, "TOOL_AIRBRUSH");
522         KEYCODE_NAME_MAP.put(0x145, "TOOL_FINGER");
523         KEYCODE_NAME_MAP.put(0x146, "TOOL_MOUSE");
524         KEYCODE_NAME_MAP.put(0x147, "TOOL_LENS");
525         KEYCODE_NAME_MAP.put(0x148, "TOOL_QUINTTAP");
526         KEYCODE_NAME_MAP.put(0x149, "STYLUS3");
527         KEYCODE_NAME_MAP.put(0x14a, "TOUCH");
528         KEYCODE_NAME_MAP.put(0x14b, "STYLUS");
529         KEYCODE_NAME_MAP.put(0x14c, "STYLUS2");
530         KEYCODE_NAME_MAP.put(0x14d, "TOOL_DOUBLETAP");
531         KEYCODE_NAME_MAP.put(0x14e, "TOOL_TRIPLETAP");
532         KEYCODE_NAME_MAP.put(0x14f, "TOOL_QUADTAP");
533         KEYCODE_NAME_MAP.put(0x150, "WHEEL");
534         KEYCODE_NAME_MAP.put(0x150, "GEAR_DOWN");
535         KEYCODE_NAME_MAP.put(0x151, "GEAR_UP");
536         KEYCODE_NAME_MAP.put(0x220, "DPAD_UP");
537         KEYCODE_NAME_MAP.put(0x221, "DPAD_DOWN");
538         KEYCODE_NAME_MAP.put(0x222, "DPAD_LEFT");
539         KEYCODE_NAME_MAP.put(0x223, "DPAD_RIGHT");
540         KEYCODE_NAME_MAP.put(0x2c0, "TRIGGER_HAPPY");
541         KEYCODE_NAME_MAP.put(0x2c0, "TRIGGER_HAPPY1");
542         KEYCODE_NAME_MAP.put(0x2c1, "TRIGGER_HAPPY2");
543         KEYCODE_NAME_MAP.put(0x2c2, "TRIGGER_HAPPY3");
544         KEYCODE_NAME_MAP.put(0x2c3, "TRIGGER_HAPPY4");
545         KEYCODE_NAME_MAP.put(0x2c4, "TRIGGER_HAPPY5");
546         KEYCODE_NAME_MAP.put(0x2c5, "TRIGGER_HAPPY6");
547         KEYCODE_NAME_MAP.put(0x2c6, "TRIGGER_HAPPY7");
548         KEYCODE_NAME_MAP.put(0x2c7, "TRIGGER_HAPPY8");
549         KEYCODE_NAME_MAP.put(0x2c8, "TRIGGER_HAPPY9");
550         KEYCODE_NAME_MAP.put(0x2c9, "TRIGGER_HAPPY10");
551         KEYCODE_NAME_MAP.put(0x2ca, "TRIGGER_HAPPY11");
552         KEYCODE_NAME_MAP.put(0x2cb, "TRIGGER_HAPPY12");
553         KEYCODE_NAME_MAP.put(0x2cc, "TRIGGER_HAPPY13");
554         KEYCODE_NAME_MAP.put(0x2cd, "TRIGGER_HAPPY14");
555         KEYCODE_NAME_MAP.put(0x2ce, "TRIGGER_HAPPY15");
556         KEYCODE_NAME_MAP.put(0x2cf, "TRIGGER_HAPPY16");
557         KEYCODE_NAME_MAP.put(0x2d0, "TRIGGER_HAPPY17");
558         KEYCODE_NAME_MAP.put(0x2d1, "TRIGGER_HAPPY18");
559         KEYCODE_NAME_MAP.put(0x2d2, "TRIGGER_HAPPY19");
560         KEYCODE_NAME_MAP.put(0x2d3, "TRIGGER_HAPPY20");
561         KEYCODE_NAME_MAP.put(0x2d4, "TRIGGER_HAPPY21");
562         KEYCODE_NAME_MAP.put(0x2d5, "TRIGGER_HAPPY22");
563         KEYCODE_NAME_MAP.put(0x2d6, "TRIGGER_HAPPY23");
564         KEYCODE_NAME_MAP.put(0x2d7, "TRIGGER_HAPPY24");
565         KEYCODE_NAME_MAP.put(0x2d8, "TRIGGER_HAPPY25");
566         KEYCODE_NAME_MAP.put(0x2d9, "TRIGGER_HAPPY26");
567         KEYCODE_NAME_MAP.put(0x2da, "TRIGGER_HAPPY27");
568         KEYCODE_NAME_MAP.put(0x2db, "TRIGGER_HAPPY28");
569         KEYCODE_NAME_MAP.put(0x2dc, "TRIGGER_HAPPY29");
570         KEYCODE_NAME_MAP.put(0x2dd, "TRIGGER_HAPPY30");
571         KEYCODE_NAME_MAP.put(0x2de, "TRIGGER_HAPPY31");
572         KEYCODE_NAME_MAP.put(0x2df, "TRIGGER_HAPPY32");
573         KEYCODE_NAME_MAP.put(0x2e0, "TRIGGER_HAPPY33");
574         KEYCODE_NAME_MAP.put(0x2e1, "TRIGGER_HAPPY34");
575         KEYCODE_NAME_MAP.put(0x2e2, "TRIGGER_HAPPY35");
576         KEYCODE_NAME_MAP.put(0x2e3, "TRIGGER_HAPPY36");
577         KEYCODE_NAME_MAP.put(0x2e4, "TRIGGER_HAPPY37");
578         KEYCODE_NAME_MAP.put(0x2e5, "TRIGGER_HAPPY38");
579         KEYCODE_NAME_MAP.put(0x2e6, "TRIGGER_HAPPY39");
580         KEYCODE_NAME_MAP.put(0x2e7, "TRIGGER_HAPPY40");
581     }
582 
583     public final String source;
584     public final int keycode;
585     public final boolean isKeydown;
586 
587     public static final Parcelable.Creator<KeypressEvent> CREATOR =
588         new Parcelable.Creator<KeypressEvent>() {
589             public KeypressEvent createFromParcel(Parcel in) {
590                 return new KeypressEvent(in);
591             }
592 
593             public KeypressEvent[] newArray(int size) {
594                 return new KeypressEvent[size];
595             }
596         };
597 
KeypressEvent(Parcel in)598     public KeypressEvent(Parcel in) {
599         source = in.readString();
600         keycode = in.readInt();
601         isKeydown = (in.readInt() != 0);
602     }
603 
604     @Override
describeContents()605     public int describeContents() {
606         return 0;
607     }
608 
609     @Override
writeToParcel(Parcel dest, int flags)610     public void writeToParcel(Parcel dest, int flags) {
611         dest.writeString(source);
612         dest.writeInt(keycode);
613         dest.writeInt(isKeydown ? 1 : 0);
614     }
615 
616     @Override
equals(Object o)617     public boolean equals(Object o) {
618         if (o instanceof KeypressEvent) {
619             KeypressEvent other = (KeypressEvent)o;
620             return other.source.equals(source) &&
621                     other.keycode == keycode &&
622                     other.isKeydown == isKeydown;
623         }
624         return false;
625     }
626 
627     @Override
hashCode()628     public int hashCode() {
629         return Objects.hash(source, keycode, isKeydown);
630     }
631 
632     @Override
toString()633     public String toString() {
634         return"Event{source = " + source + ", keycode = " + keycode +
635                 ", isKeydown = " + isKeydown + "}";
636     }
637 
keycodeToString()638     public String keycodeToString() {
639         return keycodeToString(keycode);
640     }
641 
642     /**
643      * Translates a key code from keventreader into a string.
644      * @param keycode Key code from a keventreader KeypressEvent.
645      * @return String String label corresponding to keycode, if available. If not, String with
646      *     hexidecimal representation of keycode.
647      */
keycodeToString(int keycode)648     public static String keycodeToString(int keycode) {
649         String ret = KEYCODE_NAME_MAP.get(keycode);
650         return ret != null ? ret : "0x" + Integer.toHexString(keycode);
651     }
652 }
653