• 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/ace_view_ohos.h"
17 
18 #include "adapter/ohos/entrance/ace_container.h"
19 #include "adapter/ohos/entrance/mmi_event_convertor.h"
20 #include "base/log/dump_log.h"
21 #include "core/event/event_info_convertor.h"
22 
23 namespace OHOS::Ace::Platform {
24 namespace {
25 
26 constexpr int32_t ROTATION_DIVISOR = 64;
27 
IsMMIMouseScrollBegin(const AxisEvent & event)28 bool IsMMIMouseScrollBegin(const AxisEvent& event)
29 {
30     if (event.action != AxisAction::BEGIN ||
31         event.sourceType != SourceType::MOUSE ||
32         event.sourceTool != SourceTool::MOUSE) {
33         return false;
34     }
35     return !(NearZero(event.horizontalAxis) && NearZero(event.verticalAxis));
36 }
37 } // namespace
38 
CreateView(int32_t instanceId,bool useCurrentEventRunner,bool usePlatformThread)39 RefPtr<AceViewOhos> AceViewOhos::CreateView(int32_t instanceId, bool useCurrentEventRunner, bool usePlatformThread)
40 {
41     return AceType::MakeRefPtr<AceViewOhos>(
42         instanceId, ThreadModelImpl::CreateThreadModel(
43                         useCurrentEventRunner, !usePlatformThread, !SystemProperties::GetRosenBackendEnabled()));
44 }
45 
AceViewOhos(int32_t id,std::unique_ptr<ThreadModelImpl> threadModelImpl)46 AceViewOhos::AceViewOhos(int32_t id, std::unique_ptr<ThreadModelImpl> threadModelImpl)
47     : instanceId_(id), threadModelImpl_(std::move(threadModelImpl))
48 {}
49 
SurfaceCreated(const RefPtr<AceViewOhos> & view,OHOS::sptr<OHOS::Rosen::Window> window)50 void AceViewOhos::SurfaceCreated(const RefPtr<AceViewOhos>& view, OHOS::sptr<OHOS::Rosen::Window> window)
51 {
52     CHECK_NULL_VOID(window);
53     CHECK_NULL_VOID(view);
54 }
55 
ChangeViewSize(const RefPtr<AceViewOhos> & view,int32_t width,int32_t height)56 void AceViewOhos::ChangeViewSize(const RefPtr<AceViewOhos>& view, int32_t width, int32_t height)
57 {
58     CHECK_NULL_VOID(view);
59     view->ChangeSize(width, height);
60 }
61 
SurfaceChanged(const RefPtr<AceViewOhos> & view,int32_t width,int32_t height,int32_t orientation,WindowSizeChangeReason type,const std::shared_ptr<Rosen::RSTransaction> & rsTransaction)62 void AceViewOhos::SurfaceChanged(const RefPtr<AceViewOhos>& view, int32_t width, int32_t height, int32_t orientation,
63     WindowSizeChangeReason type, const std::shared_ptr<Rosen::RSTransaction>& rsTransaction)
64 {
65     CHECK_NULL_VOID(view);
66 
67     view->NotifySurfaceChanged(width, height, type, rsTransaction);
68 
69     auto instanceId = view->GetInstanceId();
70     auto container = Platform::AceContainer::GetContainer(instanceId);
71     if (container) {
72         auto pipelineContext = container->GetPipelineContext();
73         CHECK_NULL_VOID(pipelineContext);
74         pipelineContext->HideOverlays();
75     }
76 }
77 
SurfacePositionChanged(const RefPtr<AceViewOhos> & view,int32_t posX,int32_t posY)78 void AceViewOhos::SurfacePositionChanged(const RefPtr<AceViewOhos>& view, int32_t posX, int32_t posY)
79 {
80     CHECK_NULL_VOID(view);
81     view->NotifySurfacePositionChanged(posX, posY);
82 }
83 
SetViewportMetrics(const RefPtr<AceViewOhos> & view,const ViewportConfig & config)84 void AceViewOhos::SetViewportMetrics(const RefPtr<AceViewOhos>& view, const ViewportConfig& config)
85 {
86     CHECK_NULL_VOID(view);
87     view->NotifyDensityChanged(config.Density());
88 }
89 
TransformHintChanged(const RefPtr<AceViewOhos> & view,uint32_t transform)90 void AceViewOhos::TransformHintChanged(const RefPtr<AceViewOhos>& view, uint32_t transform)
91 {
92     CHECK_NULL_VOID(view);
93     view->NotifyTransformHintChanged(transform);
94 }
95 
IsAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)96 bool IsAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
97 {
98     return pointerEvent->GetAxes() != 0;
99 }
100 
HandleMouseEvent(const RefPtr<AceViewOhos> & view,const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,int32_t pointerAction,bool isInjected,int32_t toolType)101 void AceViewOhos::HandleMouseEvent(const RefPtr<AceViewOhos>& view,
102     const std::shared_ptr<MMI::PointerEvent>& pointerEvent, const RefPtr<OHOS::Ace::NG::FrameNode>& node,
103     int32_t pointerAction, bool isInjected, int32_t toolType)
104 {
105     if ((pointerAction >= MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN &&
106             pointerAction <= MMI::PointerEvent::POINTER_ACTION_AXIS_END) ||
107         (pointerAction >= MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN &&
108             pointerAction <= MMI::PointerEvent::POINTER_ACTION_ROTATE_END) ||
109         (toolType == MMI::PointerEvent::TOOL_TYPE_TOUCHPAD &&
110             pointerAction == MMI::PointerEvent::POINTER_ACTION_CANCEL) ||
111         (pointerAction == MMI::PointerEvent::POINTER_ACTION_CANCEL && IsAxisEvent(pointerEvent))) {
112         view->ProcessAxisEvent(pointerEvent, node, isInjected);
113     } else {
114         view->ProcessDragEvent(pointerEvent, node);
115         view->ProcessMouseEvent(pointerEvent, node, isInjected);
116     }
117 }
118 
DispatchTouchEvent(const RefPtr<AceViewOhos> & view,const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,const std::function<void ()> & callback,bool isInjected)119 void AceViewOhos::DispatchTouchEvent(const RefPtr<AceViewOhos>& view,
120     const std::shared_ptr<MMI::PointerEvent>& pointerEvent, const RefPtr<OHOS::Ace::NG::FrameNode>& node,
121     const std::function<void()>& callback, bool isInjected)
122 {
123     if (!pointerEvent) {
124         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchTouchEvent pointerEvent is null return.");
125         return;
126     }
127     if (!view) {
128         MMI::InputManager::GetInstance()->MarkProcessed(
129             pointerEvent->GetId(), pointerEvent->GetActionTime(), pointerEvent->IsMarkEnabled());
130         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchTouchEvent eventId:%{public}d aceView is null return.",
131             pointerEvent->GetId());
132         return;
133     }
134     auto instanceId = view->GetInstanceId();
135     LogPointInfo(pointerEvent, instanceId);
136     DispatchEventToPerf(pointerEvent);
137     int32_t pointerAction = pointerEvent->GetPointerAction();
138     auto container = Platform::AceContainer::GetContainer(instanceId);
139     if (!container) {
140         MMI::InputManager::GetInstance()->MarkProcessed(
141             pointerEvent->GetId(), pointerEvent->GetActionTime(), pointerEvent->IsMarkEnabled());
142         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchTouchEvent eventId:%{public}d container is null return.",
143             pointerEvent->GetId());
144         return;
145     }
146     container->SetCurPointerEvent(pointerEvent);
147     if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_JOYSTICK) {
148         view->ProcessFocusAxisEvent(pointerEvent);
149     }
150     if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_MOUSE) {
151         int32_t toolType = MMI::PointerEvent::TOOL_TYPE_MOUSE;
152         if (!GetPointerEventToolType(pointerEvent, toolType)) {
153             return;
154         }
155         // mouse event
156         HandleMouseEvent(view, pointerEvent, node, pointerAction, isInjected, toolType);
157     } else if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_CROWN) {
158         view->ProcessDigitalCrownEvent(pointerEvent, isInjected);
159     } else {
160         // touch event
161         view->ProcessDragEvent(pointerEvent, node);
162         view->ProcessTouchEvent(pointerEvent, node, callback, isInjected);
163     }
164 }
165 
DispatchEventToPerf(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)166 void AceViewOhos::DispatchEventToPerf(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
167 {
168     CHECK_NULL_VOID(pointerEvent);
169     static bool isFirstMove = false;
170     PerfMonitor* pMonitor = PerfMonitor::GetPerfMonitor();
171     if (pMonitor == nullptr) {
172         return;
173     }
174     uint64_t inputTime = pointerEvent->GetSensorInputTime() * US_TO_MS;
175     if (inputTime <= 0) {
176         inputTime = pointerEvent->GetActionTime() * US_TO_MS;
177     }
178     if (inputTime <= 0) {
179         return;
180     }
181     PerfActionType inputType = UNKNOWN_ACTION;
182     PerfSourceType sourceType = UNKNOWN_SOURCE;
183     if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_MOUSE) {
184         sourceType = PERF_MOUSE_EVENT;
185     } else if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_TOUCHSCREEN) {
186         sourceType = PERF_TOUCH_EVENT;
187     } else if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_TOUCHPAD) {
188         sourceType = PERF_TOUCH_PAD;
189     } else if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_JOYSTICK) {
190         sourceType = PERF_JOY_STICK;
191     }
192     int32_t pointerAction = pointerEvent->GetPointerAction();
193     if (pointerAction == MMI::PointerEvent::POINTER_ACTION_DOWN
194         || pointerAction == MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN
195         || pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN
196         || pointerAction == MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN) {
197         inputType = LAST_DOWN;
198         isFirstMove = true;
199     } else if (pointerAction == MMI::PointerEvent::POINTER_ACTION_UP
200         || pointerAction == MMI::PointerEvent::POINTER_ACTION_BUTTON_UP
201         || pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_END
202         || pointerAction == MMI::PointerEvent::POINTER_ACTION_ROTATE_END) {
203         inputType = LAST_UP;
204         isFirstMove = false;
205     } else if (isFirstMove && (pointerAction == MMI::PointerEvent::POINTER_ACTION_MOVE
206         || pointerAction == MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE
207         || pointerAction == MMI::PointerEvent::POINTER_ACTION_ROTATE_UPDATE)) {
208         inputType = FIRST_MOVE;
209         isFirstMove = false;
210     }
211     pMonitor->RecordInputEvent(inputType, sourceType, inputTime);
212 }
213 
DispatchEventToPerf(const std::shared_ptr<MMI::KeyEvent> & keyEvent)214 void AceViewOhos::DispatchEventToPerf(const std::shared_ptr<MMI::KeyEvent>& keyEvent)
215 {
216     CHECK_NULL_VOID(keyEvent);
217     int32_t keyCode = keyEvent->GetKeyCode();
218     if (keyCode != MMI::KeyEvent::KEYCODE_VOLUME_DOWN
219         && keyCode != MMI::KeyEvent::KEYCODE_VOLUME_UP
220         && keyCode != MMI::KeyEvent::KEYCODE_POWER
221         && keyCode != MMI::KeyEvent::KEYCODE_META_LEFT
222         && keyCode != MMI::KeyEvent::KEYCODE_ESCAPE) {
223         return;
224     }
225     PerfMonitor* pMonitor = PerfMonitor::GetPerfMonitor();
226     if (pMonitor == nullptr) {
227         return;
228     }
229     PerfActionType inputType = UNKNOWN_ACTION;
230     int32_t action = keyEvent->GetKeyAction();
231     if (action == MMI::KeyEvent::KEY_ACTION_UP) {
232         inputType = LAST_UP;
233     } else if (action == MMI::KeyEvent::KEY_ACTION_DOWN) {
234         inputType = LAST_DOWN;
235     }
236     PerfSourceType sourceType = PERF_KEY_EVENT;
237     auto keyItem = keyEvent->GetKeyItem();
238     if (keyItem.has_value()) {
239         int64_t inputTime = keyItem->GetDownTime() * US_TO_MS;
240         pMonitor->RecordInputEvent(inputType, sourceType, inputTime);
241     } else {
242         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchEventToPerf keyItem is invalid.");
243     }
244 }
245 
DispatchKeyEvent(const RefPtr<AceViewOhos> & view,const std::shared_ptr<MMI::KeyEvent> & keyEvent,bool isPreIme)246 bool AceViewOhos::DispatchKeyEvent(const RefPtr<AceViewOhos>& view,
247     const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool isPreIme)
248 {
249     CHECK_NULL_RETURN(view, false);
250     DispatchEventToPerf(keyEvent);
251     return view->ProcessKeyEvent(keyEvent, isPreIme);
252 }
253 
DispatchRotationEvent(const RefPtr<AceViewOhos> & view,float rotationValue)254 bool AceViewOhos::DispatchRotationEvent(const RefPtr<AceViewOhos>& view, float rotationValue)
255 {
256     CHECK_NULL_RETURN(view, false);
257     return view->ProcessRotationEvent(rotationValue);
258 }
259 
RegisterTouchEventCallback(TouchEventCallback && callback)260 void AceViewOhos::RegisterTouchEventCallback(TouchEventCallback&& callback)
261 {
262     ACE_DCHECK(callback);
263     touchEventCallback_ = std::move(callback);
264 }
265 
RegisterDragEventCallback(DragEventCallBack && callback)266 void AceViewOhos::RegisterDragEventCallback(DragEventCallBack&& callback)
267 {
268     ACE_DCHECK(callback);
269     dragEventCallback_ = std::move(callback);
270 }
271 
RegisterKeyEventCallback(KeyEventCallback && callback)272 void AceViewOhos::RegisterKeyEventCallback(KeyEventCallback&& callback)
273 {
274     ACE_DCHECK(callback);
275     keyEventCallback_ = std::move(callback);
276 }
277 
RegisterNonPointerEventCallback(NonPointerEventCallback && callback)278 void AceViewOhos::RegisterNonPointerEventCallback(NonPointerEventCallback&& callback)
279 {
280     ACE_DCHECK(callback);
281     nonPointerEventCallback_ = std::move(callback);
282 }
283 
RegisterCrownEventCallback(CrownEventCallback && callback)284 void AceViewOhos::RegisterCrownEventCallback(CrownEventCallback&& callback)
285 {
286     ACE_DCHECK(callback);
287     crownEventCallback_ = std::move(callback);
288 }
289 
RegisterMouseEventCallback(MouseEventCallback && callback)290 void AceViewOhos::RegisterMouseEventCallback(MouseEventCallback&& callback)
291 {
292     ACE_DCHECK(callback);
293     mouseEventCallback_ = std::move(callback);
294 }
295 
RegisterAxisEventCallback(AxisEventCallback && callback)296 void AceViewOhos::RegisterAxisEventCallback(AxisEventCallback&& callback)
297 {
298     ACE_DCHECK(callback);
299     axisEventCallback_ = std::move(callback);
300 }
301 
RegisterRotationEventCallback(RotationEventCallBack && callback)302 void AceViewOhos::RegisterRotationEventCallback(RotationEventCallBack&& callback)
303 {
304     ACE_DCHECK(callback);
305     rotationEventCallBack_ = std::move(callback);
306 }
307 
Launch()308 void AceViewOhos::Launch()
309 {
310 }
311 
ProcessTouchEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,const std::function<void ()> & callback,bool isInjected)312 void AceViewOhos::ProcessTouchEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
313     const RefPtr<OHOS::Ace::NG::FrameNode>& node, const std::function<void()>& callback, bool isInjected)
314 {
315     if (!pointerEvent) {
316         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "ProcessTouchEvent pointerEvent is null return.");
317         return;
318     }
319     TouchEvent touchPoint = ConvertTouchEvent(pointerEvent);
320     touchPoint.SetIsInjected(isInjected);
321     if (SystemProperties::GetDebugEnabled()) {
322         ACE_SCOPED_TRACE("ProcessTouchEvent pointX=%f pointY=%f type=%d timeStamp=%lld id=%d eventId=%d", touchPoint.x,
323             touchPoint.y, (int)touchPoint.type, touchPoint.time.time_since_epoch().count(), touchPoint.id,
324             touchPoint.touchEventId);
325     }
326     auto markProcess = [touchPoint, finallyCallback = callback, enabled = pointerEvent->IsMarkEnabled()]() {
327         MMI::InputManager::GetInstance()->MarkProcessed(touchPoint.touchEventId,
328             std::chrono::duration_cast<std::chrono::microseconds>(touchPoint.time.time_since_epoch()).count(),
329             enabled);
330         if (finallyCallback) {
331             finallyCallback();
332         }
333     };
334     if (touchPoint.type == TouchType::UNKNOWN) {
335         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "ProcessTouchEvent pointerEvent action is unknown return.");
336         markProcess();
337         return;
338     }
339     CHECK_NULL_VOID(touchEventCallback_);
340     touchEventCallback_(touchPoint, markProcess, node);
341 }
342 
ProcessDragEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node)343 void AceViewOhos::ProcessDragEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
344     const RefPtr<OHOS::Ace::NG::FrameNode>& node)
345 {
346     DragEventAction action;
347     DragPointerEvent event;
348     ConvertPointerEvent(pointerEvent, event);
349     CHECK_NULL_VOID(dragEventCallback_);
350     int32_t orgAction = pointerEvent->GetPointerAction();
351     switch (orgAction) {
352         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_MOVE: {
353             action = DragEventAction::DRAG_EVENT_MOVE;
354             dragEventCallback_(event, action, node);
355             break;
356         }
357         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_UP: {
358             action = DragEventAction::DRAG_EVENT_END;
359             dragEventCallback_(event, action, node);
360             break;
361         }
362         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_IN_WINDOW: {
363             action = DragEventAction::DRAG_EVENT_START;
364             dragEventCallback_(event, action, node);
365             break;
366         }
367         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_OUT_WINDOW: {
368             action = DragEventAction::DRAG_EVENT_OUT;
369             dragEventCallback_(event, action, node);
370             break;
371         }
372         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_CANCEL: {
373             action = DragEventAction::DRAG_EVENT_PULL_CANCEL;
374             dragEventCallback_(event, action, node);
375             break;
376         }
377         case OHOS::MMI::PointerEvent::POINTER_ACTION_PULL_THROW: {
378             action = DragEventAction::DRAG_EVENT_PULL_THROW;
379             dragEventCallback_(event, action, node);
380             break;
381         }
382         default:
383             break;
384     }
385 }
386 
ProcessDragEvent(int32_t x,int32_t y,const DragEventAction & action,const RefPtr<OHOS::Ace::NG::FrameNode> & node)387 void AceViewOhos::ProcessDragEvent(int32_t x, int32_t y, const DragEventAction& action,
388     const RefPtr<OHOS::Ace::NG::FrameNode>& node)
389 {
390     CHECK_NULL_VOID(dragEventCallback_);
391     dragEventCallback_(DragPointerEvent(x, y), action, node);
392 }
393 
ProcessMouseEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,bool isInjected)394 void AceViewOhos::ProcessMouseEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
395     const RefPtr<OHOS::Ace::NG::FrameNode>& node, bool isInjected)
396 {
397     MouseEvent event;
398     bool markEnabled = true;
399     if (pointerEvent) {
400         auto container = Platform::AceContainer::GetContainer(instanceId_);
401         CHECK_NULL_VOID(container);
402         ConvertMouseEvent(pointerEvent, event, container->IsSceneBoardWindow());
403         markEnabled = pointerEvent->IsMarkEnabled();
404     }
405     event.isInjected = isInjected;
406     if (SystemProperties::GetDebugEnabled()) {
407         ACE_SCOPED_TRACE("ProcessMouseEvent pointX=%f pointY=%f type=%d timeStamp=%lld id=%d eventId=%d", event.x,
408             event.y, (int)event.action, event.time.time_since_epoch().count(), event.id, event.touchEventId);
409     }
410     auto markProcess = [event, markEnabled]() {
411         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
412             std::chrono::duration_cast<std::chrono::microseconds>(event.time.time_since_epoch()).count(),
413             markEnabled);
414     };
415     if (NG::EventInfoConvertor::IfNeedMouseTransform() &&
416         ProcessMouseEventWithTouch(pointerEvent, event, node, markProcess)) {
417         return;
418     }
419     CHECK_NULL_VOID(mouseEventCallback_);
420     mouseEventCallback_(event, markProcess, node);
421 }
422 
ProcessMouseEventWithTouch(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const MouseEvent & event,const RefPtr<OHOS::Ace::NG::FrameNode> & node,const std::function<void ()> & markProcess)423 bool AceViewOhos::ProcessMouseEventWithTouch(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
424     const MouseEvent& event, const RefPtr<OHOS::Ace::NG::FrameNode>& node, const std::function<void()>& markProcess)
425 {
426     if (event.button == MouseButton::LEFT_BUTTON) {
427         // Only process PRESS/MOVE/RELEASE/CANCEL event
428         switch (pointerEvent->GetPointerAction()) {
429             case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_DOWN:
430             case OHOS::MMI::PointerEvent::POINTER_ACTION_BUTTON_UP:
431             case OHOS::MMI::PointerEvent::POINTER_ACTION_CANCEL:
432             case OHOS::MMI::PointerEvent::POINTER_ACTION_MOVE:
433                 break;
434             default:
435                 return false;
436         }
437         TouchEvent touchEvent = event.CreateTouchPoint();
438         touchEvent.SetSourceType(SourceType::TOUCH);
439         CHECK_NULL_RETURN(touchEventCallback_, false);
440         touchEventCallback_(touchEvent, markProcess, node);
441         return true;
442     } else {
443         return false;
444     }
445 }
446 
ProcessAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,bool isInjected)447 void AceViewOhos::ProcessAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
448     const RefPtr<OHOS::Ace::NG::FrameNode>& node, bool isInjected)
449 {
450     if (NG::EventInfoConvertor::IfNeedMouseTransform()) {
451         if (ProcessAxisEventWithTouch(pointerEvent, node, isInjected)) {
452             return;
453         }
454     }
455 
456     CHECK_NULL_VOID(axisEventCallback_);
457     AxisEvent event;
458     event.isInjected = isInjected;
459     if (!pointerEvent) {
460         axisEventCallback_(event, nullptr, node);
461         return;
462     }
463 
464     ConvertAxisEvent(pointerEvent, event);
465     auto markProcess = [event, enabled = pointerEvent->IsMarkEnabled()]() {
466         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
467             std::chrono::duration_cast<std::chrono::microseconds>(event.time.time_since_epoch()).count(),
468             enabled);
469     };
470 
471     /* The first step of axis event of mouse is equivalent to touch event START + UPDATE.
472      * Create a fake UPDATE event here to adapt to axis event of mouse.
473      * e.g {START, END} turns into {START, UPDATE, END}.
474      */
475     if (IsMMIMouseScrollBegin(event)) {
476         auto fakeAxisStart = std::make_shared<MMI::PointerEvent>(*pointerEvent);
477         fakeAxisStart->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL, 0.0);
478         fakeAxisStart->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL, 0.0);
479         ConvertAxisEvent(fakeAxisStart, event);
480         axisEventCallback_(event, nullptr, node);
481 
482         auto fakeAxisUpdate = std::make_shared<MMI::PointerEvent>(*pointerEvent);
483         fakeAxisUpdate->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE);
484         ConvertAxisEvent(fakeAxisUpdate, event);
485     }
486     axisEventCallback_(event, markProcess, node);
487 }
488 
ProcessAxisEventWithTouch(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,bool isInjected)489 bool AceViewOhos::ProcessAxisEventWithTouch(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
490     const RefPtr<OHOS::Ace::NG::FrameNode>& node, bool isInjected)
491 {
492     if (pointerEvent->HasAxis(MMI::PointerEvent::AxisType::AXIS_TYPE_ROTATE)) {
493         return false;
494     }
495     if (pointerEvent->HasAxis(MMI::PointerEvent::AxisType::AXIS_TYPE_PINCH)) {
496         return false;
497     }
498     TouchEvent event;
499     event.isInjected = isInjected;
500 
501     if (pointerEvent->GetPointerAction() == MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN) {
502         // The first step of axis event of mouse is equivalent to touch event START + UPDATE.
503         // Create a fake UPDATE event here to adapt to axis event of mouse.
504         // e.g {START, END} turns into {START, UPDATE, END}.
505         auto fakeAxisRawEvt = std::make_shared<MMI::PointerEvent>(*pointerEvent);
506         double axisScrollVertBak = fakeAxisRawEvt->GetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL);
507         double axisScrollHoriBak =
508             fakeAxisRawEvt->GetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL);
509         fakeAxisRawEvt->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL, 0.0);
510         fakeAxisRawEvt->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL, 0.0);
511         ConvertAxisEventToTouchEvent(fakeAxisRawEvt, event, axisFakePntEvt_);
512         // fakeAxisRawEvt action will be update lately, use original pointerEvent.
513         event.SetPointerEvent(pointerEvent);
514         touchEventCallback_(event, nullptr, node);
515         fakeAxisRawEvt->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL, axisScrollVertBak);
516         fakeAxisRawEvt->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL, axisScrollHoriBak);
517         fakeAxisRawEvt->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE);
518         ConvertAxisEventToTouchEvent(fakeAxisRawEvt, event, axisFakePntEvt_);
519     } else {
520         ConvertAxisEventToTouchEvent(pointerEvent, event, axisFakePntEvt_);
521     }
522 
523     auto markProcess = [event, enabled = pointerEvent->IsMarkEnabled()]() {
524         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
525             std::chrono::duration_cast<std::chrono::microseconds>(event.time.time_since_epoch()).count(), enabled);
526     };
527     CHECK_NULL_RETURN(touchEventCallback_, false);
528     touchEventCallback_(event, markProcess, node);
529     return true;
530 }
531 
ProcessKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,bool isPreIme)532 bool AceViewOhos::ProcessKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool isPreIme)
533 {
534     CHECK_NULL_RETURN(nonPointerEventCallback_, false);
535     KeyEvent event;
536     ConvertKeyEvent(keyEvent, event);
537     event.isPreIme = isPreIme;
538     return nonPointerEventCallback_(event, nullptr);
539 }
540 
ProcessFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)541 bool AceViewOhos::ProcessFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
542 {
543     CHECK_NULL_RETURN(nonPointerEventCallback_, false);
544     NG::FocusAxisEvent event;
545     ConvertFocusAxisEvent(pointerEvent, event);
546     auto markProcess = [event, enabled = pointerEvent->IsMarkEnabled()]() {
547         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
548             std::chrono::duration_cast<std::chrono::microseconds>(event.time.time_since_epoch()).count(),
549             enabled);
550     };
551     return nonPointerEventCallback_(event, std::move(markProcess));
552 }
553 
ProcessDigitalCrownEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,bool isInjected)554 void AceViewOhos::ProcessDigitalCrownEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
555     bool isInjected)
556 {
557     CrownEvent event;
558     ConvertCrownEvent(pointerEvent, event);
559     event.isInjected = isInjected;
560     TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "crown event: action:%{public}d, AV:%{public}f, degree:%{public}f",
561         event.action, event.angularVelocity, event.degree);
562 
563     auto markProcess = [event, enabled = pointerEvent->IsMarkEnabled()]() {
564         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
565             std::chrono::duration_cast<std::chrono::microseconds>(event.timeStamp.time_since_epoch()).count(),
566             enabled);
567     };
568     CHECK_NULL_VOID(crownEventCallback_);
569     crownEventCallback_(event, markProcess);
570 }
571 
GetNativeWindowById(uint64_t textureId)572 const void* AceViewOhos::GetNativeWindowById(uint64_t textureId)
573 {
574     return nullptr;
575 }
576 
ProcessRotationEvent(float rotationValue)577 bool AceViewOhos::ProcessRotationEvent(float rotationValue)
578 {
579     CHECK_NULL_RETURN(rotationEventCallBack_, false);
580     RotationEvent event { .value = rotationValue * ROTATION_DIVISOR };
581     return rotationEventCallBack_(event);
582 }
583 
Dump(const std::vector<std::string> & params)584 bool AceViewOhos::Dump(const std::vector<std::string>& params)
585 {
586     if (params.empty() || params[0] != "-drawcmd") {
587         return false;
588     }
589     if (DumpLog::GetInstance().GetDumpFile()) {
590         DumpLog::GetInstance().AddDesc("Dump draw command not support on this version.");
591         DumpLog::GetInstance().Print(0, "Info:", 0);
592         return true;
593     }
594     return false;
595 }
596 
GetBackgroundColor()597 uint32_t AceViewOhos::GetBackgroundColor()
598 {
599     return Color::WHITE.GetValue();
600 }
601 
602 } // namespace OHOS::Ace::Platform
603