• 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 
22 namespace OHOS::Ace::Platform {
23 namespace {
24 
25 constexpr int32_t ROTATION_DIVISOR = 64;
26 
IsMMIMouseScrollBegin(const AxisEvent & event)27 bool IsMMIMouseScrollBegin(const AxisEvent& event)
28 {
29     if (event.action != AxisAction::BEGIN ||
30         event.sourceType != SourceType::MOUSE ||
31         event.sourceTool != SourceTool::MOUSE) {
32         return false;
33     }
34     return !(NearZero(event.horizontalAxis) && NearZero(event.verticalAxis));
35 }
36 } // namespace
37 
CreateView(int32_t instanceId,bool useCurrentEventRunner,bool usePlatformThread)38 RefPtr<AceViewOhos> AceViewOhos::CreateView(int32_t instanceId, bool useCurrentEventRunner, bool usePlatformThread)
39 {
40     return AceType::MakeRefPtr<AceViewOhos>(
41         instanceId, ThreadModelImpl::CreateThreadModel(
42                         useCurrentEventRunner, !usePlatformThread, !SystemProperties::GetRosenBackendEnabled()));
43 }
44 
AceViewOhos(int32_t id,std::unique_ptr<ThreadModelImpl> threadModelImpl)45 AceViewOhos::AceViewOhos(int32_t id, std::unique_ptr<ThreadModelImpl> threadModelImpl)
46     : instanceId_(id), threadModelImpl_(std::move(threadModelImpl))
47 {}
48 
SurfaceCreated(const RefPtr<AceViewOhos> & view,OHOS::sptr<OHOS::Rosen::Window> window)49 void AceViewOhos::SurfaceCreated(const RefPtr<AceViewOhos>& view, OHOS::sptr<OHOS::Rosen::Window> window)
50 {
51     CHECK_NULL_VOID(window);
52     CHECK_NULL_VOID(view);
53 }
54 
ChangeViewSize(const RefPtr<AceViewOhos> & view,int32_t width,int32_t height)55 void AceViewOhos::ChangeViewSize(const RefPtr<AceViewOhos>& view, int32_t width, int32_t height)
56 {
57     CHECK_NULL_VOID(view);
58     view->ChangeSize(width, height);
59 }
60 
SurfaceChanged(const RefPtr<AceViewOhos> & view,int32_t width,int32_t height,int32_t orientation,WindowSizeChangeReason type,const std::shared_ptr<Rosen::RSTransaction> & rsTransaction)61 void AceViewOhos::SurfaceChanged(const RefPtr<AceViewOhos>& view, int32_t width, int32_t height, int32_t orientation,
62     WindowSizeChangeReason type, const std::shared_ptr<Rosen::RSTransaction>& rsTransaction)
63 {
64     CHECK_NULL_VOID(view);
65 
66     view->NotifySurfaceChanged(width, height, type, rsTransaction);
67 
68     auto instanceId = view->GetInstanceId();
69     auto container = Platform::AceContainer::GetContainer(instanceId);
70     if (container) {
71         auto pipelineContext = container->GetPipelineContext();
72         CHECK_NULL_VOID(pipelineContext);
73         pipelineContext->HideOverlays();
74     }
75 }
76 
SurfacePositionChanged(const RefPtr<AceViewOhos> & view,int32_t posX,int32_t posY)77 void AceViewOhos::SurfacePositionChanged(const RefPtr<AceViewOhos>& view, int32_t posX, int32_t posY)
78 {
79     CHECK_NULL_VOID(view);
80     view->NotifySurfacePositionChanged(posX, posY);
81 }
82 
SetViewportMetrics(const RefPtr<AceViewOhos> & view,const ViewportConfig & config)83 void AceViewOhos::SetViewportMetrics(const RefPtr<AceViewOhos>& view, const ViewportConfig& config)
84 {
85     CHECK_NULL_VOID(view);
86     view->NotifyDensityChanged(config.Density());
87 }
88 
TransformHintChanged(const RefPtr<AceViewOhos> & view,uint32_t transform)89 void AceViewOhos::TransformHintChanged(const RefPtr<AceViewOhos>& view, uint32_t transform)
90 {
91     CHECK_NULL_VOID(view);
92     view->NotifyTransformHintChanged(transform);
93 }
94 
IsAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)95 bool IsAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
96 {
97     return pointerEvent->GetAxes() != 0;
98 }
99 
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)100 void AceViewOhos::HandleMouseEvent(const RefPtr<AceViewOhos>& view,
101     const std::shared_ptr<MMI::PointerEvent>& pointerEvent, const RefPtr<OHOS::Ace::NG::FrameNode>& node,
102     int32_t pointerAction, bool isInjected, int32_t toolType)
103 {
104     if ((pointerAction >= MMI::PointerEvent::POINTER_ACTION_AXIS_BEGIN &&
105             pointerAction <= MMI::PointerEvent::POINTER_ACTION_AXIS_END) ||
106         (pointerAction >= MMI::PointerEvent::POINTER_ACTION_ROTATE_BEGIN &&
107             pointerAction <= MMI::PointerEvent::POINTER_ACTION_ROTATE_END) ||
108         (toolType == MMI::PointerEvent::TOOL_TYPE_TOUCHPAD &&
109             pointerAction == MMI::PointerEvent::POINTER_ACTION_CANCEL) ||
110         (pointerAction == MMI::PointerEvent::POINTER_ACTION_CANCEL && IsAxisEvent(pointerEvent))) {
111         view->ProcessAxisEvent(pointerEvent, node, isInjected);
112     } else {
113         view->ProcessDragEvent(pointerEvent, node);
114         view->ProcessMouseEvent(pointerEvent, node, isInjected);
115     }
116 }
117 
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)118 void AceViewOhos::DispatchTouchEvent(const RefPtr<AceViewOhos>& view,
119     const std::shared_ptr<MMI::PointerEvent>& pointerEvent, const RefPtr<OHOS::Ace::NG::FrameNode>& node,
120     const std::function<void()>& callback, bool isInjected)
121 {
122     if (!pointerEvent) {
123         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchTouchEvent pointerEvent is null return.");
124         return;
125     }
126     if (!view) {
127         MMI::InputManager::GetInstance()->MarkProcessed(
128             pointerEvent->GetId(), pointerEvent->GetActionTime(), pointerEvent->IsMarkEnabled());
129         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchTouchEvent eventId:%{public}d aceView is null return.",
130             pointerEvent->GetId());
131         return;
132     }
133     auto instanceId = view->GetInstanceId();
134     LogPointInfo(pointerEvent, instanceId);
135     DispatchEventToPerf(pointerEvent);
136     int32_t pointerAction = pointerEvent->GetPointerAction();
137     auto container = Platform::AceContainer::GetContainer(instanceId);
138     if (!container) {
139         MMI::InputManager::GetInstance()->MarkProcessed(
140             pointerEvent->GetId(), pointerEvent->GetActionTime(), pointerEvent->IsMarkEnabled());
141         TAG_LOGE(AceLogTag::ACE_INPUTTRACKING, "DispatchTouchEvent eventId:%{public}d container is null return.",
142             pointerEvent->GetId());
143         return;
144     }
145     container->SetCurPointerEvent(pointerEvent);
146     if (pointerEvent->GetSourceType() == MMI::PointerEvent::SOURCE_TYPE_JOYSTICK) {
147         view->ProcessFocusAxisEvent(pointerEvent);
148     }
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         default:
378             break;
379     }
380 }
381 
ProcessDragEvent(int32_t x,int32_t y,const DragEventAction & action,const RefPtr<OHOS::Ace::NG::FrameNode> & node)382 void AceViewOhos::ProcessDragEvent(int32_t x, int32_t y, const DragEventAction& action,
383     const RefPtr<OHOS::Ace::NG::FrameNode>& node)
384 {
385     CHECK_NULL_VOID(dragEventCallback_);
386     dragEventCallback_(DragPointerEvent(x, y), action, node);
387 }
388 
ProcessMouseEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,bool isInjected)389 void AceViewOhos::ProcessMouseEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
390     const RefPtr<OHOS::Ace::NG::FrameNode>& node, bool isInjected)
391 {
392     MouseEvent event;
393     bool markEnabled = true;
394     if (pointerEvent) {
395         auto container = Platform::AceContainer::GetContainer(instanceId_);
396         CHECK_NULL_VOID(container);
397         ConvertMouseEvent(pointerEvent, event, container->IsScenceBoardWindow());
398         markEnabled = pointerEvent->IsMarkEnabled();
399     }
400     event.isInjected = isInjected;
401     if (SystemProperties::GetDebugEnabled()) {
402         ACE_SCOPED_TRACE("ProcessMouseEvent pointX=%f pointY=%f type=%d timeStamp=%lld id=%d eventId=%d", event.x,
403             event.y, (int)event.action, event.time.time_since_epoch().count(), event.id, event.touchEventId);
404     }
405     auto markProcess = [event, markEnabled]() {
406         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
407             std::chrono::duration_cast<std::chrono::microseconds>(event.time.time_since_epoch()).count(),
408             markEnabled);
409     };
410 
411     CHECK_NULL_VOID(mouseEventCallback_);
412     mouseEventCallback_(event, markProcess, node);
413 }
414 
ProcessAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,const RefPtr<OHOS::Ace::NG::FrameNode> & node,bool isInjected)415 void AceViewOhos::ProcessAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
416     const RefPtr<OHOS::Ace::NG::FrameNode>& node, bool isInjected)
417 {
418     CHECK_NULL_VOID(axisEventCallback_);
419     AxisEvent event;
420     event.isInjected = isInjected;
421     if (!pointerEvent) {
422         axisEventCallback_(event, nullptr, node);
423         return;
424     }
425 
426     ConvertAxisEvent(pointerEvent, event);
427     auto markProcess = [event, enabled = pointerEvent->IsMarkEnabled()]() {
428         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
429             std::chrono::duration_cast<std::chrono::microseconds>(event.time.time_since_epoch()).count(),
430             enabled);
431     };
432 
433     /* The first step of axis event of mouse is equivalent to touch event START + UPDATE.
434      * Create a fake UPDATE event here to adapt to axis event of mouse.
435      * e.g {START, END} turns into {START, UPDATE, END}.
436      */
437     if (IsMMIMouseScrollBegin(event)) {
438         auto fakeAxisStart = std::make_shared<MMI::PointerEvent>(*pointerEvent);
439         fakeAxisStart->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_VERTICAL, 0.0);
440         fakeAxisStart->SetAxisValue(MMI::PointerEvent::AxisType::AXIS_TYPE_SCROLL_HORIZONTAL, 0.0);
441         ConvertAxisEvent(fakeAxisStart, event);
442         axisEventCallback_(event, nullptr, node);
443 
444         auto fakeAxisUpdate = std::make_shared<MMI::PointerEvent>(*pointerEvent);
445         fakeAxisUpdate->SetPointerAction(MMI::PointerEvent::POINTER_ACTION_AXIS_UPDATE);
446         ConvertAxisEvent(fakeAxisUpdate, event);
447     }
448     axisEventCallback_(event, markProcess, node);
449 }
450 
ProcessKeyEvent(const std::shared_ptr<MMI::KeyEvent> & keyEvent,bool isPreIme)451 bool AceViewOhos::ProcessKeyEvent(const std::shared_ptr<MMI::KeyEvent>& keyEvent, bool isPreIme)
452 {
453     CHECK_NULL_RETURN(nonPointerEventCallback_, false);
454     KeyEvent event;
455     ConvertKeyEvent(keyEvent, event);
456     event.isPreIme = isPreIme;
457     return nonPointerEventCallback_(event, nullptr);
458 }
459 
ProcessFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent)460 bool AceViewOhos::ProcessFocusAxisEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent)
461 {
462     CHECK_NULL_RETURN(nonPointerEventCallback_, false);
463     NG::FocusAxisEvent event;
464     ConvertFocusAxisEvent(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     return nonPointerEventCallback_(event, std::move(markProcess));
471 }
472 
ProcessDigitalCrownEvent(const std::shared_ptr<MMI::PointerEvent> & pointerEvent,bool isInjected)473 bool AceViewOhos::ProcessDigitalCrownEvent(const std::shared_ptr<MMI::PointerEvent>& pointerEvent,
474     bool isInjected)
475 {
476     CrownEvent event;
477     ConvertCrownEvent(pointerEvent, event);
478     event.isInjected = isInjected;
479     TAG_LOGI(AceLogTag::ACE_INPUTTRACKING, "crown event: action:%{public}d, AV:%{public}f, degree:%{public}f",
480         event.action, event.angularVelocity, event.degree);
481 
482     auto markProcess = [event, enabled = pointerEvent->IsMarkEnabled()]() {
483         MMI::InputManager::GetInstance()->MarkProcessed(event.touchEventId,
484             std::chrono::duration_cast<std::chrono::microseconds>(event.timeStamp.time_since_epoch()).count(),
485             enabled);
486     };
487     CHECK_NULL_RETURN(crownEventCallback_, false);
488     return crownEventCallback_(event, markProcess);
489 }
490 
GetNativeWindowById(uint64_t textureId)491 const void* AceViewOhos::GetNativeWindowById(uint64_t textureId)
492 {
493     return nullptr;
494 }
495 
ProcessRotationEvent(float rotationValue)496 bool AceViewOhos::ProcessRotationEvent(float rotationValue)
497 {
498     CHECK_NULL_RETURN(rotationEventCallBack_, false);
499     RotationEvent event { .value = rotationValue * ROTATION_DIVISOR };
500     return rotationEventCallBack_(event);
501 }
502 
Dump(const std::vector<std::string> & params)503 bool AceViewOhos::Dump(const std::vector<std::string>& params)
504 {
505     if (params.empty() || params[0] != "-drawcmd") {
506         return false;
507     }
508     if (DumpLog::GetInstance().GetDumpFile()) {
509         DumpLog::GetInstance().AddDesc("Dump draw command not support on this version.");
510         DumpLog::GetInstance().Print(0, "Info:", 0);
511         return true;
512     }
513     return false;
514 }
515 
GetBackgroundColor()516 uint32_t AceViewOhos::GetBackgroundColor()
517 {
518     return Color::WHITE.GetValue();
519 }
520 
521 } // namespace OHOS::Ace::Platform
522