From 0ff55b42bbdf3d710af29210867f76af0e472aac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Fri, 28 Mar 2025 11:33:31 +0800 Subject: [PATCH] =?UTF-8?q?=E7=82=B9=E5=87=BB=E4=BA=8B=E4=BB=B6=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9F=A5=E8=AF=A2=E6=98=AF=E5=90=A6=E7=BB=91=E5=AE=9A?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- .../ark_node/src/frame_node.ts | 30 ++++++++++ .../engine/jsEnumStyle.js | 7 ++- .../declarative_frontend/engine/jsXNode.js | 18 ++++++ .../arkts_native_api_impl_bridge.cpp | 2 + .../arkts_native_frame_node_bridge.cpp | 23 ++++++++ .../arkts_native_frame_node_bridge.h | 1 + frameworks/core/components_ng/base/ui_node.h | 55 +++++++++++++++++++ .../core/components_ng/base/view_abstract.cpp | 14 +++++ .../components_ng/event/gesture_event_hub.cpp | 4 ++ .../pattern/text/text_model_ng.cpp | 9 +++ .../core/interfaces/arkoala/arkoala_api.h | 8 +++ .../native/node/frame_node_modifier.cpp | 21 +++++++ 12 files changed, 191 insertions(+), 1 deletion(-) diff --git a/frameworks/bridge/declarative_frontend/ark_node/src/frame_node.ts b/frameworks/bridge/declarative_frontend/ark_node/src/frame_node.ts index de41c7020e6..2f8db368fcb 100644 --- a/frameworks/bridge/declarative_frontend/ark_node/src/frame_node.ts +++ b/frameworks/bridge/declarative_frontend/ark_node/src/frame_node.ts @@ -23,12 +23,23 @@ interface CrossLanguageOptions { attributeSetting?: boolean; } +interface InteractionEventBindingInfo { + baseEventRegistered?: boolean; + nodeEventRegistered?: boolean; + nativeEventRegistered?: boolean; + builtInEventRegistered?: boolean; +} + enum ExpandMode { NOT_EXPAND = 0, EXPAND = 1, LAZY_EXPAND = 2, } +enum EventQueryType { + ON_CLICK = 0, +} + class FrameNode { public _nodeId: number; protected _commonAttribute: ArkComponent; @@ -595,6 +606,25 @@ class FrameNode { return this.isModifiable() || getUINativeModule().frameNode.checkIfCanCrossLanguageAttributeSetting(this.getNodePtr()); } + getInteractionEventBindingInfo(eventType: EventQueryType): InteractionEventBindingInfo { + if (eventType === undefined || eventType === null) { + return undefined; + } + __JSScopeUtil__.syncInstanceId(this.instanceId_); + const eventBindingInfo = getUINativeModule().frameNode.getInteractionEventBindingInfo(this.getNodePtr(), eventType); + __JSScopeUtil__.restoreInstanceId(); + if (!eventBindingInfo || (!eventBindingInfo.baseEventRegistered && !eventBindingInfo.nodeEventRegistered && + !eventBindingInfo.nativeEventRegistered && !eventBindingInfo.builtInEventRegistered)) { + return undefined; + } + return { + baseEventRegistered: eventBindingInfo.baseEventRegistered, + nodeEventRegistered: eventBindingInfo.nodeEventRegistered, + nativeEventRegistered: eventBindingInfo.nativeEventRegistered, + builtInEventRegistered: eventBindingInfo.builtInEventRegistered, + }; + } + get commonAttribute(): ArkComponent { if (this._commonAttribute === undefined) { this._commonAttribute = new ArkComponent(this.nodePtr_, ModifierType.FRAME_NODE); diff --git a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js index fac8e12a8d0..d2dbcfd7489 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js +++ b/frameworks/bridge/declarative_frontend/engine/jsEnumStyle.js @@ -3908,4 +3908,9 @@ let AxisAction; AxisAction[AxisAction.UPDATE = 2] = 'UPDATE'; AxisAction[AxisAction.END = 3] = 'END'; AxisAction[AxisAction.CANCEL = 4] = 'CANCEL'; -})(AxisAction || (AxisAction = {})); \ No newline at end of file +})(AxisAction || (AxisAction = {})); + +let EventQueryType; +(function (EventQueryType) { + EventQueryType[EventQueryType.ON_CLICK = 0] = 'ON_CLICK'; +})(EventQueryType || (EventQueryType = {})); \ No newline at end of file diff --git a/frameworks/bridge/declarative_frontend/engine/jsXNode.js b/frameworks/bridge/declarative_frontend/engine/jsXNode.js index 78f275dfe31..fa80802ef88 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsXNode.js +++ b/frameworks/bridge/declarative_frontend/engine/jsXNode.js @@ -1238,6 +1238,24 @@ class FrameNode { checkIfCanCrossLanguageAttributeSetting() { return this.isModifiable() || getUINativeModule().frameNode.checkIfCanCrossLanguageAttributeSetting(this.getNodePtr()); } + getInteractionEventBindingInfo(eventType) { + if (eventType === undefined || eventType === null) { + return undefined; + } + __JSScopeUtil__.syncInstanceId(this.instanceId_); + const eventBindingInfo = getUINativeModule().frameNode.getInteractionEventBindingInfo(this.getNodePtr(), eventType); + __JSScopeUtil__.restoreInstanceId(); + if (!eventBindingInfo || (!eventBindingInfo.baseEventRegistered && !eventBindingInfo.nodeEventRegistered && + !eventBindingInfo.nativeEventRegistered && !eventBindingInfo.builtInEventRegistered)) { + return undefined; + } + return { + baseEventRegistered: eventBindingInfo.baseEventRegistered, + nodeEventRegistered: eventBindingInfo.nodeEventRegistered, + nativeEventRegistered: eventBindingInfo.nativeEventRegistered, + builtInEventRegistered: eventBindingInfo.builtInEventRegistered, + }; + } get commonAttribute() { if (this._commonAttribute === undefined) { this._commonAttribute = new ArkComponent(this.nodePtr_, ModifierType.FRAME_NODE); diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp index 0034b206d72..68cfa93ce80 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_impl_bridge.cpp @@ -4293,6 +4293,8 @@ void ArkUINativeModule::RegisterFrameNodeAttributes(Local obje frameNode->Set(vm, panda::StringRef::NewFromUtf8(vm, "setOnWaterFlowScrollIndex"), panda::FunctionRef::New(const_cast(vm), FrameNodeBridge::SetOnWaterFlowScrollIndex)); + frameNode->Set(vm, panda::StringRef::NewFromUtf8(vm, "getInteractionEventBindingInfo"), + panda::FunctionRef::New(const_cast(vm), FrameNodeBridge::GetInteractionEventBindingInfo)); object->Set(vm, panda::StringRef::NewFromUtf8(vm, "frameNode"), frameNode); } diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.cpp index 3c29c15426a..a03ed926ac2 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.cpp @@ -1945,6 +1945,29 @@ ArkUINativeModuleValue FrameNodeBridge::CheckIfCanCrossLanguageAttributeSetting( return panda::BooleanRef::New(vm, result); } +ArkUINativeModuleValue FrameNodeBridge::GetInteractionEventBindingInfo(ArkUIRuntimeCallInfo* runtimeCallInfo) +{ + EcmaVM* vm = runtimeCallInfo->GetVM(); + CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm)); + Local firstArg = runtimeCallInfo->GetCallArgRef(0); + CHECK_NULL_RETURN(!firstArg.IsNull(), panda::JSValueRef::Undefined(vm)); + auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value()); + CHECK_NULL_RETURN(nativeNode, panda::JSValueRef::Undefined(vm)); + Local secondArg = runtimeCallInfo->GetCallArgRef(1); + CHECK_NULL_RETURN(!secondArg.IsNull(), panda::JSValueRef::Undefined(vm)); + int eventQueryType = secondArg->ToNumber(vm)->Value(); + auto result = + GetArkUINodeModifiers()->getFrameNodeModifier()->getInteractionEventBindingInfo(nativeNode, eventQueryType); + const char* keys[] = { "baseEventRegistered", "nodeEventRegistered", "nativeEventRegistered", + "builtInEventRegistered" }; + Local values[] = { panda::BooleanRef::New(vm, result.baseEventRegistered), + panda::BooleanRef::New(vm, result.nodeEventRegistered), + panda::BooleanRef::New(vm, result.nativeEventRegistered), + panda::BooleanRef::New(vm, result.builtInEventRegistered) }; + auto obj = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values); + return obj; +} + ArkUINativeModuleValue FrameNodeBridge::AddSupportedStates(ArkUIRuntimeCallInfo* runtimeCallInfo) { EcmaVM* vm = runtimeCallInfo->GetVM(); diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h index 5b063105242..d0c36e3206d 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_frame_node_bridge.h @@ -134,6 +134,7 @@ public: static ArkUINativeModuleValue SetOnScrollDidScroll(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue SetOnGridScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo); static ArkUINativeModuleValue SetOnWaterFlowScrollIndex(ArkUIRuntimeCallInfo* runtimeCallInfo); + static ArkUINativeModuleValue GetInteractionEventBindingInfo(ArkUIRuntimeCallInfo* runtimeCallInfo); }; } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/base/ui_node.h b/frameworks/core/components_ng/base/ui_node.h index 1ce2b8f94e0..7efa988380b 100644 --- a/frameworks/core/components_ng/base/ui_node.h +++ b/frameworks/core/components_ng/base/ui_node.h @@ -60,6 +60,32 @@ enum class RootNodeType : int32_t { WINDOW_SCENE_ETS_TAG = 2 }; +struct InteractionEventBindingInfo { + bool baseEventRegistered = false; + bool nodeEventRegistered = false; + bool nativeEventRegistered = false; + bool builtInEventRegistered = false; + + void SetModifierEventRegistered(bool isCNode, bool state) + { + if (isCNode) { + nativeEventRegistered = state; + } else { + baseEventRegistered = state; + } + } + + void SetNodeEventRegistered(bool state) + { + nodeEventRegistered = state; + } + + void SetBuiltInEventRegistered(bool state) + { + builtInEventRegistered = state; + } +}; + class InspectorFilter; class PipelineContext; constexpr int32_t DEFAULT_NODE_SLOT = -1; @@ -925,6 +951,34 @@ public: return true; } + void SetModifierEventRegistrationState(bool isCNode, bool state) { + InteractionEventBindingInfo currentInfo = GetInteractionEventBindingInfo(); + currentInfo.SetModifierEventRegistered(isCNode, state); + SetInteractionEventBindingInfo(currentInfo); + } + + void SetNodeEventRegistrationState(bool state) { + InteractionEventBindingInfo currentInfo = GetInteractionEventBindingInfo(); + currentInfo.SetNodeEventRegistered(state); + SetInteractionEventBindingInfo(currentInfo); + } + + void SetBuiltInEventRegistrationState(bool state) { + InteractionEventBindingInfo currentInfo = GetInteractionEventBindingInfo(); + currentInfo.SetBuiltInEventRegistered(state); + SetInteractionEventBindingInfo(currentInfo); + } + + void SetInteractionEventBindingInfo(const InteractionEventBindingInfo &eventBindingInfo) + { + eventBindingInfo_ = eventBindingInfo; + } + + const InteractionEventBindingInfo& GetInteractionEventBindingInfo() const + { + return eventBindingInfo_; + } + protected: std::list>& ModifyChildren() { @@ -1041,6 +1095,7 @@ private: bool isAllowUseParentTheme_ = true; NodeStatus nodeStatus_ = NodeStatus::NORMAL_NODE; RootNodeType rootNodeType_ = RootNodeType::PAGE_ETS_TAG; + InteractionEventBindingInfo eventBindingInfo_; RefPtr exportTextureInfo_; int32_t instanceId_ = -1; int32_t apiVersion_ = 0; diff --git a/frameworks/core/components_ng/base/view_abstract.cpp b/frameworks/core/components_ng/base/view_abstract.cpp index 7ff9ac139a6..dc5f37211ac 100644 --- a/frameworks/core/components_ng/base/view_abstract.cpp +++ b/frameworks/core/components_ng/base/view_abstract.cpp @@ -1015,6 +1015,9 @@ void ViewAbstract::DisableOnClick(FrameNode* frameNode) auto gestureHub = frameNode->GetOrCreateGestureEventHub(); CHECK_NULL_VOID(gestureHub); gestureHub->ClearUserOnClick(); + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), false); } void ViewAbstract::DisableOnDragStart(FrameNode* frameNode) @@ -1181,6 +1184,10 @@ void ViewAbstract::SetOnClick(GestureEventFunc&& clickEventFunc, double distance auto focusHub = frameNode->GetOrCreateFocusHub(); CHECK_NULL_VOID(focusHub); focusHub->SetFocusable(true, false); + + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), true); } void ViewAbstract::SetOnGestureJudgeBegin(GestureJudgeFunc&& gestureJudgeFunc) @@ -4588,6 +4595,10 @@ void ViewAbstract::SetOnClick(FrameNode* frameNode, GestureEventFunc&& clickEven auto focusHub = frameNode->GetOrCreateFocusHub(); CHECK_NULL_VOID(focusHub); focusHub->SetFocusable(true, false); + + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), true); } void ViewAbstract::SetOnTouch(FrameNode* frameNode, TouchEventFunc &&touchEventFunc) @@ -5362,6 +5373,9 @@ void ViewAbstract::SetJSFrameNodeOnClick(FrameNode* frameNode, GestureEventFunc& auto focusHub = frameNode->GetOrCreateFocusHub(); CHECK_NULL_VOID(focusHub); focusHub->SetFocusable(true, false); + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetNodeEventRegistrationState(true); } void ViewAbstract::ClearJSFrameNodeOnClick(FrameNode* frameNode) diff --git a/frameworks/core/components_ng/event/gesture_event_hub.cpp b/frameworks/core/components_ng/event/gesture_event_hub.cpp index a7dca455211..87d3513bfaa 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -560,6 +560,10 @@ void GestureEventHub::AddClickEvent(const RefPtr& clickEvent) clickEventActuator_->AddClickEvent(clickEvent); SetFocusClickEvent(clickEventActuator_->GetClickEvent()); + + auto uiNode = AceType::DynamicCast(GetFrameNode()); + CHECK_NULL_VOID(uiNode); + uiNode->SetBuiltInEventRegistrationState(true); } void GestureEventHub::AddClickAfterEvent(const RefPtr& clickEvent) diff --git a/frameworks/core/components_ng/pattern/text/text_model_ng.cpp b/frameworks/core/components_ng/pattern/text/text_model_ng.cpp index 84677976aeb..5644ddd9288 100644 --- a/frameworks/core/components_ng/pattern/text/text_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/text/text_model_ng.cpp @@ -423,6 +423,9 @@ void TextModelNG::SetOnClick(std::function&& click, d auto textPattern = frameNode->GetPattern(); CHECK_NULL_VOID(textPattern); textPattern->SetOnClickEvent(std::move(clickFunc), distanceThreshold); + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), true); } void TextModelNG::ClearOnClick() @@ -1012,6 +1015,9 @@ void TextModelNG::SetOnClick(FrameNode* frameNode, GestureEventFunc&& click) auto textPattern = frameNode->GetPattern(); CHECK_NULL_VOID(textPattern); textPattern->SetOnClickEvent(std::move(click)); + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), true); } void TextModelNG::ClearOnClick(FrameNode* frameNode) @@ -1020,6 +1026,9 @@ void TextModelNG::ClearOnClick(FrameNode* frameNode) auto textPattern = frameNode->GetPattern(); CHECK_NULL_VOID(textPattern); textPattern->SetOnClickEvent(nullptr); + auto* uiNode = reinterpret_cast(frameNode); + CHECK_NULL_VOID(uiNode); + uiNode->SetModifierEventRegistrationState(uiNode->IsCNode(), false); } void TextModelNG::SetOnDetectResultUpdate(FrameNode* frameNode, std::function&& onResult) diff --git a/frameworks/core/interfaces/arkoala/arkoala_api.h b/frameworks/core/interfaces/arkoala/arkoala_api.h index abaddfee97d..61dc074b8a3 100644 --- a/frameworks/core/interfaces/arkoala/arkoala_api.h +++ b/frameworks/core/interfaces/arkoala/arkoala_api.h @@ -1917,6 +1917,13 @@ struct ArkUIImageResizableSlice { ArkUI_Float32 bottom; }; +struct EventBindingInfo { + bool baseEventRegistered; + bool nodeEventRegistered; + bool nativeEventRegistered; + bool builtInEventRegistered; +}; + struct ArkUICommonModifier { void (*setBackgroundColor)(ArkUINodeHandle node, ArkUI_Uint32 color); void (*resetBackgroundColor)(ArkUINodeHandle node); @@ -5822,6 +5829,7 @@ struct ArkUIFrameNodeModifier { ArkUI_Bool (*getCrossLanguageOptions)(ArkUINodeHandle node); ArkUI_Bool (*checkIfCanCrossLanguageAttributeSetting)(ArkUINodeHandle node); void (*setKeyProcessingMode)(ArkUI_Int32 instanceId, ArkUI_Int32 mode); + EventBindingInfo (*getInteractionEventBindingInfo)(ArkUINodeHandle node, int type); }; struct ArkUINodeContentEvent { diff --git a/frameworks/core/interfaces/native/node/frame_node_modifier.cpp b/frameworks/core/interfaces/native/node/frame_node_modifier.cpp index e2078d16cd0..3997cfe99b1 100644 --- a/frameworks/core/interfaces/native/node/frame_node_modifier.cpp +++ b/frameworks/core/interfaces/native/node/frame_node_modifier.cpp @@ -32,6 +32,10 @@ enum class ExpandMode : uint32_t { LAZY_EXPAND, }; +enum EventQueryType { + ON_CLICK = 0, +}; + ArkUI_Bool IsModifiable(ArkUINodeHandle node) { auto* currentNode = reinterpret_cast(node); @@ -611,6 +615,22 @@ ArkUI_Bool CheckIfCanCrossLanguageAttributeSetting(ArkUINodeHandle node) return currentNode -> IsCNode() ? currentNode->isCrossLanguageAttributeSetting() : false; } +EventBindingInfo GetInteractionEventBindingInfo(ArkUINodeHandle node, int eventType) +{ + auto* currentNode = reinterpret_cast(node); + EventBindingInfo bindingInfo {}; + CHECK_NULL_RETURN(currentNode, bindingInfo); + if (eventType != EventQueryType::ON_CLICK) { + return bindingInfo; + } + auto info = currentNode->GetInteractionEventBindingInfo(); + bindingInfo.baseEventRegistered = info.baseEventRegistered; + bindingInfo.nodeEventRegistered = info.nodeEventRegistered; + bindingInfo.nativeEventRegistered= info.nativeEventRegistered; + bindingInfo.builtInEventRegistered= info.builtInEventRegistered; + return bindingInfo; +} + ArkUI_Int32 SetSystemFontStyleChangeEvent(ArkUINodeHandle node, void* userData, void* onFontStyleChange) { auto* frameNode = reinterpret_cast(node); @@ -983,6 +1003,7 @@ const ArkUIFrameNodeModifier* GetFrameNodeModifier() .getCrossLanguageOptions = GetCrossLanguageOptions, .checkIfCanCrossLanguageAttributeSetting = CheckIfCanCrossLanguageAttributeSetting, .setKeyProcessingMode = SetKeyProcessingMode, + .getInteractionEventBindingInfo = GetInteractionEventBindingInfo, }; CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line return &modifier; -- Gitee