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