diff --git a/frameworks/core/common/event_manager.cpp b/frameworks/core/common/event_manager.cpp index cdbadf5445f6fbc6bb9d0d9f9afcdfc9150ce003..bb61ff1bb7780f92ba8b09bde425bf235c4deef8 100644 --- a/frameworks/core/common/event_manager.cpp +++ b/frameworks/core/common/event_manager.cpp @@ -616,6 +616,15 @@ EventManager::EventManager() LOGD("EventManger Constructor."); refereeNG_ = AceType::MakeRefPtr(); referee_ = AceType::MakeRefPtr(); + + auto callback = [weak = WeakClaim(this)](size_t touchId) -> bool { + auto eventManager = weak.Upgrade(); + CHECK_NULL_RETURN(eventManager, false); + auto refereeNG = eventManager->refereeNG_; + CHECK_NULL_RETURN(refereeNG, false); + return refereeNG->HasGestureAccepted(touchId); + }; + referee_->SetQueryStateFunc(std::move(callback)); } } // namespace OHOS::Ace diff --git a/frameworks/core/components_ng/gestures/gesture_referee.cpp b/frameworks/core/components_ng/gestures/gesture_referee.cpp index 1b8c3d4cd5235f04863293db47a4bdf5f200207f..823e3f3cfe386a38f7f4e64dd110d9b6b342e9fc 100644 --- a/frameworks/core/components_ng/gestures/gesture_referee.cpp +++ b/frameworks/core/components_ng/gestures/gesture_referee.cpp @@ -69,6 +69,7 @@ bool GestureScope::CheckNeedBlocked(const RefPtr& recognize void GestureScope::OnAcceptGesture(const RefPtr& recognizer) { + hasGestureAccepted_ = true; for (const auto& weak : recognizers_) { auto gesture = weak.Upgrade(); if (gesture == recognizer) { @@ -272,4 +273,17 @@ void GestureReferee::HandleRejectDisposal(const RefPtr& rec } } +bool GestureReferee::HasGestureAccepted(size_t touchId) const +{ + const auto& iter = gestureScopes_.find(touchId); + if (iter == gestureScopes_.end()) { + LOGI("gesture scope is not exist"); + return false; + } + + const auto& scope = iter->second; + CHECK_NULL_RETURN(scope, false); + return scope->HasGestureAccepted(); +} + } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/gestures/gesture_referee.h b/frameworks/core/components_ng/gestures/gesture_referee.h index 11480d4f2a0d7c15e28d755fdf7eb459146b40a6..e0b815546b5f2cbfb0dc01f6c7f55a1c5984ef82 100644 --- a/frameworks/core/components_ng/gestures/gesture_referee.h +++ b/frameworks/core/components_ng/gestures/gesture_referee.h @@ -71,12 +71,18 @@ public: isDelay_ = true; } + bool HasGestureAccepted() const + { + return hasGestureAccepted_; + } + private: bool Existed(const RefPtr& recognizer); std::list> recognizers_; size_t touchId_ = 0; bool isDelay_ = false; + bool hasGestureAccepted_ = false; }; class GestureReferee : public virtual AceType { @@ -95,6 +101,8 @@ public: // or reject) void Adjudicate(const RefPtr& recognizer, GestureDisposal disposal); + bool HasGestureAccepted(size_t touchId) const; + private: void HandleAcceptDisposal(const RefPtr& recognizer); void HandlePendingDisposal(const RefPtr& recognizer); diff --git a/frameworks/core/components_ng/pattern/form/form_node.cpp b/frameworks/core/components_ng/pattern/form/form_node.cpp index 9a5128424ab4742c05cfeca3d0687a4b2e06b63d..264a01450200e611006739843c04de2e643d55f0 100644 --- a/frameworks/core/components_ng/pattern/form/form_node.cpp +++ b/frameworks/core/components_ng/pattern/form/form_node.cpp @@ -45,7 +45,7 @@ HitTestResult FormNode::TouchTest(const PointF& globalPoint, const PointF& paren context->SetTouchPipeline(WeakPtr(subContext)); } - return HitTestResult::STOP_BUBBLING; + return HitTestResult::BUBBLING; } RefPtr FormNode::GetOrCreateFormNode( diff --git a/frameworks/core/gestures/gesture_referee.cpp b/frameworks/core/gestures/gesture_referee.cpp index eea5d133a28a53165b4278fe4f960cff7768a84f..286776c73b4d366f47b5514454a54efd7edb35c2 100644 --- a/frameworks/core/gestures/gesture_referee.cpp +++ b/frameworks/core/gestures/gesture_referee.cpp @@ -120,6 +120,12 @@ void GestureScope::HandleParallelDisposal(const RefPtr& recog void GestureScope::HandleAcceptDisposal(const RefPtr& recognizer) { + if (queryStateFunc_ && queryStateFunc_(touchId_)) { + LOGI("gesture has accepted in NG."); + recognizer->SetRefereeState(RefereeState::FAIL); + return; + } + if (CheckNeedBlocked(recognizer)) { LOGI("gesture referee ready to notify block for %{public}s", AceType::TypeName(recognizer)); recognizer->SetRefereeState(RefereeState::BLOCKED); @@ -132,6 +138,12 @@ void GestureScope::HandleAcceptDisposal(const RefPtr& recogni void GestureScope::HandlePendingDisposal(const RefPtr& recognizer) { + if (queryStateFunc_ && queryStateFunc_(touchId_)) { + LOGI("gesture has accepted in NG."); + recognizer->SetRefereeState(RefereeState::FAIL); + return; + } + if (CheckNeedBlocked(recognizer)) { LOGI("gesture referee ready to notify block for %{public}s", AceType::TypeName(recognizer)); recognizer->SetRefereeState(RefereeState::BLOCKED); @@ -368,6 +380,7 @@ void GestureReferee::AddGestureRecognizer(size_t touchId, const RefPtr #include #include @@ -52,6 +53,11 @@ public: bool IsPending() const; + void SetQueryStateFunc(const std::function& queryStateFunc) + { + queryStateFunc_ = queryStateFunc; + } + private: bool Existed(const RefPtr& recognizer); const std::list>& GetMembersByRecognizer(const RefPtr& recognizer); @@ -69,6 +75,8 @@ private: std::list> highRecognizers_; std::list> lowRecognizers_; std::list> parallelRecognizers_; + + std::function queryStateFunc_; }; class GestureReferee : public virtual AceType { @@ -93,9 +101,16 @@ public: // or reject) void Adjudicate(size_t touchId, const RefPtr& recognizer, GestureDisposal disposal); + void SetQueryStateFunc(std::function&& queryStateFunc) + { + queryStateFunc_ = queryStateFunc; + } + private: // Stores gesture recognizer collection according to Id. std::unordered_map gestureScopes_; + + std::function queryStateFunc_; }; } // namespace OHOS::Ace