!47523 修复isEntry嵌套navigation不一步返回的问题挑单5.0.1

Merge pull request !47523 from 孙鑫炎/cherry-pick-1730632309
This commit is contained in:
openharmony_ci 2024-11-05 10:38:29 +00:00 committed by Gitee
commit 5efc52cada
No known key found for this signature in database
GPG Key ID: 173E9B9CA92EEF8F
12 changed files with 39 additions and 22 deletions

View File

@ -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);
}

View File

@ -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",

View File

@ -143,7 +143,7 @@ public:
popAnimations_.clear();
}
bool CheckCanHandleBack();
bool CheckCanHandleBack(bool& isEntry);
void OnInspectorIdUpdate(const std::string& id) override;

View File

@ -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());
}
}

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);
}

View File

@ -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);

View File

@ -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);
}
/**