diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp b/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp index 8e3ecb0d20c93447277392eb9ca83f54d5e9709a..04c36740a11e9f60d7d0097de271c6aee51a13b5 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/tabs/tabs_model_ng.cpp @@ -1680,10 +1680,7 @@ void TabsModelNG::HandleBackgroundEffectInactiveColor(FrameNode* frameNode, cons CHECK_NULL_VOID(pattern); const std::string key = "tabsBackGroundEffectInactiveColor"; pattern->RemoveResObj(key); - CHECK_NULL_VOID(resObj); - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode), - weakPattern = AceType::WeakClaim(AceType::RawPtr(pattern))]( - const RefPtr& resObj) { + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode), resObj](const RefPtr& dummyResObj) { auto tabsNode = AceType::DynamicCast(weak.Upgrade()); CHECK_NULL_VOID(tabsNode); auto tabBarNode = AceType::DynamicCast(tabsNode->GetTabBar()); @@ -1692,12 +1689,17 @@ void TabsModelNG::HandleBackgroundEffectInactiveColor(FrameNode* frameNode, cons CHECK_NULL_VOID(target); EffectOption option = target->GetBackgroundEffect().value_or(EffectOption{}); option.isWindowFocused = true; // set to default value + if (!resObj) { + TabsModelNG::SetBarBackgroundEffect(AceType::RawPtr(tabsNode), option); + return; + } Color result = Color::TRANSPARENT; option.isValidColor = ResourceParseUtils::ParseResColor(resObj, result); option.inactiveColor = result; TabsModelNG::SetBarBackgroundEffect(AceType::RawPtr(tabsNode), option); }; - pattern->AddResObj(key, resObj, std::move(updateFunc)); + RefPtr dummyResObj = AceType::MakeRefPtr("", "", -1); + pattern->AddResObj(key, dummyResObj, std::move(updateFunc)); } void TabsModelNG::HandleBackgroundBlurStyleInactiveColor(FrameNode* frameNode, const RefPtr& resObj, @@ -1708,10 +1710,7 @@ void TabsModelNG::HandleBackgroundBlurStyleInactiveColor(FrameNode* frameNode, c CHECK_NULL_VOID(pattern); const std::string key = "tabsBackGroundBlurStyle"; pattern->RemoveResObj(key); - CHECK_NULL_VOID(resObj); - auto&& updateFunc = [weak = AceType::WeakClaim(frameNode), - weakPattern = AceType::WeakClaim(AceType::RawPtr(pattern))]( - const RefPtr& resObj) { + auto&& updateFunc = [weak = AceType::WeakClaim(frameNode), resObj](const RefPtr& dummyResObj) { auto tabsNode = AceType::DynamicCast(weak.Upgrade()); CHECK_NULL_VOID(tabsNode); auto tabBarNode = AceType::DynamicCast(tabsNode->GetTabBar()); @@ -1720,11 +1719,16 @@ void TabsModelNG::HandleBackgroundBlurStyleInactiveColor(FrameNode* frameNode, c CHECK_NULL_VOID(target); BlurStyleOption styleOption = target->GetBackBlurStyle().value_or(BlurStyleOption{}); styleOption.isWindowFocused = true; // set to default value + if (!resObj) { + TabsModelNG::SetBarBackgroundBlurStyle(AceType::RawPtr(tabsNode), styleOption); + return; + } Color result = Color::TRANSPARENT; styleOption.isValidColor = ResourceParseUtils::ParseResColor(resObj, result); styleOption.inactiveColor = result; TabsModelNG::SetBarBackgroundBlurStyle(AceType::RawPtr(tabsNode), styleOption); }; - pattern->AddResObj(key, resObj, std::move(updateFunc)); + RefPtr dummyResObj = AceType::MakeRefPtr("", "", -1); + pattern->AddResObj(key, dummyResObj, std::move(updateFunc)); } } // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp b/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp index 0bb666c54234d853f9c857450b2e1316e568cc5e..053faf4b3a81e0e82dee1a190fed467eed3577a0 100644 --- a/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp +++ b/frameworks/core/components_ng/pattern/tabs/tabs_pattern.cpp @@ -883,14 +883,6 @@ void TabsPattern::OnColorModeChange(uint32_t colorMode) CHECK_NULL_VOID(dividerRenderProperty); dividerRenderProperty->UpdateDividerColor(currentDivider.color); } - auto tabBarRenderContext = tabBarNode->GetRenderContext(); - CHECK_NULL_VOID(tabBarRenderContext); - if (!tabsLayoutProperty->HasBarBackgroundColorSetByUser() || - (tabsLayoutProperty->HasBarBackgroundColorSetByUser() && - !tabsLayoutProperty->GetBarBackgroundColorSetByUserValue())) { - Color backgroundColor = Color::BLACK.BlendOpacity(0.0f); - tabBarRenderContext->UpdateBackgroundColor(backgroundColor); - } tabBarNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE); } } // namespace OHOS::Ace::NG diff --git a/test/unittest/core/pattern/tabs/tabs_model_test_ng.cpp b/test/unittest/core/pattern/tabs/tabs_model_test_ng.cpp index aa60c33416fcc3760a7b1c1d108165834f8596fa..f8a8c68c3cde5f2a6ca8ab53592b93f595b7e4ee 100644 --- a/test/unittest/core/pattern/tabs/tabs_model_test_ng.cpp +++ b/test/unittest/core/pattern/tabs/tabs_model_test_ng.cpp @@ -22,6 +22,7 @@ #include "core/components_ng/pattern/text/text_layout_property.h" #include "frameworks/core/common/resource/resource_parse_utils.h" #include "test/mock/base/mock_system_properties.h" +#include "test/mock/core/common/mock_resource_adapter_v2.h" namespace OHOS::Ace::NG { @@ -408,4 +409,92 @@ HWTEST_F(TabsModelTestNg, HandleBackgroundBlurStyleInactiveColorTest001, TestSiz EXPECT_TRUE(currentOption.has_value()); CreateDone(); } + +/** + * @tc.name: HandleBackgroundEffectInactiveColorTest002 + * @tc.desc: Verify TabsModelNG::HandleBackgroundEffectInactiveColor + * @tc.type: FUNC + */ +HWTEST_F(TabsModelTestNg, HandleBackgroundEffectInactiveColorTest002, TestSize.Level1) +{ + ResetMockResourceData(); + + const int32_t resId = 0; + const int32_t resType = static_cast(ResourceType::COLOR); + const Color resData = Color::RED; + AddMockResourceData(0, resData); + + TabsModelNG model = CreateTabs(); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + ASSERT_NE(frameNode, nullptr); + ASSERT_NE(pattern_, nullptr); + + auto tabsNode = AceType::DynamicCast(AceType::Claim(frameNode)); + ASSERT_NE(tabsNode, nullptr); + auto tabBarNode = AceType::DynamicCast(tabsNode->GetTabBar()); + ASSERT_NE(tabBarNode, nullptr); + auto target = tabBarNode->GetRenderContext(); + ASSERT_NE(target, nullptr); + + TabsModelNG::HandleBackgroundEffectInactiveColor(frameNode, nullptr); + ASSERT_NE(pattern_->resourceMgr_, nullptr); + pattern_->resourceMgr_->ReloadResources(); + ASSERT_TRUE(target->GetBackgroundEffect().has_value()); + EXPECT_TRUE(target->GetBackgroundEffect()->isWindowFocused); + + std::vector params; + auto resObj = AceType::MakeRefPtr(resId, resType, params, "", "", Container::CurrentIdSafely()); + TabsModelNG::HandleBackgroundEffectInactiveColor(frameNode, resObj); + ASSERT_NE(pattern_->resourceMgr_, nullptr); + pattern_->resourceMgr_->ReloadResources(); + ASSERT_TRUE(target->GetBackgroundEffect().has_value()); + EXPECT_EQ(target->GetBackgroundEffect()->inactiveColor, resData); + CreateDone(); + ResetMockResourceData(); +} + +/** + * @tc.name: HandleBackgroundBlurStyleInactiveColorTest002 + * @tc.desc: Verify TabsModelNG::HandleBackgroundBlurStyleInactiveColor + * @tc.type: FUNC + */ +HWTEST_F(TabsModelTestNg, HandleBackgroundBlurStyleInactiveColorTest002, TestSize.Level1) +{ + ResetMockResourceData(); + + const int32_t resId = 0; + const int32_t resType = static_cast(ResourceType::COLOR); + const Color resData = Color::RED; + AddMockResourceData(0, resData); + + TabsModelNG model = CreateTabs(); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + ASSERT_NE(frameNode, nullptr); + ASSERT_NE(pattern_, nullptr); + + auto tabsNode = AceType::DynamicCast(AceType::Claim(frameNode)); + ASSERT_NE(tabsNode, nullptr); + auto tabBarNode = AceType::DynamicCast(tabsNode->GetTabBar()); + ASSERT_NE(tabBarNode, nullptr); + auto target = tabBarNode->GetRenderContext(); + ASSERT_NE(target, nullptr); + + target->ResetBackBlurStyle(); + TabsModelNG::HandleBackgroundBlurStyleInactiveColor(frameNode, nullptr); + ASSERT_NE(pattern_->resourceMgr_, nullptr); + pattern_->resourceMgr_->ReloadResources(); + ASSERT_TRUE(target->GetBackBlurStyle().has_value()); + EXPECT_TRUE(target->GetBackBlurStyle()->isWindowFocused); + + std::vector params; + auto resObj = AceType::MakeRefPtr(resId, resType, params, "", "", Container::CurrentIdSafely()); + target->ResetBackBlurStyle(); + TabsModelNG::HandleBackgroundBlurStyleInactiveColor(frameNode, resObj); + ASSERT_NE(pattern_->resourceMgr_, nullptr); + pattern_->resourceMgr_->ReloadResources(); + ASSERT_TRUE(target->GetBackBlurStyle().has_value()); + EXPECT_EQ(target->GetBackBlurStyle()->inactiveColor, resData); + CreateDone(); + ResetMockResourceData(); +} } // namespace OHOS::Ace::NG \ No newline at end of file diff --git a/test/unittest/core/pattern/tabs/tabs_test_ng.cpp b/test/unittest/core/pattern/tabs/tabs_test_ng.cpp index 9b788b191a30f6e5b79b57b40e368a4e77c775c3..f9ea34e80b3e910a45b74c7e72f2b34ccca6603f 100644 --- a/test/unittest/core/pattern/tabs/tabs_test_ng.cpp +++ b/test/unittest/core/pattern/tabs/tabs_test_ng.cpp @@ -15,7 +15,9 @@ #include "tabs_test_ng.h" +#include "test/mock/base/mock_system_properties.h" #include "test/mock/base/mock_task_executor.h" +#include "test/mock/core/common/mock_resource_adapter_v2.h" #include "test/mock/core/common/mock_theme_manager.h" #include "test/mock/core/pipeline/mock_pipeline_context.h" #include "test/mock/core/render/mock_render_context.h" @@ -72,6 +74,8 @@ void TabsTestNg::SetUpTestSuite() void TabsTestNg::TearDownTestSuite() { TestNG::TearDownTestSuite(); + ResetMockResourceData(); + g_isConfigChangePerform = false; } void TabsTestNg::SetUp() {} @@ -99,6 +103,8 @@ void TabsTestNg::TearDown() dividerRenderProperty_ = nullptr; ClearOldNodes(); // Each testCase will create new list at begin AceApplicationInfo::GetInstance().isRightToLeft_ = false; + ResetMockResourceData(); + g_isConfigChangePerform = false; } void TabsTestNg::GetTabs() @@ -938,6 +944,47 @@ HWTEST_F(TabsTestNg, ReportComponentChangeEvent001, TestSize.Level1) pattern_->ReportComponentChangeEvent(currentIndex); } +/** + * @tc.name: OnColorModeChangeTest001 + * @tc.desc: Test Tabs OnColorModeChange + * @tc.type: FUNC + */ +HWTEST_F(TabsTestNg, OnColorModeChangeTest001, TestSize.Level1) +{ + g_isConfigChangePerform = true; + + /** + * @tc.steps: step1. create tabs and set parameters. + */ + TabsModelNG model = CreateTabs(); + CreateTabContents(TABCONTENT_NUMBER); + CreateTabsDone(model); + ASSERT_NE(pattern_, nullptr); + ASSERT_NE(layoutProperty_, nullptr); + ASSERT_NE(dividerRenderProperty_, nullptr); + + /** + * @tc.steps: step2. reset data. + */ + int32_t colorMode = static_cast(ColorMode::DARK); + layoutProperty_->ResetDividerColorSetByUser(); + dividerRenderProperty_->ResetDividerColor(); + pattern_->OnColorModeChange(colorMode); + EXPECT_TRUE(dividerRenderProperty_->HasDividerColor()); + + layoutProperty_->UpdateDividerColorSetByUser(false); + dividerRenderProperty_->ResetDividerColor(); + pattern_->OnColorModeChange(colorMode); + EXPECT_TRUE(dividerRenderProperty_->HasDividerColor()); + + layoutProperty_->UpdateDividerColorSetByUser(true); + dividerRenderProperty_->ResetDividerColor(); + pattern_->OnColorModeChange(colorMode); + EXPECT_FALSE(dividerRenderProperty_->HasDividerColor()); + + g_isConfigChangePerform = false; +} + /** * @tc.name: TabContentCreatePaddingWithResourceObj001 * @tc.desc: test CreatePaddingWithResourceObj of TabContentModelNG