1 /*
2 * Copyright (c) 2022 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 "core/components_ng/event/event_hub.h"
17
18 #include "core/pipeline_ng/pipeline_context.h"
19
20 namespace OHOS::Ace::NG {
21
AttachHost(const WeakPtr<FrameNode> & host)22 void EventHub::AttachHost(const WeakPtr<FrameNode>& host)
23 {
24 host_ = host;
25 }
26
OnAttachContext(PipelineContext * context)27 void EventHub::OnAttachContext(PipelineContext *context)
28 {
29 auto host = host_.Upgrade();
30 CHECK_NULL_VOID(host);
31 if (HasOnAreaChanged() || HasInnerOnAreaChanged()) {
32 context->AddOnAreaChangeNode(host->GetId());
33 }
34
35 if (HasVisibleAreaCallback(true) || HasVisibleAreaCallback(false)) {
36 context->AddVisibleAreaChangeNode(host->GetId());
37 }
38 }
39
OnDetachContext(PipelineContext * context)40 void EventHub::OnDetachContext(PipelineContext *context)
41 {
42 auto host = host_.Upgrade();
43 CHECK_NULL_VOID(host);
44 if (HasOnAreaChanged() || HasInnerOnAreaChanged()) {
45 context->RemoveOnAreaChangeNode(host->GetId());
46 }
47
48 if (HasVisibleAreaCallback(true) || HasVisibleAreaCallback(false) || HasThrottledVisibleAreaCallback()) {
49 host->SetVisibleAreaChangeTriggerReason(VisibleAreaChangeTriggerReason::DETACH_FROM_MAINTREE);
50 host->TriggerVisibleAreaChangeCallback(0, true);
51 context->RemoveVisibleAreaChangeNode(host->GetId());
52 }
53 auto eventManager = context->GetEventManager();
54 if (eventManager) {
55 eventManager->DelKeyboardShortcutNode(host->GetId());
56 }
57 }
58
GetFrameNode() const59 RefPtr<FrameNode> EventHub::GetFrameNode() const
60 {
61 return host_.Upgrade();
62 }
63
AddSupportedState(UIState state)64 void EventHub::AddSupportedState(UIState state)
65 {
66 if (!stateStyleMgr_) {
67 stateStyleMgr_ = MakeRefPtr<StateStyleManager>(host_);
68 }
69 stateStyleMgr_->AddSupportedState(state);
70 }
71
SetSupportedStates(UIState state)72 void EventHub::SetSupportedStates(UIState state)
73 {
74 if (!stateStyleMgr_) {
75 stateStyleMgr_ = MakeRefPtr<StateStyleManager>(host_);
76 }
77 stateStyleMgr_->SetSupportedStates(state);
78 }
79
SetCurrentUIState(UIState state,bool flag)80 void EventHub::SetCurrentUIState(UIState state, bool flag)
81 {
82 if (!stateStyleMgr_) {
83 stateStyleMgr_ = MakeRefPtr<StateStyleManager>(host_);
84 }
85 stateStyleMgr_->SetCurrentUIState(state, flag);
86 }
87
IsCurrentStateOn(UIState state)88 bool EventHub::IsCurrentStateOn(UIState state)
89 {
90 if (!stateStyleMgr_) {
91 return false;
92 }
93 return stateStyleMgr_->IsCurrentStateOn(state);
94 }
95
CreateGetEventTargetImpl() const96 GetEventTargetImpl EventHub::CreateGetEventTargetImpl() const
97 {
98 auto impl = [weak = host_]() -> std::optional<EventTarget> {
99 auto host = weak.Upgrade();
100 CHECK_NULL_RETURN(host, std::nullopt);
101 EventTarget eventTarget;
102 eventTarget.id = host->GetInspectorId().value_or("").c_str();
103 eventTarget.type = host->GetTag();
104 auto geometryNode = host->GetGeometryNode();
105 auto offset = geometryNode->GetFrameOffset();
106 auto size = geometryNode->GetFrameSize();
107 eventTarget.area.SetOffset(DimensionOffset(offset));
108 eventTarget.area.SetHeight(Dimension(size.Height()));
109 eventTarget.area.SetWidth(Dimension(size.Width()));
110 eventTarget.origin = DimensionOffset(host->GetOffsetRelativeToWindow() - offset);
111 return eventTarget;
112 };
113 return impl;
114 }
115
PostEnabledTask()116 void EventHub::PostEnabledTask()
117 {
118 auto pipeline = PipelineBase::GetCurrentContextSafelyWithCheck();
119 CHECK_NULL_VOID(pipeline);
120 auto taskExecutor = pipeline->GetTaskExecutor();
121 CHECK_NULL_VOID(taskExecutor);
122 auto host = GetFrameNode();
123 CHECK_NULL_VOID(host);
124 auto callback = [weak = WeakClaim(this)]() {
125 auto eventHub = weak.Upgrade();
126 CHECK_NULL_VOID(eventHub);
127 eventHub->UpdateCurrentUIState(UI_STATE_DISABLED);
128 };
129 if (!host->IsOnMainTree()) {
130 enabledFunc_ = callback;
131 return;
132 }
133 taskExecutor->PostTask(callback, TaskExecutor::TaskType::UI, "ArkUIUpdateCurrentUIState");
134 }
135
FireEnabledTask()136 void EventHub::FireEnabledTask()
137 {
138 if (enabledFunc_) {
139 enabledFunc_();
140 enabledFunc_ = nullptr;
141 }
142 }
143
MarkModifyDone()144 void EventHub::MarkModifyDone()
145 {
146 if (stateStyleMgr_) {
147 // focused style is managered in focus event hub.
148 if (stateStyleMgr_->HasStateStyle(UI_STATE_PRESSED)) {
149 GetOrCreateGestureEventHub()->AddTouchEvent(stateStyleMgr_->GetPressedListener());
150 }
151 if (stateStyleMgr_->HasStateStyle(UI_STATE_DISABLED)) {
152 if (enabled_) {
153 stateStyleMgr_->ResetCurrentUIState(UI_STATE_DISABLED);
154 } else {
155 PostEnabledTask();
156 }
157 }
158 }
159
160 if (gestureEventHub_) {
161 gestureEventHub_->OnModifyDone();
162 }
163 OnModifyDone();
164 }
165
SetCustomerOnDragFunc(DragFuncType dragFuncType,OnDragFunc && onDragFunc)166 void EventHub::SetCustomerOnDragFunc(DragFuncType dragFuncType, OnDragFunc&& onDragFunc)
167 {
168 switch (dragFuncType) {
169 case DragFuncType::DRAG_ENTER:
170 customerOnDragEnter_ = std::move(onDragFunc);
171 break;
172 case DragFuncType::DRAG_LEAVE:
173 customerOnDragLeave_ = std::move(onDragFunc);
174 break;
175 case DragFuncType::DRAG_MOVE:
176 customerOnDragMove_ = std::move(onDragFunc);
177 break;
178 case DragFuncType::DRAG_DROP:
179 customerOnDrop_ = std::move(onDragFunc);
180 break;
181 default:
182 TAG_LOGW(AceLogTag::ACE_DRAG, "Unsupported DragFuncType");
183 break;
184 }
185 }
186
SetCustomerOnDragFunc(DragFuncType dragFuncType,OnNewDragFunc && onDragEnd)187 void EventHub::SetCustomerOnDragFunc(DragFuncType dragFuncType, OnNewDragFunc&& onDragEnd)
188 {
189 if (dragFuncType != DragFuncType::DRAG_END) {
190 return;
191 }
192 customerOnDragEnd_ = std::move(onDragEnd);
193 }
194
FireCustomerOnDragFunc(DragFuncType dragFuncType,const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)195 void EventHub::FireCustomerOnDragFunc(DragFuncType dragFuncType, const RefPtr<OHOS::Ace::DragEvent>& info,
196 const std::string& extraParams)
197 {
198 switch (dragFuncType) {
199 case DragFuncType::DRAG_ENTER: {
200 if (customerOnDragEnter_ != nullptr) {
201 auto customerDragEnter = customerOnDragEnter_;
202 customerDragEnter(info, extraParams);
203 }
204 break;
205 }
206 case DragFuncType::DRAG_LEAVE: {
207 if (customerOnDragLeave_ != nullptr) {
208 auto customerOnDragLeave = customerOnDragLeave_;
209 customerOnDragLeave(info, extraParams);
210 }
211 break;
212 }
213 case DragFuncType::DRAG_MOVE: {
214 if (customerOnDragMove_ != nullptr) {
215 auto customerOnDragMove = customerOnDragMove_;
216 customerOnDragMove(info, extraParams);
217 }
218 break;
219 }
220 case DragFuncType::DRAG_DROP: {
221 if (customerOnDrop_ != nullptr) {
222 auto customerOnDrop = customerOnDrop_;
223 ACE_SCOPED_TRACE("drag: execute user onDrop");
224 customerOnDrop(info, extraParams);
225 }
226 break;
227 }
228 case DragFuncType::DRAG_END: {
229 if (customerOnDragEnd_ != nullptr) {
230 auto customerOnDragEnd = customerOnDragEnd_;
231 customerOnDragEnd(info);
232 }
233 break;
234 }
235 default:
236 TAG_LOGW(AceLogTag::ACE_DRAG, "Unsupported DragFuncType");
237 break;
238 }
239 }
240
FireOnDragEnter(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)241 void EventHub::FireOnDragEnter(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
242 {
243 if (SystemProperties::GetDebugEnabled()) {
244 TAG_LOGD(AceLogTag::ACE_DRAG, "DragDropManager fire onDragEnter");
245 }
246 if (onDragEnter_) {
247 // callback may be overwritten in its invoke so we copy it first
248 auto onDragEnter = onDragEnter_;
249 onDragEnter(info, extraParams);
250 }
251 }
252
FireOnDragLeave(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)253 void EventHub::FireOnDragLeave(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
254 {
255 if (SystemProperties::GetDebugEnabled()) {
256 TAG_LOGD(AceLogTag::ACE_DRAG, "DragDropManager fire onDragLeave");
257 }
258 if (onDragLeave_) {
259 // callback may be overwritten in its invoke so we copy it first
260 auto onDragLeave = onDragLeave_;
261 onDragLeave(info, extraParams);
262 }
263 }
264
FireOnDragMove(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)265 void EventHub::FireOnDragMove(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
266 {
267 if (SystemProperties::GetDebugEnabled()) {
268 TAG_LOGD(AceLogTag::ACE_DRAG, "DragDropManager fire onDragMove");
269 }
270 if (onDragMove_) {
271 // callback may be overwritten in its invoke so we copy it first
272 auto onDragMove = onDragMove_;
273 onDragMove(info, extraParams);
274 }
275 }
276
FireOnDrop(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)277 void EventHub::FireOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
278 {
279 if (SystemProperties::GetDebugEnabled()) {
280 TAG_LOGD(AceLogTag::ACE_DRAG, "DragDropManager fire onDrop");
281 }
282 if (onDrop_) {
283 // callback may be overwritten in its invoke so we copy it first
284 auto onDrop = onDrop_;
285 onDrop(info, extraParams);
286 }
287 }
288
IsFireOnDrop(const RefPtr<OHOS::Ace::DragEvent> & info)289 bool EventHub::IsFireOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info)
290 {
291 return !HasCustomerOnDrop()
292 || info->GetResult() == DragRet::DRAG_DEFAULT
293 || info->GetResult() == DragRet::ENABLE_DROP
294 || info->GetResult() == DragRet::DISABLE_DROP;
295 }
296
HandleInternalOnDrop(const RefPtr<OHOS::Ace::DragEvent> & info,const std::string & extraParams)297 void EventHub::HandleInternalOnDrop(const RefPtr<OHOS::Ace::DragEvent>& info, const std::string& extraParams)
298 {
299 CHECK_NULL_VOID(info);
300 if (IsFireOnDrop(info)) {
301 FireOnDrop(info, extraParams);
302 } else {
303 TAG_LOGI(AceLogTag::ACE_DRAG, "InternalOnDrop not exist");
304 }
305 }
306
AddInnerOnAreaChangedCallback(int32_t id,OnAreaChangedFunc && callback)307 void EventHub::AddInnerOnAreaChangedCallback(int32_t id, OnAreaChangedFunc&& callback)
308 {
309 auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
310 CHECK_NULL_VOID(pipeline);
311 auto frameNode = GetFrameNode();
312 CHECK_NULL_VOID(frameNode);
313 pipeline->AddOnAreaChangeNode(frameNode->GetId());
314 frameNode->InitLastArea();
315 if (onAreaChangedInnerCallbacks_.find(id) == onAreaChangedInnerCallbacks_.end()) {
316 hasInnerAreaChangeUntriggered_.emplace_back(id);
317 }
318 onAreaChangedInnerCallbacks_[id] = std::move(callback);
319 }
320
RemoveInnerOnAreaChangedCallback(int32_t id)321 void EventHub::RemoveInnerOnAreaChangedCallback(int32_t id)
322 {
323 onAreaChangedInnerCallbacks_.erase(id);
324 }
325
ClearCustomerOnDragFunc()326 void EventHub::ClearCustomerOnDragFunc()
327 {
328 onDragStart_ = nullptr;
329 customerOnDragEnter_ = nullptr;
330 customerOnDragLeave_ = nullptr;
331 customerOnDragMove_ = nullptr;
332 customerOnDrop_ = nullptr;
333 customerOnDragEnd_ = nullptr;
334 }
335
ClearCustomerOnDragStart()336 void EventHub::ClearCustomerOnDragStart()
337 {
338 onDragStart_ = nullptr;
339 }
340
ClearCustomerOnDragEnter()341 void EventHub::ClearCustomerOnDragEnter()
342 {
343 customerOnDragEnter_ = nullptr;
344 }
345
ClearCustomerOnDragMove()346 void EventHub::ClearCustomerOnDragMove()
347 {
348 customerOnDragMove_ = nullptr;
349 }
350
ClearCustomerOnDragLeave()351 void EventHub::ClearCustomerOnDragLeave()
352 {
353 customerOnDragLeave_ = nullptr;
354 }
355
ClearCustomerOnDrop()356 void EventHub::ClearCustomerOnDrop()
357 {
358 customerOnDrop_ = nullptr;
359 }
360
ClearCustomerOnDragEnd()361 void EventHub::ClearCustomerOnDragEnd()
362 {
363 customerOnDragEnd_ = nullptr;
364 }
365
SetOnSizeChanged(OnSizeChangedFunc && onSizeChanged)366 void EventHub::SetOnSizeChanged(OnSizeChangedFunc&& onSizeChanged)
367 {
368 onSizeChanged_ = std::move(onSizeChanged);
369 }
370
FireOnSizeChanged(const RectF & oldRect,const RectF & rect)371 void EventHub::FireOnSizeChanged(const RectF& oldRect, const RectF& rect)
372 {
373 if (onSizeChanged_) {
374 // callback may be overwritten in its invoke so we copy it first
375 auto onSizeChanged = onSizeChanged_;
376 onSizeChanged(oldRect, rect);
377 }
378 }
379
SetJSFrameNodeOnSizeChangeCallback(OnSizeChangedFunc && onSizeChanged)380 void EventHub::SetJSFrameNodeOnSizeChangeCallback(OnSizeChangedFunc&& onSizeChanged)
381 {
382 onJsFrameNodeSizeChanged_ = std::move(onSizeChanged);
383 }
384
FireJSFrameNodeOnSizeChanged(const RectF & oldRect,const RectF & rect)385 void EventHub::FireJSFrameNodeOnSizeChanged(const RectF& oldRect, const RectF& rect)
386 {
387 if (onJsFrameNodeSizeChanged_) {
388 // callback may be overwritten in its invoke so we copy it first
389 auto onSizeChanged = onJsFrameNodeSizeChanged_;
390 onSizeChanged(oldRect, rect);
391 }
392 }
393
ClearJSFrameNodeOnSizeChange()394 void EventHub::ClearJSFrameNodeOnSizeChange()
395 {
396 if (onJsFrameNodeSizeChanged_) {
397 onJsFrameNodeSizeChanged_ = nullptr;
398 }
399 auto host = GetFrameNode();
400 CHECK_NULL_VOID(host);
401 host->ResetLastFrameNodeRect();
402 }
403
HasOnSizeChanged() const404 bool EventHub::HasOnSizeChanged() const
405 {
406 return static_cast<bool>(onSizeChanged_) || static_cast<bool>(onJsFrameNodeSizeChanged_);
407 }
408
HasImmediatelyVisibleCallback()409 bool EventHub::HasImmediatelyVisibleCallback()
410 {
411 return visibleAreaUserCallback_.callback || visibleAreaInnerCallback_.callback;
412 }
413
ClearOnAreaChangedInnerCallbacks()414 void EventHub::ClearOnAreaChangedInnerCallbacks()
415 {
416 onAreaChangedInnerCallbacks_.clear();
417 }
418
SetJSFrameNodeOnAppear(std::function<void ()> && onAppear)419 void EventHub::SetJSFrameNodeOnAppear(std::function<void()>&& onAppear)
420 {
421 onJSFrameNodeAppear_ = std::move(onAppear);
422 }
423
ClearJSFrameNodeOnAppear()424 void EventHub::ClearJSFrameNodeOnAppear()
425 {
426 if (onJSFrameNodeAppear_) {
427 onJSFrameNodeAppear_ = nullptr;
428 }
429 }
430
SetJSFrameNodeOnDisappear(std::function<void ()> && onDisappear)431 void EventHub::SetJSFrameNodeOnDisappear(std::function<void()>&& onDisappear)
432 {
433 onJSFrameNodeDisappear_ = std::move(onDisappear);
434 }
435
ClearJSFrameNodeOnDisappear()436 void EventHub::ClearJSFrameNodeOnDisappear()
437 {
438 if (onJSFrameNodeDisappear_) {
439 onJSFrameNodeDisappear_ = nullptr;
440 }
441 }
442
FireOnAppear()443 void EventHub::FireOnAppear()
444 {
445 if (onAppear_ || onJSFrameNodeAppear_) {
446 auto pipeline = PipelineBase::GetCurrentContextSafelyWithCheck();
447 CHECK_NULL_VOID(pipeline);
448 auto taskScheduler = pipeline->GetTaskExecutor();
449 CHECK_NULL_VOID(taskScheduler);
450 taskScheduler->PostTask(
451 [weak = WeakClaim(this)]() {
452 auto eventHub = weak.Upgrade();
453 CHECK_NULL_VOID(eventHub);
454 if (eventHub->onAppear_) {
455 // callback may be overwritten in its invoke so we copy it first
456 auto onAppear = eventHub->onAppear_;
457 onAppear();
458 }
459 if (eventHub->onJSFrameNodeAppear_) {
460 // callback may be overwritten in its invoke so we copy it first
461 auto onJSFrameNodeAppear = eventHub->onJSFrameNodeAppear_;
462 onJSFrameNodeAppear();
463 }
464 },
465 TaskExecutor::TaskType::UI, "ArkUIFrameNodeAppearEvent");
466 }
467 }
468
FireOnDisappear()469 void EventHub::FireOnDisappear()
470 {
471 if (onDisappear_) {
472 // callback may be overwritten in its invoke so we copy it first
473 auto onDisappear = onDisappear_;
474 onDisappear();
475 }
476 if (onJSFrameNodeDisappear_) {
477 // callback may be overwritten in its invoke so we copy it first
478 auto onJSFrameNodeDisappear = onJSFrameNodeDisappear_;
479 onJSFrameNodeDisappear();
480 }
481 }
482
AddInnerOnSizeChanged(int32_t id,OnSizeChangedFunc && callback)483 void EventHub::AddInnerOnSizeChanged(int32_t id, OnSizeChangedFunc&& callback)
484 {
485 onSizeChangedInnerCallbacks_[id] = std::move(callback);
486 }
487
FireInnerOnSizeChanged(const RectF & oldRect,const RectF & rect)488 void EventHub::FireInnerOnSizeChanged(const RectF& oldRect, const RectF& rect)
489 {
490 for (auto& innerCallbackInfo : onSizeChangedInnerCallbacks_) {
491 if (innerCallbackInfo.second) {
492 auto innerOnSizeCallback = innerCallbackInfo.second;
493 innerOnSizeCallback(oldRect, rect);
494 }
495 }
496 }
497
HasInnerOnSizeChanged() const498 bool EventHub::HasInnerOnSizeChanged() const
499 {
500 return !onSizeChangedInnerCallbacks_.empty();
501 }
502
ClearInnerOnSizeChanged()503 void EventHub::ClearInnerOnSizeChanged()
504 {
505 onSizeChangedInnerCallbacks_.clear();
506 }
507
SetOnAttach(std::function<void ()> && onAttach)508 void EventHub::SetOnAttach(std::function<void()>&& onAttach)
509 {
510 onAttach_ = std::move(onAttach);
511 }
512
ClearOnAttach()513 void EventHub::ClearOnAttach()
514 {
515 onAttach_ = nullptr;
516 }
517
FireOnAttach()518 void EventHub::FireOnAttach()
519 {
520 if (onAttach_) {
521 auto onAttach = onAttach_;
522 onAttach();
523 }
524 }
525
SetOnDetach(std::function<void ()> && onDetach)526 void EventHub::SetOnDetach(std::function<void()>&& onDetach)
527 {
528 onDetach_ = std::move(onDetach);
529 }
530
ClearOnDetach()531 void EventHub::ClearOnDetach()
532 {
533 onDetach_ = nullptr;
534 }
535
ClearOnPreDrag()536 void EventHub::ClearOnPreDrag()
537 {
538 onPreDragFunc_ = nullptr;
539 }
540
FireOnDetach()541 void EventHub::FireOnDetach()
542 {
543 if (onDetach_) {
544 auto onDetach = onDetach_;
545 onDetach();
546 }
547 }
548
SetOnWillBind(std::function<void (int32_t)> && onWillBind)549 void EventHub::SetOnWillBind(std::function<void(int32_t)>&& onWillBind)
550 {
551 onWillBind_ = std::move(onWillBind);
552 }
553
ClearOnWillBind()554 void EventHub::ClearOnWillBind()
555 {
556 onWillBind_ = nullptr;
557 }
558
FireOnWillBind(int32_t containerId)559 void EventHub::FireOnWillBind(int32_t containerId)
560 {
561 if (onWillBind_) {
562 auto onWillBind = onWillBind_;
563 onWillBind(containerId);
564 }
565 }
566
SetOnWillUnbind(std::function<void (int32_t)> && onWillUnbind)567 void EventHub::SetOnWillUnbind(std::function<void(int32_t)>&& onWillUnbind)
568 {
569 onWillUnbind_ = std::move(onWillUnbind);
570 }
571
ClearOnWillUnbind()572 void EventHub::ClearOnWillUnbind()
573 {
574 onWillUnbind_ = nullptr;
575 }
576
FireOnWillUnbind(int32_t containerId)577 void EventHub::FireOnWillUnbind(int32_t containerId)
578 {
579 if (onWillUnbind_) {
580 auto onWillUnbind = onWillUnbind_;
581 onWillUnbind(containerId);
582 }
583 }
584
SetOnBind(std::function<void (int32_t)> && onBind)585 void EventHub::SetOnBind(std::function<void(int32_t)>&& onBind)
586 {
587 onBind_ = std::move(onBind);
588 }
589
ClearOnBind()590 void EventHub::ClearOnBind()
591 {
592 onBind_ = nullptr;
593 }
594
FireOnBind(int32_t containerId)595 void EventHub::FireOnBind(int32_t containerId)
596 {
597 if (onBind_) {
598 auto onBind = onBind_;
599 onBind(containerId);
600 }
601 }
602
SetOnUnbind(std::function<void (int32_t)> && onUnbind)603 void EventHub::SetOnUnbind(std::function<void(int32_t)>&& onUnbind)
604 {
605 onUnbind_ = std::move(onUnbind);
606 }
607
ClearOnUnbind()608 void EventHub::ClearOnUnbind()
609 {
610 onUnbind_ = nullptr;
611 }
612
FireOnUnbind(int32_t containerId)613 void EventHub::FireOnUnbind(int32_t containerId)
614 {
615 if (onUnbind_) {
616 auto onUnbind = onUnbind_;
617 onUnbind(containerId);
618 }
619 }
620
ClearStateStyle()621 void EventHub::ClearStateStyle()
622 {
623 if (stateStyleMgr_) {
624 stateStyleMgr_->ClearStateStyleTask();
625 }
626 }
627
OnDetachClear()628 void EventHub::OnDetachClear()
629 {
630 FireOnDetach();
631 FireOnDisappear();
632 ClearStateStyle();
633 }
634
GetOrCreateGestureEventHub()635 const RefPtr<GestureEventHub>& EventHub::GetOrCreateGestureEventHub()
636 {
637 if (!gestureEventHub_) {
638 gestureEventHub_ = CreateGestureEventHub();
639 }
640 return gestureEventHub_;
641 }
642
GetGestureEventHub() const643 const RefPtr<GestureEventHub>& EventHub::GetGestureEventHub() const
644 {
645 return gestureEventHub_;
646 }
647
SetGestureEventHub(const RefPtr<GestureEventHub> & gestureEventHub)648 void EventHub::SetGestureEventHub(const RefPtr<GestureEventHub>& gestureEventHub)
649 {
650 gestureEventHub_ = gestureEventHub;
651 }
652
GetOrCreateInputEventHub()653 const RefPtr<InputEventHub>& EventHub::GetOrCreateInputEventHub()
654 {
655 if (!inputEventHub_) {
656 inputEventHub_ = MakeRefPtr<InputEventHub>(WeakClaim(this));
657 }
658 return inputEventHub_;
659 }
660
GetInputEventHub() const661 const RefPtr<InputEventHub>& EventHub::GetInputEventHub() const
662 {
663 return inputEventHub_;
664 }
665
GetOrCreateFocusHub(FocusType type,bool focusable,FocusStyleType focusStyleType,const std::unique_ptr<FocusPaintParam> & paintParamsPtr)666 RefPtr<FocusHub> EventHub::GetOrCreateFocusHub(FocusType type, bool focusable, FocusStyleType focusStyleType,
667 const std::unique_ptr<FocusPaintParam>& paintParamsPtr)
668 {
669 auto frameNode = GetFrameNode();
670 CHECK_NULL_RETURN(frameNode, nullptr);
671 return frameNode->GetOrCreateFocusHub(type, focusable, focusStyleType, paintParamsPtr);
672 }
673
GetOrCreateFocusHub(const FocusPattern & focusPattern)674 RefPtr<FocusHub> EventHub::GetOrCreateFocusHub(const FocusPattern& focusPattern)
675 {
676 auto frameNode = GetFrameNode();
677 CHECK_NULL_RETURN(frameNode, nullptr);
678 return frameNode->GetOrCreateFocusHub(focusPattern);
679 }
680
GetFocusHub() const681 RefPtr<FocusHub> EventHub::GetFocusHub() const
682 {
683 auto frameNode = GetFrameNode();
684 CHECK_NULL_RETURN(frameNode, nullptr);
685 return frameNode->GetFocusHub();
686 }
687
OnContextAttached()688 void EventHub::OnContextAttached()
689 {
690 if (gestureEventHub_) {
691 gestureEventHub_->OnContextAttached();
692 }
693 }
694
ClearUserOnAppear()695 void EventHub::ClearUserOnAppear()
696 {
697 if (onAppear_) {
698 onAppear_ = nullptr;
699 }
700 }
701
SetOnAppear(std::function<void ()> && onAppear)702 void EventHub::SetOnAppear(std::function<void()>&& onAppear)
703 {
704 onAppear_ = std::move(onAppear);
705 }
706
ClearUserOnDisAppear()707 void EventHub::ClearUserOnDisAppear()
708 {
709 if (onDisappear_) {
710 onDisappear_ = nullptr;
711 }
712 }
713
SetOnDisappear(std::function<void ()> && onDisappear)714 void EventHub::SetOnDisappear(std::function<void()>&& onDisappear)
715 {
716 onDisappear_ = std::move(onDisappear);
717 }
718
ClearUserOnAreaChanged()719 void EventHub::ClearUserOnAreaChanged()
720 {
721 if (onAreaChanged_) {
722 onAreaChanged_ = nullptr;
723 }
724 }
725
SetOnAreaChanged(OnAreaChangedFunc && onAreaChanged)726 void EventHub::SetOnAreaChanged(OnAreaChangedFunc&& onAreaChanged)
727 {
728 onAreaChanged_ = std::move(onAreaChanged);
729 }
730
FireOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)731 void EventHub::FireOnAreaChanged(
732 const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)
733 {
734 if (onAreaChanged_) {
735 // callback may be overwritten in its invoke so we copy it first
736 auto onAreaChanged = onAreaChanged_;
737 onAreaChanged(oldRect, oldOrigin, rect, origin);
738 }
739 }
740
FireInnerOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)741 void EventHub::FireInnerOnAreaChanged(
742 const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)
743 {
744 for (auto& innerCallbackInfo : onAreaChangedInnerCallbacks_) {
745 if (innerCallbackInfo.second) {
746 auto innerOnAreaCallback = innerCallbackInfo.second;
747 innerOnAreaCallback(oldRect, oldOrigin, rect, origin);
748 }
749 }
750 hasInnerAreaChangeUntriggered_.clear();
751 }
752
HasOnAreaChanged() const753 bool EventHub::HasOnAreaChanged() const
754 {
755 return static_cast<bool>(onAreaChanged_);
756 }
757
HasInnerOnAreaChanged() const758 bool EventHub::HasInnerOnAreaChanged() const
759 {
760 return !onAreaChangedInnerCallbacks_.empty();
761 }
762
SetOnPreDrag(OnPreDragFunc && onPreDragFunc)763 void EventHub::SetOnPreDrag(OnPreDragFunc&& onPreDragFunc)
764 {
765 onPreDragFunc_ = std::move(onPreDragFunc);
766 }
767
GetOnPreDrag() const768 const OnPreDragFunc& EventHub::GetOnPreDrag() const
769 {
770 return onPreDragFunc_;
771 }
772
SetOnDragStart(OnDragStartFunc && onDragStart)773 void EventHub::SetOnDragStart(OnDragStartFunc&& onDragStart)
774 {
775 onDragStart_ = std::move(onDragStart);
776 }
777
HasOnDragStart() const778 bool EventHub::HasOnDragStart() const
779 {
780 return static_cast<bool>(onDragStart_) || static_cast<bool>(defaultOnDragStart_);
781 }
782
SetOnDragEnter(OnDragFunc && onDragEnter)783 void EventHub::SetOnDragEnter(OnDragFunc&& onDragEnter)
784 {
785 onDragEnter_ = std::move(onDragEnter);
786 }
787
SetOnDragLeave(OnDragFunc && onDragLeave)788 void EventHub::SetOnDragLeave(OnDragFunc&& onDragLeave)
789 {
790 onDragLeave_ = std::move(onDragLeave);
791 }
792
SetOnDragMove(OnDragFunc && onDragMove)793 void EventHub::SetOnDragMove(OnDragFunc&& onDragMove)
794 {
795 onDragMove_ = std::move(onDragMove);
796 }
797
HasOnDragMove() const798 bool EventHub::HasOnDragMove() const
799 {
800 return static_cast<bool>(onDragMove_);
801 }
802
SetOnDrop(OnDragFunc && onDrop)803 void EventHub::SetOnDrop(OnDragFunc&& onDrop)
804 {
805 onDrop_ = std::move(onDrop);
806 }
807
SetOnDragEnd(OnNewDragFunc && onDragEnd)808 void EventHub::SetOnDragEnd(OnNewDragFunc&& onDragEnd)
809 {
810 onDragEnd_ = std::move(onDragEnd);
811 }
812
HasOnDragEnter() const813 bool EventHub::HasOnDragEnter() const
814 {
815 return static_cast<bool>(onDragEnter_);
816 }
817
HasOnDragLeave() const818 bool EventHub::HasOnDragLeave() const
819 {
820 return static_cast<bool>(onDragLeave_);
821 }
822
HasOnDragEnd() const823 bool EventHub::HasOnDragEnd() const
824 {
825 return static_cast<bool>(onDragEnd_);
826 }
827
HasOnDrop() const828 bool EventHub::HasOnDrop() const
829 {
830 return onDrop_ != nullptr;
831 }
832
HasCustomerOnDragEnter() const833 bool EventHub::HasCustomerOnDragEnter() const
834 {
835 return customerOnDragEnter_ != nullptr;
836 }
837
HasCustomerOnDragLeave() const838 bool EventHub::HasCustomerOnDragLeave() const
839 {
840 return customerOnDragLeave_ != nullptr;
841 }
842
HasCustomerOnDragMove() const843 bool EventHub::HasCustomerOnDragMove() const
844 {
845 return customerOnDragMove_ != nullptr;
846 }
847
HasCustomerOnDragEnd() const848 bool EventHub::HasCustomerOnDragEnd() const
849 {
850 return customerOnDragEnd_ != nullptr;
851 }
852
HasCustomerOnDrop() const853 bool EventHub::HasCustomerOnDrop() const
854 {
855 return customerOnDrop_ != nullptr;
856 }
857
SetDisableDataPrefetch(bool disableDataPrefetch)858 void EventHub::SetDisableDataPrefetch(bool disableDataPrefetch)
859 {
860 disableDataPrefetch_ = disableDataPrefetch;
861 }
862
GetDisableDataPrefetch() const863 bool EventHub::GetDisableDataPrefetch() const
864 {
865 return disableDataPrefetch_;
866 }
867
IsEnabled() const868 bool EventHub::IsEnabled() const
869 {
870 return enabled_;
871 }
872
IsDeveloperEnabled() const873 bool EventHub::IsDeveloperEnabled() const
874 {
875 return developerEnabled_;
876 }
877
SetEnabled(bool enabled)878 void EventHub::SetEnabled(bool enabled)
879 {
880 auto host = GetFrameNode();
881 if (enabled_ != enabled && host) {
882 auto accessibilityProperty = host->GetAccessibilityProperty<NG::AccessibilityProperty>();
883 if (accessibilityProperty) {
884 accessibilityProperty->NotifyComponentChangeEvent(AccessibilityEventType::ELEMENT_INFO_CHANGE);
885 }
886 }
887 enabled_ = enabled;
888 developerEnabled_ = enabled;
889 }
890
SetEnabledInternal(bool enabled)891 void EventHub::SetEnabledInternal(bool enabled)
892 {
893 enabled_ = enabled;
894 }
895
896 // restore enabled value to what developer sets
RestoreEnabled()897 void EventHub::RestoreEnabled()
898 {
899 enabled_ = developerEnabled_;
900 }
901
UpdateCurrentUIState(UIState state)902 void EventHub::UpdateCurrentUIState(UIState state)
903 {
904 if (stateStyleMgr_) {
905 stateStyleMgr_->UpdateCurrentUIState(state);
906 }
907 }
908
ResetCurrentUIState(UIState state)909 void EventHub::ResetCurrentUIState(UIState state)
910 {
911 if (stateStyleMgr_) {
912 stateStyleMgr_->ResetCurrentUIState(state);
913 }
914 }
915
GetCurrentUIState() const916 UIState EventHub::GetCurrentUIState() const
917 {
918 return stateStyleMgr_ ? stateStyleMgr_->GetCurrentUIState() : UI_STATE_NORMAL;
919 }
920
HasStateStyle(UIState state) const921 bool EventHub::HasStateStyle(UIState state) const
922 {
923 if (stateStyleMgr_) {
924 return stateStyleMgr_->HasStateStyle(state);
925 }
926 return false;
927 }
928
SetKeyboardShortcut(const std::string & value,uint8_t keys,const std::function<void ()> & onKeyboardShortcutAction)929 void EventHub::SetKeyboardShortcut(
930 const std::string& value, uint8_t keys, const std::function<void()>& onKeyboardShortcutAction)
931 {
932 TAG_LOGI(AceLogTag::ACE_KEYBOARD, "SetKeyboardShortcut value = %{public}s, keys = %{public}d", value.c_str(), keys);
933 KeyboardShortcut keyboardShortcut;
934 for (auto&& ch : value) {
935 keyboardShortcut.value.push_back(static_cast<char>(std::toupper(ch)));
936 }
937 keyboardShortcut.keys = keys;
938 keyboardShortcut.onKeyboardShortcutAction = onKeyboardShortcutAction;
939
940 for (auto& shortCut : keyboardShortcut_) {
941 if (shortCut.IsEqualTrigger(keyboardShortcut)) {
942 shortCut.onKeyboardShortcutAction = onKeyboardShortcutAction;
943 return;
944 }
945 }
946 keyboardShortcut_.emplace_back(keyboardShortcut);
947 }
948
ClearSingleKeyboardShortcut()949 void EventHub::ClearSingleKeyboardShortcut()
950 {
951 if (keyboardShortcut_.size() == 1) {
952 keyboardShortcut_.clear();
953 }
954 }
955
GetKeyboardShortcut()956 std::vector<KeyboardShortcut>& EventHub::GetKeyboardShortcut()
957 {
958 return keyboardShortcut_;
959 }
960
SetDefaultOnDragStart(OnDragStartFunc && defaultOnDragStart)961 void EventHub::SetDefaultOnDragStart(OnDragStartFunc&& defaultOnDragStart)
962 {
963 defaultOnDragStart_ = std::move(defaultOnDragStart);
964 }
965
HasDefaultOnDragStart() const966 bool EventHub::HasDefaultOnDragStart() const
967 {
968 return static_cast<bool>(defaultOnDragStart_);
969 }
970
GetThrottledVisibleAreaRatios()971 std::vector<double>& EventHub::GetThrottledVisibleAreaRatios()
972 {
973 return throttledVisibleAreaRatios_;
974 }
975
GetThrottledVisibleAreaCallback()976 VisibleCallbackInfo& EventHub::GetThrottledVisibleAreaCallback()
977 {
978 return throttledVisibleAreaCallback_;
979 }
980
GetVisibleAreaRatios(bool isUser)981 std::vector<double>& EventHub::GetVisibleAreaRatios(bool isUser)
982 {
983 if (isUser) {
984 return visibleAreaUserRatios_;
985 } else {
986 return visibleAreaInnerRatios_;
987 }
988 }
989
GetVisibleAreaCallback(bool isUser)990 VisibleCallbackInfo& EventHub::GetVisibleAreaCallback(bool isUser)
991 {
992 if (isUser) {
993 return visibleAreaUserCallback_;
994 } else {
995 return visibleAreaInnerCallback_;
996 }
997 }
998
SetVisibleAreaRatiosAndCallback(const VisibleCallbackInfo & callback,const std::vector<double> & radios,bool isUser)999 void EventHub::SetVisibleAreaRatiosAndCallback(
1000 const VisibleCallbackInfo& callback, const std::vector<double>& radios, bool isUser)
1001 {
1002 if (isUser) {
1003 VisibleCallbackInfo* cbInfo =
1004 (callback.period == 0) ? &visibleAreaUserCallback_ : &throttledVisibleAreaCallback_;
1005 auto ratioInfo = (callback.period == 0) ? &visibleAreaUserRatios_ : &throttledVisibleAreaRatios_;
1006 *cbInfo = callback;
1007 *ratioInfo = radios;
1008 } else {
1009 visibleAreaInnerCallback_ = callback;
1010 visibleAreaInnerRatios_ = radios;
1011 }
1012 }
1013
CleanVisibleAreaCallback(bool isUser,bool isThrottled)1014 void EventHub::CleanVisibleAreaCallback(bool isUser, bool isThrottled)
1015 {
1016 if (!isUser) {
1017 visibleAreaInnerRatios_.clear();
1018 visibleAreaInnerCallback_.callback = nullptr;
1019 } else if (isThrottled) {
1020 throttledVisibleAreaRatios_.clear();
1021 throttledVisibleAreaCallback_.callback = nullptr;
1022 } else {
1023 visibleAreaUserRatios_.clear();
1024 visibleAreaUserCallback_.callback = nullptr;
1025 }
1026 }
1027
HasVisibleAreaCallback(bool isUser)1028 bool EventHub::HasVisibleAreaCallback(bool isUser)
1029 {
1030 if (isUser) {
1031 return static_cast<bool>(visibleAreaUserCallback_.callback);
1032 } else {
1033 return static_cast<bool>(visibleAreaInnerCallback_.callback);
1034 }
1035 }
1036
HasThrottledVisibleAreaCallback() const1037 bool EventHub::HasThrottledVisibleAreaCallback() const
1038 {
1039 return static_cast<bool>(throttledVisibleAreaCallback_.callback);
1040 }
1041
HandleOnAreaChange(const std::unique_ptr<RectF> & lastFrameRect,const std::unique_ptr<OffsetF> & lastParentOffsetToWindow,const RectF & currFrameRect,const OffsetF & currParentOffsetToWindow)1042 void EventHub::HandleOnAreaChange(const std::unique_ptr<RectF>& lastFrameRect,
1043 const std::unique_ptr<OffsetF>& lastParentOffsetToWindow,
1044 const RectF& currFrameRect, const OffsetF& currParentOffsetToWindow)
1045 {
1046 auto host = GetFrameNode();
1047 CHECK_NULL_VOID(host);
1048 if (currFrameRect != *lastFrameRect || currParentOffsetToWindow != *lastParentOffsetToWindow) {
1049 if (HasInnerOnAreaChanged()) {
1050 FireInnerOnAreaChanged(
1051 *lastFrameRect, *lastParentOffsetToWindow, currFrameRect, currParentOffsetToWindow);
1052 }
1053 if (HasOnAreaChanged()) {
1054 FireOnAreaChanged(*lastFrameRect, *lastParentOffsetToWindow,
1055 host->GetFrameRectWithSafeArea(true), host->GetParentGlobalOffsetWithSafeArea(true, true));
1056 }
1057 *lastFrameRect = currFrameRect;
1058 *lastParentOffsetToWindow = currParentOffsetToWindow;
1059 }
1060
1061 if (!hasInnerAreaChangeUntriggered_.empty()) {
1062 FireUntriggeredInnerOnAreaChanged(
1063 *lastFrameRect, *lastParentOffsetToWindow, currFrameRect, currParentOffsetToWindow);
1064 }
1065 }
1066
FireUntriggeredInnerOnAreaChanged(const RectF & oldRect,const OffsetF & oldOrigin,const RectF & rect,const OffsetF & origin)1067 void EventHub::FireUntriggeredInnerOnAreaChanged(
1068 const RectF& oldRect, const OffsetF& oldOrigin, const RectF& rect, const OffsetF& origin)
1069 {
1070 for (auto& id : hasInnerAreaChangeUntriggered_) {
1071 auto it = onAreaChangedInnerCallbacks_.find(id);
1072 if (it != onAreaChangedInnerCallbacks_.end()) {
1073 auto innerOnAreaCallback = it->second;
1074 if (innerOnAreaCallback) {
1075 innerOnAreaCallback(oldRect, oldOrigin, rect, origin);
1076 }
1077 }
1078 }
1079 hasInnerAreaChangeUntriggered_.clear();
1080 }
1081
FireDrawCompletedNDKCallback(PipelineContext * pipeline)1082 void EventHub::FireDrawCompletedNDKCallback(PipelineContext* pipeline)
1083 {
1084 if (ndkDrawCompletedCallback_) {
1085 if (!pipeline) {
1086 TAG_LOGW(AceLogTag::ACE_UIEVENT, "can not fire draw callback, pipeline is null");
1087 return;
1088 }
1089 auto executor = pipeline->GetTaskExecutor();
1090 if (!executor) {
1091 TAG_LOGW(AceLogTag::ACE_UIEVENT, "can not fire draw callback, executor is null");
1092 return;
1093 }
1094 auto cb = ndkDrawCompletedCallback_;
1095 executor->PostTask(std::move(cb), TaskExecutor::TaskType::UI, "FireDrawCompletedNDKCallback");
1096 }
1097 }
1098
FireLayoutNDKCallback(PipelineContext * pipeline)1099 void EventHub::FireLayoutNDKCallback(PipelineContext* pipeline)
1100 {
1101 if (ndkLayoutCallback_) {
1102 if (!pipeline) {
1103 TAG_LOGW(AceLogTag::ACE_UIEVENT, "can not fire layout callback, pipeline is null");
1104 return;
1105 }
1106 auto executor = pipeline->GetTaskExecutor();
1107 if (!executor) {
1108 TAG_LOGW(AceLogTag::ACE_UIEVENT, "can not fire layout callback, executor is null");
1109 return;
1110 }
1111 auto cb = ndkLayoutCallback_;
1112 executor->PostTask(std::move(cb), TaskExecutor::TaskType::UI, "FireLayoutNDKCallback");
1113 }
1114 }
1115 } // namespace OHOS::Ace::NG
1116