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 c491dbc5269ce0efa2e0a333adc26cb0816a16eb..073428e90b090952b29d060e8335fc829d1d7eb4 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 @@ -410,6 +410,12 @@ void DragDropManager::OnDragStart(const Point& point, const RefPtr& f draggedFrameNode_ = preTargetFrameNode_; } +void DragDropManager::OnDragStart(const Point& point) +{ + dragDropState_ = DragDropMgrState::DRAGGING; + NotifyDragFrameNode(point, DragEventType::START); +} + void DragDropManager::PrintDragFrameNode(const Point& point, const RefPtr& dragFrameNode) { CHECK_NULL_VOID(dragFrameNode); 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 d7abc796f849b586164bd9845e198c06c80aeb6b..0d21344d06c62c8cfd6752e3b8065ffac6b400c5 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 @@ -73,6 +73,7 @@ public: } void UpdateDragWindowPosition(int32_t globalX, int32_t globalY); + void OnDragStart(const Point& point); void OnDragStart(const Point& point, const RefPtr& frameNode); void OnDragMove(const PointerEvent& pointerEvent, const std::string& extraInfo); void OnDragEnd(const PointerEvent& pointerEvent, const std::string& extraInfo); diff --git a/frameworks/core/gestures/gesture_info.h b/frameworks/core/gestures/gesture_info.h index 3cac908bb666ace64e58dcc0ab63fbef1a7b74e7..6e92dec63735bcd5283bd8ac9ddb0eb0c933bb0a 100644 --- a/frameworks/core/gestures/gesture_info.h +++ b/frameworks/core/gestures/gesture_info.h @@ -105,6 +105,7 @@ enum class DragEventAction { DRAG_EVENT_MOVE, DRAG_EVENT_END, DRAG_EVENT_OUT, + DRAG_EVENT_START_FOR_CONTROLLER, }; enum class InputEventType { diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 3e1e8589e2ec86ec56a1934a23bf3c4d9070c901..25c3f19f9af64df5b57b30388705acd6528819ba 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -2340,6 +2340,10 @@ void PipelineContext::OnDragEvent(const PointerEvent& pointerEvent, DragEventAct return; } } + if (action == DragEventAction::DRAG_EVENT_START_FOR_CONTROLLER) { + manager->OnDragStart(pointerEvent.GetPoint()); + return; + } if (action == DragEventAction::DRAG_EVENT_OUT) { manager->ClearSummary(); manager->ClearExtraInfo(); diff --git a/interfaces/napi/kits/drag_controller/BUILD.gn b/interfaces/napi/kits/drag_controller/BUILD.gn index eda2cd7f931130b18d8bf8380950a26dbdd3cb39..0a2fed14aad041cfb20dd7ae563c007e605e3be0 100644 --- a/interfaces/napi/kits/drag_controller/BUILD.gn +++ b/interfaces/napi/kits/drag_controller/BUILD.gn @@ -76,6 +76,7 @@ template("napi_dragcontroller_static") { if (defined(global_parts_info.distributeddatamgr_udmf)) { external_deps += [ "udmf:udmf_client" ] external_deps += [ "udmf:udmf_data_napi" ] + external_deps += [ "napi:ace_container_scope" ] } external_deps += [ "kv_store:distributeddata_inner" ] } diff --git a/interfaces/napi/kits/drag_controller/js_drag_controller.cpp b/interfaces/napi/kits/drag_controller/js_drag_controller.cpp index d59fd15c2cbb2babbfe29a6512efc58c9471acd4..c6bf533ba07fe47ce60d0bf547babd992ace42af 100644 --- a/interfaces/napi/kits/drag_controller/js_drag_controller.cpp +++ b/interfaces/napi/kits/drag_controller/js_drag_controller.cpp @@ -41,6 +41,7 @@ #include "bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h" #include "bridge/js_frontend/engine/jsi/ark_js_runtime.h" #include "core/common/ace_engine.h" +#include "core/common/container_scope.h" #include "core/common/udmf/udmf_client.h" #include "core/event/ace_events.h" #include "frameworks/bridge/common/utils/engine_helper.h" @@ -289,6 +290,31 @@ void HandleFail(DragControllerAsyncCtx* asyncCtx, int32_t errorCode) } } +void HandleOnDragStart(DragControllerAsyncCtx* asyncCtx) +{ + ContainerScope scope(asyncCtx->instanceId); + auto container = Container::Current(); + if (!container) { + LOGW("container is null"); + return; + } + auto pipelineContext = container->GetPipelineContext(); + if (!pipelineContext) { + LOGW("pipelineContext is null!"); + return; + } + auto taskExecutor = container->GetTaskExecutor(); + if (!taskExecutor) { + LOGW("taskExecutor is null!"); + return; + } + taskExecutor->PostTask( + [globalX = asyncCtx->globalX, globalY = asyncCtx->globalY, context = pipelineContext]() { + context->OnDragEvent({ globalX, globalY }, DragEventAction::DRAG_EVENT_START_FOR_CONTROLLER); + }, + TaskExecutor::TaskType::UI); +} + void OnMultipleComplete(DragControllerAsyncCtx* asyncCtx) { auto container = AceEngine::Get().GetContainer(asyncCtx->instanceId); @@ -368,6 +394,10 @@ void OnMultipleComplete(DragControllerAsyncCtx* asyncCtx) if (asyncCtx->dragState == DragState::SENDING) { asyncCtx->dragState = DragState::SUCCESS; Msdp::DeviceStatus::InteractionManager::GetInstance()->SetDragWindowVisible(true); + napi_handle_scope scope = nullptr; + napi_open_handle_scope(asyncCtx->env, &scope); + HandleOnDragStart(asyncCtx); + napi_close_handle_scope(asyncCtx->env, scope); } }, TaskExecutor::TaskType::JS); @@ -445,6 +475,10 @@ void OnComplete(DragControllerAsyncCtx* asyncCtx) if (asyncCtx->dragState == DragState::SENDING) { asyncCtx->dragState = DragState::SUCCESS; Msdp::DeviceStatus::InteractionManager::GetInstance()->SetDragWindowVisible(true); + napi_handle_scope scope = nullptr; + napi_open_handle_scope(asyncCtx->env, &scope); + HandleOnDragStart(asyncCtx); + napi_close_handle_scope(asyncCtx->env, scope); } } },