mirror of
https://gitee.com/openharmony/arkui_ace_engine
synced 2025-02-21 13:08:05 +00:00
!47523 修复isEntry嵌套navigation不一步返回的问题挑单5.0.1
Merge pull request !47523 from 孙鑫炎/cherry-pick-1730632309
This commit is contained in:
commit
5efc52cada
@ -371,6 +371,7 @@ RefPtr<NG::UINode> JSNavigationStack::CreateNodeByIndex(int32_t index, const Wea
|
||||
pattern->SetIndex(index);
|
||||
auto onPop = GetOnPopByIndex(index);
|
||||
auto isEntry = GetIsEntryByIndex(index);
|
||||
TAG_LOGD(AceLogTag::ACE_NAVIGATION, "create destination node, isEntry %{public}d", isEntry);
|
||||
auto pathInfo = AceType::MakeRefPtr<JSNavPathInfo>(name, param, onPop, isEntry);
|
||||
pattern->SetNavPathInfo(pathInfo);
|
||||
pattern->SetNavigationStack(WeakClaim(this));
|
||||
@ -473,7 +474,6 @@ bool JSNavigationStack::GetIsEntryByIndex(int32_t index)
|
||||
void JSNavigationStack::SetIsEntryByIndex(int32_t index, bool isEntry)
|
||||
{
|
||||
JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(executionContext_);
|
||||
CHECK_NULL_VOID(dataSourceObj_->IsEmpty());
|
||||
if (dataSourceObj_->IsEmpty()) {
|
||||
return;
|
||||
}
|
||||
@ -1040,7 +1040,9 @@ void JSNavigationStack::UpdatePathInfoIfNeeded(RefPtr<NG::UINode>& uiNode, int32
|
||||
auto name = GetNameByIndex(index);
|
||||
auto param = GetParamByIndex(index);
|
||||
auto onPop = GetOnPopByIndex(index);
|
||||
auto pathInfo = AceType::MakeRefPtr<JSNavPathInfo>(name, param, onPop);
|
||||
auto isEntry = GetIsEntryByIndex(index);
|
||||
TAG_LOGD(AceLogTag::ACE_NAVIGATION, "update destination node info, isEntry %{public}d", isEntry);
|
||||
auto pathInfo = AceType::MakeRefPtr<JSNavPathInfo>(name, param, onPop, isEntry);
|
||||
pattern->SetNavPathInfo(pathInfo);
|
||||
}
|
||||
|
||||
|
@ -443,7 +443,7 @@ RefPtr<FrameNode> NavigationGroupNode::GetTopDestination()
|
||||
return topNavdestination;
|
||||
}
|
||||
|
||||
bool NavigationGroupNode::CheckCanHandleBack()
|
||||
bool NavigationGroupNode::CheckCanHandleBack(bool& isEntry)
|
||||
{
|
||||
auto navigation = AceType::WeakClaim(this).Upgrade();
|
||||
CHECK_NULL_RETURN(navigation, false);
|
||||
@ -472,13 +472,14 @@ bool NavigationGroupNode::CheckCanHandleBack()
|
||||
CHECK_NULL_RETURN(navDestinationContext, false);
|
||||
auto navPathInfo = navDestinationContext->GetNavPathInfo();
|
||||
CHECK_NULL_RETURN(navPathInfo, false);
|
||||
auto isEntry = navPathInfo->GetIsEntry();
|
||||
if (isEntry) {
|
||||
auto isPathEntry = navPathInfo->GetIsEntry();
|
||||
if (isPathEntry) {
|
||||
TAG_LOGI(AceLogTag::ACE_NAVIGATION, "%{public}s is entry navDestination, do not consume backPressed event",
|
||||
navDestinationPattern->GetName().c_str());
|
||||
navPathInfo->SetIsEntry(false);
|
||||
auto index = navDestinationContext->GetIndex();
|
||||
navigationStack->SetIsEntryByIndex(index, false);
|
||||
isEntry = true;
|
||||
return false;
|
||||
}
|
||||
TAG_LOGI(AceLogTag::ACE_NAVIGATION, "navDestination consume back button event: %{public}s",
|
||||
|
@ -143,7 +143,7 @@ public:
|
||||
popAnimations_.clear();
|
||||
}
|
||||
|
||||
bool CheckCanHandleBack();
|
||||
bool CheckCanHandleBack(bool& isEntry);
|
||||
|
||||
void OnInspectorIdUpdate(const std::string& id) override;
|
||||
|
||||
|
@ -609,7 +609,7 @@ void NavigationLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper)
|
||||
auto geometryNode = hostNode->GetGeometryNode();
|
||||
CHECK_NULL_VOID(geometryNode);
|
||||
TAG_LOGD(AceLogTag::ACE_NAVIGATION,
|
||||
"Navigation id is %d{public}, frameRect is %{public}s",
|
||||
"Navigation id is %{public}d, frameRect is %{public}s",
|
||||
hostNode->GetId(), geometryNode->GetFrameRect().ToString().c_str());
|
||||
}
|
||||
}
|
||||
|
@ -395,7 +395,7 @@ void NavDestinationLayoutAlgorithm::Layout(LayoutWrapper* layoutWrapper)
|
||||
auto geometryNode = hostNode->GetGeometryNode();
|
||||
CHECK_NULL_VOID(geometryNode);
|
||||
TAG_LOGD(AceLogTag::ACE_NAVIGATION,
|
||||
"Navdestination id is %d{public}, frameRect is %{public}s",
|
||||
"Navdestination id is %{public}d, frameRect is %{public}s",
|
||||
hostNode->GetId(), geometryNode->GetFrameRect().ToString().c_str());
|
||||
}
|
||||
LayoutSheet(hostNode);
|
||||
|
@ -3113,8 +3113,9 @@ bool OverlayManager::RemoveOverlay(bool isBackPressed, bool isPageRouter)
|
||||
// remove navDestination in navigation first
|
||||
do {
|
||||
CHECK_NULL_BREAK(rootNode->GetTag() != V2::NAVDESTINATION_VIEW_ETS_TAG);
|
||||
bool isEntry = false;
|
||||
auto navigationGroupNode =
|
||||
AceType::DynamicCast<NavigationGroupNode>(pipeline->FindNavigationNodeToHandleBack(overlay));
|
||||
AceType::DynamicCast<NavigationGroupNode>(pipeline->FindNavigationNodeToHandleBack(overlay, isEntry));
|
||||
CHECK_NULL_BREAK(navigationGroupNode);
|
||||
return true;
|
||||
} while (0);
|
||||
|
@ -2027,8 +2027,9 @@ bool PipelineContext::OnBackPressed()
|
||||
CHECK_NULL_VOID(stageManager);
|
||||
auto lastPage = stageManager->GetLastPage();
|
||||
CHECK_NULL_VOID(lastPage);
|
||||
bool isEntry = false;
|
||||
auto navigationGroupNode =
|
||||
AceType::DynamicCast<NavigationGroupNode>(context->FindNavigationNodeToHandleBack(lastPage));
|
||||
AceType::DynamicCast<NavigationGroupNode>(context->FindNavigationNodeToHandleBack(lastPage, isEntry));
|
||||
if (navigationGroupNode) {
|
||||
result = true;
|
||||
}
|
||||
@ -2060,7 +2061,7 @@ bool PipelineContext::OnBackPressed()
|
||||
return false;
|
||||
}
|
||||
|
||||
RefPtr<FrameNode> PipelineContext::FindNavigationNodeToHandleBack(const RefPtr<UINode>& node)
|
||||
RefPtr<FrameNode> PipelineContext::FindNavigationNodeToHandleBack(const RefPtr<UINode>& node, bool& isEntry)
|
||||
{
|
||||
CHECK_NULL_RETURN(node, nullptr);
|
||||
const auto& children = node->GetChildren();
|
||||
@ -2078,16 +2079,22 @@ RefPtr<FrameNode> PipelineContext::FindNavigationNodeToHandleBack(const RefPtr<U
|
||||
auto navigationGroupNode = AceType::DynamicCast<NavigationGroupNode>(childNode);
|
||||
auto topChild = navigationGroupNode->GetTopDestination();
|
||||
// find navigation from top destination
|
||||
auto targetNodeFromDestination = FindNavigationNodeToHandleBack(topChild);
|
||||
auto targetNodeFromDestination = FindNavigationNodeToHandleBack(topChild, isEntry);
|
||||
if (targetNodeFromDestination) {
|
||||
return targetNodeFromDestination;
|
||||
}
|
||||
if (isEntry) {
|
||||
return nullptr;
|
||||
}
|
||||
targetNodeFromDestination = childNode;
|
||||
auto targetNavigation = AceType::DynamicCast<NavigationGroupNode>(targetNodeFromDestination);
|
||||
// check if the destination responds
|
||||
if (targetNavigation && targetNavigation->CheckCanHandleBack()) {
|
||||
if (targetNavigation && targetNavigation->CheckCanHandleBack(isEntry)) {
|
||||
return targetNavigation;
|
||||
}
|
||||
if (isEntry) {
|
||||
return nullptr;
|
||||
}
|
||||
// if the destination does not responds, find navigation from navbar
|
||||
auto navBarNode = AceType::DynamicCast<NavBarNode>(navigationGroupNode->GetNavBarNode());
|
||||
auto navigationLayoutProperty = navigationGroupNode->GetLayoutProperty<NavigationLayoutProperty>();
|
||||
@ -2095,16 +2102,19 @@ RefPtr<FrameNode> PipelineContext::FindNavigationNodeToHandleBack(const RefPtr<U
|
||||
if (navigationLayoutProperty->GetHideNavBarValue(false)) {
|
||||
return nullptr;
|
||||
}
|
||||
auto targetNodeFromNavbar = FindNavigationNodeToHandleBack(navBarNode);
|
||||
auto targetNodeFromNavbar = FindNavigationNodeToHandleBack(navBarNode, isEntry);
|
||||
if (targetNodeFromNavbar) {
|
||||
return targetNodeFromNavbar;
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
auto target = FindNavigationNodeToHandleBack(child);
|
||||
auto target = FindNavigationNodeToHandleBack(child, isEntry);
|
||||
if (target) {
|
||||
return target;
|
||||
}
|
||||
if (isEntry) {
|
||||
return nullptr;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -257,7 +257,7 @@ public:
|
||||
|
||||
bool OnBackPressed();
|
||||
|
||||
RefPtr<FrameNode> FindNavigationNodeToHandleBack(const RefPtr<UINode>& node);
|
||||
RefPtr<FrameNode> FindNavigationNodeToHandleBack(const RefPtr<UINode>& node, bool& isEntry);
|
||||
|
||||
void AddDirtyPropertyNode(const RefPtr<FrameNode>& dirty);
|
||||
|
||||
|
@ -575,7 +575,7 @@ bool PipelineContext::HasDifferentDirectionGesture() const
|
||||
|
||||
void PipelineContext::SetJSViewActive(bool active, WeakPtr<CustomNode> custom) {}
|
||||
|
||||
RefPtr<FrameNode> PipelineContext::FindNavigationNodeToHandleBack(const RefPtr<UINode>& node)
|
||||
RefPtr<FrameNode> PipelineContext::FindNavigationNodeToHandleBack(const RefPtr<UINode>& node, bool& isEntry)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
@ -536,15 +536,16 @@ HWTEST_F(NavigationTestNg, NavigationModelNG0017, TestSize.Level1)
|
||||
auto child = FrameNode::CreateFrameNode("navigationContent", 345, AceType::MakeRefPtr<ButtonPattern>());
|
||||
navigationContentNode->children_.push_back(child);
|
||||
|
||||
navigation->CheckCanHandleBack();
|
||||
bool isEntry = false;
|
||||
navigation->CheckCanHandleBack(isEntry);
|
||||
ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::AUTO);
|
||||
navigationPattern->navigationMode_ = NavigationMode::SPLIT;
|
||||
navigation->CheckCanHandleBack();
|
||||
navigation->CheckCanHandleBack(isEntry);
|
||||
ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::SPLIT);
|
||||
auto child2 = FrameNode::CreateFrameNode("navigationContent", 346, AceType::MakeRefPtr<ButtonPattern>());
|
||||
navigationContentNode->children_.push_back(child2);
|
||||
navigationPattern->navigationMode_ = NavigationMode::SPLIT;
|
||||
navigation->CheckCanHandleBack();
|
||||
navigation->CheckCanHandleBack(isEntry);
|
||||
ASSERT_EQ(navigationPattern->navigationMode_, NavigationMode::SPLIT);
|
||||
}
|
||||
|
||||
|
@ -159,7 +159,8 @@ HWTEST_F(NavrouterModelTestNg, NavrouterTestNg0021, TestSize.Level1)
|
||||
parent->isOnAnimation_ = true;
|
||||
auto onBackButtonEvent = [](GestureEvent&) -> bool {return true;};
|
||||
navDestination->backButtonEvent_ = onBackButtonEvent;
|
||||
parent->CheckCanHandleBack();
|
||||
bool isEntry = false;
|
||||
parent->CheckCanHandleBack(isEntry);
|
||||
bool isPop = true;
|
||||
EXPECT_TRUE(parent->isOnAnimation_);
|
||||
pattern->TransitionWithAnimation(preNavDestination, navDestination, isPop);
|
||||
|
@ -740,7 +740,8 @@ HWTEST_F(PipelineContextTestNg, PipelineContextTestNg053, TestSize.Level1)
|
||||
context_->AddNavigationNode(nodeId, AceType::WeakClaim(AceType::RawPtr(node)));
|
||||
context_->RemoveNavigationNode(nodeId, nodeId);
|
||||
context_->FirePageChanged(nodeId, false);
|
||||
EXPECT_EQ(context_->FindNavigationNodeToHandleBack(node), nullptr);
|
||||
bool isEntry = false;
|
||||
EXPECT_EQ(context_->FindNavigationNodeToHandleBack(node, isEntry), nullptr);
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user