• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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/ohos/entrance/mmi_event_convertor.h"
17 
18 #include "adapter/ohos/entrance/ace_application_info.h"
19 #include "adapter/ohos/entrance/ace_extra_input_data.h"
20 #include "adapter/ohos/entrance/ace_container.h"
21 #include "adapter/ohos/entrance/tsa_advanced_feature.h"
22 
23 namespace OHOS::Ace::Platform {
24 namespace {
25 constexpr int32_t ANGLE_0 = 0;
26 constexpr int32_t ANGLE_90 = 90;
27 constexpr int32_t ANGLE_180 = 180;
28 constexpr int32_t ANGLE_270 = 270;
29 constexpr double SIZE_DIVIDE = 2.0;
30 
ConvertTouchEventType(int32_t originAction)31 TouchType ConvertTouchEventType(int32_t originAction)
32 {
33     std::map<int32_t, TouchType> actionMap = {
34         { OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL, TouchType::CANCEL },
35         { OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN, TouchType::DOWN },
36         { OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE, TouchType::MOVE },
37         { OHOS::MMI::PointerEvent::POINTER_ACTION_UP, TouchType::UP },
38         { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN, TouchType::PULL_DOWN },
39         { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE, TouchType::PULL_MOVE },
40         { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP, TouchType::PULL_UP },
41         { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW, TouchType::PULL_IN_WINDOW },
42         { OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW, TouchType::PULL_OUT_WINDOW },
43         { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_ENTER, TouchType::HOVER_ENTER },
44         { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_MOVE, TouchType::HOVER_MOVE },
45         { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_EXIT, TouchType::HOVER_EXIT },
46         { OHOS::MMI::PointerEvent::POINTER_ACTION_HOVER_CANCEL, TouchType::HOVER_CANCEL },
47         { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_IN, TouchType::PROXIMITY_IN },
48         { OHOS::MMI::PointerEvent::POINTER_ACTION_PROXIMITY_OUT, TouchType::PROXIMITY_OUT },
49     };
50     auto typeIter = actionMap.find(originAction);
51     if (typeIter == actionMap.end()) {
52         return TouchType::UNKNOWN;
53     }
54     return typeIter->second;
55 }
56 
ConvertMouseEventAction(int32_t originAction)57 MouseAction ConvertMouseEventAction(int32_t originAction)
58 {
59     switch (originAction) {
60         case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN:
61             return MouseAction::PRESS;
62         case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP:
63             return MouseAction::RELEASE;
64         case OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW:
65             return MouseAction::WINDOW_ENTER;
66         case OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW:
67             return MouseAction::WINDOW_LEAVE;
68         case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE:
69             return MouseAction::MOVE;
70         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN:
71             return MouseAction::PRESS;
72         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
73             return MouseAction::MOVE;
74         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
75             return MouseAction::WINDOW_ENTER;
76         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
77             return MouseAction::WINDOW_LEAVE;
78         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
79             return MouseAction::RELEASE;
80         case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
81             return MouseAction::CANCEL;
82         default:
83             return MouseAction::NONE;
84     }
85 }
86 
ConvertAxisEventAction(int32_t originAction)87 AxisAction ConvertAxisEventAction(int32_t originAction)
88 {
89     switch (originAction) {
90         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
91         case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN:
92             return AxisAction::BEGIN;
93         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
94         case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE:
95             return AxisAction::UPDATE;
96         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END:
97         case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END:
98             return AxisAction::END;
99         case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
100             return AxisAction::CANCEL;
101         default:
102             return AxisAction::NONE;
103     }
104 }
105 } // namespace
106 
GetSourceTool(int32_t orgToolType)107 SourceTool GetSourceTool(int32_t orgToolType)
108 {
109     switch (orgToolType) {
110         case OHOS::MMI::PointerEvent::TOOL_TYPE_FINGER:
111             return SourceTool::FINGER;
112         case OHOS::MMI::PointerEvent::TOOL_TYPE_PEN:
113             return SourceTool::PEN;
114         case OHOS::MMI::PointerEvent::TOOL_TYPE_RUBBER:
115             return SourceTool::RUBBER;
116         case OHOS::MMI::PointerEvent::TOOL_TYPE_BRUSH:
117             return SourceTool::BRUSH;
118         case OHOS::MMI::PointerEvent::TOOL_TYPE_PENCIL:
119             return SourceTool::PENCIL;
120         case OHOS::MMI::PointerEvent::TOOL_TYPE_AIRBRUSH:
121             return SourceTool::AIRBRUSH;
122         case OHOS::MMI::PointerEvent::TOOL_TYPE_MOUSE:
123             return SourceTool::MOUSE;
124         case OHOS::MMI::PointerEvent::TOOL_TYPE_LENS:
125             return SourceTool::LENS;
126         case OHOS::MMI::PointerEvent::TOOL_TYPE_TOUCHPAD:
127             return SourceTool::TOUCHPAD;
128         default:
129             LOGW("unknown tool type");
130             return SourceTool::UNKNOWN;
131     }
132 }
133 
GetPointerSensorTime(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)134 uint64_t GetPointerSensorTime(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
135 {
136     if (AceApplicationInfo::GetInstance().GetTouchEventPassMode() != TouchPassMode::ACCELERATE) {
137         return pointerEvent->GetActionTime();
138     }
139     auto inputTime = pointerEvent->GetSensorInputTime();
140     if (inputTime == 0) {
141         // inject event has no sensor time.
142         inputTime = static_cast<uint64_t>(pointerEvent->GetActionTime());
143     }
144     return inputTime;
145 }
146 
ConvertTouchPoint(const MMI::PointerEvent::PointerItem & pointerItem,int32_t sourceType,bool useHighPrecision)147 TouchPoint ConvertTouchPoint(const MMI::PointerEvent::PointerItem& pointerItem, int32_t sourceType,
148     bool useHighPrecision)
149 {
150     TouchPoint touchPoint;
151     // just get the max of width and height
152     touchPoint.size = std::max(pointerItem.GetWidth(), pointerItem.GetHeight()) / 2.0;
153     touchPoint.id = pointerItem.GetPointerId();
154     touchPoint.downTime = TimeStamp(std::chrono::microseconds(pointerItem.GetDownTime()));
155     if (useHighPrecision && sourceType == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
156         touchPoint.x = NearZero(pointerItem.GetWindowXPos()) ? pointerItem.GetWindowX()
157                                                              : static_cast<float>(pointerItem.GetWindowXPos());
158         touchPoint.y = NearZero(pointerItem.GetWindowYPos()) ? pointerItem.GetWindowY()
159                                                              : static_cast<float>(pointerItem.GetWindowYPos());
160         touchPoint.screenX = NearZero(pointerItem.GetDisplayXPos()) ? pointerItem.GetDisplayX()
161                                                                     : static_cast<float>(pointerItem.GetDisplayXPos());
162         touchPoint.screenY = NearZero(pointerItem.GetDisplayYPos()) ? pointerItem.GetDisplayY()
163                                                                     : static_cast<float>(pointerItem.GetDisplayYPos());
164     } else {
165         touchPoint.x = pointerItem.GetWindowX();
166         touchPoint.y = pointerItem.GetWindowY();
167         touchPoint.screenX = pointerItem.GetDisplayX();
168         touchPoint.screenY = pointerItem.GetDisplayY();
169     }
170     touchPoint.globalDisplayX = pointerItem.GetGlobalX();
171     touchPoint.globalDisplayY = pointerItem.GetGlobalY();
172     touchPoint.isPressed = pointerItem.IsPressed();
173     touchPoint.force = static_cast<float>(pointerItem.GetPressure());
174     touchPoint.tiltX = pointerItem.GetTiltX();
175     touchPoint.tiltY = pointerItem.GetTiltY();
176     touchPoint.rollAngle = pointerItem.GetTwist();
177     touchPoint.sourceTool = GetSourceTool(pointerItem.GetToolType());
178     touchPoint.originalId = pointerItem.GetOriginPointerId();
179     touchPoint.width = pointerItem.GetWidth();
180     touchPoint.height = pointerItem.GetHeight();
181     int32_t blobId = pointerItem.GetBlobId();
182     if (blobId < 0) {
183         touchPoint.operatingHand = 0;
184     } else {
185         touchPoint.operatingHand = static_cast<int32_t>(static_cast<uint32_t>(blobId) &
186             (OPERATING_HAND_LEFT | OPERATING_HAND_RIGHT));
187     }
188     return touchPoint;
189 }
190 
UpdateTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,TouchEvent & touchEvent)191 void UpdateTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, TouchEvent& touchEvent)
192 {
193     CHECK_NULL_VOID(pointerEvent);
194     auto ids = pointerEvent->GetPointerIds();
195     for (auto&& id : ids) {
196         MMI::PointerEvent::PointerItem item;
197         bool ret = pointerEvent->GetPointerItem(id, item);
198         if (!ret) {
199             LOGE("get pointer item failed.");
200             continue;
201         }
202         auto touchPoint = ConvertTouchPoint(item, pointerEvent->GetSourceType(), true);
203         touchPoint.CovertId();
204         touchEvent.pointers.emplace_back(std::move(touchPoint));
205     }
206     touchEvent.CovertId();
207 }
208 
GetTouchEventOriginOffset(const TouchEvent & event)209 Offset GetTouchEventOriginOffset(const TouchEvent& event)
210 {
211     auto pointerEvent = event.pointerEvent;
212     if (!pointerEvent) {
213         return Offset();
214     }
215     int32_t pointerID = pointerEvent->GetPointerId();
216     MMI::PointerEvent::PointerItem item;
217     bool ret = pointerEvent->GetPointerItem(pointerID, item);
218     if (!ret) {
219         return Offset();
220     }
221     if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
222         return Offset(
223             NearZero(item.GetWindowXPos()) ? item.GetWindowX()
224                                                 : static_cast<float>(item.GetWindowXPos()),
225             NearZero(item.GetWindowYPos()) ? item.GetWindowY()
226                                                   : static_cast<float>(item.GetWindowYPos()));
227     } else {
228         return Offset(item.GetWindowX(), item.GetWindowY());
229     }
230 }
231 
GetTouchEventOriginTimeStamp(const TouchEvent & event)232 TimeStamp GetTouchEventOriginTimeStamp(const TouchEvent& event)
233 {
234     auto pointerEvent = event.pointerEvent;
235     if (!pointerEvent) {
236         return event.time;
237     }
238     std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
239     TimeStamp time(microseconds);
240     return time;
241 }
242 
UpdatePressedKeyCodes(std::vector<KeyCode> & pressedKeyCodes)243 void UpdatePressedKeyCodes(std::vector<KeyCode>& pressedKeyCodes)
244 {
245     auto inputManager = MMI::InputManager::GetInstance();
246     CHECK_NULL_VOID(inputManager);
247 
248     std::vector<int32_t> pressedKeys;
249     std::map<int32_t, int32_t> specialKeysState;
250     pressedKeyCodes.clear();
251     auto ret = inputManager->GetKeyState(pressedKeys, specialKeysState);
252     if (ret == 0) {
253         for (const auto& curCode : pressedKeys) {
254             pressedKeyCodes.emplace_back(static_cast<KeyCode>(curCode));
255         }
256     }
257 }
258 
UpdateMouseEventForPen(const MMI::PointerEvent::PointerItem & pointerItem,MouseEvent & mouseEvent)259 void UpdateMouseEventForPen(const MMI::PointerEvent::PointerItem& pointerItem, MouseEvent& mouseEvent)
260 {
261     if (mouseEvent.sourceType != SourceType::TOUCH || mouseEvent.sourceTool != SourceTool::PEN) {
262         return;
263     }
264     mouseEvent.id = TOUCH_TOOL_BASE_ID + static_cast<int32_t>(mouseEvent.sourceTool);
265     // Pen use type double XY position.
266     mouseEvent.x = pointerItem.GetWindowXPos();
267     mouseEvent.y = pointerItem.GetWindowYPos();
268     mouseEvent.screenX = pointerItem.GetDisplayXPos();
269     mouseEvent.screenY = pointerItem.GetDisplayYPos();
270     mouseEvent.originalId = mouseEvent.id;
271     mouseEvent.globalDisplayX = pointerItem.GetGlobalX();
272     mouseEvent.globalDisplayY = pointerItem.GetGlobalY();
273 }
274 
ConvertTouchEventFromTouchPoint(TouchPoint touchPoint)275 TouchEvent ConvertTouchEventFromTouchPoint(TouchPoint touchPoint)
276 {
277     TouchEvent event;
278     event.SetId(touchPoint.id)
279         .SetX(touchPoint.x)
280         .SetY(touchPoint.y)
281         .SetScreenX(touchPoint.screenX)
282         .SetScreenY(touchPoint.screenY)
283         .SetGlobalDisplayX(touchPoint.globalDisplayX)
284         .SetGlobalDisplayY(touchPoint.globalDisplayY)
285         .SetType(TouchType::UNKNOWN)
286         .SetPullType(TouchType::UNKNOWN)
287         .SetSize(touchPoint.size)
288         .SetForce(touchPoint.force)
289         .SetTiltX(touchPoint.tiltX)
290         .SetTiltY(touchPoint.tiltY)
291         .SetRollAngle(touchPoint.rollAngle)
292         .SetSourceType(SourceType::NONE)
293         .SetSourceTool(touchPoint.sourceTool)
294         .SetOriginalId(touchPoint.originalId)
295         .SetSourceType(SourceType::NONE)
296         .SetOperatingHand(touchPoint.operatingHand)
297         .SetPressedTime(touchPoint.downTime)
298         .SetWidth(touchPoint.width)
299         .SetHeight(touchPoint.height);
300     return event;
301 }
302 
SetClonedPointerEvent(const MMI::PointerEvent * pointerEvent,ArkUITouchEvent * arkUITouchEventCloned)303 void SetClonedPointerEvent(const MMI::PointerEvent* pointerEvent, ArkUITouchEvent* arkUITouchEventCloned)
304 {
305     if (pointerEvent) {
306         MMI::PointerEvent* clonedEvent = new MMI::PointerEvent(*pointerEvent);
307         arkUITouchEventCloned->rawPointerEvent = clonedEvent;
308     }
309 }
310 
SetPostPointerEvent(TouchEvent & touchEvent,ArkUITouchEvent * arkUITouchEventCloned)311 void SetPostPointerEvent(TouchEvent& touchEvent, ArkUITouchEvent* arkUITouchEventCloned)
312 {
313     MMI::PointerEvent* pointerEvent = reinterpret_cast<MMI::PointerEvent*>(arkUITouchEventCloned->rawPointerEvent);
314     if (pointerEvent) {
315         MMI::PointerEvent* clonedEvent = new MMI::PointerEvent(*pointerEvent);
316         arkUITouchEventCloned->rawPointerEvent = clonedEvent;
317     }
318     std::shared_ptr<const MMI::PointerEvent> pointer(pointerEvent);
319     touchEvent.SetPointerEvent(pointer);
320 }
321 
DestroyRawPointerEvent(ArkUITouchEvent * arkUITouchEvent)322 void DestroyRawPointerEvent(ArkUITouchEvent* arkUITouchEvent)
323 {
324     MMI::PointerEvent* pointerEvent = reinterpret_cast<MMI::PointerEvent*>(arkUITouchEvent->rawPointerEvent);
325     if (pointerEvent) {
326         delete pointerEvent;
327         pointerEvent = nullptr;
328     }
329 }
330 
ConvertTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)331 TouchEvent ConvertTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
332 {
333     CHECK_NULL_RETURN(pointerEvent, TouchEvent());
334     int32_t pointerID = pointerEvent->GetPointerId();
335     MMI::PointerEvent::PointerItem item;
336     bool ret = pointerEvent->GetPointerItem(pointerID, item);
337     if (!ret) {
338         LOGE("get pointer item failed.");
339         return TouchEvent();
340     }
341     auto touchPoint = ConvertTouchPoint(item, pointerEvent->GetSourceType(), true);
342     TouchEvent event = ConvertTouchEventFromTouchPoint(touchPoint);
343     std::chrono::microseconds microseconds(GetPointerSensorTime(pointerEvent));
344     TimeStamp time(microseconds);
345     event.SetTime(time)
346         .SetDeviceId(pointerEvent->GetDeviceId())
347         .SetTargetDisplayId(pointerEvent->GetTargetDisplayId())
348         .SetTouchEventId(pointerEvent->GetId());
349     AceExtraInputData::ReadToTouchEvent(pointerEvent, event);
350     event.pointerEvent = pointerEvent;
351     int32_t orgDevice = pointerEvent->GetSourceType();
352     GetEventDevice(orgDevice, event);
353     int32_t orgAction = pointerEvent->GetPointerAction();
354     SetTouchEventType(orgAction, event);
355     event.isPrivacyMode = pointerEvent->HasFlag(OHOS::MMI::InputEvent::EVENT_FLAG_PRIVACY_MODE);
356     UpdateTouchEvent(pointerEvent, event);
357     if (event.sourceType == SourceType::TOUCH && event.sourceTool == SourceTool::PEN) {
358         // Pen use type double XY position.
359         event.x = item.GetWindowXPos();
360         event.y = item.GetWindowYPos();
361         event.screenX = item.GetDisplayXPos();
362         event.screenY = item.GetDisplayYPos();
363         event.globalDisplayX = item.GetGlobalX();
364         event.globalDisplayY = item.GetGlobalY();
365     }
366     event.pressedKeyCodes_.clear();
367     for (const auto& curCode : pointerEvent->GetPressedKeys()) {
368         event.pressedKeyCodes_.emplace_back(static_cast<KeyCode>(curCode));
369     }
370     return event;
371 }
372 
SetTouchEventType(int32_t orgAction,TouchEvent & event)373 void SetTouchEventType(int32_t orgAction, TouchEvent& event)
374 {
375     auto touchType = ConvertTouchEventType(orgAction);
376     if (touchType == TouchType::UNKNOWN) {
377         TAG_LOGE(AceLogTag::ACE_INPUTKEYFLOW, "unknown touch type");
378         return;
379     }
380     event.type = touchType;
381     if (touchType == TouchType::PULL_DOWN || touchType == TouchType::PULL_MOVE || touchType == TouchType::PULL_UP ||
382         touchType == TouchType::PULL_IN_WINDOW || touchType == TouchType::PULL_OUT_WINDOW) {
383         event.pullType = touchType;
384     }
385 }
386 
GetMouseEventAction(int32_t action,MouseEvent & events,bool isSceneBoardWindow)387 void GetMouseEventAction(int32_t action, MouseEvent& events, bool isSceneBoardWindow)
388 {
389     events.action = ConvertMouseEventAction(action);
390     switch (action) {
391         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_DOWN:
392             events.pullAction = MouseAction::PULL_DOWN;
393             break;
394         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
395             events.pullAction = MouseAction::PULL_MOVE;
396             break;
397         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
398             events.pullAction = MouseAction::PULL_MOVE;
399             return;
400         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
401             events.pullAction = MouseAction::PULL_MOVE;
402             return;
403         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
404             events.pullAction = MouseAction::PULL_UP;
405             break;
406         default:
407             break;
408     }
409 }
410 
GetMouseEventButton(int32_t button)411 MouseButton GetMouseEventButton(int32_t button)
412 {
413     switch (button) {
414         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_LEFT:
415             return MouseButton::LEFT_BUTTON;
416         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_RIGHT:
417             return MouseButton::RIGHT_BUTTON;
418         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_MIDDLE:
419             return MouseButton::MIDDLE_BUTTON;
420         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_SIDE:
421             return MouseButton::BACK_BUTTON;
422         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_EXTRA:
423             return MouseButton::FORWARD_BUTTON;
424         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_FORWARD:
425             return MouseButton::FORWARD_BUTTON;
426         case OHOS::MMI::PointerEvent::MOUSE_BUTTON_BACK:
427             return MouseButton::BACK_BUTTON;
428         default:
429             return MouseButton::NONE_BUTTON;
430     }
431 }
432 
ConvertMouseEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,MouseEvent & events,bool isSceneBoardWindow)433 void ConvertMouseEvent(
434     const std::shared_ptr<MMI::PointerEvent>& pointerEvent, MouseEvent& events, bool isSceneBoardWindow)
435 {
436     int32_t pointerID = pointerEvent->GetPointerId();
437     MMI::PointerEvent::PointerItem item;
438     bool ret = pointerEvent->GetPointerItem(pointerID, item);
439     if (!ret) {
440         LOGE("get pointer: %{public}d item failed.", pointerID);
441         return;
442     }
443     events.id = pointerID;
444     if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
445         events.x = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : static_cast<float>(item.GetWindowXPos());
446         events.y = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : static_cast<float>(item.GetWindowYPos());
447         events.screenX =
448             NearZero(item.GetDisplayXPos()) ? item.GetDisplayX() : static_cast<float>(item.GetDisplayXPos());
449         events.screenY =
450             NearZero(item.GetDisplayYPos()) ? item.GetDisplayY() : static_cast<float>(item.GetDisplayYPos());
451     } else {
452         events.x = item.GetWindowX();
453         events.y = item.GetWindowY();
454         events.screenX = item.GetDisplayX();
455         events.screenY = item.GetDisplayY();
456     }
457     events.globalDisplayX = item.GetGlobalX();
458     events.globalDisplayY = item.GetGlobalY();
459     events.rawDeltaX = item.GetRawDx();
460     events.rawDeltaY = item.GetRawDy();
461     GetMouseEventAction(pointerEvent->GetPointerAction(), events, isSceneBoardWindow);
462     events.button = GetMouseEventButton(pointerEvent->GetButtonId());
463     GetEventDevice(pointerEvent->GetSourceType(), events);
464     events.isPrivacyMode = pointerEvent->HasFlag(OHOS::MMI::InputEvent::EVENT_FLAG_PRIVACY_MODE);
465     events.targetDisplayId = pointerEvent->GetTargetDisplayId();
466     events.originalId = item.GetOriginPointerId();
467     events.deviceId = pointerEvent->GetDeviceId();
468 
469     std::set<int32_t> pressedSet = pointerEvent->GetPressedButtons();
470     uint32_t pressedButtons = 0;
471     if (pressedSet.find(OHOS::MMI::PointerEvent::MOUSE_BUTTON_LEFT) != pressedSet.end()) {
472         pressedButtons &= static_cast<uint32_t>(MouseButton::LEFT_BUTTON);
473     }
474     if (pressedSet.find(OHOS::MMI::PointerEvent::MOUSE_BUTTON_RIGHT) != pressedSet.end()) {
475         pressedButtons &= static_cast<uint32_t>(MouseButton::RIGHT_BUTTON);
476     }
477     if (pressedSet.find(OHOS::MMI::PointerEvent::MOUSE_BUTTON_MIDDLE) != pressedSet.end()) {
478         pressedButtons &= static_cast<uint32_t>(MouseButton::MIDDLE_BUTTON);
479     }
480     events.pressedButtons = static_cast<int32_t>(pressedButtons);
481 
482     for (const auto& pressedButton : pressedSet) {
483         auto convertedButton = GetMouseEventButton(pressedButton);
484         if (convertedButton != MouseButton::NONE_BUTTON) {
485             events.pressedButtonsArray.emplace_back(convertedButton);
486         }
487     }
488     events.time = TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime()));
489     events.pressedTime = TimeStamp(std::chrono::microseconds(item.GetDownTime()));
490     events.pointerEvent = pointerEvent;
491     events.sourceTool = GetSourceTool(item.GetToolType());
492     UpdateMouseEventForPen(item, events);
493     events.touchEventId = pointerEvent->GetId();
494     events.pressedKeyCodes_.clear();
495     for (const auto& curCode : pointerEvent->GetPressedKeys()) {
496         events.pressedKeyCodes_.emplace_back(static_cast<KeyCode>(curCode));
497     }
498 }
499 
GetAxisEventAction(int32_t action,AxisEvent & event)500 void GetAxisEventAction(int32_t action, AxisEvent& event)
501 {
502     event.action = ConvertAxisEventAction(action);
503 }
504 
GetNonPointerAxisEventAction(int32_t action,NG::FocusAxisEvent & event)505 void GetNonPointerAxisEventAction(int32_t action, NG::FocusAxisEvent& event)
506 {
507     switch (action) {
508         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
509             event.action = AxisAction::BEGIN;
510             break;
511         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
512             event.action = AxisAction::UPDATE;
513             break;
514         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_END:
515             event.action = AxisAction::END;
516             break;
517         case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
518             event.action = AxisAction::CANCEL;
519             break;
520         default:
521             event.action = AxisAction::NONE;
522             break;
523     }
524 }
525 
ConvertCrownEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,CrownEvent & event)526 void ConvertCrownEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, CrownEvent& event)
527 {
528     event.touchEventId = pointerEvent->GetId();
529     int32_t pointerAction = pointerEvent->GetPointerAction();
530     if (pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN) {
531         event.action = Ace::CrownAction::BEGIN;
532     } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE) {
533         event.action = Ace::CrownAction::UPDATE;
534     } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_END) {
535         event.action = Ace::CrownAction::END;
536     } else {
537         event.action = Ace::CrownAction::UNKNOWN;
538     }
539     int32_t orgDevice = pointerEvent->GetSourceType();
540     GetEventDevice(orgDevice, event);
541     event.angularVelocity = pointerEvent->GetVelocity();
542     event.degree =  pointerEvent->GetAxisValue(MMI::PointerEvent::AXIS_TYPE_SCROLL_VERTICAL);
543     std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
544     TimeStamp time(microseconds);
545     event.timeStamp = time;
546     event.SetPointerEvent(pointerEvent);
547 }
548 
ConvertAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,AxisEvent & event)549 void ConvertAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, AxisEvent& event)
550 {
551     int32_t pointerID = pointerEvent->GetPointerId();
552     MMI::PointerEvent::PointerItem item;
553     bool ret = pointerEvent->GetPointerItem(pointerID, item);
554     if (!ret) {
555         LOGE("get pointer: %{public}d item failed.", pointerID);
556         return;
557     }
558 
559     event.id = item.GetPointerId();
560     if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
561         event.x = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : static_cast<float>(item.GetWindowXPos());
562         event.y = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : static_cast<float>(item.GetWindowYPos());
563         event.screenX =
564             NearZero(item.GetDisplayXPos()) ? item.GetDisplayX() : static_cast<float>(item.GetDisplayXPos());
565         event.screenY =
566             NearZero(item.GetDisplayYPos()) ? item.GetDisplayY() : static_cast<float>(item.GetDisplayYPos());
567     } else {
568         event.x = static_cast<float>(item.GetWindowX());
569         event.y = static_cast<float>(item.GetWindowY());
570         event.screenX = static_cast<float>(item.GetDisplayX());
571         event.screenY = static_cast<float>(item.GetDisplayY());
572     }
573     event.globalDisplayX = item.GetGlobalX();
574     event.globalDisplayY = item.GetGlobalY();
575     event.horizontalAxis = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL);
576     event.verticalAxis = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL);
577     event.pinchAxisScale = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_PINCH);
578     event.rotateAxisAngle = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ROTATE);
579     int32_t orgAction = pointerEvent->GetPointerAction();
580     GetAxisEventAction(orgAction, event);
581     event.isRotationEvent = (orgAction >= MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN) &&
582                             (orgAction <= MMI::PointerEvent::POINTER_ACTION_ROTATE_END);
583     event.scrollStep = pointerEvent->GetScrollRows();
584     int32_t orgDevice = pointerEvent->GetSourceType();
585     GetEventDevice(orgDevice, event);
586     event.sourceTool = GetSourceTool(item.GetToolType());
587     event.pointerEvent = pointerEvent;
588     event.originalId = item.GetOriginPointerId();
589     event.deviceId = pointerEvent->GetDeviceId();
590 
591     std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
592     TimeStamp time(microseconds);
593     event.time = time;
594     event.touchEventId = pointerEvent->GetId();
595     event.targetDisplayId = pointerEvent->GetTargetDisplayId();
596     event.pressedCodes.clear();
597     for (const auto& curCode : pointerEvent->GetPressedKeys()) {
598         event.pressedCodes.emplace_back(static_cast<KeyCode>(curCode));
599     }
600 }
601 
ConvertRawAxisActionToTouch(int32_t rawAxisAction)602 static TouchType ConvertRawAxisActionToTouch(int32_t rawAxisAction)
603 {
604     switch (rawAxisAction) {
605         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN:
606         case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN:
607             return TouchType::DOWN;
608         case OHOS::MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE:
609         case OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE:
610             return TouchType::MOVE;
611         case MMI::PointerEvent::POINTER_ACTION_AXIS_END:
612         case MMI::PointerEvent::POINTER_ACTION_ROTATE_END:
613             return TouchType::UP;
614         case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
615             return TouchType::CANCEL;
616         default:
617             return TouchType::UNKNOWN;
618     }
619 }
620 
SetAxisEvent(PointerEvent & axisFakePntEvt,TouchPoint & touchPoint)621 void SetAxisEvent(PointerEvent& axisFakePntEvt, TouchPoint& touchPoint)
622 {
623     axisFakePntEvt.x = touchPoint.x;
624     axisFakePntEvt.y = touchPoint.y;
625     axisFakePntEvt.screenX = touchPoint.screenX;
626     axisFakePntEvt.screenY = touchPoint.screenY;
627     axisFakePntEvt.globalDisplayX = touchPoint.globalDisplayX;
628     axisFakePntEvt.globalDisplayY = touchPoint.globalDisplayY;
629     touchPoint.downTime = axisFakePntEvt.time;
630 }
631 
ConvertAxisEventToTouchPoint(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,MMI::PointerEvent::PointerItem & pointerItem,TouchPoint & touchPoint,PointerEvent & axisFakePntEvt)632 static void ConvertAxisEventToTouchPoint(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
633     MMI::PointerEvent::PointerItem& pointerItem, TouchPoint& touchPoint, PointerEvent& axisFakePntEvt)
634 {
635     constexpr float FAKE_TOUCH_PRESSURE = 3.0f;
636     float cvtStep = SystemProperties::GetScrollCoefficients();
637     touchPoint.id = pointerItem.GetPointerId();
638     touchPoint.isPressed = !(pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_AXIS_END ||
639                              pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_ROTATE_END);
640     touchPoint.force = FAKE_TOUCH_PRESSURE;
641     touchPoint.tiltX = 0.0;
642     touchPoint.tiltY = 0.0;
643     touchPoint.rollAngle = 0.0;
644     touchPoint.sourceTool = SourceTool::FINGER;
645     touchPoint.originalId = pointerItem.GetOriginPointerId();
646     touchPoint.width = 0;
647     touchPoint.height = 0;
648     touchPoint.size = 0.0;
649     touchPoint.operatingHand = 0;
650 
651     if (pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN ||
652         pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN) {
653         axisFakePntEvt.time = TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime()));
654         if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
655             touchPoint.x = NearZero(pointerItem.GetWindowXPos()) ? pointerItem.GetWindowX()
656                                                                  : static_cast<float>(pointerItem.GetWindowXPos());
657             touchPoint.y = NearZero(pointerItem.GetWindowYPos()) ? pointerItem.GetWindowY()
658                                                                  : static_cast<float>(pointerItem.GetWindowYPos());
659             touchPoint.screenX = NearZero(pointerItem.GetDisplayXPos())
660                                      ? pointerItem.GetDisplayX()
661                                      : static_cast<float>(pointerItem.GetDisplayXPos());
662             touchPoint.screenY = NearZero(pointerItem.GetDisplayYPos())
663                                      ? pointerItem.GetDisplayY()
664                                      : static_cast<float>(pointerItem.GetDisplayYPos());
665         } else {
666             touchPoint.x = pointerItem.GetWindowX();
667             touchPoint.y = pointerItem.GetWindowY();
668             touchPoint.screenX = pointerItem.GetDisplayX();
669             touchPoint.screenY = pointerItem.GetDisplayY();
670         }
671         touchPoint.globalDisplayX = pointerItem.GetGlobalX();
672         touchPoint.globalDisplayY = pointerItem.GetGlobalY();
673     } else {
674         const float xOffset =
675             cvtStep * pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL);
676         const float yOffset =
677             cvtStep * pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL);
678         touchPoint.x = axisFakePntEvt.x - xOffset;
679         touchPoint.y = axisFakePntEvt.y - yOffset;
680         touchPoint.screenX = axisFakePntEvt.screenX - xOffset;
681         touchPoint.screenY = axisFakePntEvt.screenY - yOffset;
682         touchPoint.globalDisplayX = axisFakePntEvt.globalDisplayX - xOffset;
683         touchPoint.globalDisplayY = axisFakePntEvt.globalDisplayY - yOffset;
684     }
685     SetAxisEvent(axisFakePntEvt, touchPoint);
686 }
687 
ConvertAxisEventToTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,TouchEvent & touchEvt,OHOS::Ace::PointerEvent & axisFakePntEvt)688 void ConvertAxisEventToTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, TouchEvent& touchEvt,
689     OHOS::Ace::PointerEvent& axisFakePntEvt)
690 {
691     CHECK_NULL_VOID(pointerEvent);
692 
693     int32_t pointerID = pointerEvent->GetPointerId();
694     MMI::PointerEvent::PointerItem pointerItem;
695     if (!pointerEvent->GetPointerItem(pointerID, pointerItem)) {
696         return;
697     }
698     TouchPoint touchPoint;
699     ConvertAxisEventToTouchPoint(pointerEvent, pointerItem, touchPoint, axisFakePntEvt);
700     touchEvt = ConvertTouchEventFromTouchPoint(touchPoint);
701     touchEvt.SetSourceType(SourceType::TOUCH)
702         .SetType(ConvertRawAxisActionToTouch(pointerEvent->GetPointerAction()))
703         .SetPullType(TouchType::UNKNOWN)
704         .SetTime(TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime())))
705         .SetDeviceId(pointerEvent->GetDeviceId())
706         .SetTargetDisplayId(pointerEvent->GetTargetDisplayId())
707         .SetTouchEventId(pointerEvent->GetId())
708         .SetPointerEvent(pointerEvent);
709     touchEvt.convertInfo.first = UIInputEventType::AXIS;
710     touchEvt.convertInfo.second = UIInputEventType::TOUCH;
711 
712     touchEvt.pointers.emplace_back(std::move(touchPoint));
713 }
714 
ConvertKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,KeyEvent & event)715 void ConvertKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, KeyEvent& event)
716 {
717     CHECK_NULL_VOID(keyEvent);
718     event.rawKeyEvent = keyEvent;
719     event.code = static_cast<KeyCode>(keyEvent->GetKeyCode());
720     event.numLock = keyEvent->GetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY);
721     event.enableCapsLock = keyEvent->GetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY);
722     event.scrollLock = keyEvent->GetFunctionKey(MMI::KeyEvent::SCROLL_LOCK_FUNCTION_KEY);
723     event.keyIntention = static_cast<KeyIntention>(keyEvent->GetKeyIntention());
724     event.targetDisplayId = keyEvent->GetTargetDisplayId();
725     if (keyEvent->GetKeyAction() == OHOS::MMI::KeyEvent::KEY_ACTION_UP) {
726         event.action = KeyAction::UP;
727     } else if (keyEvent->GetKeyAction() == OHOS::MMI::KeyEvent::KEY_ACTION_DOWN) {
728         event.action = KeyAction::DOWN;
729     } else {
730         event.action = KeyAction::UNKNOWN;
731     }
732     auto keyItems = keyEvent->GetKeyItems();
733     for (auto item = keyItems.rbegin(); item != keyItems.rend(); item++) {
734         if (item->GetKeyCode() == keyEvent->GetKeyCode()) {
735             event.unicode = item->GetUnicode();
736             break;
737         } else {
738             event.unicode = 0;
739         }
740     }
741 
742     std::chrono::microseconds microseconds(keyEvent->GetActionTime());
743     TimeStamp time(microseconds);
744     event.timeStamp = time;
745     event.key.assign(MMI::KeyEvent::KeyCodeToString(keyEvent->GetKeyCode()));
746     event.deviceId = keyEvent->GetDeviceId();
747     int32_t orgDevice = keyEvent->GetSourceType();
748     event.sourceType =
749         orgDevice == MMI::PointerEvent::SOURCE_TYPE_JOYSTICK ? SourceType::JOYSTICK : SourceType::KEYBOARD;
750 #ifdef SECURITY_COMPONENT_ENABLE
751     event.enhanceData = keyEvent->GetEnhanceData();
752 #endif
753     event.pressedCodes.clear();
754     for (const auto& curCode : keyEvent->GetPressedKeys()) {
755         event.pressedCodes.emplace_back(static_cast<KeyCode>(curCode));
756     }
757     event.enableCapsLock = keyEvent->GetFunctionKey(MMI::KeyEvent::CAPS_LOCK_FUNCTION_KEY);
758     event.numLock = keyEvent->GetFunctionKey(MMI::KeyEvent::NUM_LOCK_FUNCTION_KEY);
759     if (keyEvent->IsFlag(OHOS::MMI::InputEvent::EVENT_FLAG_KEYBOARD_ENTER_FOCUS)) {
760         event.activeMark = true;
761     } else if (keyEvent->IsFlag(OHOS::MMI::InputEvent::EVENT_FLAG_KEYBOARD_EXIT_FOCUS)) {
762         event.activeMark = false;
763     }
764 }
765 
ConvertFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,NG::FocusAxisEvent & event)766 void ConvertFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, NG::FocusAxisEvent& event)
767 {
768     int32_t pointerID = pointerEvent->GetPointerId();
769     MMI::PointerEvent::PointerItem item;
770     bool ret = pointerEvent->GetPointerItem(pointerID, item);
771     if (!ret) {
772         LOGE("get pointer: %{public}d item failed.", pointerID);
773         return;
774     }
775 
776     event.id = item.GetPointerId();
777     event.absXValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_X);
778     event.absYValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_Y);
779     event.absZValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_Z);
780     event.absRzValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_RZ);
781     event.absHat0XValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_HAT0X);
782     event.absHat0YValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_HAT0Y);
783     event.absBrakeValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_BRAKE);
784     event.absGasValue = pointerEvent->GetAxisValue(OHOS::MMI::PointerEvent::AxisType::AXIS_TYPE_ABS_GAS);
785     int32_t orgAction = pointerEvent->GetPointerAction();
786     GetNonPointerAxisEventAction(orgAction, event);
787     int32_t orgDevice = pointerEvent->GetSourceType();
788     GetEventDevice(orgDevice, event);
789     event.sourceTool = SourceTool::JOYSTICK;
790     event.pointerEvent = pointerEvent;
791     event.originalId = item.GetOriginPointerId();
792     event.deviceId = pointerEvent->GetDeviceId();
793 
794     std::chrono::microseconds microseconds(pointerEvent->GetActionTime());
795     TimeStamp time(microseconds);
796     event.time = time;
797     event.touchEventId = pointerEvent->GetId();
798     event.targetDisplayId = pointerEvent->GetTargetDisplayId();
799     event.pressedCodes.clear();
800     for (const auto& curCode : pointerEvent->GetPressedKeys()) {
801         event.pressedCodes.emplace_back(static_cast<KeyCode>(curCode));
802     }
803 }
804 
GetPointerEventAction(int32_t action,DragPointerEvent & event)805 void GetPointerEventAction(int32_t action, DragPointerEvent& event)
806 {
807     switch (action) {
808         case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
809             event.action = PointerAction::CANCEL;
810             break;
811         case OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN:
812             event.action = PointerAction::DOWN;
813             break;
814         case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE:
815             event.action = PointerAction::MOVE;
816             break;
817         case OHOS::MMI::PointerEvent::POINTER_ACTION_UP:
818             event.action = PointerAction::UP;
819             break;
820         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE:
821             event.action = PointerAction::PULL_MOVE;
822             break;
823         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP:
824             event.action = PointerAction::PULL_UP;
825             break;
826         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW:
827             event.action = PointerAction::PULL_IN_WINDOW;
828             break;
829         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW:
830             event.action = PointerAction::PULL_OUT_WINDOW;
831             break;
832         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_CANCEL:
833             event.action = PointerAction::PULL_CANCEL;
834             break;
835         default:
836             event.action = PointerAction::UNKNOWN;
837             break;
838     }
839 }
840 
841 /**
842  * Only for UIExtension to convert drag event type and dispatch.
843  */
UpdatePointerAction(std::shared_ptr<MMI::PointerEvent> & pointerEvent,const PointerAction action)844 void UpdatePointerAction(std::shared_ptr<MMI::PointerEvent>& pointerEvent, const PointerAction action)
845 {
846     if (action == PointerAction::PULL_IN_WINDOW) {
847         pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW);
848     }
849     if (action == PointerAction::PULL_OUT_WINDOW) {
850         pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW);
851     }
852     if (action == PointerAction::UP) {
853         pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP);
854     }
855     if (action == PointerAction::PULL_CANCEL) {
856         pointerEvent->SetPointerAction(OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_CANCEL);
857     }
858 }
859 
GetPointerEventToolType(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,int32_t & toolType)860 bool GetPointerEventToolType(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, int32_t& toolType)
861 {
862     int32_t pointerID = pointerEvent->GetPointerId();
863     MMI::PointerEvent::PointerItem item;
864     bool ret = pointerEvent->GetPointerItem(pointerID, item);
865     if (!ret) {
866         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "get pointer: %{public}d item failed.", pointerID);
867         return false;
868     }
869     toolType = item.GetToolType();
870     return true;
871 }
872 
ConvertPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,DragPointerEvent & event)873 void ConvertPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, DragPointerEvent& event)
874 {
875     event.rawPointerEvent = pointerEvent;
876     event.pointerEventId = pointerEvent->GetId();
877     event.pointerId = pointerEvent->GetPointerId();
878     event.pullId = pointerEvent->GetPullId();
879     MMI::PointerEvent::PointerItem pointerItem;
880     pointerEvent->GetPointerItem(pointerEvent->GetPointerId(), pointerItem);
881     event.pressed = pointerItem.IsPressed();
882     if (pointerEvent->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
883         event.windowX = NearZero(pointerItem.GetWindowXPos()) ? pointerItem.GetWindowX()
884                                                               : static_cast<float>(pointerItem.GetWindowXPos());
885         event.windowY = NearZero(pointerItem.GetWindowYPos()) ? pointerItem.GetWindowY()
886                                                               : static_cast<float>(pointerItem.GetWindowYPos());
887         event.displayX = NearZero(pointerItem.GetDisplayXPos()) ? pointerItem.GetDisplayX()
888                                                                 : static_cast<float>(pointerItem.GetDisplayXPos());
889         event.displayY = NearZero(pointerItem.GetDisplayYPos()) ? pointerItem.GetDisplayY()
890                                                                 : static_cast<float>(pointerItem.GetDisplayYPos());
891     } else {
892         event.windowX = pointerItem.GetWindowX();
893         event.windowY = pointerItem.GetWindowY();
894         event.displayX = pointerItem.GetDisplayX();
895         event.displayY = pointerItem.GetDisplayY();
896     }
897     event.globalDisplayX = pointerItem.GetGlobalX();
898     event.globalDisplayY = pointerItem.GetGlobalY();
899     event.displayId = pointerEvent->GetTargetDisplayId();
900     event.size = std::max(pointerItem.GetWidth(), pointerItem.GetHeight()) / SIZE_DIVIDE;
901     event.force = static_cast<float>(pointerItem.GetPressure());
902     event.deviceId = pointerItem.GetDeviceId();
903     event.downTime = TimeStamp(std::chrono::microseconds(pointerItem.GetDownTime()));
904     event.time = TimeStamp(std::chrono::microseconds(pointerEvent->GetActionTime()));
905     event.sourceTool = GetSourceTool(pointerItem.GetToolType());
906     event.targetWindowId = pointerItem.GetTargetWindowId();
907     event.x = event.windowX;
908     event.y = event.windowY;
909     event.pressedKeyCodes.clear();
910     for (const auto& curCode : pointerEvent->GetPressedKeys()) {
911         event.pressedKeyCodes.emplace_back(static_cast<KeyCode>(curCode));
912     }
913     int32_t orgAction = pointerEvent->GetPointerAction();
914     GetPointerEventAction(orgAction, event);
915 }
916 
LogPointInfo(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,int32_t instanceId)917 void LogPointInfo(const std::shared_ptr<MMI::PointerEvent>& pointerEvent, int32_t instanceId)
918 {
919     if (pointerEvent->GetSourceType() != OHOS::MMI::PointerEvent::SOURCE_TYPE_MOUSE &&
920         (pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_ENTER_WINDOW ||
921         pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_LEAVE_WINDOW)) {
922         TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "SourceType:%{public}d error, PointerAction:%{public}d "
923             "instanceId:%{public}d",
924             pointerEvent->GetSourceType(), pointerEvent->GetPointerAction(), instanceId);
925     }
926 
927     if (pointerEvent->GetPointerAction() == OHOS::MMI::PointerEvent::POINTER_ACTION_DOWN) {
928         auto container = Platform::AceContainer::GetContainer(instanceId);
929         if (container) {
930             auto pipelineContext = container->GetPipelineContext();
931             if (pipelineContext) {
932                 uint32_t windowId = pipelineContext->GetWindowId();
933                 TAG_LOGD(AceLogTag::ACE_INPUTTRACKING, "pointdown windowId: %{public}u", windowId);
934             }
935         }
936     }
937     if (SystemProperties::GetDebugEnabled()) {
938         TAG_LOGD(AceLogTag::ACE_DRAG, "point source: %{public}d", pointerEvent->GetSourceType());
939         auto actionId = pointerEvent->GetPointerId();
940         MMI::PointerEvent::PointerItem item;
941         if (pointerEvent->GetPointerItem(actionId, item)) {
942             TAG_LOGD(AceLogTag::ACE_DRAG,
943                 "action point info: id: %{public}d, pointerId: %{public}d, action: "
944                 "%{public}d, pressure: %{public}f, tiltX: %{public}f, tiltY: %{public}f",
945                 pointerEvent->GetId(), actionId, pointerEvent->GetPointerAction(),
946                 item.GetPressure(), item.GetTiltX(), item.GetTiltY());
947         }
948         auto ids = pointerEvent->GetPointerIds();
949         for (auto&& id : ids) {
950             MMI::PointerEvent::PointerItem item;
951             if (pointerEvent->GetPointerItem(id, item)) {
952                 TAG_LOGD(AceLogTag::ACE_UIEVENT,
953                     "all point info: id: %{public}d, x: %{public}d/%{public}f, y: %{public}d/%{public}f, isPressed: "
954                     "%{public}d, pressure: %{public}f, tiltX: %{public}f, tiltY: %{public}f",
955                     actionId, item.GetWindowX(), static_cast<float>(item.GetWindowXPos()), item.GetWindowY(),
956                     static_cast<float>(item.GetWindowYPos()), item.IsPressed(), item.GetPressure(), item.GetTiltX(),
957                     item.GetTiltY());
958             }
959         }
960     }
961 }
962 
CalculatePointerEvent(const std::shared_ptr<MMI::PointerEvent> & point,const RefPtr<NG::FrameNode> & frameNode,bool useRealtimeMatrix)963 void CalculatePointerEvent(const std::shared_ptr<MMI::PointerEvent>& point, const RefPtr<NG::FrameNode>& frameNode,
964     bool useRealtimeMatrix)
965 {
966     CHECK_NULL_VOID(point);
967     int32_t pointerId = point->GetPointerId();
968     MMI::PointerEvent::PointerItem item;
969     bool ret = point->GetPointerItem(pointerId, item);
970     if (ret) {
971         float xRelative = item.GetWindowX();
972         float yRelative = item.GetWindowY();
973         if (point->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
974             xRelative = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : item.GetWindowXPos();
975             yRelative = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : item.GetWindowYPos();
976         }
977         NG::PointF transformPoint(xRelative, yRelative);
978         NG::NGGestureRecognizer::Transform(transformPoint, frameNode, useRealtimeMatrix);
979         item.SetWindowX(static_cast<int32_t>(transformPoint.GetX()));
980         item.SetWindowY(static_cast<int32_t>(transformPoint.GetY()));
981         item.SetWindowXPos(transformPoint.GetX());
982         item.SetWindowYPos(transformPoint.GetY());
983         point->UpdatePointerItem(pointerId, item);
984     }
985 }
986 
CalculatePointerEvent(const NG::OffsetF & offsetF,const std::shared_ptr<MMI::PointerEvent> & point,const NG::VectorF & scale,int32_t udegree)987 void CalculatePointerEvent(const NG::OffsetF& offsetF, const std::shared_ptr<MMI::PointerEvent>& point,
988     const NG::VectorF& scale, int32_t udegree)
989 {
990     CHECK_NULL_VOID(point);
991     int32_t pointerId = point->GetPointerId();
992     MMI::PointerEvent::PointerItem item;
993     bool ret = point->GetPointerItem(pointerId, item);
994     if (ret) {
995         float xRelative = item.GetWindowX();
996         float yRelative = item.GetWindowY();
997         if (point->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
998             xRelative = NearZero(item.GetWindowXPos()) ? item.GetWindowX() : item.GetWindowXPos();
999             yRelative = NearZero(item.GetWindowYPos()) ? item.GetWindowY() : item.GetWindowYPos();
1000         }
1001         auto windowX = xRelative;
1002         auto windowY = yRelative;
1003         auto pipelineContext = PipelineBase::GetCurrentContextSafelyWithCheck();
1004         CHECK_NULL_VOID(pipelineContext);
1005         auto displayWindowRect = pipelineContext->GetDisplayWindowRectInfo();
1006         auto windowWidth = displayWindowRect.Width();
1007         auto windowHeight = displayWindowRect.Height();
1008         switch (udegree) {
1009             case ANGLE_0:
1010                 windowX = xRelative - offsetF.GetX();
1011                 windowY = yRelative - offsetF.GetY();
1012                 break;
1013             case ANGLE_90:
1014                 windowX = yRelative - offsetF.GetX();
1015                 windowY = windowWidth - offsetF.GetY() - xRelative;
1016                 break;
1017             case ANGLE_180:
1018                 windowX = windowWidth - offsetF.GetX() - xRelative;
1019                 windowY = windowHeight - offsetF.GetY() - yRelative;
1020                 break;
1021             case ANGLE_270:
1022                 windowX = windowHeight - offsetF.GetX() - yRelative;
1023                 windowY = xRelative - offsetF.GetY();
1024                 break;
1025             default:
1026                 break;
1027         }
1028         windowX = NearZero(scale.x) ? windowX : windowX / scale.x;
1029         windowY = NearZero(scale.y) ? windowY : windowY / scale.y;
1030 
1031         item.SetWindowX(static_cast<int32_t>(windowX));
1032         item.SetWindowY(static_cast<int32_t>(windowY));
1033         item.SetWindowXPos(windowX);
1034         item.SetWindowYPos(windowY);
1035         point->UpdatePointerItem(pointerId, item);
1036     }
1037 }
1038 
CalculateWindowCoordinate(const NG::OffsetF & offsetF,const std::shared_ptr<MMI::PointerEvent> & point,const NG::VectorF & scale,const int32_t udegree)1039 void CalculateWindowCoordinate(const NG::OffsetF& offsetF, const std::shared_ptr<MMI::PointerEvent>& point,
1040     const NG::VectorF& scale, const int32_t udegree)
1041 {
1042     CHECK_NULL_VOID(point);
1043     auto ids = point->GetPointerIds();
1044     for (auto&& id : ids) {
1045         MMI::PointerEvent::PointerItem item;
1046         bool ret = point->GetPointerItem(id, item);
1047         if (!ret) {
1048             LOGE("get pointer:%{public}d item failed", id);
1049             continue;
1050         }
1051         float xRelative = item.GetDisplayX();
1052         float yRelative = item.GetDisplayY();
1053         if (point->GetSourceType() == OHOS::MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
1054             xRelative = NearZero(item.GetDisplayXPos()) ? item.GetDisplayX() : item.GetDisplayXPos();
1055             yRelative = NearZero(item.GetDisplayYPos()) ? item.GetDisplayY() : item.GetDisplayYPos();
1056         }
1057         float windowX = xRelative;
1058         float windowY = yRelative;
1059         int32_t deviceWidth = SystemProperties::GetDevicePhysicalWidth();
1060         int32_t deviceHeight = SystemProperties::GetDevicePhysicalHeight();
1061 
1062         if (udegree == ANGLE_0) {
1063             windowX = xRelative - offsetF.GetX();
1064             windowY = yRelative - offsetF.GetY();
1065         }
1066         if (udegree == ANGLE_90) {
1067             windowX = yRelative - offsetF.GetX();
1068             windowY = deviceWidth - offsetF.GetY() - xRelative;
1069         }
1070         if (udegree == ANGLE_180) {
1071             windowX = deviceWidth - offsetF.GetX() - xRelative;
1072             windowY = deviceHeight - offsetF.GetY() - yRelative;
1073         }
1074         if (udegree == ANGLE_270) {
1075             windowX = deviceHeight - offsetF.GetX() - yRelative;
1076             windowY = xRelative - offsetF.GetY();
1077         }
1078 
1079         windowX = NearZero(scale.x) ? windowX : windowX / scale.x;
1080         windowY = NearZero(scale.y) ? windowY : windowY / scale.y;
1081 
1082         item.SetWindowX(static_cast<int32_t>(windowX));
1083         item.SetWindowY(static_cast<int32_t>(windowY));
1084         item.SetWindowXPos(windowX);
1085         item.SetWindowYPos(windowY);
1086         point->UpdatePointerItem(id, item);
1087     }
1088 }
1089 
GetTouchTypeFromPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1090 TouchType GetTouchTypeFromPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1091 {
1092     CHECK_NULL_RETURN(pointerEvent, TouchType::UNKNOWN);
1093     auto pointerAction = pointerEvent->GetPointerAction();
1094     return ConvertTouchEventType(pointerAction);
1095 }
1096 
GetAxisActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1097 AxisAction GetAxisActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1098 {
1099     CHECK_NULL_RETURN(pointerEvent, AxisAction::NONE);
1100     auto pointerAction = pointerEvent->GetPointerAction();
1101     return ConvertAxisEventAction(pointerAction);
1102 }
1103 
GetMouseActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)1104 MouseAction GetMouseActionFromPointerEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
1105 {
1106     CHECK_NULL_RETURN(pointerEvent, MouseAction::NONE);
1107     auto pointerAction = pointerEvent->GetPointerAction();
1108     return ConvertMouseEventAction(pointerAction);
1109 }
1110 } // namespace OHOS::Ace::Platform
1111