• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-2023 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 "adapter/preview/entrance/event_dispatcher.h"
17 
18 #include <map>
19 
20 #include "adapter/preview/entrance/ace_container.h"
21 #include "adapter/preview/entrance/ace_view_preview.h"
22 #include "adapter/preview/entrance/editing/text_input_client_mgr.h"
23 #include "base/log/ace_trace.h"
24 #include "base/log/log.h"
25 #include "core/common/container_scope.h"
26 #include "core/event/key_event.h"
27 #include "core/event/touch_event.h"
28 
29 namespace OHOS::Ace::Platform {
30 namespace {
31 
32 const wchar_t UPPER_CASE_A = L'A';
33 const wchar_t LOWER_CASE_A = L'a';
34 const wchar_t CASE_0 = L'0';
35 const std::wstring NUM_SYMBOLS = L")!@#$%^&*(";
36 const std::map<MMI::KeyCode, wchar_t> PRINTABEL_SYMBOLS = {
37     { MMI::KeyCode::KEY_GRAVE, L'`' },
38     { MMI::KeyCode::KEY_MINUS, L'-' },
39     { MMI::KeyCode::KEY_EQUALS, L'=' },
40     { MMI::KeyCode::KEY_LEFT_BRACKET, L'[' },
41     { MMI::KeyCode::KEY_RIGHT_BRACKET, L']' },
42     { MMI::KeyCode::KEY_BACKSLASH, L'\\' },
43     { MMI::KeyCode::KEY_SEMICOLON, L';' },
44     { MMI::KeyCode::KEY_APOSTROPHE, L'\'' },
45     { MMI::KeyCode::KEY_COMMA, L',' },
46     { MMI::KeyCode::KEY_PERIOD, L'.' },
47     { MMI::KeyCode::KEY_SLASH, L'/' },
48     { MMI::KeyCode::KEY_SPACE, L' ' },
49     { MMI::KeyCode::KEY_NUMPAD_DIVIDE, L'/' },
50     { MMI::KeyCode::KEY_NUMPAD_MULTIPLY, L'*' },
51     { MMI::KeyCode::KEY_NUMPAD_SUBTRACT, L'-' },
52     { MMI::KeyCode::KEY_NUMPAD_ADD, L'+' },
53     { MMI::KeyCode::KEY_NUMPAD_DOT, L'.' },
54     { MMI::KeyCode::KEY_NUMPAD_COMMA, L',' },
55     { MMI::KeyCode::KEY_NUMPAD_EQUALS, L'=' },
56 };
57 
58 const std::map<MMI::KeyCode, wchar_t> SHIFT_PRINTABEL_SYMBOLS = {
59     { MMI::KeyCode::KEY_GRAVE, L'~' },
60     { MMI::KeyCode::KEY_MINUS, L'_' },
61     { MMI::KeyCode::KEY_EQUALS, L'+' },
62     { MMI::KeyCode::KEY_LEFT_BRACKET, L'{' },
63     { MMI::KeyCode::KEY_RIGHT_BRACKET, L'}' },
64     { MMI::KeyCode::KEY_BACKSLASH, L'|' },
65     { MMI::KeyCode::KEY_SEMICOLON, L':' },
66     { MMI::KeyCode::KEY_APOSTROPHE, L'\"' },
67     { MMI::KeyCode::KEY_COMMA, L'<' },
68     { MMI::KeyCode::KEY_PERIOD, L'>' },
69     { MMI::KeyCode::KEY_SLASH, L'?' },
70 };
71 
ConvertTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,TouchEvent & event)72 void ConvertTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, TouchEvent& event)
73 {
74     event.id = pointerEvent->id;
75     event.x = pointerEvent->x;
76     event.y = pointerEvent->y;
77     event.screenX = pointerEvent->screenX;
78     event.screenY = pointerEvent->screenY;
79     event.globalDisplayX = pointerEvent->globalDisplayX;
80     event.globalDisplayY = pointerEvent->globalDisplayY;
81     event.type = static_cast<TouchType>(static_cast<size_t>(pointerEvent->type));
82     event.pullType = static_cast<TouchType>(static_cast<size_t>(pointerEvent->pullType));
83     event.time = pointerEvent->time;
84     event.size = pointerEvent->size;
85     event.force = pointerEvent->force;
86     event.tiltX = pointerEvent->tiltX;
87     event.tiltY = pointerEvent->tiltY;
88     event.deviceId = pointerEvent->deviceId;
89     event.sourceType = static_cast<SourceType>(static_cast<int32_t>(pointerEvent->sourceType));
90     event.sourceTool = static_cast<SourceTool>(static_cast<int32_t>(pointerEvent->sourceTool));
91     event.pointerEvent = pointerEvent;
92     TouchPoint pointer { .id = event.id,
93         .x = event.x,
94         .y = event.y,
95         .screenX = event.screenX,
96         .screenY = event.screenY,
97         .globalDisplayX = event.globalDisplayX,
98         .globalDisplayY = event.globalDisplayY,
99         .downTime = event.time,
100         .size = event.size,
101         .force = event.force,
102         .isPressed = (event.type == TouchType::DOWN) };
103     event.pointers.emplace_back(pointer);
104 }
105 
ConvertKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,KeyEvent & event)106 void ConvertKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, KeyEvent& event)
107 {
108     event.code = static_cast<KeyCode>(static_cast<int32_t>(keyEvent->code));
109     event.key.assign(keyEvent->key);
110     event.action = static_cast<KeyAction>(static_cast<int32_t>(keyEvent->action));
111     for (auto& item : keyEvent->pressedCodes) {
112         event.pressedCodes.push_back(static_cast<KeyCode>(static_cast<int32_t>(item)));
113     }
114     event.repeatTime = keyEvent->repeatTime;
115     event.timeStamp = keyEvent->timeStamp;
116     event.metaKey = keyEvent->metaKey;
117     event.deviceId = keyEvent->deviceId;
118     event.sourceType = static_cast<SourceType>(static_cast<int32_t>(keyEvent->sourceType));
119     event.rawKeyEvent = keyEvent;
120     event.enableCapsLock = keyEvent->enableCapsLock_;
121     event.numLock = keyEvent->enableNumLock_;
122 }
123 
124 } // namespace
125 
GetTouchEventOriginOffset(const TouchEvent & event)126 Offset GetTouchEventOriginOffset(const TouchEvent& event)
127 {
128     if (event.pointerEvent) {
129         for (auto& item : event.pointerEvent->pointers) {
130             return Offset(item.x, item.y);
131         }
132     }
133     return Offset();
134 }
135 
GetTouchEventOriginTimeStamp(const TouchEvent & event)136 TimeStamp GetTouchEventOriginTimeStamp(const TouchEvent& event)
137 {
138     if (event.pointerEvent) {
139         return event.pointerEvent->time;
140     }
141     return event.time;
142 }
143 
UpdatePressedKeyCodes(std::vector<KeyCode> & pressedKeyCodes)144 void UpdatePressedKeyCodes(std::vector<KeyCode>& pressedKeyCodes) {}
145 
EventDispatcher()146 EventDispatcher::EventDispatcher() {}
147 
148 EventDispatcher::~EventDispatcher() = default;
149 
Initialize()150 void EventDispatcher::Initialize()
151 {
152     LOGI("Initialize event dispatcher");
153     // Initial the proxy of Input method
154     TextInputClientMgr::GetInstance().InitTextInputProxy();
155     // Register the idle event callback function.
156 #ifndef ENABLE_ROSEN_BACKEND
157     IdleCallback idleNoticeCallback = [](int64_t deadline) {
158         EventDispatcher::GetInstance().DispatchIdleEvent(deadline);
159     };
160     FlutterDesktopSetIdleCallback(controller_, idleNoticeCallback);
161 #else
162     // rosen process idle
163 #endif
164 }
165 
DispatchIdleEvent(int64_t deadline)166 void EventDispatcher::DispatchIdleEvent(int64_t deadline)
167 {
168     ACE_SCOPED_TRACE("DispatchIdleEvent");
169     auto container = AceContainer::GetContainerInstance(ACE_INSTANCE_ID);
170     if (!container) {
171         return;
172     }
173 
174     auto aceView = AceType::DynamicCast<AceViewPreview>(container->GetAceView());
175     if (!aceView) {
176         return;
177     }
178 
179     aceView->ProcessIdleEvent(deadline);
180 }
181 
GetMouseEventAction(int32_t action,OHOS::Ace::MouseEvent & mouseEvent)182 static void GetMouseEventAction(int32_t action, OHOS::Ace::MouseEvent& mouseEvent)
183 {
184     switch (action) {
185         case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN:
186             mouseEvent.action = MouseAction::PRESS;
187             break;
188         case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP:
189             mouseEvent.action = MouseAction::RELEASE;
190             break;
191         case OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW:
192             mouseEvent.action = MouseAction::WINDOW_ENTER;
193             break;
194         case OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW:
195             mouseEvent.action = MouseAction::WINDOW_LEAVE;
196             break;
197         case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE:
198             mouseEvent.action = MouseAction::MOVE;
199             break;
200         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN:
201             mouseEvent.action = MouseAction::PRESS;
202             break;
203         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
204             mouseEvent.action = MouseAction::MOVE;
205             break;
206         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
207             mouseEvent.action = MouseAction::RELEASE;
208             break;
209         default:
210             mouseEvent.action = MouseAction::NONE;
211             break;
212     }
213 }
214 
GetMouseEventButton(int32_t button,Ace::MouseEvent & mouseEvent)215 static void GetMouseEventButton(int32_t button, Ace::MouseEvent& mouseEvent)
216 {
217     switch (button) {
218         case MMI::PointerEvent::MOUSE_BUTTON_LEFT:
219             mouseEvent.button = MouseButton::LEFT_BUTTON;
220             break;
221         case MMI::PointerEvent::MOUSE_BUTTON_RIGHT:
222             mouseEvent.button = MouseButton::RIGHT_BUTTON;
223             break;
224         case MMI::PointerEvent::MOUSE_BUTTON_MIDDLE:
225             mouseEvent.button = MouseButton::MIDDLE_BUTTON;
226             break;
227         case MMI::PointerEvent::MOUSE_BUTTON_SIDE:
228             mouseEvent.button = MouseButton::BACK_BUTTON;
229             break;
230         case MMI::PointerEvent::MOUSE_BUTTON_EXTRA:
231             mouseEvent.button = MouseButton::SIDE_BUTTON;
232             break;
233         case MMI::PointerEvent::MOUSE_BUTTON_FORWARD:
234             mouseEvent.button = MouseButton::FORWARD_BUTTON;
235             break;
236         case MMI::PointerEvent::MOUSE_BUTTON_BACK:
237             mouseEvent.button = MouseButton::BACK_BUTTON;
238             break;
239         case MMI::PointerEvent::MOUSE_BUTTON_TASK:
240             mouseEvent.button = MouseButton::TASK_BUTTON;
241             break;
242         default:
243             mouseEvent.button = MouseButton::NONE_BUTTON;
244             break;
245     }
246 }
247 
ConvertMouseEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,Ace::MouseEvent & mouseEvent)248 static void ConvertMouseEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, Ace::MouseEvent& mouseEvent)
249 {
250     mouseEvent.id = pointerEvent->id;
251     mouseEvent.x = pointerEvent->x;
252     mouseEvent.y = pointerEvent->y;
253     mouseEvent.screenX = pointerEvent->screenX;
254     mouseEvent.screenY = pointerEvent->screenY;
255     mouseEvent.globalDisplayX = pointerEvent->globalDisplayX;
256     mouseEvent.globalDisplayY = pointerEvent->globalDisplayY;
257     GetMouseEventAction(pointerEvent->pointerAction_, mouseEvent);
258     GetMouseEventButton(pointerEvent->buttonId_, mouseEvent);
259     mouseEvent.sourceType = SourceType::MOUSE;
260     mouseEvent.targetDisplayId = pointerEvent->targetDisplayId_;
261     mouseEvent.deviceId = pointerEvent->deviceId;
262     std::set<int32_t> buttonSet = pointerEvent->pressedButtons_;
263     if (pointerEvent->pressedButtons_.empty()) {
264         pointerEvent->pressedButtons_.insert(pointerEvent->buttonId_);
265     }
266     uint32_t buttons = 0;
267     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_LEFT)) {
268         buttons &= static_cast<uint32_t>(MouseButton::LEFT_BUTTON);
269     }
270     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_RIGHT)) {
271         buttons &= static_cast<uint32_t>(MouseButton::RIGHT_BUTTON);
272     }
273     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_MIDDLE)) {
274         buttons &= static_cast<uint32_t>(MouseButton::MIDDLE_BUTTON);
275     }
276     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_SIDE)) {
277         buttons &= static_cast<uint32_t>(MouseButton::SIDE_BUTTON);
278     }
279     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_EXTRA)) {
280         buttons &= static_cast<uint32_t>(MouseButton::EXTRA_BUTTON);
281     }
282     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_FORWARD)) {
283         buttons &= static_cast<uint32_t>(MouseButton::FORWARD_BUTTON);
284     }
285     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_BACK)) {
286         buttons &= static_cast<uint32_t>(MouseButton::BACK_BUTTON);
287     }
288     if (buttonSet.end() != buttonSet.find(MMI::PointerEvent::MOUSE_BUTTON_TASK)) {
289         buttons &= static_cast<uint32_t>(MouseButton::TASK_BUTTON);
290     }
291     mouseEvent.pressedButtons = static_cast<int32_t>(buttons);
292 }
293 
GetAxisEventAction(int32_t action,Ace::AxisEvent & event)294 static void GetAxisEventAction(int32_t action, Ace::AxisEvent& event)
295 {
296     switch (action) {
297         case MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
298             event.action = Ace::AxisAction::BEGIN;
299             break;
300         case MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
301             event.action = Ace::AxisAction::UPDATE;
302             break;
303         case MMI::PointerEvent::POINTER_ACTION_AXIS_END:
304             event.action = Ace::AxisAction::END;
305             break;
306         default:
307             event.action = Ace::AxisAction::NONE;
308             break;
309     }
310 }
311 
GetAxisValue(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,MMI::PointerEvent::AxisType axis)312 static double GetAxisValue(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, MMI::PointerEvent::AxisType axis)
313 {
314     double axisValue {};
315     if ((axis >= MMI::PointerEvent::AXIS_TYPE_UNKNOWN) && (axis < MMI::PointerEvent::AXIS_TYPE_MAX)) {
316         axisValue = pointerEvent->axisValues_[axis];
317     }
318     return axisValue;
319 }
320 
ConvertAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,Ace::AxisEvent & event)321 static void ConvertAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, Ace::AxisEvent& event)
322 {
323     event.id = pointerEvent->id;
324     event.x = pointerEvent->x;
325     event.y = pointerEvent->y;
326     event.screenX = pointerEvent->screenX;
327     event.screenY = pointerEvent->screenY;
328     event.horizontalAxis = GetAxisValue(pointerEvent, MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL);
329     event.verticalAxis = GetAxisValue(pointerEvent, MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL);
330     event.pinchAxisScale = GetAxisValue(pointerEvent, MMI::PointerEvent::AxisType::AXIS_TYPE_PINCH);
331     event.rotateAxisAngle = GetAxisValue(pointerEvent, MMI::PointerEvent::AxisType::AXIS_TYPE_ROTATE);
332     GetAxisEventAction(pointerEvent->pointerAction_, event);
333     event.isRotationEvent = (pointerEvent->pointerAction_ >= MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN) &&
334                             (pointerEvent->pointerAction_ <= MMI::PointerEvent::POINTER_ACTION_ROTATE_END);
335     event.sourceType = SourceType::MOUSE;
336     event.sourceTool = SourceTool::MOUSE;
337     event.pointerEvent = pointerEvent;
338 }
339 
DispatchTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)340 bool EventDispatcher::DispatchTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
341 {
342     ACE_SCOPED_TRACE("DispatchTouchEvent");
343     auto container = AceContainer::GetContainerInstance(ACE_INSTANCE_ID);
344     CHECK_NULL_RETURN(container, false);
345     auto aceView = AceType::DynamicCast<AceViewPreview>(container->GetAceView());
346     CHECK_NULL_RETURN(aceView, false);
347     if (pointerEvent->sourceType == MMI::PointerEvent::SOURCE_TYPE_MOUSE) {
348         if (pointerEvent->pointerAction_ >= MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN &&
349             pointerEvent->pointerAction_ <= MMI::PointerEvent::POINTER_ACTION_AXIS_END) {
350             OHOS::Ace::AxisEvent axisEvent;
351             ConvertAxisEvent(pointerEvent, axisEvent);
352             return aceView->HandleAxisEvent(axisEvent);
353         } else {
354             OHOS::Ace::MouseEvent mouseEvent;
355             ConvertMouseEvent(pointerEvent, mouseEvent);
356             return aceView->HandleMouseEvent(mouseEvent);
357         }
358     }
359 
360     TouchEvent touchEvent;
361     ConvertTouchEvent(pointerEvent, touchEvent);
362     return aceView->HandleTouchEvent(touchEvent);
363 }
364 
DispatchBackPressedEvent()365 bool EventDispatcher::DispatchBackPressedEvent()
366 {
367     ACE_SCOPED_TRACE("DispatchBackPressedEvent");
368     auto container = AceContainer::GetContainerInstance(ACE_INSTANCE_ID);
369     CHECK_NULL_RETURN(container, false);
370     auto context = container->GetPipelineContext();
371     CHECK_NULL_RETURN(context, false);
372 
373     std::promise<bool> backPromise;
374     std::future<bool> backFuture = backPromise.get_future();
375     auto weak = AceType::WeakClaim(AceType::RawPtr(context));
376     container->GetTaskExecutor()->PostTask(
377         [weak, &backPromise]() {
378             auto context = weak.Upgrade();
379             if (context == nullptr) {
380                 return;
381             }
382             bool canBack = false;
383             if (!context->IsLastPage()) {
384                 canBack = context->CallRouterBackToPopPage();
385             }
386             backPromise.set_value(canBack);
387         },
388         TaskExecutor::TaskType::PLATFORM, "ArkUICallRouterBackToPopPage");
389     return backFuture.get();
390 }
391 
DispatchInputMethodEvent(unsigned int codePoint)392 bool EventDispatcher::DispatchInputMethodEvent(unsigned int codePoint)
393 {
394     ACE_SCOPED_TRACE("DispatchInputMethodEvent");
395     return TextInputClientMgr::GetInstance().AddCharacter(static_cast<wchar_t>(codePoint));
396 }
397 
DispatchKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent)398 bool EventDispatcher::DispatchKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent)
399 {
400     ACE_SCOPED_TRACE("DispatchKeyEvent");
401     if (HandleTextKeyEvent(keyEvent)) {
402         return true;
403     }
404     auto container = AceContainer::GetContainerInstance(ACE_INSTANCE_ID);
405     CHECK_NULL_RETURN(container, false);
406     auto aceView = AceType::DynamicCast<AceViewPreview>(container->GetAceView());
407     CHECK_NULL_RETURN(aceView, false);
408 
409     KeyEvent event;
410     ConvertKeyEvent(keyEvent, event);
411     event.isPreIme = true;
412     if (!aceView->HandleKeyEvent(event)) {
413         event.isPreIme = false;
414         return aceView->HandleKeyEvent(event);
415     }
416     return true;
417 }
418 
HandleTextKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent)419 bool EventDispatcher::HandleTextKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent)
420 {
421     // Only the keys involved in the input component are processed here, and the other keys will be forwarded.
422     if (!TextInputClientMgr::GetInstance().IsValidClientId()) {
423         return false;
424     }
425 
426     const static size_t maxKeySizes = 2;
427     wchar_t keyChar;
428     if (keyEvent->pressedCodes.size() == 1) {
429         auto iterCode = PRINTABEL_SYMBOLS.find(keyEvent->code);
430         if (iterCode != PRINTABEL_SYMBOLS.end()) {
431             keyChar = iterCode->second;
432         } else if (MMI::KeyCode::KEY_0 <= keyEvent->code && keyEvent->code <= MMI::KeyCode::KEY_9) {
433             keyChar = static_cast<wchar_t>(keyEvent->code) - static_cast<wchar_t>(MMI::KeyCode::KEY_0) + CASE_0;
434         } else if (MMI::KeyCode::KEY_NUMPAD_0 <= keyEvent->code && keyEvent->code <= MMI::KeyCode::KEY_NUMPAD_9) {
435             if (!keyEvent->enableNumLock_) {
436                 return true;
437             }
438             keyChar = static_cast<wchar_t>(keyEvent->code) - static_cast<wchar_t>(MMI::KeyCode::KEY_NUMPAD_0) + CASE_0;
439         } else if (MMI::KeyCode::KEY_A <= keyEvent->code && keyEvent->code <= MMI::KeyCode::KEY_Z) {
440             keyChar = static_cast<wchar_t>(keyEvent->code) - static_cast<wchar_t>(MMI::KeyCode::KEY_A);
441             keyChar += (keyEvent->enableCapsLock_ ? UPPER_CASE_A : LOWER_CASE_A);
442         } else {
443             return false;
444         }
445     } else if (keyEvent->pressedCodes.size() == maxKeySizes &&
446                keyEvent->pressedCodes[0] == MMI::KeyCode::KEY_SHIFT_LEFT) {
447         auto iterCode = SHIFT_PRINTABEL_SYMBOLS.find(keyEvent->code);
448         if (iterCode != SHIFT_PRINTABEL_SYMBOLS.end()) {
449             keyChar = iterCode->second;
450         } else if (MMI::KeyCode::KEY_A <= keyEvent->code && keyEvent->code <= MMI::KeyCode::KEY_Z) {
451             keyChar = static_cast<wchar_t>(keyEvent->code) - static_cast<wchar_t>(MMI::KeyCode::KEY_A);
452             keyChar += (keyEvent->enableCapsLock_ ? LOWER_CASE_A : UPPER_CASE_A);
453         } else if (MMI::KeyCode::KEY_0 <= keyEvent->code && keyEvent->code <= MMI::KeyCode::KEY_9) {
454             keyChar = NUM_SYMBOLS[static_cast<int32_t>(keyEvent->code) - static_cast<int32_t>(MMI::KeyCode::KEY_0)];
455         } else {
456             return false;
457         }
458     } else {
459         return false;
460     }
461     if (keyEvent->action != MMI::KeyAction::DOWN) {
462         return true;
463     }
464     return TextInputClientMgr::GetInstance().AddCharacter(keyChar);
465 }
466 
467 } // namespace OHOS::Ace::Platform
468