diff --git a/adapter/ohos/capability/interaction/interaction_impl.cpp b/adapter/ohos/capability/interaction/interaction_impl.cpp index 460ff3399b2f8b669ff59deba333b30cf99f1590..565ef9e966ff40777c8b0a826f891f3c14d590b3 100644 --- a/adapter/ohos/capability/interaction/interaction_impl.cpp +++ b/adapter/ohos/capability/interaction/interaction_impl.cpp @@ -102,6 +102,11 @@ int32_t InteractionImpl::GetDragExtraInfo(std::string& extraInfo) return InteractionManager::GetInstance()->GetExtraInfo(extraInfo); } +int32_t InteractionImpl::EnterTextEditorArea(bool enable) +{ + return InteractionManager::GetInstance()->EnterTextEditorArea(enable); +} + 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 de71b2a264cea7e328ee1bcf3a10ca6aa36ed733..3834383c2ea38abb8826a0dce4c9ac953d998046 100644 --- a/adapter/ohos/capability/interaction/interaction_impl.h +++ b/adapter/ohos/capability/interaction/interaction_impl.h @@ -39,10 +39,12 @@ 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; + + int32_t EnterTextEditorArea(bool enable) 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_interface.h b/frameworks/core/common/interaction/interaction_interface.h index c39f3090bde522f73903117288604c5336d73116..3dcd6c7abc35a18aa15565b8441f680641a71de1 100644 --- a/frameworks/core/common/interaction/interaction_interface.h +++ b/frameworks/core/common/interaction/interaction_interface.h @@ -48,6 +48,8 @@ public: virtual int32_t GetDragSummary(std::map& summary) = 0; virtual int32_t GetDragExtraInfo(std::string& extraInfo) = 0; + + virtual int32_t EnterTextEditorArea(bool enable) = 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 8e06438f4d7bd803966a317d862dfdb5006ad38b..adad80d90af42dee676455a6395bedeccca9492c 100644 --- a/frameworks/core/components_ng/event/gesture_event_hub.cpp +++ b/frameworks/core/components_ng/event/gesture_event_hub.cpp @@ -590,23 +590,20 @@ std::function GestureEventHub::GetMousePixelMapCallback(const GestureEve std::shared_ptr pixelMap; auto frameNode = gestureHub->GetFrameNode(); CHECK_NULL_VOID(frameNode); + RefPtr context; if (gestureHub->GetTextDraggable()) { auto pattern = frameNode->GetPattern(); CHECK_NULL_VOID(pattern); auto dragNode = pattern->MoveDragNode(); CHECK_NULL_VOID(dragNode); - auto context = dragNode->GetRenderContext(); - CHECK_NULL_VOID(context); - auto thumbnailPixelMap = context->GetThumbnailPixelMap(); - CHECK_NULL_VOID(thumbnailPixelMap); - pixelMap = thumbnailPixelMap->GetPixelMapSharedPtr(); + context = dragNode->GetRenderContext(); } else { - auto context = frameNode->GetRenderContext(); - CHECK_NULL_VOID(context); - auto thumbnailPixelMap = context->GetThumbnailPixelMap(); - CHECK_NULL_VOID(thumbnailPixelMap); - pixelMap = thumbnailPixelMap->GetPixelMapSharedPtr(); + context = frameNode->GetRenderContext(); } + CHECK_NULL_VOID(context); + auto thumbnailPixelMap = context->GetThumbnailPixelMap(); + CHECK_NULL_VOID(thumbnailPixelMap); + pixelMap = thumbnailPixelMap->GetPixelMapSharedPtr(); CHECK_NULL_VOID(pixelMap); float scale = gestureHub->GetPixelMapScale( frameNode->GetDragPreviewOption(), pixelMap->GetHeight(), pixelMap->GetWidth()); @@ -631,6 +628,7 @@ std::function GestureEventHub::GetMousePixelMapCallback(const GestureEve } InteractionInterface::GetInstance()->SetDragWindowVisible(true); dragDropManager->SetIsDragWindowShow(true); + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::ENTER); dragDropManager->SetPreviewRect(Rect(pixelMapOffset.GetX(), pixelMapOffset.GetY(), width, height)); }; return callback; @@ -832,6 +830,7 @@ void GestureEventHub::OnDragStart(const GestureEvent& info, const RefPtrRemovePixelMap(); pipeline->FlushPipelineImmediately(); InteractionInterface::GetInstance()->SetDragWindowVisible(true); + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::ENTER); } else if (info.GetInputEventType() == InputEventType::MOUSE_BUTTON && (dragDropInfo.pixelMap || dragDropInfo.customNode)) { if (SystemProperties::GetDebugEnabled()) { 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 073428e90b090952b29d060e8335fc829d1d7eb4..6c43cbc63cd0af9d2c7e935b7bdbe85821f3bf85 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 @@ -496,6 +496,7 @@ void DragDropManager::OnDragEnd(const PointerEvent& pointerEvent, const std::str Point point = pointerEvent.GetPoint(); dragDropState_ = DragDropMgrState::IDLE; preTargetFrameNode_ = nullptr; + hasNotifiedTransformation_ = false; #ifdef ENABLE_DRAG_FRAMEWORK auto container = Container::Current(); if (container && container->IsScenceBoardWindow()) { @@ -708,6 +709,7 @@ void DragDropManager::FireOnDragEvent( event->SetPreviewRect(GetDragWindowRect(point)); #endif // ENABLE_DRAG_FRAMEWORK + FireOnEditableTextComponent(frameNode, type); FireOnDragEventWithDragType(eventHub, type, event, extraParams); #ifdef ENABLE_DRAG_FRAMEWORK @@ -1137,4 +1139,42 @@ void DragDropManager::UpdateVelocityTrackerPoint(const Point& point, bool isEnd) velocityTracker_.UpdateTrackerPoint(point.GetX(), point.GetY(), curTime, isEnd); } +void DragDropManager::FireOnEditableTextComponent(const RefPtr& frameNode, + DragEventType type) +{ + auto frameTag = frameNode->GetTag(); + if (!IsEditableTextComponent(frameTag)) { + if (SystemProperties::GetDebugEnabled()) { + TAG_LOGI(AceLogTag::ACE_DRAG, + "This frame node is not editable text component %{public}s", frameTag.c_str()); + } + return; + } + + if (type != DragEventType::ENTER && type != DragEventType::LEAVE) { + if (SystemProperties::GetDebugEnabled()) { + TAG_LOGI(AceLogTag::ACE_DRAG, "It is an invalid drag type %{public}d", type); + } + return; + } + + if (type == DragEventType::LEAVE) { + TAG_LOGI(AceLogTag::ACE_DRAG, "The current control has been dragged away."); + hasNotifiedTransformation_ = false; + return; + } + + if (hasNotifiedTransformation_) { + TAG_LOGI(AceLogTag::ACE_DRAG, "Coordinates have been transformed."); + return; + } +#ifdef ENABLE_DRAG_FRAMEWORK + auto ret = InteractionInterface::GetInstance()->EnterTextEditorArea(true); + if (ret != 0) { + TAG_LOGI(AceLogTag::ACE_DRAG, "Fail to notify entering text editor erea."); + } +#endif // ENABLE_DRAG_FRAMEWORK + hasNotifiedTransformation_ = true; +} + } // namespace OHOS::Ace::NG 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 0d21344d06c62c8cfd6752e3b8065ffac6b400c5..fe6794fa0ee2ade4ce6e143a780fd1f6bf5929d9 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 @@ -110,6 +110,7 @@ public: void UpdateNotifyDragEvent( RefPtr& notifyEvent, const Point& point, const DragEventType dragEventType); bool CheckDragDropProxy(int64_t id) const; + void FireOnEditableTextComponent(const RefPtr& frameNode, DragEventType type); bool IsWindowConsumed() const { @@ -222,6 +223,15 @@ public: currentPointerId_ = currentPointerId; } + static inline bool IsEditableTextComponent(const std::string& frameTag) + { + if (frameTag != V2::TEXTINPUT_ETS_TAG && frameTag != V2::TEXTAREA_ETS_TAG && + frameTag != V2::RICH_EDITOR_ETS_TAG && frameTag != V2::SEARCH_Field_ETS_TAG) { + return false; + } + return true; + } + private: RefPtr FindDragFrameNodeByPosition(float globalX, float globalY, DragType dragType, bool findDrop); void FireOnDragEvent( @@ -272,6 +282,7 @@ private: bool isMouseDragged_ = false; bool isWindowConsumed_ = false; bool isDragWindowShow_ = false; + bool hasNotifiedTransformation_ = false; VelocityTracker velocityTracker_; DragDropMgrState dragDropState_ = DragDropMgrState::IDLE; Rect previewRect_ { -1, -1, -1, -1 }; diff --git a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp index 497dfc1b42e49654dc6dec9bea4fe249f33c59fa..e4441ec49181e22c647eabe32ce3e336ff33b498 100644 --- a/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp +++ b/frameworks/core/components_ng/pattern/rich_editor/rich_editor_pattern.cpp @@ -89,6 +89,10 @@ constexpr Dimension AUTO_SCROLL_DRAG_EDGE_DISTANCE = 25.0_vp; constexpr float DOUBLE_CLICK_INTERVAL_MS = 300.0f; constexpr float BOX_EPSILON = 0.5f; +#ifdef ENABLE_DRAG_FRAMEWORK +constexpr Dimension INSERT_CURSOR_OFFSET = 8.0_vp; +#endif // ENABLE_DRAG_FRAMEWORK + const std::wstring lineSeparator = L"\n"; const std::wstring NUM_SYMBOL = L")!@#$%^&*("; // hen do ai anaylsis, we should limit the left an right limit of the string @@ -1802,7 +1806,7 @@ void RichEditorPattern::OnDragMove(const RefPtr& event) auto textRect = GetTextRect(); textRect.SetTop(textRect.GetY() - std::min(baselineOffset_, 0.0f)); Offset textOffset = { touchX - textRect.GetX() - GetParentGlobalOffset().GetX(), - touchY - textRect.GetY() - GetParentGlobalOffset().GetY() }; + touchY - textRect.GetY() - GetParentGlobalOffset().GetY() - INSERT_CURSOR_OFFSET.ConvertToPx() }; auto position = paragraphs_.GetIndex(textOffset); float caretHeight = 0.0f; SetCaretPosition(position); diff --git a/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp b/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp index 423c7641918ea4433fe382e2ff319ae3f25e1928..46f90a59a2e96ca6c7efdc12b59ffa1a51151b39 100644 --- a/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp +++ b/frameworks/core/components_ng/pattern/text_field/text_field_pattern.cpp @@ -124,6 +124,10 @@ const std::string NEWLINE = "\n"; const std::wstring WIDE_NEWLINE = StringUtils::ToWstring(NEWLINE); constexpr int32_t AUTO_FILL_FAILED = 1; +#ifdef ENABLE_DRAG_FRAMEWORK +constexpr Dimension INSERT_CURSOR_OFFSET = 8.0_vp; +#endif // ENABLE_DRAG_FRAMEWORK + // need to be moved to formatter const std::string DIGIT_WHITE_LIST = "[0-9]"; const std::string PHONE_WHITE_LIST = "[\\d\\-\\+\\*\\#]+"; @@ -1410,7 +1414,8 @@ void TextFieldPattern::InitDragDropEvent() auto touchX = event->GetX(); auto touchY = event->GetY(); Offset offset = Offset(touchX, touchY) - Offset(pattern->textRect_.GetX(), pattern->textRect_.GetY()) - - Offset(pattern->parentGlobalOffset_.GetX(), pattern->parentGlobalOffset_.GetY()); + Offset(pattern->parentGlobalOffset_.GetX(), pattern->parentGlobalOffset_.GetY()) - + Offset(0, INSERT_CURSOR_OFFSET.ConvertToPx()); auto position = pattern->ConvertTouchOffsetToCaretPosition(offset); auto host = pattern->GetHost(); CHECK_NULL_VOID(host); diff --git a/test/mock/core/common/mock_interaction_interface.h b/test/mock/core/common/mock_interaction_interface.h index 9521210f4043d9f0e282502fadae085a846d12d9..39e7f69b40075dc53859ef346659c973cb74c55a 100644 --- a/test/mock/core/common/mock_interaction_interface.h +++ b/test/mock/core/common/mock_interaction_interface.h @@ -49,6 +49,8 @@ public: MOCK_METHOD(int32_t, GetDragSummary, ((std::map& summary)), (override)); MOCK_METHOD(int32_t, GetDragExtraInfo, (std::string& extraInfo), (override)); + + MOCK_METHOD(int32_t, EnterTextEditorArea, (bool enable), (override)); }; } // namespace OHOS::Ace #endif // FOUNDATION_ACE_TEST_MOCK_CORE_COMMON_MOCK_INTERACTION_H \ No newline at end of file diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index a200c4a29bdf889e3c16cb463c35862031e14849..c372f8b956a8ebc032467d5cf56a7c80a5da1c59 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -408,6 +408,7 @@ source_set("ace_components_mock") { "$ace_root/test/mock/core/common/mock_container.cpp", "$ace_root/test/mock/core/common/mock_data_detector_mgr.cpp", "$ace_root/test/mock/core/common/mock_font_manager_ng.cpp", + "$ace_root/test/mock/core/common/mock_interaction.cpp", "$ace_root/test/mock/core/event/mock_time_event_proxy.cpp", "$ace_root/test/mock/core/image_provider/mock_image_cache.cpp", "$ace_root/test/mock/core/image_provider/mock_image_loading_context.cpp", diff --git a/test/unittest/core/manager/drag_drop_manager_test_ng.cpp b/test/unittest/core/manager/drag_drop_manager_test_ng.cpp index d55d13ac8594e84101fec9f98ef3f046bde1c4d5..a87c0f2b5beb6fdb193bf47c362699577c358ce5 100644 --- a/test/unittest/core/manager/drag_drop_manager_test_ng.cpp +++ b/test/unittest/core/manager/drag_drop_manager_test_ng.cpp @@ -24,7 +24,6 @@ #include "base/image/pixel_map.h" #include "base/memory/ace_type.h" #include "base/memory/referenced.h" -#include "test/mock/base/mock_drag_window.h" #include "core/components_ng/base/frame_node.h" #include "core/components_ng/base/geometry_node.h" #include "core/components_ng/base/ui_node.h" @@ -33,10 +32,13 @@ #include "core/components_ng/pattern/grid/grid_pattern.h" #include "core/components_ng/pattern/list/list_event_hub.h" #include "core/components_ng/pattern/pattern.h" - +#include "core/components_v2/inspector/inspector_constants.h" +#include "core/common/interaction/interaction_interface.h" #include "core/components_ng/manager/drag_drop/drag_drop_manager.h" #include "core/components_ng/manager/drag_drop/drag_drop_proxy.h" #include "core/components_ng/pattern/list/list_pattern.h" +#include "test/mock/base/mock_drag_window.h" +#include "test/mock/core/common/mock_interaction_interface.h" #include "test/mock/core/pipeline/mock_pipeline_context.h" #include "test/mock/core/pattern/mock_list_drag_status_listener.h" @@ -1883,4 +1885,49 @@ HWTEST_F(DragDropManagerTestNg, DragDropManagerNotifyDragRegisterFrameNode002, T dragDropManager->UnRegisterDragStatusListener(listNode3->GetId()); EXPECT_EQ(dragDropManager->nodesForDragNotify_.size(), 0); } + +/** + * @tc.name: DragDropManagerFireOnEditableTextComponent + * @tc.desc: Test FireOnEditableTextComponent + * @tc.type: FUNC + * @tc.author: + */ +HWTEST_F(DragDropManagerTestNg, DragDropManagerFireOnEditableTextComponent, TestSize.Level1) +{ + /** + * @tc.steps: step1. construct a DragDropManager and create a point. + */ + auto dragDropManager = AceType::MakeRefPtr(); + + /** + * @tc.steps: step2. Create a normal frameNode which is not a editable text component, + * and test FireOnEditableTextComponent. + * @tc.expected: step2. + */ + { + auto frameNode = AceType::MakeRefPtr(NODE_TAG, -1, AceType::MakeRefPtr()); + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::ENTER); + } + + /** + * @tc.steps: step3. Create a editable text component, and test FireOnEditableTextComponent. + * @tc.expected: step3. + */ + { + auto frameNode = AceType::MakeRefPtr(V2::TEXTINPUT_ETS_TAG, 1, AceType::MakeRefPtr()); +#ifdef ENABLE_DRAG_FRAMEWORK + EXPECT_CALL(*(AceType::DynamicCast( + MockInteractionInterface::GetInstance())), EnterTextEditorArea(_)) + .Times(1).WillOnce(::testing::Return(0)); +#else + EXPECT_CALL(*(AceType::DynamicCast( + MockInteractionInterface::GetInstance())), EnterTextEditorArea(_)) + .Times(0); +#endif // ENABLE_DRAG_FRAMEWORK + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::ENTER); + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::ENTER); + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::MOVE); + dragDropManager->FireOnEditableTextComponent(frameNode, DragEventType::LEAVE); + } +} } // namespace OHOS::Ace::NG