From 0ea8f7da48bbddcb9dab16e1223479310db55ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E6=B0=B8=E5=87=AF?= Date: Wed, 18 Jun 2025 21:15:05 +0800 Subject: [PATCH] cross process add replaceDelegate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: 刘永凯 --- frameworks/core/common/event_manager.cpp | 19 +++++- frameworks/core/common/event_manager.h | 4 +- .../dynamic_component/dynamic_node.cpp | 2 +- .../ui_extension_node.cpp | 2 +- .../core/event/event_manager_test_ng_two.cpp | 62 +++++++++++++++++++ 5 files changed, 84 insertions(+), 5 deletions(-) diff --git a/frameworks/core/common/event_manager.cpp b/frameworks/core/common/event_manager.cpp index 2c7c1caa638..f91713e73d7 100644 --- a/frameworks/core/common/event_manager.cpp +++ b/frameworks/core/common/event_manager.cpp @@ -2506,11 +2506,26 @@ void EventManager::DumpEventWithCount(const std::vector& params, NG } } -TouchDelegateHdl EventManager::RegisterTouchDelegate(const int32_t touchId, const RefPtr delegater) +TouchDelegateHdl EventManager::AddTouchDelegate(const int32_t touchId, const RefPtr delegater) { touchDelegatesMap_[touchId].emplace_back(delegater); TouchDelegatesIter iter = std::prev(touchDelegatesMap_[touchId].end()); - LOGD("RegisterTouchDelegate successful"); + LOGD("AddTouchDelegate successful"); + TouchDelegateHdl handler(touchId, iter); + return handler; +} + +TouchDelegateHdl EventManager::ReplaceTouchDelegate(const int32_t touchId, const RefPtr delegater) +{ + if (touchDelegatesMap_.find(touchId) == touchDelegatesMap_.end() || touchDelegatesMap_[touchId].empty()) { + touchDelegatesMap_[touchId].emplace_back(delegater); + } else { + LOGD("swap touchDelegatesMap %{public}d", touchId); + touchDelegatesMap_[touchId].clear(); + touchDelegatesMap_[touchId].emplace_back(delegater); + } + TouchDelegatesIter iter = std::prev(touchDelegatesMap_[touchId].end()); + LOGD("ReplaceTouchDelegate successful"); TouchDelegateHdl handler(touchId, iter); return handler; } diff --git a/frameworks/core/common/event_manager.h b/frameworks/core/common/event_manager.h index dc1e3191924..f2d3aadf4a7 100644 --- a/frameworks/core/common/event_manager.h +++ b/frameworks/core/common/event_manager.h @@ -369,7 +369,9 @@ public: std::unordered_map touchDelegatesMap_; - TouchDelegateHdl RegisterTouchDelegate(const int32_t touchId, const RefPtr delegater); + TouchDelegateHdl AddTouchDelegate(const int32_t touchId, const RefPtr delegater); + + TouchDelegateHdl ReplaceTouchDelegate(const int32_t touchId, const RefPtr delegater); void UnregisterTouchDelegate(TouchDelegateHdl handler); diff --git a/frameworks/core/components_ng/pattern/ui_extension/dynamic_component/dynamic_node.cpp b/frameworks/core/components_ng/pattern/ui_extension/dynamic_component/dynamic_node.cpp index 848a9a57d53..5cad9ca7e0a 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/dynamic_component/dynamic_node.cpp +++ b/frameworks/core/components_ng/pattern/ui_extension/dynamic_component/dynamic_node.cpp @@ -84,7 +84,7 @@ HitTestResult DynamicNode::TouchTest(const PointF& globalPoint, const PointF& pa auto eventManager = context->GetEventManager(); CHECK_NULL_RETURN(eventManager, testResult); auto delegate = AceType::MakeRefPtr(pattern); - eventManager->RegisterTouchDelegate(touchRestrict.touchEvent.id, delegate); + eventManager->ReplaceTouchDelegate(touchRestrict.touchEvent.id, delegate); return testResult; } } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_component/ui_extension_node.cpp b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_component/ui_extension_node.cpp index 542cf7b29b7..618d6100eb5 100644 --- a/frameworks/core/components_ng/pattern/ui_extension/ui_extension_component/ui_extension_node.cpp +++ b/frameworks/core/components_ng/pattern/ui_extension/ui_extension_component/ui_extension_node.cpp @@ -74,7 +74,7 @@ HitTestResult UIExtensionNode::TouchTest(const PointF& globalPoint, const PointF auto eventManager = context->GetEventManager(); CHECK_NULL_RETURN(eventManager, testResult); auto delegate = AceType::MakeRefPtr(pattern); - eventManager->RegisterTouchDelegate(touchRestrict.touchEvent.id, delegate); + eventManager->ReplaceTouchDelegate(touchRestrict.touchEvent.id, delegate); return testResult; } } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/event/event_manager_test_ng_two.cpp b/test/unittest/core/event/event_manager_test_ng_two.cpp index 2a69fe47012..3a4c7e69f8a 100644 --- a/test/unittest/core/event/event_manager_test_ng_two.cpp +++ b/test/unittest/core/event/event_manager_test_ng_two.cpp @@ -18,7 +18,14 @@ using namespace testing; using namespace testing::ext; namespace OHOS::Ace::NG { +constexpr int TOUCH_ID = 0; +class TouchDelegateTest : public TouchDelegate { + void DelegateTouchEvent(const TouchEvent& point) + { + return; + }; +}; /** * @tc.name: ExecuteTouchTestDoneCallbackTest001 * @tc.desc: Test ExecuteTouchTestDoneCallbackTest function. @@ -260,4 +267,59 @@ HWTEST_F(EventManagerTestNg, ExecuteTouchTestDoneCallbackTest008, TestSize.Level eventManager->ExecuteTouchTestDoneCallback(axisEvent, responseLinkRecognizers); EXPECT_FALSE(eventManager->onTouchTestDoneFrameNodeList_.empty()); } + +/** + * @tc.name: AddTouchDelegate001 + * @tc.desc: Test AddTouchDelegate function. + * @tc.type: FUNC + */ +HWTEST_F(EventManagerTestNg, AddTouchDelegate001, TestSize.Level1) +{ + /** + * @tc.steps: step1. Create eventManager, delegate. + * @tc.expected: recognizers is not null and axis direction is correct. + */ + auto eventManager = AceType::MakeRefPtr(); + ASSERT_NE(eventManager, nullptr); + auto delegate = AceType::MakeRefPtr(); + ASSERT_NE(delegate, nullptr); + + /** + * @tc.steps: step2. Call AddTouchDelegate twice. + * @tc.expected: touchDelegatesMap_ is not empty and size is 2. + */ + eventManager->AddTouchDelegate(TOUCH_ID, delegate); + eventManager->AddTouchDelegate(TOUCH_ID, delegate); + EXPECT_FALSE(eventManager->touchDelegatesMap_.empty()); + EXPECT_EQ(eventManager->touchDelegatesMap_[TOUCH_ID].size(), 2); + + /** + * @tc.steps: step3. Call ReplaceTouchDelegate. + * @tc.expected: touchDelegatesMap_ is not empty and size is 1. + */ + eventManager->ReplaceTouchDelegate(TOUCH_ID, delegate); + EXPECT_FALSE(eventManager->touchDelegatesMap_.empty()); + EXPECT_EQ(eventManager->touchDelegatesMap_[TOUCH_ID].size(), 1); + + /** + * @tc.steps: step4. Call ReplaceTouchDelegate when eventManager->touchDelegatesMap_ is empty. + * @tc.expected: touchDelegatesMap_ is not empty and size is 1. + */ + eventManager->UnregisterTouchDelegate(TOUCH_ID); + EXPECT_TRUE(eventManager->touchDelegatesMap_.empty()); + eventManager->ReplaceTouchDelegate(TOUCH_ID, delegate); + EXPECT_FALSE(eventManager->touchDelegatesMap_.empty()); + EXPECT_EQ(eventManager->touchDelegatesMap_[TOUCH_ID].size(), 1); + + /** + * @tc.steps: step5. Call ReplaceTouchDelegate when eventManager->touchDelegatesMap_[TOUCH_ID] is empty. + * @tc.expected: touchDelegatesMap_ is not empty and size is 1. + */ + eventManager->touchDelegatesMap_[TOUCH_ID].clear(); + EXPECT_FALSE(eventManager->touchDelegatesMap_.empty()); + EXPECT_TRUE(eventManager->touchDelegatesMap_[TOUCH_ID].empty()); + eventManager->ReplaceTouchDelegate(TOUCH_ID, delegate); + EXPECT_FALSE(eventManager->touchDelegatesMap_.empty()); + EXPECT_EQ(eventManager->touchDelegatesMap_[TOUCH_ID].size(), 1); +} } // namespace OHOS::Ace::NG \ No newline at end of file -- Gitee