diff --git a/frameworks/core/components_ng/event/gesture_event_hub_drag.cpp b/frameworks/core/components_ng/event/gesture_event_hub_drag.cpp index a0472b1021c30ec56119bbf519df6ad2e01f37cd..177ed63dee7e9a53606105ed08ad4cc1b1b594ce 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub_drag.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub_drag.cpp @@ -628,6 +628,22 @@ void GestureEventHub::HandleOnDragStart(const GestureEvent& info) */ DragDropInfo dragPreviewInfo; auto dragDropInfo = GetDragDropInfo(info, frameNode, dragPreviewInfo, event); + auto callAnsyncEnd = [weak = WeakClaim(this)](DragStartRequestStatus dragStatus) { + LOGI("acedrag 3"); + if (dragStatus == DragStartRequestStatus::WAITING) { + auto gestureEventHub = weak.Upgrade(); + CHECK_NULL_VOID(gestureEventHub); + LOGI("acedrag 4"); + auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck(); + CHECK_NULL_VOID(pipeline); + LOGI("acedrag 5"); + auto eventHub = gestureEventHub->eventHub_.Upgrade(); + CHECK_NULL_VOID(eventHub); + LOGI("acedrag 6"); + gestureEventHub->FireCustomerOnDragEnd(pipeline, eventHub); + LOGI("acedrag 9"); + } + }; auto continueFunc = [id = Container::CurrentId(), weak = WeakClaim(this), dragPreviewInfo, info, event, dragDropInfo, frameNode, pipeline]() { ContainerScope scope(id); @@ -644,6 +660,7 @@ void GestureEventHub::HandleOnDragStart(const GestureEvent& info) DoOnDragStartHandling(info, frameNode, dragDropInfo, event, dragPreviewInfo, pipeline); } else { dragDropManager->SetDelayDragCallBack(continueFunc); + dragDropManager->SetCallAnsyncEnd(callAnsyncEnd); TAG_LOGI(AceLogTag::ACE_DRAG, "drag start pended"); } } @@ -1459,7 +1476,9 @@ void GestureEventHub::FireCustomerOnDragEnd(const RefPtr& context, dragDropManager->SetDraggingPressedState(false); dragDropManager->ResetDragPreviewInfo(); eventHub->FireCustomerOnDragFunc(DragFuncType::DRAG_END, dragEvent); + LOGI("acedrag 7"); if (eventHub->HasOnDragEnd()) { + LOGI("acedrag 8"); (eventHub->GetOnDragEnd())(dragEvent); } } diff --git a/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.cpp b/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.cpp index 2a105a8068d7d89b0903856e411c6975d5ebf5a1..51aea6483e1ce0a086a467124613f6569ab8e1e3 100644 --- a/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.cpp +++ b/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.cpp @@ -77,6 +77,18 @@ void DragDropGlobalController::SetAsyncDragCallback(std::function asyncD asyncDragCallback_ = asyncDragCallbac; } +void DragDropGlobalController::SetCallAnsyncEnd(std::function callSyncEnd) +{ + std::unique_lock lock(mutex_); + callSyncEnd_ = callSyncEnd; +} + +std::function DragDropGlobalController::GetCallAnsyncEnd() +{ + std::shared_lock lock(mutex_); + return callSyncEnd_; +} + std::function DragDropGlobalController::GetAsyncDragCallback() { std::shared_lock lock(mutex_); diff --git a/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.h b/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.h index 94f49bf42c561367fe7a8106f073a3309a92a1e9..17805a5c4ff84042310a517308aff1620c5b2c53 100644 --- a/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.h +++ b/frameworks/core/components_ng/manager/drag_drop/drag_drop_global_controller.h @@ -70,6 +70,10 @@ public: void SetAsyncDragCallback(std::function asyncDragCallbac); std::function GetAsyncDragCallback(); + + void SetCallAnsyncEnd(std::function callSyncEnd); + + std::function GetCallAnsyncEnd(); private: DragDropGlobalController() = default; @@ -87,6 +91,7 @@ private: DragStartRequestStatus dragStartRequestStatus_{DragStartRequestStatus::READY}; std::function asyncDragCallback_; + std::function callSyncEnd_; // use for async on drop bool isOnOnDropPhase_ = false; diff --git a/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.cpp b/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.cpp index 5c37648fc35670a624ffa967a9161c39b4bcb356..b944016e2ff7e1bd89e00d9d702a02ef81398d71 100644 --- a/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.cpp +++ b/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.cpp @@ -131,6 +131,11 @@ void DragDropManager::SetDelayDragCallBack(const std::function& cb) noex DragDropGlobalController::GetInstance().SetAsyncDragCallback(cb); } +void DragDropManager::SetCallAnsyncEnd(const std::function& cb) +{ + DragDropGlobalController::GetInstance().SetCallAnsyncEnd(cb); +} + void DragDropManager::ExecuteDeadlineTimer() { auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck(); @@ -946,6 +951,15 @@ void DragDropManager::HandleDragEvent(const DragPointerEvent& pointerEvent, Drag } } +void DragDropManager::onDragEnd() +{ + LOGI("acedrag 1"); + if (DragDropGlobalController::GetInstance().GetCallAnsyncEnd()) { + LOGI("acedrag 2"); + DragDropGlobalController::GetInstance().GetCallAnsyncEnd()(DragStartRequestStatus::WAITING); + } +} + bool DragDropManager::isDistanceLimited(const Point& point) { auto distance = sqrt(pow(point.GetX() - preMovePoint_.GetX(), 2) + pow(point.GetY() - preMovePoint_.GetY(), 2)); diff --git a/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h b/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h index cc738d1733d1453b39cf4a38b36150fcf81e4038..fcfb5d9ba05a350c3e21a77cea57a5fb4d9e3c21 100644 --- a/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h +++ b/frameworks/core/components_ng/manager/drag_drop/drag_drop_manager.h @@ -166,6 +166,8 @@ public: const RefPtr& node = nullptr); void OnTextDragEnd(float globalX, float globalY, const std::string& extraInfo); void onDragCancel(); + void onDragEnd(); + void SetCallAnsyncEnd(const std::function& cb); void OnItemDragStart(float globalX, float globalY, const RefPtr& frameNode); void OnItemDragMove(float globalX, float globalY, int32_t draggedIndex, DragType dragType); void OnItemDragEnd(float globalX, float globalY, int32_t draggedIndex, DragType dragType); diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 043cf02897c21130cd9f6da4be608210ca911f6d..ce4345f6c9352c72a884e69bfb19bc4619a221d5 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -4759,6 +4759,9 @@ void PipelineContext::NotifyDragOnHide() auto manager = GetDragDropManager(); CHECK_NULL_VOID(manager); manager->HandlePipelineOnHide(); + LOGI("acedrag begin"); + manager->onDragEnd(); + LOGI("acedrag end"); } void PipelineContext::CompensatePointerMoveEvent(const DragPointerEvent& event, const RefPtr& node)