From cb4e5faf06cd84c123c2ee53ca46ff825e191744 Mon Sep 17 00:00:00 2001 From: hct95 Date: Mon, 6 Nov 2023 02:03:43 +0000 Subject: [PATCH] =?UTF-8?q?=E6=8B=96=E6=8B=BD=E8=BF=87=E7=A8=8B=E4=B8=AD?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=8B=96=E6=8B=BD=E6=A1=86=E6=9E=B6=E4=BC=A0?= =?UTF-8?q?=E8=BE=93summary=E4=BF=A1=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: hct95 Change-Id: Ibce166aa08f4cab84bab4acfb8764bdc97afd4b4 --- .../interaction/interaction_impl.cpp | 12 +++++++++- .../capability/interaction/interaction_impl.h | 4 ++++ .../common/interaction/interaction_data.h | 1 + .../interaction/interaction_interface.h | 4 ++++ .../components_ng/event/gesture_event_hub.cpp | 12 +++++++--- .../manager/drag_drop/drag_drop_manager.cpp | 22 +++++++------------ .../manager/drag_drop/drag_drop_proxy.cpp | 4 ++++ .../core/pipeline_ng/pipeline_context.cpp | 9 +++----- .../drag_controller/js_drag_controller.cpp | 2 +- .../core/common/mock_interaction_interface.h | 4 ++++ 10 files changed, 49 insertions(+), 25 deletions(-) diff --git a/adapter/ohos/capability/interaction/interaction_impl.cpp b/adapter/ohos/capability/interaction/interaction_impl.cpp index e17554c6487..10e457b824c 100644 --- a/adapter/ohos/capability/interaction/interaction_impl.cpp +++ b/adapter/ohos/capability/interaction/interaction_impl.cpp @@ -59,7 +59,7 @@ int32_t InteractionImpl::StartDrag(const DragDataCore& dragData, Msdp::DeviceStatus::ShadowInfo { dragData.shadowInfo.pixelMap, dragData.shadowInfo.x, dragData.shadowInfo.y }, dragData.buffer, dragData.udKey, dragData.filterInfo, dragData.extraInfo, dragData.sourceType, dragData.dragNum, dragData.pointerId, dragData.displayX, dragData.displayY, - dragData.displayId, dragData.hasCanceledAnimation }; + dragData.displayId, dragData.hasCanceledAnimation, dragData.summary }; return InteractionManager::GetInstance()->StartDrag(msdpDragData, callbackCore); } @@ -89,6 +89,16 @@ int32_t InteractionImpl::GetShadowOffset(ShadowOffsetData& shadowOffsetData) shadowOffsetData.offsetX, shadowOffsetData.offsetY, shadowOffsetData.width, shadowOffsetData.height); } +int32_t InteractionImpl::GetDragSummary(std::map& summary) +{ + return InteractionManager::GetInstance()->GetDragSummary(summary); +} + +int32_t InteractionImpl::GetDragExtraInfo(std::string& extraInfo) +{ + return InteractionManager::GetInstance()->GetExtraInfo(extraInfo); +} + Msdp::DeviceStatus::DragCursorStyle TranslateDragCursorStyle(OHOS::Ace::DragCursorStyleCore style) { switch (style) { diff --git a/adapter/ohos/capability/interaction/interaction_impl.h b/adapter/ohos/capability/interaction/interaction_impl.h index f0bef25018a..de71b2a264c 100644 --- a/adapter/ohos/capability/interaction/interaction_impl.h +++ b/adapter/ohos/capability/interaction/interaction_impl.h @@ -39,6 +39,10 @@ public: int32_t GetShadowOffset(ShadowOffsetData& shadowOffsetData) override; int32_t GetDragState(DragState& dragState) const override; + + int32_t GetDragSummary(std::map& summary) override; + + int32_t GetDragExtraInfo(std::string& extraInfo) override; }; } // namespace OHOS::Ace #endif // FOUNDATION_ACE_ACE_ENGINE_ADAPTER_OHOS_CAPABILITY_INTERACTION_IMPL_H \ No newline at end of file diff --git a/frameworks/core/common/interaction/interaction_data.h b/frameworks/core/common/interaction/interaction_data.h index e3ff9ba918f..928b88f3a27 100644 --- a/frameworks/core/common/interaction/interaction_data.h +++ b/frameworks/core/common/interaction/interaction_data.h @@ -53,6 +53,7 @@ struct DragDataCore { int32_t displayY = -1; int32_t displayId = -1; bool hasCanceledAnimation = false; + std::map summary; }; struct DragNotifyMsg { diff --git a/frameworks/core/common/interaction/interaction_interface.h b/frameworks/core/common/interaction/interaction_interface.h index 041c2572f3a..c39f3090bde 100644 --- a/frameworks/core/common/interaction/interaction_interface.h +++ b/frameworks/core/common/interaction/interaction_interface.h @@ -44,6 +44,10 @@ public: virtual int32_t GetShadowOffset(ShadowOffsetData& shadowOffsetData) = 0; virtual int32_t GetDragState(DragState& dragState) const = 0; + + virtual int32_t GetDragSummary(std::map& summary) = 0; + + virtual int32_t GetDragExtraInfo(std::string& extraInfo) = 0; }; } // namespace OHOS::Ace #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMMON_INTERACTION_INTERFACE_H \ No newline at end of file diff --git a/frameworks/core/components_ng/event/gesture_event_hub.cpp b/frameworks/core/components_ng/event/gesture_event_hub.cpp index 399a2091277..a7b5bb843a0 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -50,7 +50,10 @@ namespace OHOS::Ace::NG { #ifdef ENABLE_DRAG_FRAMEWORK RefPtr g_pixelMap; bool g_getPixelMapSucc = false; +namespace { constexpr int32_t CREATE_PIXELMAP_TIME = 80; +constexpr uint32_t EXTRA_INFO_MAX_LENGTH = 200; +} // namespace using namespace Msdp::DeviceStatus; const std::string DEFAULT_MOUSE_DRAG_IMAGE { "/system/etc/device_status/drag_icon/Copy_Drag.svg" }; #endif // ENABLE_DRAG_FRAMEWORK @@ -777,13 +780,16 @@ void GestureEventHub::OnDragStart(const GestureEvent& info, const RefPtrGetWidth(); uint32_t height = pixelMap->GetHeight(); auto pixelMapOffset = GetPixelMapOffset(info, SizeF(width, height), scale, !NearEqual(scale, defaultPixelMapScale)); + auto extraInfoLimited = dragDropInfo.extraInfo.size() > EXTRA_INFO_MAX_LENGTH + ? dragDropInfo.extraInfo.substr(EXTRA_INFO_MAX_LENGTH + 1) + : dragDropInfo.extraInfo; auto arkExtraInfoJson = JsonUtil::Create(true); auto dipScale = pipeline->GetDipScale(); arkExtraInfoJson->Put("dip_scale", dipScale); ShadowInfoCore shadowInfo { pixelMap, pixelMapOffset.GetX(), pixelMapOffset.GetY() }; - DragDataCore dragData { shadowInfo, {}, udKey, dragDropInfo.extraInfo, arkExtraInfoJson->ToString(), + DragDataCore dragData { shadowInfo, {}, udKey, extraInfoLimited, arkExtraInfoJson->ToString(), static_cast(info.GetSourceDevice()), recordsSize, info.GetPointerId(), info.GetScreenLocation().GetX(), - info.GetScreenLocation().GetY(), info.GetTargetDisplayId(), true }; + info.GetScreenLocation().GetY(), info.GetTargetDisplayId(), true, summary }; ret = InteractionInterface::GetInstance()->StartDrag(dragData, GetDragCallback(pipeline, eventHub)); if (ret != 0) { return; @@ -815,7 +821,7 @@ void GestureEventHub::OnDragStart(const GestureEvent& info, const RefPtrOnDragStart(info, dragDropInfo.extraInfo, GetFrameNode()); + dragDropProxy_->OnDragStart(info, extraInfoLimited, GetFrameNode()); #else if (dragDropInfo.customNode) { dragDropProxy_ = dragDropManager->CreateAndShowDragWindow(dragDropInfo.customNode, info); 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 d8a8c7c20cf..74d6e0f01e8 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 @@ -570,14 +570,18 @@ void DragDropManager::OnDragEnd(const Point& point, const std::string& extraInfo #ifdef ENABLE_DRAG_FRAMEWORK void DragDropManager::RequireSummary() { - std::string udKey; - InteractionInterface::GetInstance()->GetUdKey(udKey); std::map summary; - int32_t ret = UdmfClient::GetInstance()->GetSummary(udKey, summary); + int32_t ret = InteractionInterface::GetInstance()->GetDragSummary(summary); if (ret != 0) { - LOGW("OnDragStart: UDMF GetSummary failed: %{public}d", ret); + TAG_LOGI(AceLogTag::ACE_DRAG, "RequireSummary: Interaction GetSummary failed: %{public}d", ret); + } + std::string extraInfo; + ret = InteractionInterface::GetInstance()->GetDragExtraInfo(extraInfo); + if (ret != 0) { + TAG_LOGI(AceLogTag::ACE_DRAG, "GetExtraInfo: Interaction GetExtraInfo failed: %{public}d", ret); } previewRect_ = Rect(-1, -1, -1, -1); + extraInfo_ = extraInfo; summaryMap_ = summary; } @@ -915,9 +919,6 @@ void DragDropManager::AddDataToClipboard(const std::string& extraInfo) if (clipboard_) { clipboard_->GetData(addDataCallback_, true); } -#ifdef ENABLE_DRAG_FRAMEWORK - extraInfo_ = extraInfo; -#endif // ENABLE_DRAG_FRAMEWORK } void DragDropManager::GetExtraInfoFromClipboard(std::string& extraInfo) @@ -962,14 +963,7 @@ void DragDropManager::RestoreClipboardData() CHECK_NULL_VOID(dragDropManager); auto json = JsonUtil::ParseJsonString(data); if (json->Contains("preData")) { - auto preData = json->GetString("preData"); -#ifdef ENABLE_DRAG_FRAMEWORK - if (!preData.empty()) { - dragDropManager->clipboard_->SetData(preData); - } -#else dragDropManager->clipboard_->SetData(json->GetString("preData")); -#endif // ENABLE_DRAG_FRAMEWORK } }; deleteDataCallback_ = callback; diff --git a/frameworks/core/components_ng/manager/drag_drop/drag_drop_proxy.cpp b/frameworks/core/components_ng/manager/drag_drop/drag_drop_proxy.cpp index beda502fc16..8401c687c0f 100644 --- a/frameworks/core/components_ng/manager/drag_drop/drag_drop_proxy.cpp +++ b/frameworks/core/components_ng/manager/drag_drop/drag_drop_proxy.cpp @@ -29,7 +29,9 @@ void DragDropProxy::OnTextDragStart(const std::string& extraInfo) auto manager = pipeline->GetDragDropManager(); CHECK_NULL_VOID(manager); CHECK_NULL_VOID(manager->CheckDragDropProxy(id_)); +#ifndef ENABLE_DRAG_FRAMEWORK manager->AddDataToClipboard(extraInfo); +#endif // ENABLE_DRAG_FRAMEWORK } void DragDropProxy::OnDragStart( @@ -45,7 +47,9 @@ void DragDropProxy::OnDragStart( info.GetScreenLocation().GetY()); manager->OnDragStart(point, frameNode); manager->OnDragMove(point, extraInfo); +#ifndef ENABLE_DRAG_FRAMEWORK manager->AddDataToClipboard(extraInfo); +#endif // ENABLE_DRAG_FRAMEWORK } void DragDropProxy::OnDragMove(const GestureEvent& info) diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 611d62820d3..8af5df43633 100755 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -2236,19 +2236,16 @@ void PipelineContext::OnDragEvent(int32_t x, int32_t y, DragEventAction action) #ifdef ENABLE_DRAG_FRAMEWORK if (action == DragEventAction::DRAG_EVENT_START) { manager->RequireSummary(); - manager->GetExtraInfoFromClipboard(extraInfo); - manager->SetExtraInfo(extraInfo); } + extraInfo = manager->GetExtraInfo(); #else manager->GetExtraInfoFromClipboard(extraInfo); #endif // ENABLE_DRAG_FRAMEWORK if (action == DragEventAction::DRAG_EVENT_END) { -#ifdef ENABLE_DRAG_FRAMEWORK - manager->GetExtraInfoFromClipboard(extraInfo); - manager->SetExtraInfo(extraInfo); -#endif // ENABLE_DRAG_FRAMEWORK manager->OnDragEnd(Point(x, y, x, y), extraInfo); +#ifndef ENABLE_DRAG_FRAMEWORK manager->RestoreClipboardData(); +#endif // ENABLE_DRAG_FRAMEWORK return; } manager->OnDragMove(Point(x, y, x, y), extraInfo); diff --git a/interfaces/napi/kits/drag_controller/js_drag_controller.cpp b/interfaces/napi/kits/drag_controller/js_drag_controller.cpp index 8ffc74ae3a7..57c8ad656f3 100644 --- a/interfaces/napi/kits/drag_controller/js_drag_controller.cpp +++ b/interfaces/napi/kits/drag_controller/js_drag_controller.cpp @@ -270,7 +270,7 @@ void OnComplete(DragControllerAsyncCtx* asyncCtx) Msdp::DeviceStatus::DragData dragData { { asyncCtx->pixmap, width * PIXELMAP_WIDTH_RATE, height * PIXELMAP_HEIGHT_RATE }, {}, udKey, "", "", - asyncCtx->sourceType, dataSize, pointerId, asyncCtx->globalX, asyncCtx->globalY, 0, true + asyncCtx->sourceType, dataSize, pointerId, asyncCtx->globalX, asyncCtx->globalY, 0, true, {} }; OnDragCallback callback = [asyncCtx](const DragNotifyMsg& dragNotifyMsg) { diff --git a/test/mock/core/common/mock_interaction_interface.h b/test/mock/core/common/mock_interaction_interface.h index 349046f1a38..9521210f404 100644 --- a/test/mock/core/common/mock_interaction_interface.h +++ b/test/mock/core/common/mock_interaction_interface.h @@ -45,6 +45,10 @@ public: MOCK_METHOD(int32_t, GetShadowOffset, (ShadowOffsetData& shadowOffsetData), (override)); MOCK_METHOD(int32_t, GetDragState, (DragState& dragState), (const, override)); + + MOCK_METHOD(int32_t, GetDragSummary, ((std::map& summary)), (override)); + + MOCK_METHOD(int32_t, GetDragExtraInfo, (std::string& extraInfo), (override)); }; } // namespace OHOS::Ace #endif // FOUNDATION_ACE_TEST_MOCK_CORE_COMMON_MOCK_INTERACTION_H \ No newline at end of file -- Gitee