1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "core/event/key_event_recognizer.h"
17 
18 namespace OHOS::Ace {
19 namespace {
20 
21 constexpr int32_t LONG_PRESS_DURATION = 1;
22 constexpr int32_t KEY_INTENTION_OFFSET = 16;
23 constexpr int32_t KEY_INTENTION_ITEM_MIN_COUNT = 1;
24 constexpr int32_t KEY_INTENTION_ITEM_MAX_COUNT = 3;
25 
26 // List Menu key on keyboard.
27 constexpr int64_t KEY_COMPOSE = 2466;
28 
29 enum class CtrlKeysBit {
30     CTRL = 1,
31     SHIFT = 2,
32     ALT = 4,
33     META = 8,
34 };
35 }
36 
KeyCodeToString(int32_t keyCode)37 const char* KeyCodeToString(int32_t keyCode)
38 {
39     const static std::map<KeyCode, std::string> KEYCODE_TO_STRING = {
40         {KeyCode::KEY_FN, "KEYCODE_FN"},
41         {KeyCode::KEY_UNKNOWN, "KEYCODE_UNKNOWN"},
42         {KeyCode::KEY_HOME, "KEYCODE_HOME"},
43         {KeyCode::KEY_BACK, "KEYCODE_BACK"},
44         {KeyCode::KEY_CALL, "KEYCODE_CALL"},
45         {KeyCode::KEY_ENDCALL, "KEYCODE_ENDCALL"},
46         {KeyCode::KEY_CLEAR, "KEYCODE_CLEAR"},
47         {KeyCode::KEY_HEADSETHOOK, "KEYCODE_HEADSETHOOK"},
48         {KeyCode::KEY_FOCUS, "KEYCODE_FOCUS"},
49         {KeyCode::KEY_NOTIFICATION, "KEYCODE_NOTIFICATION"},
50         {KeyCode::KEY_SEARCH, "KEYCODE_SEARCH"},
51         {KeyCode::KEY_MEDIA_PLAY_PAUSE, "KEYCODE_MEDIA_PLAY_PAUSE"},
52         {KeyCode::KEY_MEDIA_STOP, "KEYCODE_MEDIA_STOP"},
53         {KeyCode::KEY_MEDIA_NEXT, "KEYCODE_MEDIA_NEXT"},
54         {KeyCode::KEY_MEDIA_PREVIOUS, "KEYCODE_MEDIA_PREVIOUS"},
55         {KeyCode::KEY_MEDIA_REWIND, "KEYCODE_MEDIA_REWIND"},
56         {KeyCode::KEY_MEDIA_FAST_FORWARD, "KEYCODE_MEDIA_FAST_FORWARD"},
57         {KeyCode::KEY_VOLUME_UP, "KEYCODE_VOLUME_UP"},
58         {KeyCode::KEY_VOLUME_DOWN, "KEYCODE_VOLUME_DOWN"},
59         {KeyCode::KEY_POWER, "KEYCODE_POWER"},
60         {KeyCode::KEY_CAMERA, "KEYCODE_CAMERA"},
61         {KeyCode::KEY_VOICE_ASSISTANT, "KEYCODE_VOICE_ASSISTANT"},
62         {KeyCode::KEY_CUSTOM1, "KEYCODE_CUSTOM1"},
63         {KeyCode::KEY_VOLUME_MUTE, "KEYCODE_VOLUME_MUTE"},
64         {KeyCode::KEY_MUTE, "KEYCODE_MUTE"},
65         {KeyCode::KEY_BRIGHTNESS_UP, "KEYCODE_BRIGHTNESS_UP"},
66         {KeyCode::KEY_BRIGHTNESS_DOWN, "KEYCODE_BRIGHTNESS_DOWN"},
67         {KeyCode::KEY_WEAR_1, "KEYCODE_WEAR_1"},
68         {KeyCode::KEY_0, "KEYCODE_0"},
69         {KeyCode::KEY_1, "KEYCODE_1"},
70         {KeyCode::KEY_2, "KEYCODE_2"},
71         {KeyCode::KEY_3, "KEYCODE_3"},
72         {KeyCode::KEY_4, "KEYCODE_4"},
73         {KeyCode::KEY_5, "KEYCODE_5"},
74         {KeyCode::KEY_6, "KEYCODE_6"},
75         {KeyCode::KEY_7, "KEYCODE_7"},
76         {KeyCode::KEY_8, "KEYCODE_8"},
77         {KeyCode::KEY_9, "KEYCODE_9"},
78         {KeyCode::KEY_STAR, "KEYCODE_STAR"},
79         {KeyCode::KEY_POUND, "KEYCODE_POUND"},
80         {KeyCode::KEY_DPAD_UP, "KEYCODE_DPAD_UP"},
81         {KeyCode::KEY_DPAD_DOWN, "KEYCODE_DPAD_DOWN"},
82         {KeyCode::KEY_DPAD_LEFT, "KEYCODE_DPAD_LEFT"},
83         {KeyCode::KEY_DPAD_RIGHT, "KEYCODE_DPAD_RIGHT"},
84         {KeyCode::KEY_DPAD_CENTER, "KEYCODE_DPAD_CENTER"},
85         {KeyCode::KEY_A, "KEYCODE_A"},
86         {KeyCode::KEY_B, "KEYCODE_B"},
87         {KeyCode::KEY_C, "KEYCODE_C"},
88         {KeyCode::KEY_D, "KEYCODE_D"},
89         {KeyCode::KEY_E, "KEYCODE_E"},
90         {KeyCode::KEY_F, "KEYCODE_F"},
91         {KeyCode::KEY_G, "KEYCODE_G"},
92         {KeyCode::KEY_H, "KEYCODE_H"},
93         {KeyCode::KEY_I, "KEYCODE_I"},
94         {KeyCode::KEY_J, "KEYCODE_J"},
95         {KeyCode::KEY_K, "KEYCODE_K"},
96         {KeyCode::KEY_L, "KEYCODE_L"},
97         {KeyCode::KEY_M, "KEYCODE_M"},
98         {KeyCode::KEY_N, "KEYCODE_N"},
99         {KeyCode::KEY_O, "KEYCODE_O"},
100         {KeyCode::KEY_P, "KEYCODE_P"},
101         {KeyCode::KEY_Q, "KEYCODE_Q"},
102         {KeyCode::KEY_R, "KEYCODE_R"},
103         {KeyCode::KEY_S, "KEYCODE_S"},
104         {KeyCode::KEY_T, "KEYCODE_T"},
105         {KeyCode::KEY_U, "KEYCODE_U"},
106         {KeyCode::KEY_V, "KEYCODE_V"},
107         {KeyCode::KEY_W, "KEYCODE_W"},
108         {KeyCode::KEY_X, "KEYCODE_X"},
109         {KeyCode::KEY_Y, "KEYCODE_Y"},
110         {KeyCode::KEY_Z, "KEYCODE_Z"},
111         {KeyCode::KEY_COMMA, "KEYCODE_COMMA"},
112         {KeyCode::KEY_PERIOD, "KEYCODE_PERIOD"},
113         {KeyCode::KEY_ALT_LEFT, "KEYCODE_ALT_LEFT"},
114         {KeyCode::KEY_ALT_RIGHT, "KEYCODE_ALT_RIGHT"},
115         {KeyCode::KEY_SHIFT_LEFT, "KEYCODE_SHIFT_LEFT"},
116         {KeyCode::KEY_SHIFT_RIGHT, "KEYCODE_SHIFT_RIGHT"},
117         {KeyCode::KEY_TAB, "KEYCODE_TAB"},
118         {KeyCode::KEY_SPACE, "KEYCODE_SPACE"},
119         {KeyCode::KEY_SYM, "KEYCODE_SYM"},
120         {KeyCode::KEY_EXPLORER, "KEYCODE_EXPLORER"},
121         {KeyCode::KEY_ENVELOPE, "KEYCODE_ENVELOPE"},
122         {KeyCode::KEY_ENTER, "KEYCODE_ENTER"},
123         {KeyCode::KEY_DEL, "KEYCODE_DEL"},
124         {KeyCode::KEY_GRAVE, "KEYCODE_GRAVE"},
125         {KeyCode::KEY_MINUS, "KEYCODE_MINUS"},
126         {KeyCode::KEY_EQUALS, "KEYCODE_EQUALS"},
127         {KeyCode::KEY_LEFT_BRACKET, "KEYCODE_LEFT_BRACKET"},
128         {KeyCode::KEY_RIGHT_BRACKET, "KEYCODE_RIGHT_BRACKET"},
129         {KeyCode::KEY_BACKSLASH, "KEYCODE_BACKSLASH"},
130         {KeyCode::KEY_SEMICOLON, "KEYCODE_SEMICOLON"},
131         {KeyCode::KEY_APOSTROPHE, "KEYCODE_APOSTROPHE"},
132         {KeyCode::KEY_SLASH, "KEYCODE_SLASH"},
133         {KeyCode::KEY_AT, "KEYCODE_AT"},
134         {KeyCode::KEY_PLUS, "KEYCODE_PLUS"},
135         {KeyCode::KEY_MENU, "KEYCODE_MENU"},
136         {KeyCode::KEY_PAGE_UP, "KEYCODE_PAGE_UP"},
137         {KeyCode::KEY_PAGE_DOWN, "KEYCODE_PAGE_DOWN"},
138         {KeyCode::KEY_ESCAPE, "KEYCODE_ESCAPE"},
139         {KeyCode::KEY_FORWARD_DEL, "KEYCODE_FORWARD_DEL"},
140         {KeyCode::KEY_CTRL_LEFT, "KEYCODE_CTRL_LEFT"},
141         {KeyCode::KEY_CTRL_RIGHT, "KEYCODE_CTRL_RIGHT"},
142         {KeyCode::KEY_CAPS_LOCK, "KEYCODE_CAPS_LOCK"},
143         {KeyCode::KEY_SCROLL_LOCK, "KEYCODE_SCROLL_LOCK"},
144         {KeyCode::KEY_META_LEFT, "KEYCODE_META_LEFT"},
145         {KeyCode::KEY_META_RIGHT, "KEYCODE_META_RIGHT"},
146         {KeyCode::KEY_FUNCTION, "KEYCODE_FUNCTION"},
147         {KeyCode::KEY_SYSRQ, "KEYCODE_SYSRQ"},
148         {KeyCode::KEY_BREAK, "KEYCODE_BREAK"},
149         {KeyCode::KEY_MOVE_HOME, "KEYCODE_MOVE_HOME"},
150         {KeyCode::KEY_MOVE_END, "KEYCODE_MOVE_END"},
151         {KeyCode::KEY_INSERT, "KEYCODE_INSERT"},
152         {KeyCode::KEY_FORWARD, "KEYCODE_FORWARD"},
153         {KeyCode::KEY_MEDIA_PLAY, "KEYCODE_MEDIA_PLAY"},
154         {KeyCode::KEY_MEDIA_PAUSE, "KEYCODE_MEDIA_PAUSE"},
155         {KeyCode::KEY_MEDIA_CLOSE, "KEYCODE_MEDIA_CLOSE"},
156         {KeyCode::KEY_MEDIA_EJECT, "KEYCODE_MEDIA_EJECT"},
157         {KeyCode::KEY_MEDIA_RECORD, "KEYCODE_MEDIA_RECORD"},
158         {KeyCode::KEY_F1, "KEYCODE_F1"},
159         {KeyCode::KEY_F2, "KEYCODE_F2"},
160         {KeyCode::KEY_F3, "KEYCODE_F3"},
161         {KeyCode::KEY_F4, "KEYCODE_F4"},
162         {KeyCode::KEY_F5, "KEYCODE_F5"},
163         {KeyCode::KEY_F6, "KEYCODE_F6"},
164         {KeyCode::KEY_F7, "KEYCODE_F7"},
165         {KeyCode::KEY_F8, "KEYCODE_F8"},
166         {KeyCode::KEY_F9, "KEYCODE_F9"},
167         {KeyCode::KEY_F10, "KEYCODE_F10"},
168         {KeyCode::KEY_F11, "KEYCODE_F11"},
169         {KeyCode::KEY_F12, "KEYCODE_F12"},
170         {KeyCode::KEY_NUM_LOCK, "KEYCODE_NUM_LOCK"},
171         {KeyCode::KEY_NUMPAD_0, "KEYCODE_NUMPAD_0"},
172         {KeyCode::KEY_NUMPAD_1, "KEYCODE_NUMPAD_1"},
173         {KeyCode::KEY_NUMPAD_2, "KEYCODE_NUMPAD_2"},
174         {KeyCode::KEY_NUMPAD_3, "KEYCODE_NUMPAD_3"},
175         {KeyCode::KEY_NUMPAD_4, "KEYCODE_NUMPAD_4"},
176         {KeyCode::KEY_NUMPAD_5, "KEYCODE_NUMPAD_5"},
177         {KeyCode::KEY_NUMPAD_6, "KEYCODE_NUMPAD_6"},
178         {KeyCode::KEY_NUMPAD_7, "KEYCODE_NUMPAD_7"},
179         {KeyCode::KEY_NUMPAD_8, "KEYCODE_NUMPAD_8"},
180         {KeyCode::KEY_NUMPAD_9, "KEYCODE_NUMPAD_9"},
181         {KeyCode::KEY_NUMPAD_DIVIDE, "KEYCODE_NUMPAD_DIVIDE"},
182         {KeyCode::KEY_NUMPAD_MULTIPLY, "KEYCODE_NUMPAD_MULTIPLY"},
183         {KeyCode::KEY_NUMPAD_SUBTRACT, "KEYCODE_NUMPAD_SUBTRACT"},
184         {KeyCode::KEY_NUMPAD_ADD, "KEYCODE_NUMPAD_ADD"},
185         {KeyCode::KEY_NUMPAD_DOT, "KEYCODE_NUMPAD_DOT"},
186         {KeyCode::KEY_NUMPAD_COMMA, "KEYCODE_NUMPAD_COMMA"},
187         {KeyCode::KEY_NUMPAD_ENTER, "KEYCODE_NUMPAD_ENTER"},
188         {KeyCode::KEY_NUMPAD_EQUALS, "KEYCODE_NUMPAD_EQUALS"},
189         {KeyCode::KEY_NUMPAD_LEFT_PAREN, "KEYCODE_NUMPAD_LEFT_PAREN"},
190         {KeyCode::KEY_NUMPAD_RIGHT_PAREN, "KEYCODE_NUMPAD_RIGHT_PAREN"},
191         {KeyCode::KEY_VIRTUAL_MULTITASK, "KEYCODE_VIRTUAL_MULTITASK"},
192         {KeyCode::KEY_BUTTON_A, "KEYCODE_BUTTON_A"},
193         {KeyCode::KEY_BUTTON_B, "KEYCODE_BUTTON_B"},
194         {KeyCode::KEY_BUTTON_C, "KEYCODE_BUTTON_C"},
195         {KeyCode::KEY_BUTTON_X, "KEYCODE_BUTTON_X"},
196         {KeyCode::KEY_BUTTON_Y, "KEYCODE_BUTTON_Y"},
197         {KeyCode::KEY_BUTTON_Z, "KEYCODE_BUTTON_Z"},
198         {KeyCode::KEY_BUTTON_L1, "KEYCODE_BUTTON_L1"},
199         {KeyCode::KEY_BUTTON_R1, "KEYCODE_BUTTON_R1"},
200         {KeyCode::KEY_BUTTON_L2, "KEYCODE_BUTTON_L2"},
201         {KeyCode::KEY_BUTTON_R2, "KEYCODE_BUTTON_R2"},
202         {KeyCode::KEY_BUTTON_SELECT, "KEYCODE_BUTTON_SELECT"},
203         {KeyCode::KEY_BUTTON_START, "KEYCODE_BUTTON_START"},
204         {KeyCode::KEY_BUTTON_MODE, "KEYCODE_BUTTON_MODE"},
205         {KeyCode::KEY_BUTTON_THUMBL, "KEYCODE_BUTTON_THUMBL"},
206         {KeyCode::KEY_BUTTON_THUMBR, "KEYCODE_BUTTON_THUMBR"},
207         {KeyCode::KEY_BUTTON_TRIGGER, "KEYCODE_BUTTON_TRIGGER"},
208         {KeyCode::KEY_BUTTON_THUMB, "KEYCODE_BUTTON_THUMB"},
209         {KeyCode::KEY_BUTTON_THUMB2, "KEYCODE_BUTTON_THUMB2"},
210         {KeyCode::KEY_BUTTON_TOP, "KEYCODE_BUTTON_TOP"},
211         {KeyCode::KEY_BUTTON_TOP2, "KEYCODE_BUTTON_TOP2"},
212         {KeyCode::KEY_BUTTON_PINKIE, "KEYCODE_BUTTON_PINKIE"},
213         {KeyCode::KEY_BUTTON_BASE1, "KEYCODE_BUTTON_BASE1"},
214         {KeyCode::KEY_BUTTON_BASE2, "KEYCODE_BUTTON_BASE2"},
215         {KeyCode::KEY_BUTTON_BASE3, "KEYCODE_BUTTON_BASE3"},
216         {KeyCode::KEY_BUTTON_BASE4, "KEYCODE_BUTTON_BASE4"},
217         {KeyCode::KEY_BUTTON_BASE5, "KEYCODE_BUTTON_BASE5"},
218         {KeyCode::KEY_BUTTON_BASE6, "KEYCODE_BUTTON_BASE6"},
219         {KeyCode::KEY_BUTTON_BASE7, "KEYCODE_BUTTON_BASE7"},
220         {KeyCode::KEY_BUTTON_BASE8, "KEYCODE_BUTTON_BASE8"},
221         {KeyCode::KEY_BUTTON_BASE9, "KEYCODE_BUTTON_BASE9"},
222         {KeyCode::KEY_BUTTON_DEAD, "KEYCODE_BUTTON_DEAD"},
223         {KeyCode::KEY_SLEEP, "KEYCODE_SLEEP"},
224         {KeyCode::KEY_ZENKAKU_HANKAKU, "KEYCODE_ZENKAKU_HANKAKU"},
225         {KeyCode::KEY_102ND, "KEYCODE_102ND"},
226         {KeyCode::KEY_RO, "KEYCODE_RO"},
227         {KeyCode::KEY_KATAKANA, "KEYCODE_KATAKANA"},
228         {KeyCode::KEY_HIRAGANA, "KEYCODE_HIRAGANA"},
229         {KeyCode::KEY_HENKAN, "KEYCODE_HENKAN"},
230         {KeyCode::KEY_KATAKANA_HIRAGANA, "KEYCODE_KATAKANA_HIRAGANA"},
231         {KeyCode::KEY_MUHENKAN, "KEYCODE_MUHENKAN"},
232         {KeyCode::KEY_LINEFEED, "KEYCODE_LINEFEED"},
233         {KeyCode::KEY_MACRO, "KEYCODE_MACRO"},
234         {KeyCode::KEY_NUMPAD_PLUSMINUS, "KEYCODE_NUMPAD_PLUSMINUS"},
235         {KeyCode::KEY_SCALE, "KEYCODE_SCALE"},
236         {KeyCode::KEY_HANGUEL, "KEYCODE_HANGUEL"},
237         {KeyCode::KEY_HANJA, "KEYCODE_HANJA"},
238         {KeyCode::KEY_YEN, "KEYCODE_YEN"},
239         {KeyCode::KEY_STOP, "KEYCODE_STOP"},
240         {KeyCode::KEY_AGAIN, "KEYCODE_AGAIN"},
241         {KeyCode::KEY_PROPS, "KEYCODE_PROPS"},
242         {KeyCode::KEY_UNDO, "KEYCODE_UNDO"},
243         {KeyCode::KEY_COPY, "KEYCODE_COPY"},
244         {KeyCode::KEY_OPEN, "KEYCODE_OPEN"},
245         {KeyCode::KEY_PASTE, "KEYCODE_PASTE"},
246         {KeyCode::KEY_FIND, "KEYCODE_FIND"},
247         {KeyCode::KEY_CUT, "KEYCODE_CUT"},
248         {KeyCode::KEY_HELP, "KEYCODE_HELP"},
249         {KeyCode::KEY_CALC, "KEYCODE_CALC"},
250         {KeyCode::KEY_FILE, "KEYCODE_FILE"},
251         {KeyCode::KEY_BOOKMARKS, "KEYCODE_BOOKMARKS"},
252         {KeyCode::KEY_NEXT, "KEYCODE_NEXT"},
253         {KeyCode::KEY_PLAYPAUSE, "KEYCODE_PLAYPAUSE"},
254         {KeyCode::KEY_PREVIOUS, "KEYCODE_PREVIOUS"},
255         {KeyCode::KEY_STOPCD, "KEYCODE_STOPCD"},
256         {KeyCode::KEY_CONFIG, "KEYCODE_CONFIG"},
257         {KeyCode::KEY_REFRESH, "KEYCODE_REFRESH"},
258         {KeyCode::KEY_EXIT, "KEYCODE_EXIT"},
259         {KeyCode::KEY_EDIT, "KEYCODE_EDIT"},
260         {KeyCode::KEY_SCROLLUP, "KEYCODE_SCROLLUP"},
261         {KeyCode::KEY_SCROLLDOWN, "KEYCODE_SCROLLDOWN"},
262         {KeyCode::KEY_NEW, "KEYCODE_NEW"},
263         {KeyCode::KEY_REDO, "KEYCODE_REDO"},
264         {KeyCode::KEY_CLOSE, "KEYCODE_CLOSE"},
265         {KeyCode::KEY_PLAY, "KEYCODE_PLAY"},
266         {KeyCode::KEY_BASSBOOST, "KEYCODE_BASSBOOST"},
267         {KeyCode::KEY_PRINT, "KEYCODE_PRINT"},
268         {KeyCode::KEY_CHAT, "KEYCODE_CHAT"},
269         {KeyCode::KEY_FINANCE, "KEYCODE_FINANCE"},
270         {KeyCode::KEY_CANCEL, "KEYCODE_CANCEL"},
271         {KeyCode::KEY_KBDILLUM_TOGGLE, "KEYCODE_KBDILLUM_TOGGLE"},
272         {KeyCode::KEY_KBDILLUM_DOWN, "KEYCODE_KBDILLUM_DOWN"},
273         {KeyCode::KEY_KBDILLUM_UP, "KEYCODE_KBDILLUM_UP"},
274         {KeyCode::KEY_SEND, "KEYCODE_SEND"},
275         {KeyCode::KEY_REPLY, "KEYCODE_REPLY"},
276         {KeyCode::KEY_FORWARDMAIL, "KEYCODE_FORWARDMAIL"},
277         {KeyCode::KEY_SAVE, "KEYCODE_SAVE"},
278         {KeyCode::KEY_DOCUMENTS, "KEYCODE_DOCUMENTS"},
279         {KeyCode::KEY_VIDEO_NEXT, "KEYCODE_VIDEO_NEXT"},
280         {KeyCode::KEY_VIDEO_PREV, "KEYCODE_VIDEO_PREV"},
281         {KeyCode::KEY_BRIGHTNESS_CYCLE, "KEYCODE_BRIGHTNESS_CYCLE"},
282         {KeyCode::KEY_BRIGHTNESS_ZERO, "KEYCODE_BRIGHTNESS_ZERO"},
283         {KeyCode::KEY_DISPLAY_OFF, "KEYCODE_DISPLAY_OFF"},
284         {KeyCode::KEY_BTN_MISC, "KEYCODE_BTN_MISC"},
285         {KeyCode::KEY_GOTO, "KEYCODE_GOTO"},
286         {KeyCode::KEY_INFO, "KEYCODE_INFO"},
287         {KeyCode::KEY_PROGRAM, "KEYCODE_PROGRAM"},
288         {KeyCode::KEY_PVR, "KEYCODE_PVR"},
289         {KeyCode::KEY_SUBTITLE, "KEYCODE_SUBTITLE"},
290         {KeyCode::KEY_FULL_SCREEN, "KEYCODE_FULL_SCREEN"},
291         {KeyCode::KEY_KEYBOARD, "KEYCODE_KEYBOARD"},
292         {KeyCode::KEY_ASPECT_RATIO, "KEYCODE_ASPECT_RATIO"},
293         {KeyCode::KEY_PC, "KEYCODE_PC"},
294         {KeyCode::KEY_TV, "KEYCODE_TV"},
295         {KeyCode::KEY_TV2, "KEYCODE_TV2"},
296         {KeyCode::KEY_VCR, "KEYCODE_VCR"},
297         {KeyCode::KEY_VCR2, "KEYCODE_VCR2"},
298         {KeyCode::KEY_SAT, "KEYCODE_SAT"},
299         {KeyCode::KEY_CD, "KEYCODE_CD"},
300         {KeyCode::KEY_TAPE, "KEYCODE_TAPE"},
301         {KeyCode::KEY_TUNER, "KEYCODE_TUNER"},
302         {KeyCode::KEY_PLAYER, "KEYCODE_PLAYER"},
303         {KeyCode::KEY_DVD, "KEYCODE_DVD"},
304         {KeyCode::KEY_AUDIO, "KEYCODE_AUDIO"},
305         {KeyCode::KEY_VIDEO, "KEYCODE_VIDEO"},
306         {KeyCode::KEY_MEMO, "KEYCODE_MEMO"},
307         {KeyCode::KEY_CALENDAR, "KEYCODE_CALENDAR"},
308         {KeyCode::KEY_RED, "KEYCODE_RED"},
309         {KeyCode::KEY_GREEN, "KEYCODE_GREEN"},
310         {KeyCode::KEY_YELLOW, "KEYCODE_YELLOW"},
311         {KeyCode::KEY_BLUE, "KEYCODE_BLUE"},
312         {KeyCode::KEY_CHANNELUP, "KEYCODE_CHANNELUP"},
313         {KeyCode::KEY_CHANNELDOWN, "KEYCODE_CHANNELDOWN"},
314         {KeyCode::KEY_LAST, "KEYCODE_LAST"},
315         {KeyCode::KEY_RESTART, "KEYCODE_RESTART"},
316         {KeyCode::KEY_SLOW, "KEYCODE_SLOW"},
317         {KeyCode::KEY_SHUFFLE, "KEYCODE_SHUFFLE"},
318         {KeyCode::KEY_VIDEOPHONE, "KEYCODE_VIDEOPHONE"},
319         {KeyCode::KEY_GAMES, "KEYCODE_GAMES"},
320         {KeyCode::KEY_ZOOMIN, "KEYCODE_ZOOMIN"},
321         {KeyCode::KEY_ZOOMOUT, "KEYCODE_ZOOMOUT"},
322         {KeyCode::KEY_ZOOMRESET, "KEYCODE_ZOOMRESET"},
323         {KeyCode::KEY_WORDPROCESSOR, "KEYCODE_WORDPROCESSOR"},
324         {KeyCode::KEY_EDITOR, "KEYCODE_EDITOR"},
325         {KeyCode::KEY_SPREADSHEET, "KEYCODE_SPREADSHEET"},
326         {KeyCode::KEY_GRAPHICSEDITOR, "KEYCODE_GRAPHICSEDITOR"},
327         {KeyCode::KEY_PRESENTATION, "KEYCODE_PRESENTATION"},
328         {KeyCode::KEY_DATABASE, "KEYCODE_DATABASE"},
329         {KeyCode::KEY_NEWS, "KEYCODE_NEWS"},
330         {KeyCode::KEY_VOICEMAIL, "KEYCODE_VOICEMAIL"},
331         {KeyCode::KEY_ADDRESSBOOK, "KEYCODE_ADDRESSBOOK"},
332         {KeyCode::KEY_MESSENGER, "KEYCODE_MESSENGER"},
333         {KeyCode::KEY_BRIGHTNESS_TOGGLE, "KEYCODE_BRIGHTNESS_TOGGLE"},
334         {KeyCode::KEY_SPELLCHECK, "KEYCODE_SPELLCHECK"},
335         {KeyCode::KEY_COFFEE, "KEYCODE_COFFEE"},
336         {KeyCode::KEY_MEDIA_REPEAT, "KEYCODE_MEDIA_REPEAT"},
337         {KeyCode::KEY_IMAGES, "KEYCODE_IMAGES"},
338         {KeyCode::KEY_BUTTONCONFIG, "KEYCODE_BUTTONCONFIG"},
339         {KeyCode::KEY_TASKMANAGER, "KEYCODE_TASKMANAGER"},
340         {KeyCode::KEY_JOURNAL, "KEYCODE_JOURNAL"},
341         {KeyCode::KEY_CONTROLPANEL, "KEYCODE_CONTROLPANEL"},
342         {KeyCode::KEY_APPSELECT, "KEYCODE_APPSELECT"},
343         {KeyCode::KEY_SCREENSAVER, "KEYCODE_SCREENSAVER"},
344         {KeyCode::KEY_ASSISTANT, "KEYCODE_ASSISTANT"},
345         {KeyCode::KEY_KBD_LAYOUT_NEXT, "KEYCODE_KBD_LAYOUT_NEXT"},
346         {KeyCode::KEY_BRIGHTNESS_MIN, "KEYCODE_BRIGHTNESS_MIN"},
347         {KeyCode::KEY_BRIGHTNESS_MAX, "KEYCODE_BRIGHTNESS_MAX"},
348         {KeyCode::KEY_KBDINPUTASSIST_PREV, "KEYCODE_KBDINPUTASSIST_PREV"},
349         {KeyCode::KEY_KBDINPUTASSIST_NEXT, "KEYCODE_KBDINPUTASSIST_NEXT"},
350         {KeyCode::KEY_KBDINPUTASSIST_PREVGROUP, "KEYCODE_KBDINPUTASSIST_PREVGROUP"},
351         {KeyCode::KEY_KBDINPUTASSIST_NEXTGROUP, "KEYCODE_KBDINPUTASSIST_NEXTGROUP"},
352         {KeyCode::KEY_KBDINPUTASSIST_ACCEPT, "KEYCODE_KBDINPUTASSIST_ACCEPT"},
353         {KeyCode::KEY_KBDINPUTASSIST_CANCEL, "KEYCODE_KBDINPUTASSIST_CANCEL"},
354         {KeyCode::KEY_FRONT, "KEYCODE_FRONT"},
355         {KeyCode::KEY_SETUP, "KEYCODE_SETUP"},
356         {KeyCode::KEY_WAKEUP, "KEYCODE_WAKEUP"},
357         {KeyCode::KEY_SENDFILE, "KEYCODE_SENDFILE"},
358         {KeyCode::KEY_DELETEFILE, "KEYCODE_DELETEFILE"},
359         {KeyCode::KEY_XFER, "KEYCODE_XFER"},
360         {KeyCode::KEY_PROG1, "KEYCODE_PROG1"},
361         {KeyCode::KEY_PROG2, "KEYCODE_PROG2"},
362         {KeyCode::KEY_MSDOS, "KEYCODE_MSDOS"},
363         {KeyCode::KEY_SCREENLOCK, "KEYCODE_SCREENLOCK"},
364         {KeyCode::KEY_DIRECTION_ROTATE_DISPLAY, "KEYCODE_DIRECTION_ROTATE_DISPLAY"},
365         {KeyCode::KEY_CYCLEWINDOWS, "KEYCODE_CYCLEWINDOWS"},
366         {KeyCode::KEY_COMPUTER, "KEYCODE_COMPUTER"},
367         {KeyCode::KEY_EJECTCLOSECD, "KEYCODE_EJECTCLOSECD"},
368         {KeyCode::KEY_ISO, "KEYCODE_ISO"},
369         {KeyCode::KEY_MOVE, "KEYCODE_MOVE"},
370         {KeyCode::KEY_F13, "KEYCODE_F13"},
371         {KeyCode::KEY_F14, "KEYCODE_F14"},
372         {KeyCode::KEY_F15, "KEYCODE_F15"},
373         {KeyCode::KEY_F16, "KEYCODE_F16"},
374         {KeyCode::KEY_F17, "KEYCODE_F17"},
375         {KeyCode::KEY_F18, "KEYCODE_F18"},
376         {KeyCode::KEY_F19, "KEYCODE_F19"},
377         {KeyCode::KEY_F20, "KEYCODE_F20"},
378         {KeyCode::KEY_F21, "KEYCODE_F21"},
379         {KeyCode::KEY_F22, "KEYCODE_F22"},
380         {KeyCode::KEY_F23, "KEYCODE_F23"},
381         {KeyCode::KEY_F24, "KEYCODE_F24"},
382         {KeyCode::KEY_PROG3, "KEYCODE_PROG3"},
383         {KeyCode::KEY_PROG4, "KEYCODE_PROG4"},
384         {KeyCode::KEY_DASHBOARD, "KEYCODE_DASHBOARD"},
385         {KeyCode::KEY_SUSPEND, "KEYCODE_SUSPEND"},
386         {KeyCode::KEY_HP, "KEYCODE_HP"},
387         {KeyCode::KEY_SOUND, "KEYCODE_SOUND"},
388         {KeyCode::KEY_QUESTION, "KEYCODE_QUESTION"},
389         {KeyCode::KEY_CONNECT, "KEYCODE_CONNECT"},
390         {KeyCode::KEY_SPORT, "KEYCODE_SPORT"},
391         {KeyCode::KEY_SHOP, "KEYCODE_SHOP"},
392         {KeyCode::KEY_ALTERASE, "KEYCODE_ALTERASE"},
393         {KeyCode::KEY_SWITCHVIDEOMODE, "KEYCODE_SWITCHVIDEOMODE"},
394         {KeyCode::KEY_BATTERY, "KEYCODE_BATTERY"},
395         {KeyCode::KEY_BLUETOOTH, "KEYCODE_BLUETOOTH"},
396         {KeyCode::KEY_WLAN, "KEYCODE_WLAN"},
397         {KeyCode::KEY_UWB, "KEYCODE_UWB"},
398         {KeyCode::KEY_WWAN_WIMAX, "KEYCODE_WWAN_WIMAX"},
399         {KeyCode::KEY_RFKILL, "KEYCODE_RFKILL"},
400         {KeyCode::KEY_CHANNEL, "KEYCODE_CHANNEL"},
401         {KeyCode::KEY_BTN_0, "KEYCODE_BTN_0"},
402         {KeyCode::KEY_BTN_1, "KEYCODE_BTN_1"},
403         {KeyCode::KEY_BTN_2, "KEYCODE_BTN_2"},
404         {KeyCode::KEY_BTN_3, "KEYCODE_BTN_3"},
405         {KeyCode::KEY_BTN_4, "KEYCODE_BTN_4"},
406         {KeyCode::KEY_BTN_5, "KEYCODE_BTN_5"},
407         {KeyCode::KEY_BTN_6, "KEYCODE_BTN_6"},
408         {KeyCode::KEY_BTN_7, "KEYCODE_BTN_7"},
409         {KeyCode::KEY_BTN_8, "KEYCODE_BTN_8"},
410         {KeyCode::KEY_BTN_9, "KEYCODE_BTN_9"},
411         {KeyCode::KEY_BRL_DOT1, "KEYCODE_BRL_DOT1"},
412         {KeyCode::KEY_BRL_DOT2, "KEYCODE_BRL_DOT2"},
413         {KeyCode::KEY_BRL_DOT3, "KEYCODE_BRL_DOT3"},
414         {KeyCode::KEY_BRL_DOT4, "KEYCODE_BRL_DOT4"},
415         {KeyCode::KEY_BRL_DOT5, "KEYCODE_BRL_DOT5"},
416         {KeyCode::KEY_BRL_DOT6, "KEYCODE_BRL_DOT6"},
417         {KeyCode::KEY_BRL_DOT7, "KEYCODE_BRL_DOT7"},
418         {KeyCode::KEY_BRL_DOT8, "KEYCODE_BRL_DOT8"},
419         {KeyCode::KEY_BRL_DOT9, "KEYCODE_BRL_DOT9"},
420         {KeyCode::KEY_BRL_DOT10, "KEYCODE_BRL_DOT10"},
421         {KeyCode::KEY_LEFT_KNOB_ROLL_UP, "KEYCODE_LEFT_KNOB_ROLL_UP"},
422         {KeyCode::KEY_LEFT_KNOB_ROLL_DOWN, "KEYCODE_LEFT_KNOB_ROLL_DOWN"},
423         {KeyCode::KEY_LEFT_KNOB, "KEYCODE_LEFT_KNOB"},
424         {KeyCode::KEY_RIGHT_KNOB_ROLL_UP, "KEYCODE_RIGHT_KNOB_ROLL_UP"},
425         {KeyCode::KEY_RIGHT_KNOB_ROLL_DOWN, "KEYCODE_RIGHT_KNOB_ROLL_DOWN"},
426         {KeyCode::KEY_RIGHT_KNOB, "KEYCODE_RIGHT_KNOB"},
427         {KeyCode::KEY_VOICE_SOURCE_SWITCH, "KEYCODE_VOICE_SOURCE_SWITCH"},
428         {KeyCode::KEY_LAUNCHER_MENU, "KEYCODE_LAUNCHER_MENU"},
429     };
430     auto iter = KEYCODE_TO_STRING.find(static_cast<KeyCode>(keyCode));
431     if (iter == KEYCODE_TO_STRING.end()) {
432         return "KEYCODE_INVALID";
433     }
434     return iter->second.c_str();
435 }
keyItemsTransKeyIntention(const std::vector<KeyCode> & items)436 KeyIntention keyItemsTransKeyIntention(const std::vector<KeyCode> &items)
437 {
438     if (items.size() < KEY_INTENTION_ITEM_MIN_COUNT || items.size() > KEY_INTENTION_ITEM_MAX_COUNT) {
439         return KeyIntention::INTENTION_UNKNOWN;
440     }
441 
442     uint64_t keyCodes = 0;
443     for (const auto &item : items) {
444         keyCodes = (keyCodes << KEY_INTENTION_OFFSET) + static_cast<uint64_t>(item);
445     }
446     const static std::map<int64_t, KeyIntention> MAP_KEY_INTENTION = {
447         {(int64_t)KeyCode::KEY_DPAD_UP, KeyIntention::INTENTION_UP},
448         {(int64_t)KeyCode::KEY_DPAD_DOWN, KeyIntention::INTENTION_DOWN},
449         {(int64_t)KeyCode::KEY_DPAD_LEFT, KeyIntention::INTENTION_LEFT},
450         {(int64_t)KeyCode::KEY_DPAD_RIGHT, KeyIntention::INTENTION_RIGHT},
451         {(int64_t)KeyCode::KEY_SPACE, KeyIntention::INTENTION_SELECT},
452         {(int64_t)KeyCode::KEY_NUMPAD_ENTER, KeyIntention::INTENTION_SELECT},
453         {(int64_t)KeyCode::KEY_ESCAPE, KeyIntention::INTENTION_ESCAPE},
454         {((int64_t)KeyCode::KEY_ALT_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_LEFT,
455             KeyIntention::INTENTION_BACK},
456         {((int64_t)KeyCode::KEY_ALT_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_RIGHT,
457             KeyIntention::INTENTION_FORWARD},
458         {((int64_t)KeyCode::KEY_ALT_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_LEFT,
459             KeyIntention::INTENTION_BACK},
460         {((int64_t)KeyCode::KEY_ALT_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_DPAD_RIGHT,
461             KeyIntention::INTENTION_FORWARD},
462         {((int64_t)KeyCode::KEY_SHIFT_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_F10,
463             KeyIntention::INTENTION_MENU},
464         {((int64_t)KeyCode::KEY_SHIFT_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_F10,
465             KeyIntention::INTENTION_MENU},
466         {KEY_COMPOSE, KeyIntention::INTENTION_MENU},
467         {(int64_t)KeyCode::KEY_PAGE_UP, KeyIntention::INTENTION_PAGE_UP},
468         {(int64_t)KeyCode::KEY_PAGE_DOWN, KeyIntention::INTENTION_PAGE_DOWN},
469         {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_PLUS,
470             KeyIntention::INTENTION_ZOOM_OUT},
471         {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_PLUS,
472             KeyIntention::INTENTION_ZOOM_OUT},
473         {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_ADD,
474             KeyIntention::INTENTION_ZOOM_OUT},
475         {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_ADD,
476             KeyIntention::INTENTION_ZOOM_OUT},
477         {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_MINUS,
478             KeyIntention::INTENTION_ZOOM_IN},
479         {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_MINUS,
480             KeyIntention::INTENTION_ZOOM_IN},
481         {((int64_t)KeyCode::KEY_CTRL_LEFT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_SUBTRACT,
482             KeyIntention::INTENTION_ZOOM_IN},
483         {((int64_t)KeyCode::KEY_CTRL_RIGHT << KEY_INTENTION_OFFSET) + (int64_t)KeyCode::KEY_NUMPAD_SUBTRACT,
484             KeyIntention::INTENTION_ZOOM_IN},
485         {(int64_t)KeyCode::KEY_VOLUME_MUTE, KeyIntention::INTENTION_MEDIA_MUTE},
486         {(int64_t)KeyCode::KEY_MUTE, KeyIntention::INTENTION_MEDIA_MUTE},
487         {(int64_t)KeyCode::KEY_VOLUME_UP, KeyIntention::INTENTION_VOLUTE_UP},
488         {(int64_t)KeyCode::KEY_VOLUME_DOWN, KeyIntention::INTENTION_VOLUTE_DOWN},
489         {(int64_t)KeyCode::KEY_APPSELECT, KeyIntention::INTENTION_SELECT},
490         {(int64_t)KeyCode::KEY_BACK, KeyIntention::INTENTION_BACK},
491         {(int64_t)KeyCode::KEY_MOVE_HOME, KeyIntention::INTENTION_HOME},
492     };
493 
494     auto iter = MAP_KEY_INTENTION.find(static_cast<int64_t>(keyCodes));
495     if (iter == MAP_KEY_INTENTION.end()) {
496         return KeyIntention::INTENTION_UNKNOWN;
497     }
498     return iter->second;
499 }
500 
GetKeyEvents(int32_t keyCode,int32_t keyAction,int32_t repeatTime,int64_t timeStamp,int64_t timeStampStart,int32_t metaKey,int32_t keySource,int64_t deviceId,std::string msg)501 std::vector<KeyEvent> KeyEventRecognizer::GetKeyEvents(int32_t keyCode, int32_t keyAction, int32_t repeatTime,
502     int64_t timeStamp, int64_t timeStampStart, int32_t metaKey, int32_t keySource, int64_t deviceId,
503     std::string msg)
504 {
505     if (timeStamp == 0) {
506         timeStamp = clock();
507     }
508     std::vector<KeyEvent> keyEvents;
509     auto event = KeyEvent(static_cast<KeyCode>(keyCode), static_cast<KeyAction>(keyAction), repeatTime,
510         timeStamp, deviceId, static_cast<SourceType>(keySource));
511     if ((keyCode != static_cast<int32_t>(KeyCode::KEY_UNKNOWN)) &&
512         (keyAction == static_cast<int32_t>(KeyAction::DOWN))) {
513         clearPressedKey();
514         if (static_cast<uint32_t>(metaKey) & static_cast<uint32_t>(CtrlKeysBit::CTRL)) {
515             addPressedKey(static_cast<int32_t>(KeyCode::KEY_CTRL_LEFT));
516         }
517         if (static_cast<uint32_t>(metaKey) & static_cast<uint32_t>(CtrlKeysBit::SHIFT)) {
518             addPressedKey(static_cast<int32_t>(KeyCode::KEY_SHIFT_LEFT));
519         }
520         if (static_cast<uint32_t>(metaKey) & static_cast<uint32_t>(CtrlKeysBit::ALT)) {
521             addPressedKey(static_cast<int32_t>(KeyCode::KEY_ALT_LEFT));
522         }
523         addPressedKey(keyCode);
524     }
525     auto keyItems = getPressedKeys();
526     event.keyIntention = keyItemsTransKeyIntention(keyItems);
527     if ((keyCode != static_cast<int32_t>(KeyCode::KEY_UNKNOWN)) &&
528         (keyAction == static_cast<int32_t>(KeyAction::UP))) {
529         removeReleasedKey(keyCode);
530     }
531     event.pressedCodes = getPressedKeys();
532     event.key = KeyCodeToString(keyCode);
533     event.msg = msg;
534 
535     keyEvents.emplace_back(event);
536     auto result = keyMap_.try_emplace(keyCode, false);
537     auto iter = result.first;
538 
539     // Recognize long press event.
540     if ((keyAction == static_cast<int32_t>(KeyAction::DOWN)) && (repeatTime >= LONG_PRESS_DURATION) &&
541         (!iter->second)) {
542         iter->second = true;
543         keyEvents.emplace_back(KeyEvent(static_cast<KeyCode>(keyCode), KeyAction::LONG_PRESS, repeatTime, timeStamp,
544             deviceId, static_cast<SourceType>(keySource)));
545     }
546     // Recognize click event.
547     if (keyAction == static_cast<int32_t>(KeyAction::UP)) {
548         if (iter->second) {
549             iter->second = false;
550         } else {
551             keyEvents.emplace_back(KeyEvent(static_cast<KeyCode>(keyCode), KeyAction::CLICK, repeatTime, timeStamp,
552                 deviceId, static_cast<SourceType>(keySource)));
553         }
554     }
555     return keyEvents;
556 }
557 
getPressedKeys() const558 std::vector<KeyCode> KeyEventRecognizer::getPressedKeys() const
559 {
560     std::vector<KeyCode> result;
561     for (const auto &item : keys_) {
562         result.push_back(static_cast<KeyCode>(item));
563     }
564     return result;
565 }
addPressedKey(const int32_t keyCode)566 void KeyEventRecognizer::addPressedKey(const int32_t keyCode)
567 {
568     std::vector<KeyCode> pressedkeys = getPressedKeys();
569     std::vector<KeyCode>::iterator result = std::find(pressedkeys.begin(),
570         pressedkeys.end(), static_cast<KeyCode>(keyCode));
571     if (result == pressedkeys.end()) {
572         keys_.push_back(keyCode);
573     }
574 }
removeReleasedKey(const int32_t keyCode)575 void KeyEventRecognizer::removeReleasedKey(const int32_t keyCode)
576 {
577     for (auto it = keys_.begin(); it != keys_.end(); ++it) {
578         if (*it == keyCode) {
579             keys_.erase(it);
580             return;
581         }
582     }
583 }
clearPressedKey()584 void KeyEventRecognizer::clearPressedKey()
585 {
586     keys_.clear();
587 }
588 } // namespace OHOS::Ace
589