diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp index 61cd72f6af4d7212fd06802b923234fceaa630cb..4e49f49233791b8f37bbbf8c9a2122a36ff48afe 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.cpp @@ -264,7 +264,7 @@ void SubwindowOhos::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo ShowWindow(false); ResizeWindow(); ContainerScope scope(childContainerId_); - overlayManager->ShowPopup(targetId, popupInfo); + overlayManager->UpdatePopupNode(targetId, popupInfo); } void SubwindowOhos::HidePopupNG(int32_t targetId) @@ -280,6 +280,7 @@ void SubwindowOhos::HidePopupNG(int32_t targetId) ContainerScope scope(childContainerId_); overlayManager->HidePopup(targetId == -1 ? popupTargetId_ : targetId, popupInfo); context->FlushPipelineImmediately(); + HideWindow(); #ifdef ENABLE_DRAG_FRAMEWORK HideEventColumn(); HidePixelMap(); @@ -572,19 +573,6 @@ void SubwindowOhos::ClearMenuNG(bool inWindow, bool showAnimation) #endif // ENABLE_DRAG_FRAMEWORK } -void SubwindowOhos::ClearPopupNG() -{ - auto aceContainer = Platform::AceContainer::GetContainer(childContainerId_); - CHECK_NULL_VOID(aceContainer); - auto context = DynamicCast(aceContainer->GetPipelineContext()); - CHECK_NULL_VOID(context); - auto overlay = context->GetOverlayManager(); - CHECK_NULL_VOID(overlay); - overlay->CleanPopupInSubWindow(); - HideWindow(); - context->FlushPipelineImmediately(); -} - void SubwindowOhos::ShowMenu(const RefPtr& newComponent) { ShowWindow(); diff --git a/adapter/ohos/entrance/subwindow/subwindow_ohos.h b/adapter/ohos/entrance/subwindow/subwindow_ohos.h index d2e7636b429d19736a25f13a0372e88fd4e912cc..d5391845c73172b3bc4e4846a6c92a674664d866 100644 --- a/adapter/ohos/entrance/subwindow/subwindow_ohos.h +++ b/adapter/ohos/entrance/subwindow/subwindow_ohos.h @@ -69,7 +69,6 @@ public: void CloseMenu() override; void ClearMenu() override; void ClearMenuNG(bool inWindow, bool showAnimation = false) override; - void ClearPopupNG() override; RefPtr ShowDialogNG(const DialogProperties& dialogProps, std::function&& buildFunc) override; void HideSubWindowNG() override; bool GetShown() override diff --git a/adapter/ohos/entrance/ui_content_impl.cpp b/adapter/ohos/entrance/ui_content_impl.cpp index dce4b02a655e71d0a0655f4c15d0cab3e5da5818..1f290a5a4a681396be5b1465a78bd2b78b5858da 100644 --- a/adapter/ohos/entrance/ui_content_impl.cpp +++ b/adapter/ohos/entrance/ui_content_impl.cpp @@ -277,7 +277,7 @@ public: taskExecutor->PostTask( [instanceId = instanceId_] { SubwindowManager::GetInstance()->ClearMenu(); - SubwindowManager::GetInstance()->ClearPopupInSubwindow(instanceId); + SubwindowManager::GetInstance()->HidePopupNG(-1, instanceId); }, TaskExecutor::TaskType::UI); } diff --git a/frameworks/base/subwindow/subwindow.h b/frameworks/base/subwindow/subwindow.h index 384e20a28f1c39343cccc9707e38c0bd3fc44e7e..4c5931187566eacfbac3b87688699f7475db7cc8 100644 --- a/frameworks/base/subwindow/subwindow.h +++ b/frameworks/base/subwindow/subwindow.h @@ -49,7 +49,6 @@ public: virtual void CloseMenu() = 0; virtual void ClearMenu() {}; virtual void ClearMenuNG(bool inWindow = true, bool showAnimation = false) = 0; - virtual void ClearPopupNG() = 0; virtual RefPtr ShowDialogNG( const DialogProperties& dialogProps, std::function&& buildFunc) = 0; virtual void HideSubWindowNG() = 0; diff --git a/frameworks/base/subwindow/subwindow_manager.cpp b/frameworks/base/subwindow/subwindow_manager.cpp index 99e585d202f937b4e7b33c1e370469c768999d8e..582c9876d90fff8d77764e277fe39014d1f6a82d 100644 --- a/frameworks/base/subwindow/subwindow_manager.cpp +++ b/frameworks/base/subwindow/subwindow_manager.cpp @@ -200,20 +200,6 @@ void SubwindowManager::ClearMenuNG(int32_t instanceId, bool inWindow, bool showA } } -void SubwindowManager::ClearPopupInSubwindow(int32_t instanceId) -{ - RefPtr subwindow; - if (instanceId != -1) { - // get the subwindow which overlay node in, not current - subwindow = GetSubwindow(instanceId >= MIN_SUBCONTAINER_ID ? GetParentContainerId(instanceId) : instanceId); - } else { - subwindow = GetCurrentWindow(); - } - if (subwindow) { - subwindow->ClearPopupNG(); - } -} - void SubwindowManager::ShowPopupNG(int32_t targetId, const NG::PopupInfo& popupInfo) { auto containerId = Container::CurrentId(); diff --git a/frameworks/base/subwindow/subwindow_manager.h b/frameworks/base/subwindow/subwindow_manager.h index 263566f8cc18a0701c6ee6131e0b4fb3f07dec17..6019b60093a31e6810390fde8d0820728c905c88 100644 --- a/frameworks/base/subwindow/subwindow_manager.h +++ b/frameworks/base/subwindow/subwindow_manager.h @@ -73,7 +73,6 @@ public: void CloseMenu(); void ClearMenu(); void ClearMenuNG(int32_t instanceId = -1, bool inWindow = true, bool showAnimation = false); - void ClearPopupInSubwindow(int32_t instanceId = -1); RefPtr ShowDialogNG(const DialogProperties& dialogProps, std::function&& buildFunc); void HideSubWindowNG(); diff --git a/frameworks/core/components_ng/base/view_abstract.cpp b/frameworks/core/components_ng/base/view_abstract.cpp index e1ad1c12d14fca7df92c93858093a0158507fbb1..266df456590eaac283294324a341a5241964a763 100644 --- a/frameworks/core/components_ng/base/view_abstract.cpp +++ b/frameworks/core/components_ng/base/view_abstract.cpp @@ -1127,8 +1127,15 @@ void ViewAbstract::BindPopup( if (showInSubWindow) { if (isShow) { SubwindowManager::GetInstance()->ShowPopupNG(targetId, popupInfo); + if (popupPattern) { + popupPattern->SetContainerId(Container::CurrentId()); + popupPattern->StartEnteringAnimation(nullptr); + } } else { - SubwindowManager::GetInstance()->HidePopupNG(targetId); + if (popupPattern) { + popupPattern->StartExitingAnimation( + [targetId]() { SubwindowManager::GetInstance()->HidePopupNG(targetId); }); + } } return; } @@ -1137,9 +1144,19 @@ void ViewAbstract::BindPopup( AccessibilityEventType::CHANGE, WindowsContentChangeTypes::CONTENT_CHANGE_TYPE_SUBTREE); } if (isShow) { - overlayManager->ShowPopup(targetId, popupInfo); + overlayManager->UpdatePopupNode(targetId, popupInfo); + if (popupPattern) { + popupPattern->StartEnteringAnimation(nullptr); + } } else { - overlayManager->HidePopup(targetId, popupInfo); + if (popupPattern) { + popupPattern->StartExitingAnimation( + [targetId, popupInfo, weakOverlayManger = AceType::WeakClaim(AceType::RawPtr(overlayManager))]() { + auto overlay = weakOverlayManger.Upgrade(); + CHECK_NULL_VOID(overlay); + overlay->UpdatePopupNode(targetId, popupInfo); + }); + } } } diff --git a/frameworks/core/components_ng/event/focus_hub.cpp b/frameworks/core/components_ng/event/focus_hub.cpp index af6f9e6bfa4f6d67c4fa0845ce0569dba96a2ec6..20ae2f81f5afa6ea6ec98b39a3b6dc0f96d8e323 100644 --- a/frameworks/core/components_ng/event/focus_hub.cpp +++ b/frameworks/core/components_ng/event/focus_hub.cpp @@ -205,8 +205,7 @@ RefPtr FocusHub::GetChildMainView() } auto frameName = child->GetFrameName(); if (frameName == V2::PAGE_ETS_TAG || frameName == V2::MENU_WRAPPER_ETS_TAG || frameName == V2::DIALOG_ETS_TAG || - frameName == V2::MODAL_PAGE_TAG || frameName == V2::MENU_ETS_TAG || frameName == V2::SHEET_PAGE_TAG || - frameName == V2::POPUP_ETS_TAG) { + frameName == V2::MODAL_PAGE_TAG || frameName == V2::MENU_ETS_TAG || frameName == V2::SHEET_PAGE_TAG) { if (!curFocusMainView && child->IsCurrentFocus()) { curFocusMainView = child; } @@ -254,8 +253,6 @@ RefPtr FocusHub::GetMainViewRootScope() rootScopeDeepth = DEEPTH_OF_MENU; } else if (frameName == V2::DIALOG_ETS_TAG) { rootScopeDeepth = DEEPTH_OF_DIALOG; - } else if (frameName == V2::POPUP_ETS_TAG) { - rootScopeDeepth = DEEPTH_OF_POPUP; } else { rootScopeDeepth = DEEPTH_OF_PAGE; } @@ -264,9 +261,6 @@ RefPtr FocusHub::GetMainViewRootScope() CHECK_NULL_RETURN(rootScope, nullptr); rootScope = rootScope->GetChildren().front(); } - if (rootScope->GetFocusType() != FocusType::SCOPE) { - return rootScope->GetParentFocusHub(); - } return rootScope; } diff --git a/frameworks/core/components_ng/event/focus_hub.h b/frameworks/core/components_ng/event/focus_hub.h index 87cd415b0f668ac7e922058d649e2da07ba70252..bfe1c430f594da888678fad97710f050bbf40769 100644 --- a/frameworks/core/components_ng/event/focus_hub.h +++ b/frameworks/core/components_ng/event/focus_hub.h @@ -37,7 +37,6 @@ constexpr int32_t DEEPTH_OF_MENU_WRAPPER = 3; constexpr int32_t DEEPTH_OF_MENU = 2; constexpr int32_t DEEPTH_OF_DIALOG = 2; constexpr int32_t DEEPTH_OF_PAGE = 1; -constexpr int32_t DEEPTH_OF_POPUP = 2; enum class FocusType : int32_t { DISABLE = 0, diff --git a/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp b/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp index 72b4c1751161d0cb7e34b3b86bfd201037a126c2..324084d0da657b1c2b528c4654e093c359a8f693 100644 --- a/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp +++ b/frameworks/core/components_ng/pattern/bubble/bubble_pattern.cpp @@ -325,11 +325,16 @@ void BubblePattern::PopBubble() auto layoutProp = host->GetLayoutProperty(); CHECK_NULL_VOID(layoutProp); auto showInSubWindow = layoutProp->GetShowInSubWindow().value_or(false); - if (showInSubWindow) { - SubwindowManager::GetInstance()->HidePopupNG(targetNodeId_); - } else { - overlayManager->HidePopup(targetNodeId_, popupInfo); - } + StartExitingAnimation([showInSubWindow, targetId = targetNodeId_, popupInfo, + weakOverlayManger = AceType::WeakClaim(AceType::RawPtr(overlayManager))]() { + if (showInSubWindow) { + SubwindowManager::GetInstance()->HidePopupNG(targetId); + } else { + auto overlay = weakOverlayManger.Upgrade(); + CHECK_NULL_VOID(overlay); + overlay->UpdatePopupNode(targetId, popupInfo); + } + }); } RefPtr BubblePattern::GetPopupTheme() @@ -431,6 +436,10 @@ void BubblePattern::StartAlphaEnteringAnimation(std::function finish) void BubblePattern::StartExitingAnimation(std::function finish) { + if (!IsOnShow()) { + return; + } + StartOffsetExitingAnimation(); StartAlphaExitingAnimation(finish); } diff --git a/frameworks/core/components_ng/pattern/bubble/bubble_pattern.h b/frameworks/core/components_ng/pattern/bubble/bubble_pattern.h index 9a160a4b806c713a25a2cb50f356f1bc94b414c4..0aeafc1d11398a00bdb73193f1c22d03aaa8d5cc 100644 --- a/frameworks/core/components_ng/pattern/bubble/bubble_pattern.h +++ b/frameworks/core/components_ng/pattern/bubble/bubble_pattern.h @@ -117,11 +117,6 @@ public: transitionStatus_ = transitionStatus; } - TransitionStatus GetTransitionStatus() const - { - return transitionStatus_; - } - protected: void OnDetachFromFrameNode(FrameNode* frameNode) override; diff --git a/frameworks/core/components_ng/pattern/bubble/bubble_view.cpp b/frameworks/core/components_ng/pattern/bubble/bubble_view.cpp index f7391d5798da2fabb89bb1fbf4e9e1209525ac5c..02a83b2337b526b9fe351ea95e986557c5e47ece 100644 --- a/frameworks/core/components_ng/pattern/bubble/bubble_view.cpp +++ b/frameworks/core/components_ng/pattern/bubble/bubble_view.cpp @@ -95,19 +95,6 @@ void UpdateTextProperties(const RefPtr& param, const RefPtr& popupNode, bool isBlockEvent) -{ - auto hub = popupNode->GetEventHub(); - if (hub) { - auto ges = hub->GetOrCreateGestureEventHub(); - if (!isBlockEvent) { - ges->SetHitTestMode(HitTestMode::HTMTRANSPARENT_SELF); - } else { - ges->SetHitTestMode(HitTestMode::HTMDEFAULT); - } - } -} - RefPtr BubbleView::CreateBubbleNode( const std::string& targetTag, int32_t targetId, const RefPtr& param) { @@ -135,7 +122,6 @@ RefPtr BubbleView::CreateBubbleNode( popupProp->UpdateShowInSubWindow(param->IsShowInSubWindow()); popupProp->UpdatePositionOffset(OffsetF(param->GetTargetOffset().GetX(), param->GetTargetOffset().GetY())); popupProp->UpdateBlockEvent(param->IsBlockEvent()); - SetHitTestMode(popupNode, param->IsBlockEvent()); if (param->GetTargetSpace().has_value()) { popupProp->UpdateTargetSpace(param->GetTargetSpace().value()); } @@ -211,7 +197,6 @@ RefPtr BubbleView::CreateCustomBubbleNode( layoutProps->UpdatePlacement(param->GetPlacement()); layoutProps->UpdateShowInSubWindow(param->IsShowInSubWindow()); layoutProps->UpdateBlockEvent(param->IsBlockEvent()); - SetHitTestMode(popupNode, param->IsBlockEvent()); auto displayWindowOffset = GetDisplayWindowRectOffset(); layoutProps->UpdateDisplayWindowOffset(displayWindowOffset); layoutProps->UpdatePositionOffset(OffsetF(param->GetTargetOffset().GetX(), param->GetTargetOffset().GetY())); @@ -230,7 +215,6 @@ RefPtr BubbleView::CreateCustomBubbleNode( if (param->IsBackgroundColorSetted()) { popupPaintProps->UpdateBackgroundColor(param->GetBackgroundColor()); } - auto columnNode = FrameNode::CreateFrameNode(V2::COLUMN_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr(true)); customNode->MountToParent(columnNode); @@ -302,7 +286,6 @@ void BubbleView::UpdateCommonParam(int32_t popupId, const RefPtr& pa } popupLayoutProp->UpdateShowInSubWindow(param->IsShowInSubWindow()); popupLayoutProp->UpdateBlockEvent(param->IsBlockEvent()); - SetHitTestMode(popupNode, param->IsBlockEvent()); popupLayoutProp->UpdatePositionOffset(OffsetF(param->GetTargetOffset().GetX(), param->GetTargetOffset().GetY())); if (param->IsMaskColorSetted()) { popupPaintProp->UpdateMaskColor(param->GetMaskColor()); @@ -316,8 +299,6 @@ RefPtr BubbleView::CreateMessage(const std::string& message, bool IsU { auto textId = ElementRegister::GetInstance()->MakeUniqueId(); auto textNode = FrameNode::CreateFrameNode(V2::TEXT_ETS_TAG, textId, AceType::MakeRefPtr()); - // The buttons in popupNode can not get focus, if the textNode in the button is not focusable - textNode->GetOrCreateFocusHub()->SetFocusable(true); auto layoutProperty = textNode->GetLayoutProperty(); layoutProperty->UpdateContent(message); auto popupTheme = GetPopupTheme(); @@ -419,6 +400,7 @@ RefPtr BubbleView::CreateButton( auto buttonProp = AceType::DynamicCast(buttonNode->GetLayoutProperty()); auto isUseCustom = param->IsUseCustom(); + auto isShow = param->IsShow(); auto buttonTextNode = BubbleView::CreateMessage(buttonParam.value, isUseCustom); auto textLayoutProperty = buttonTextNode->GetLayoutProperty(); @@ -445,7 +427,7 @@ RefPtr BubbleView::CreateButton( CHECK_NULL_RETURN(buttonEventHub, nullptr); buttonEventHub->AddClickEvent(buttonParam.action); auto popupNode = FrameNode::GetFrameNode(V2::POPUP_ETS_TAG, popupId); - auto closeCallback = [popupNode, targetId](GestureEvent& /* info */) { + auto closeCallback = [popupNode, targetId, isShow](GestureEvent& /* info */) { auto container = Container::Current(); CHECK_NULL_VOID(container); auto pipelineContext = container->GetPipelineContext(); @@ -456,7 +438,8 @@ RefPtr BubbleView::CreateButton( CHECK_NULL_VOID(overlayManager); auto popupInfo = overlayManager->GetPopupInfo(targetId); popupInfo.markNeedUpdate = true; - overlayManager->HidePopup(targetId, popupInfo); + popupInfo.markNeedUpdate = isShow; + overlayManager->UpdatePopupNode(targetId, popupInfo); }; if (buttonParam.action) { buttonEventHub->AddClickEvent(buttonParam.action); diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index d6c298ff952b68e18bf943c27c3915a5a78f8a6b..0155f4e4ac2106a6bc7206a6b9166d99cfbbab8f 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -668,22 +668,9 @@ void OverlayManager::ClearToast() toastMap_.clear(); } -void OverlayManager::ShowPopup(int32_t targetId, const PopupInfo& popupInfo) +void OverlayManager::UpdatePopupNode(int32_t targetId, const PopupInfo& popupInfo) { popupMap_[targetId] = popupInfo; - if (!popupInfo.markNeedUpdate) { - return; - } - popupMap_[targetId].markNeedUpdate = false; - auto popupNode = popupInfo.popupNode; - CHECK_NULL_VOID(popupNode); - auto layoutProp = popupNode->GetLayoutProperty(); - CHECK_NULL_VOID(layoutProp); - auto isShowInSubWindow = layoutProp->GetShowInSubWindow().value_or(false); - auto paintProperty = popupNode->GetPaintProperty(); - CHECK_NULL_VOID(paintProperty); - auto isTypeWithOption = paintProperty->GetPrimaryButtonShow().value_or(false); - auto rootNode = rootNodeWeak_.Upgrade(); auto container = Container::Current(); if (container && container->IsScenceBoardWindow()) { @@ -693,126 +680,40 @@ void OverlayManager::ShowPopup(int32_t targetId, const PopupInfo& popupInfo) CHECK_NULL_VOID(popupInfo.markNeedUpdate); CHECK_NULL_VOID(popupInfo.popupNode); - const auto& rootChildren = rootNode->GetChildren(); - auto iter = std::find(rootChildren.rbegin(), rootChildren.rend(), popupNode); - if (iter != rootChildren.rend()) { - return; - } - - // attach popupNode before entering animation - popupNode->GetEventHub()->FireChangeEvent(true); - popupNode->MountToParent(rootNode); - rootNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); - popupMap_[targetId].isCurrentOnShow = true; - - auto popupPattern = popupNode->GetPattern(); - CHECK_NULL_VOID(popupPattern); - if (isTypeWithOption && !isShowInSubWindow) { - BlurLowerNode(popupNode); - auto onFinish = [popupNodeWk = WeakPtr(popupNode), weak = WeakClaim(this)]() { - auto overlayManager = weak.Upgrade(); - auto popupNode = popupNodeWk.Upgrade(); - CHECK_NULL_VOID(overlayManager && popupNode); - overlayManager->FocusOverlayNode(popupNode); - }; - popupPattern->StartEnteringAnimation(onFinish); - } else { - popupPattern->StartEnteringAnimation(nullptr); - } -} - -void OverlayManager::HidePopup(int32_t targetId, const PopupInfo& popupInfo) -{ - popupMap_[targetId] = popupInfo; - if (!popupInfo.markNeedUpdate) { - return; - } popupMap_[targetId].markNeedUpdate = false; - auto popupNode = popupInfo.popupNode; - CHECK_NULL_VOID(popupNode); - auto layoutProp = popupNode->GetLayoutProperty(); - CHECK_NULL_VOID(layoutProp); - auto isShowInSubWindow = layoutProp->GetShowInSubWindow().value_or(false); - auto paintProperty = popupNode->GetPaintProperty(); - CHECK_NULL_VOID(paintProperty); - auto isTypeWithOption = paintProperty->GetPrimaryButtonShow().value_or(false); - - auto rootNode = rootNodeWeak_.Upgrade(); - auto container = Container::Current(); - if (container && container->IsScenceBoardWindow()) { - rootNode = FindWindowScene(popupInfo.target.Upgrade()); - } - CHECK_NULL_VOID(rootNode); - - const auto& rootChildren = rootNode->GetChildren(); - auto iter = std::find(rootChildren.rbegin(), rootChildren.rend(), popupNode); - if (iter == rootChildren.rend()) { - return; - } - - auto popupPattern = popupNode->GetPattern(); - CHECK_NULL_VOID(popupPattern); - if (popupPattern->GetTransitionStatus() == TransitionStatus::EXITING) { - return; - } - popupPattern->SetTransitionStatus(TransitionStatus::EXITING); - if (isTypeWithOption && !isShowInSubWindow) { - ResetLowerNodeFocusable(popupNode); - } - // detach popupNode after exiting animation - popupMap_[targetId].isCurrentOnShow = false; - popupPattern->StartExitingAnimation( - [isShowInSubWindow, isTypeWithOption, popupNodeWk = WeakPtr(popupNode), - rootNodeWk = WeakPtr(rootNode), weak = WeakClaim(this)]() { - auto rootNode = rootNodeWk.Upgrade(); - auto popupNode = popupNodeWk.Upgrade(); - auto overlayManager = weak.Upgrade(); - CHECK_NULL_VOID(rootNode && popupNode && overlayManager); - - auto popupPattern = popupNode->GetPattern(); - CHECK_NULL_VOID(popupPattern); - popupNode->GetEventHub()->FireChangeEvent(false); - rootNode->RemoveChild(popupNode); - rootNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); - if (isTypeWithOption && !isShowInSubWindow) { - overlayManager->BlurOverlayNode(popupNode); - } - if (isShowInSubWindow) { - auto subwindow = SubwindowManager::GetInstance(); - CHECK_NULL_VOID(subwindow); - subwindow->HideSubWindowNG(); - } - }); - popupNode->OnAccessibilityEvent( - AccessibilityEventType::CHANGE, WindowsContentChangeTypes::CONTENT_CHANGE_TYPE_SUBTREE); -#ifdef ENABLE_DRAG_FRAMEWORK - RemoveEventColumn(); - RemovePixelMapAnimation(false, 0, 0); - RemoveFilter(); -#endif // ENABLE_DRAG_FRAMEWORK -} - -void OverlayManager::HidePopupWithoutAnimation(int32_t targetId, const PopupInfo& popupInfo) -{ - popupMap_[targetId] = popupInfo; - CHECK_NULL_VOID(popupInfo.markNeedUpdate); - if (!popupInfo.markNeedUpdate) { - return; - } - CHECK_NULL_VOID(popupInfo.popupNode); - popupInfo.popupNode->GetEventHub()->FireChangeEvent(false); - CHECK_NULL_VOID(popupInfo.isCurrentOnShow); - popupMap_[targetId].isCurrentOnShow = false; - auto pattern = popupInfo.popupNode->GetPattern(); - CHECK_NULL_VOID(pattern); - - auto rootNode = rootNodeWeak_.Upgrade(); - CHECK_NULL_VOID(rootNode); auto rootChildren = rootNode->GetChildren(); auto iter = std::find(rootChildren.begin(), rootChildren.end(), popupInfo.popupNode); if (iter != rootChildren.end()) { + // Pop popup + CHECK_NULL_VOID(popupInfo.isCurrentOnShow); + popupInfo.popupNode->GetEventHub()->FireChangeEvent(false); rootNode->RemoveChild(popupMap_[targetId].popupNode); + AccessibilityEvent event; + event.type = AccessibilityEventType::CHANGE; + event.windowContentChangeTypes = WindowsContentChangeTypes::CONTENT_CHANGE_TYPE_SUBTREE; + auto pipeline = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(pipeline); + pipeline->SendEventToAccessibility(event); +#ifdef ENABLE_DRAG_FRAMEWORK + RemoveEventColumn(); + RemovePixelMapAnimation(false, 0, 0); + RemoveFilter(); +#endif // ENABLE_DRAG_FRAMEWORK + } else { + // Push popup + CHECK_NULL_VOID(!popupInfo.isCurrentOnShow); + popupInfo.popupNode->GetEventHub()->FireChangeEvent(true); + auto hub = popupInfo.popupNode->GetEventHub(); + if (!popupInfo.isBlockEvent && hub) { + auto ges = hub->GetOrCreateGestureEventHub(); + if (ges) { + ges->SetHitTestMode(HitTestMode::HTMTRANSPARENT_SELF); + } + } + popupMap_[targetId].popupNode->MountToParent(rootNode); } + popupMap_[targetId].isCurrentOnShow = !popupInfo.isCurrentOnShow; + rootNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); } void OverlayManager::ShowIndexerPopup(int32_t targetId, RefPtr& customNode) @@ -858,6 +759,26 @@ void OverlayManager::RemoveIndexerPopup() rootNode->MarkDirtyNode(PROPERTY_UPDATE_BY_CHILD_REQUEST); } +void OverlayManager::HidePopup(int32_t targetId, const PopupInfo& popupInfo) +{ + popupMap_[targetId] = popupInfo; + CHECK_NULL_VOID(popupInfo.markNeedUpdate); + popupMap_[targetId].markNeedUpdate = false; + CHECK_NULL_VOID(popupInfo.popupNode); + popupInfo.popupNode->GetEventHub()->FireChangeEvent(false); + CHECK_NULL_VOID(popupInfo.isCurrentOnShow); + popupMap_[targetId].isCurrentOnShow = !popupInfo.isCurrentOnShow; + + auto rootNode = rootNodeWeak_.Upgrade(); + CHECK_NULL_VOID(rootNode); + auto rootChildren = rootNode->GetChildren(); + auto iter = std::find(rootChildren.begin(), rootChildren.end(), popupInfo.popupNode); + if (iter != rootChildren.end()) { + rootNode->RemoveChild(popupMap_[targetId].popupNode); + rootNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); + } +} + void OverlayManager::HideCustomPopups() { if (popupMap_.empty()) { @@ -883,7 +804,11 @@ void OverlayManager::HideCustomPopups() if (showInSubWindow) { SubwindowManager::GetInstance()->HidePopupNG(targetNodeId); } else { - HidePopup(targetNodeId, popupInfo); + UpdatePopupNode(targetNodeId, popupInfo); + CHECK_NULL_VOID(popupInfo.popupNode); + auto pattern = popupInfo.popupNode->GetPattern(); + CHECK_NULL_VOID(pattern); + pattern->SetTransitionStatus(TransitionStatus::INVISIABLE); } } } @@ -1189,27 +1114,6 @@ void OverlayManager::CleanMenuInSubWindow() } } -void OverlayManager::CleanPopupInSubWindow() -{ - auto rootNode = rootNodeWeak_.Upgrade(); - CHECK_NULL_VOID(rootNode); - for (const auto& child : rootNode->GetChildren()) { - if (child && child->GetTag() == V2::POPUP_ETS_TAG) { - auto id = child->GetId(); - for (const auto& popup : popupMap_) { - auto popupInfo = popup.second; - auto target = popup.first; - if (id == popupInfo.popupId) { - popupInfo.markNeedUpdate = true; - HidePopupWithoutAnimation(target, popupInfo); - break; - } - } - } - } - rootNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); -} - void OverlayManager::BeforeShowDialog(const RefPtr& node) { CHECK_NULL_VOID(node); @@ -1349,18 +1253,23 @@ bool OverlayManager::RemoveDialog(const RefPtr& overlay, bool isBackP bool OverlayManager::RemoveBubble(const RefPtr& overlay) { + auto bubbleEventHub = overlay->GetEventHub(); + CHECK_NULL_RETURN(bubbleEventHub, false); + bubbleEventHub->FireChangeEvent(false); + auto rootNode = overlay->GetParent(); + CHECK_NULL_RETURN(rootNode, false); for (const auto& popup : popupMap_) { auto targetId = popup.first; auto popupInfo = popup.second; if (overlay == popupInfo.popupNode) { - popupInfo.markNeedUpdate = true; - HidePopup(targetId, popupInfo); + popupMap_.erase(targetId); + rootNode->RemoveChild(overlay); + rootNode->MarkDirtyNode(PROPERTY_UPDATE_BY_CHILD_REQUEST); return true; } } return false; } - bool OverlayManager::RemoveMenu(const RefPtr& overlay) { auto menuWrapperPattern = overlay->GetPattern(); diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index f0ffe43292b79c3f83e32ce4c4593a2ecfd3b461..0a600c0acf9012abf423219923aa0eb7560b7c6e 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -72,9 +72,8 @@ public: void ShowIndexerPopup(int32_t targetId, RefPtr& customNode); void RemoveIndexerPopupById(int32_t targetId); void RemoveIndexerPopup(); + void UpdatePopupNode(int32_t targetId, const PopupInfo& popupInfo); void HidePopup(int32_t targetId, const PopupInfo& popupInfo); - void HidePopupWithoutAnimation(int32_t targetId, const PopupInfo& popupInfo); - void ShowPopup(int32_t targetId, const PopupInfo& popupInfo); void ErasePopup(int32_t targetId); void HideAllPopups(); void HideCustomPopups(); @@ -102,7 +101,6 @@ public: void HideMenuInSubWindow(bool showPreviewAnimation = true, bool startDrag = false); void CleanMenuInSubWindow(); void CleanPreviewInSubWindow(); - void CleanPopupInSubWindow(); void CleanMenuInSubWindowWithAnimation(); void HideAllMenus(); diff --git a/frameworks/core/components_ng/test/pattern/overlay/overlay_manager_test_ng.cpp b/frameworks/core/components_ng/test/pattern/overlay/overlay_manager_test_ng.cpp index 88b504ae1efceb3bb05142c4d661d2fa2a0e7bd2..1f2bd1c4e36f7470f868aeba0b8441e2f7630676 100644 --- a/frameworks/core/components_ng/test/pattern/overlay/overlay_manager_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/overlay/overlay_manager_test_ng.cpp @@ -141,7 +141,7 @@ void OverlayManagerTestNg::CreateSheetStyle(SheetStyle& sheetStyle) } /** * @tc.name: PopupTest001 - * @tc.desc: Test OverlayManager::ShowPopup. + * @tc.desc: Test OverlayManager::UpdatePopupNode. * @tc.type: FUNC */ HWTEST_F(OverlayManagerTestNg, PopupTest001, TestSize.Level1) @@ -163,14 +163,14 @@ HWTEST_F(OverlayManagerTestNg, PopupTest001, TestSize.Level1) popupInfo.isCurrentOnShow = true; /** - * @tc.steps: step2. create overlayManager and call HidePopup. + * @tc.steps: step2. create overlayManager and call UpdatePopupNode. * @tc.expected: popupMap's data is updated successfully */ auto rootNode = FrameNode::CreateFrameNode(V2::ROOT_ETS_TAG, 1, AceType::MakeRefPtr()); popupNode->MountToParent(rootNode); rootNode->MarkDirtyNode(); auto overlayManager = AceType::MakeRefPtr(rootNode); - overlayManager->HidePopup(targetId, popupInfo); + overlayManager->UpdatePopupNode(targetId, popupInfo); EXPECT_FALSE(overlayManager->popupMap_[targetId].isCurrentOnShow); /** @@ -844,16 +844,16 @@ HWTEST_F(OverlayManagerTestNg, PopupTest002, TestSize.Level1) popups.emplace_back(popupInfo); } /** - * @tc.steps: step2. create overlayManager and call ShowPopup. + * @tc.steps: step2. create overlayManager and call UpdatePopupNode. * @tc.expected: Push popup successfully */ auto rootNode = FrameNode::CreateFrameNode(V2::ROOT_ETS_TAG, 1, AceType::MakeRefPtr()); auto overlayManager = AceType::MakeRefPtr(rootNode); auto targetId1 = targetNodes[0]->GetId(); auto targetId2 = targetNodes[1]->GetId(); - overlayManager->ShowPopup(targetId1, popups[0]); + overlayManager->UpdatePopupNode(targetId1, popups[0]); EXPECT_TRUE(overlayManager->popupMap_[targetId1].isCurrentOnShow); - overlayManager->ShowPopup(targetId2, popups[1]); + overlayManager->UpdatePopupNode(targetId2, popups[1]); EXPECT_TRUE(overlayManager->popupMap_[targetId2].isCurrentOnShow); /** * @tc.steps: step3. call HideCustomPopups when childCount is 2 @@ -866,8 +866,8 @@ HWTEST_F(OverlayManagerTestNg, PopupTest002, TestSize.Level1) * @tc.steps: step4. call RemoveOverlay when childCount is 2 * @tc.expected: remove one popupNode at a time */ - overlayManager->HidePopup(targetId1, popups[0]); - overlayManager->HidePopup(targetId2, popups[1]); + overlayManager->UpdatePopupNode(targetId1, popups[0]); + overlayManager->UpdatePopupNode(targetId2, popups[1]); EXPECT_TRUE(overlayManager->RemoveOverlay(false)); EXPECT_FALSE(overlayManager->popupMap_.empty()); overlayManager->ErasePopup(targetId1); @@ -1285,7 +1285,7 @@ HWTEST_F(OverlayManagerTestNg, PopupTest004, TestSize.Level1) */ auto rootNode = FrameNode::CreateFrameNode(V2::ROOT_ETS_TAG, 1, AceType::MakeRefPtr()); auto overlayManager = AceType::MakeRefPtr(rootNode); - overlayManager->ShowPopup(targetId, popupInfo); + overlayManager->UpdatePopupNode(targetId, popupInfo); overlayManager->HideAllPopups(); EXPECT_FALSE(overlayManager->popupMap_[targetId].markNeedUpdate); EXPECT_TRUE(rootNode->GetChildren().empty()); @@ -1294,7 +1294,7 @@ HWTEST_F(OverlayManagerTestNg, PopupTest004, TestSize.Level1) * @tc.expected: popupMap's data is updated successfully */ layoutProp->UpdateShowInSubWindow(true); - overlayManager->ShowPopup(targetId, popupInfo); + overlayManager->UpdatePopupNode(targetId, popupInfo); overlayManager->HideAllPopups(); EXPECT_FALSE(overlayManager->popupMap_[targetId].markNeedUpdate); @@ -1355,7 +1355,7 @@ HWTEST_F(OverlayManagerTestNg, RemoveOverlayTest001, TestSize.Level1) */ auto rootNode = FrameNode::CreateFrameNode(V2::ROOT_ETS_TAG, 1, AceType::MakeRefPtr()); auto overlayManager = AceType::MakeRefPtr(rootNode); - overlayManager->HidePopup(targetId, popupInfo); + overlayManager->UpdatePopupNode(targetId, popupInfo); EXPECT_FALSE(overlayManager->popupMap_[targetId].markNeedUpdate); auto res = overlayManager->RemoveOverlay(false); EXPECT_FALSE(res); diff --git a/test/mock/base/mock_subwindow.h b/test/mock/base/mock_subwindow.h index 8e1126d870251b9ab0a3f6088136acc2ea540d7f..ff35867d83f4665d7a9dce457713aec47fa32b85 100644 --- a/test/mock/base/mock_subwindow.h +++ b/test/mock/base/mock_subwindow.h @@ -35,7 +35,6 @@ public: MOCK_METHOD2(ShowPopup, void(const RefPtr& newComponent, bool disableTouchEvent)); MOCK_METHOD2(ShowPopupNG, void(int32_t targetId, const NG::PopupInfo& popupInfo)); MOCK_METHOD1(HidePopupNG, void(int32_t targetId)); - MOCK_METHOD0(ClearPopupNG, void()); MOCK_METHOD2(GetPopupInfoNG, void(int32_t targetId, NG::PopupInfo& popupInfo)); MOCK_METHOD1(CancelPopup, bool(const std::string& id)); MOCK_METHOD0(CloseMenu, void()); diff --git a/test/unittest/core/base/view_abstract/view_abstract_test_ng.cpp b/test/unittest/core/base/view_abstract/view_abstract_test_ng.cpp index f8a12f9667f55e20c78a8c01eec2aed0f599e172..af51cacd9894ce8f7c23472780cee2d588241077 100755 --- a/test/unittest/core/base/view_abstract/view_abstract_test_ng.cpp +++ b/test/unittest/core/base/view_abstract/view_abstract_test_ng.cpp @@ -1076,7 +1076,7 @@ HWTEST_F(ViewAbstractTestNg, ViewAbstractTest025, TestSize.Level1) PopupInfo info = overlayManager->GetPopupInfo(targetNode->GetId()); info.isCurrentOnShow = true; info.popupId = 1; - overlayManager->ShowPopup(targetNode->GetId(), info); + overlayManager->UpdatePopupNode(targetNode->GetId(), info); /** * @tc.steps: step3. Call BindPopup many times. diff --git a/test/unittest/core/pipeline/mock_overlay_manager.cpp b/test/unittest/core/pipeline/mock_overlay_manager.cpp index 944d6bb7710e2e05396bce01e8f49bb378dd906b..8dfddc9667b06a35eb3a08ee337545a913d91374 100644 --- a/test/unittest/core/pipeline/mock_overlay_manager.cpp +++ b/test/unittest/core/pipeline/mock_overlay_manager.cpp @@ -30,7 +30,7 @@ void OverlayManager::ClearToast() {} void OverlayManager::PopToast(int32_t toastId) {} -void OverlayManager::ShowPopup(int32_t targetId, const PopupInfo& popupInfo) {} +void OverlayManager::UpdatePopupNode(int32_t targetId, const PopupInfo& popupInfo) {} void OverlayManager::HidePopup(int32_t targetId, const PopupInfo& popupInfo) {}