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