diff --git a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp index 56b7cf9b91d12a8ae302b789b44b2eadc044b801..dba2d0b2730485e1162d6dd0d792f8f8cc442dac 100644 --- a/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp +++ b/frameworks/core/components_ng/pattern/navigation/navigation_pattern.cpp @@ -170,6 +170,10 @@ void NavigationPattern::ReplaceNodeWithProxyNodeIfNeeded( if (property) { property->UpdateVisibility(VisibleType::VISIBLE); } + auto eventHub = node->GetOrCreateEventHub(); + if (eventHub) { + eventHub->SetEnabledInternal(true); + } auto childIndex = navContentNode->GetChildIndex(node); if (childIndex < 0) { return; @@ -1824,7 +1828,14 @@ void NavigationPattern::TransitionWithOutAnimation(RefPtrGetUsrNavigationModeValue(NavigationMode::AUTO) == NavigationMode::STACK && navBarOrHomeDestNode) { navBarOrHomeDestNode->SetTransitionType(PageTransitionType::EXIT_PUSH); - DealTransitionVisibility(navBarOrHomeDestNode, false, true); + /** + * In the follow situations, navBar is still visible + * 1. Navigation is in force split mode, and navBar was recognized as the homePage. + * 2. Push a Standard NavDestination from navBar. + * 3. Finally navBar is displayed on the primary side, NavDestination is displayed on the secondary side. + */ + bool isVisible = forceSplitSuccess_ && navBarIsHome_; + DealTransitionVisibility(navBarOrHomeDestNode, isVisible, true); } // if current mode is auto, need set navBar need set invisible true navigationNode->SetNeedSetInvisible(true); diff --git a/test/unittest/core/pattern/navigation/navigation_layout_test_ng.cpp b/test/unittest/core/pattern/navigation/navigation_layout_test_ng.cpp index 2cff60d68c488cad34d99109f9eb380ef3299748..13ec176b3f436551ea2e121982548567771d8e61 100644 --- a/test/unittest/core/pattern/navigation/navigation_layout_test_ng.cpp +++ b/test/unittest/core/pattern/navigation/navigation_layout_test_ng.cpp @@ -1234,6 +1234,41 @@ HWTEST_F(NavigationLayoutTestNg, NavigationPatternTest057, TestSize.Level1) navigationPattern->AddDividerHotZoneRect(); } +/** + * @tc.name: NavigationPatternTest058 + * @tc.desc: Branch: bool isVisible = forceSplitSuccess_ && navBarIsHome_; => true + * @tc.type: FUNC + */ +HWTEST_F(NavigationLayoutTestNg, NavigationPatternTest058, TestSize.Level1) +{ + MockPipelineContextGetTheme(); + NavigationModelNG model; + model.Create(); + model.SetNavigationStack(); + auto navigation = + AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainElementNode()); + ASSERT_NE(navigation, nullptr); + auto navigationProperty = navigation->GetLayoutProperty(); + ASSERT_NE(navigationProperty, nullptr); + auto navigationPattern = navigation->GetPattern(); + ASSERT_NE(navigationPattern, nullptr); + auto navBar = AceType::DynamicCast(navigation->GetNavBarNode()); + ASSERT_NE(navBar, nullptr); + auto navBarProperty = navBar->GetLayoutProperty(); + ASSERT_NE(navBarProperty, nullptr); + auto newTop = NavDestinationGroupNode::GetOrCreateGroupNode(V2::NAVDESTINATION_VIEW_ETS_TAG, + ElementRegister::GetInstance()->MakeUniqueId(), []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(newTop, nullptr); + + navigationPattern->forceSplitSuccess_ = true; + navigationPattern->navBarIsHome_ = true; + newTop->SetNavDestinationMode(NavDestinationMode::STANDARD); + navigationProperty->UpdateUsrNavigationMode(NavigationMode::STACK); + navBarProperty->UpdateVisibility(VisibleType::INVISIBLE); + navigationPattern->TransitionWithOutAnimation(nullptr, newTop, false, false); + EXPECT_EQ(navBarProperty->GetVisibilityValue(VisibleType::INVISIBLE), VisibleType::VISIBLE); +} + /** * @tc.name: HandleBack001 * @tc.desc: Test HandleBack and match all conditions of "!isOverride && !isLastChild". diff --git a/test/unittest/core/pattern/navigation/navigation_pattern_test_seven_ng.cpp b/test/unittest/core/pattern/navigation/navigation_pattern_test_seven_ng.cpp index 8b6c1114c1a2a3b4df0722e38b22b39d2718cd68..5f19d98c593c20cae71e6e27ecf558b79a6fdd0b 100644 --- a/test/unittest/core/pattern/navigation/navigation_pattern_test_seven_ng.cpp +++ b/test/unittest/core/pattern/navigation/navigation_pattern_test_seven_ng.cpp @@ -429,6 +429,37 @@ HWTEST_F(NavigationPatternTestSevenNg, ReplaceNodeWithProxyNodeIfNeeded004, Test EXPECT_EQ(proxyNode->GetIndex(), 1); } +/** + * @tc.name: ReplaceNodeWithProxyNodeIfNeeded005 + * @tc.desc: Branch: if (!proxyNode) { => false + * if (eventHub) { => false + * @tc.type: FUNC + */ +HWTEST_F(NavigationPatternTestSevenNg, ReplaceNodeWithProxyNodeIfNeeded005, TestSize.Level1) +{ + NavigationModelNG navigationModel; + navigationModel.Create(); + navigationModel.SetNavigationStack(); + auto navNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainFrameNode()); + ASSERT_NE(navNode, nullptr); + auto navContentNode = AceType::DynamicCast(navNode->GetContentNode()); + ASSERT_NE(navContentNode, nullptr); + auto property = navNode->GetLayoutProperty(); + ASSERT_NE(property, nullptr); + auto pattern = navNode->GetPattern(); + ASSERT_NE(pattern, nullptr); + + auto dest = NavDestinationGroupNode::GetOrCreateGroupNode( + V2::NAVDESTINATION_VIEW_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), + []() { return AceType::MakeRefPtr(); }); + ASSERT_NE(dest, nullptr); + auto eventHub = dest->GetOrCreateEventHub(); + ASSERT_NE(eventHub, nullptr); + eventHub->SetEnabledInternal(false); + pattern->ReplaceNodeWithProxyNodeIfNeeded(navContentNode, dest); + EXPECT_TRUE(eventHub->enabled_); +} + /** * @tc.name: RestoreNodeFromProxyNodeIfNeeded001 * @tc.desc: Branch: if (childIndex < 0) { => true