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