• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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