diff --git a/frameworks/bridge/declarative_frontend/ng/page_router_manager.cpp b/frameworks/bridge/declarative_frontend/ng/page_router_manager.cpp index ed2d76f83e2..b1175b06acc 100644 --- a/frameworks/bridge/declarative_frontend/ng/page_router_manager.cpp +++ b/frameworks/bridge/declarative_frontend/ng/page_router_manager.cpp @@ -1167,7 +1167,7 @@ void PageRouterManager::CleanPageOverlay() sharedManager->StopSharedTransition(); } - if (overlayManager->RemoveOverlay()) { + if (overlayManager->RemoveOverlay(true)) { LOGI("clean page overlay."); } } diff --git a/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp b/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp index eba46c94a85..99fb27d63b4 100644 --- a/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp +++ b/frameworks/core/components_ng/pattern/dialog/dialog_pattern.cpp @@ -648,10 +648,6 @@ bool DialogPattern::OnKeyEvent(const KeyEvent& event) if (event.action != KeyAction::DOWN) { return false; } - if (event.code == KeyCode::KEY_ESCAPE) { - PopDialog(); - return true; - } return false; } diff --git a/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp b/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp index c5f743fdb9e..b56332c2719 100644 --- a/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp +++ b/frameworks/core/components_ng/pattern/menu/menu_pattern.cpp @@ -230,10 +230,6 @@ bool MenuPattern::OnKeyEvent(const KeyEvent& event) const wrapperPattern->HideSubMenu(); return true; } - if (event.code == KeyCode::KEY_ESCAPE) { - HideMenu(); - return true; - } return false; } diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp index ce33b55a6ff..84905720022 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.cpp @@ -840,7 +840,7 @@ void OverlayManager::CloseDialog(const RefPtr& dialogNode) CallOnHideDialogCallback(); } -bool OverlayManager::RemoveOverlay() +bool OverlayManager::RemoveOverlay(bool isBackPressed) { auto rootNode = rootNodeWeak_.Upgrade(); CHECK_NULL_RETURN(rootNode, true); @@ -861,7 +861,9 @@ bool OverlayManager::RemoveOverlay() hub->FireCancelEvent(); } CloseDialog(overlay); - SetBackPressEvent(nullptr); + if (isBackPressed) { + SetBackPressEvent(nullptr); + } return true; } else if (AceType::DynamicCast(pattern)) { auto popupNode = AceType::DynamicCast(rootNode->GetChildAtIndex(childrenSize - 1)); @@ -1009,6 +1011,20 @@ void OverlayManager::FocusOverlayNode(const RefPtr& overlayNode, bool void OverlayManager::BlurOverlayNode(bool isInSubWindow) { LOGI("OverlayManager::BlurOverlayNode"); + auto rootNode = rootNodeWeak_.Upgrade(); + CHECK_NULL_VOID(rootNode); + if (rootNode->GetChildren().size() > 1) { + auto collection = rootNode->GetChildren(); + for (auto iter = collection.rbegin(); iter != collection.rend(); ++iter) { + auto overlay = DynamicCast(*iter); + CHECK_NULL_VOID(overlay); + auto pattern = overlay->GetPattern(); + if (AceType::InstanceOf(pattern) || AceType::InstanceOf(pattern)) { + FocusOverlayNode(overlay, isInSubWindow); + return; + } + } + } if (isInSubWindow) { // no need to set page request focus in sub window. return; diff --git a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h index 178e3ff4c2d..57c21293042 100644 --- a/frameworks/core/components_ng/pattern/overlay/overlay_manager.h +++ b/frameworks/core/components_ng/pattern/overlay/overlay_manager.h @@ -108,7 +108,7 @@ public: * * @return true if popup was removed, false if no overlay exists */ - bool RemoveOverlay(); + bool RemoveOverlay(bool isBackPressed); bool RemoveModalInOverlay(); bool RemoveOverlayInSubwindow(); diff --git a/frameworks/core/pipeline_ng/pipeline_context.cpp b/frameworks/core/pipeline_ng/pipeline_context.cpp index 85e2a8cfa10..f13d81182a1 100644 --- a/frameworks/core/pipeline_ng/pipeline_context.cpp +++ b/frameworks/core/pipeline_ng/pipeline_context.cpp @@ -859,7 +859,7 @@ bool PipelineContext::OnBackPressed() [weakOverlay = AceType::WeakClaim(AceType::RawPtr(overlayManager_)), &hasOverlay]() { auto overlay = weakOverlay.Upgrade(); CHECK_NULL_VOID_NOLOG(overlay); - hasOverlay = overlay->RemoveOverlay(); + hasOverlay = overlay->RemoveOverlay(true); }, TaskExecutor::TaskType::UI); if (hasOverlay) { @@ -1293,7 +1293,16 @@ bool PipelineContext::OnKeyEvent(const KeyEvent& event) auto mainNode = lastPage ? lastPage : rootNode_; CHECK_NULL_RETURN(mainNode, false); if (!eventManager_->DispatchTabIndexEventNG(event, rootNode_, mainNode)) { - return eventManager_->DispatchKeyEventNG(event, rootNode_); + if (!eventManager_->DispatchKeyEventNG(event, rootNode_) && event.code == KeyCode::KEY_ESCAPE && + event.action == KeyAction::DOWN) { + CHECK_NULL_RETURN(overlayManager_, false); + auto currentContainer = Container::Current(); + if (currentContainer->IsSubContainer() || currentContainer->IsDialogContainer()) { + return overlayManager_->RemoveOverlayInSubwindow(); + } else { + return overlayManager_->RemoveOverlay(false); + } + } } return true; } diff --git a/test/unittest/core/pipeline/mock_overlay_manager.cpp b/test/unittest/core/pipeline/mock_overlay_manager.cpp index 75ca6f55afe..84dac656d00 100644 --- a/test/unittest/core/pipeline/mock_overlay_manager.cpp +++ b/test/unittest/core/pipeline/mock_overlay_manager.cpp @@ -76,7 +76,12 @@ void OverlayManager::CloseDialog(const RefPtr& dialogNode) removeOverlayFlag = (dialogNode != nullptr); } -bool OverlayManager::RemoveOverlay() +bool OverlayManager::RemoveOverlay(bool isBackPressed) +{ + return removeOverlayFlag; +} + +bool OverlayManager::RemoveOverlayInSubwindow() { return removeOverlayFlag; }