diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp index fe2a2d2397c6ff038c975048016c622a52a820e6..dc9071c21d8cc5e6b4c6a6336c0ab28d674de990 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp +++ b/frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.cpp @@ -124,10 +124,17 @@ void ArkTSUtils::CompleteResourceObjectFromColor(RefPtr& resObj, resObj = nullptr; return; } - auto colorMode = Container::CurrentColorMode(); bool hasDarkRes = CheckDarkResource(resObj); - if ((colorMode == ColorMode::DARK || nodeInfo.localColorMode == ColorMode::DARK) && - (!resObj || !hasDarkRes)) { + if (nodeInfo.localColorMode == ColorMode::DARK) { + if (!hasDarkRes) { + color = Color(invertFunc(color.GetValue())); + } + resObj = nullptr; + return; + } + auto colorMode = Container::CurrentColorMode(); + Color curColor = color; + if ((colorMode == ColorMode::DARK) && !hasDarkRes) { color = Color(invertFunc(color.GetValue())); } if (!resObj) { @@ -138,7 +145,7 @@ void ArkTSUtils::CompleteResourceObjectFromColor(RefPtr& resObj, resObj->SetNodeTag(nodeInfo.nodeTag); resObj->SetColorMode(colorMode); resObj->SetHasDarkRes(hasDarkRes); - resObj->SetColor(color); + resObj->SetColor((colorMode == ColorMode::DARK) ? curColor : color); } bool ArkTSUtils::ParseJsColor(const EcmaVM* vm, const Local& value, Color& result) diff --git a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp index 904b414be64e32526e5eb49a2ec126e53406e1e7..1a39553c7ea649db2b835c5d3f29cd8a5eb3aebb 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_view_abstract.cpp @@ -6985,10 +6985,17 @@ void JSViewAbstract::CompleteResourceObjectFromColor(RefPtr& res resObj = nullptr; return; } - - auto colorMode = Container::CurrentColorMode(); bool hasDarkRes = CheckDarkResource(resObj); - if ((colorMode == ColorMode::DARK || localColorMode == ColorMode::DARK) && (!resObj || !hasDarkRes)) { + if (localColorMode == ColorMode::DARK) { + if (!hasDarkRes) { + color = Color(invertFunc(color.GetValue())); + } + resObj = nullptr; + return; + } + auto colorMode = Container::CurrentColorMode(); + Color curColor = color; + if ((colorMode == ColorMode::DARK) && !hasDarkRes) { color = Color(invertFunc(color.GetValue())); } if (!resObj) { @@ -6999,7 +7006,7 @@ void JSViewAbstract::CompleteResourceObjectFromColor(RefPtr& res resObj->SetNodeTag(nodeTag); resObj->SetColorMode(colorMode); resObj->SetHasDarkRes(hasDarkRes); - resObj->SetColor(color); + resObj->SetColor(((colorMode == ColorMode::DARK) ? curColor : color)); } bool JSViewAbstract::ParseJsColor(const JSRef& jsValue, Color& result) diff --git a/frameworks/core/common/color_inverter.cpp b/frameworks/core/common/color_inverter.cpp index 2302ae22e4383b78ba1511ea37ecede82dd8c9d5..42af9e6d67e02965f86285e85a0ff36f2524cb80 100644 --- a/frameworks/core/common/color_inverter.cpp +++ b/frameworks/core/common/color_inverter.cpp @@ -100,7 +100,9 @@ uint32_t ColorInverter::DefaultInverter(uint32_t color) { Color curColor = Color(color); uint8_t full = 255; - Color invertColor = Color::FromRGB(full - curColor.GetRed(), full - curColor.GetGreen(), full - curColor.GetBlue()); + auto curAlpha = curColor.GetAlpha(); + Color invertColor = Color::FromARGB(curAlpha, + full - curColor.GetRed(), full - curColor.GetGreen(), full - curColor.GetBlue()); return invertColor.GetValue(); } diff --git a/frameworks/core/common/resource/pattern_resource_manager.cpp b/frameworks/core/common/resource/pattern_resource_manager.cpp index 766ad3d56da6145d3828f1197025c1a4ac3d8b47..25832b2cc5fd35cf482d3d953b8f58575e74167d 100644 --- a/frameworks/core/common/resource/pattern_resource_manager.cpp +++ b/frameworks/core/common/resource/pattern_resource_manager.cpp @@ -30,6 +30,7 @@ void PatternResourceManager::AddResource( } if (resMap_.count(key) > 0) { resCacheMap_.clear(); + resKeyArray_.erase(std::remove(resKeyArray_.begin(), resKeyArray_.end(), key), resKeyArray_.end()); } resMap_[key] = { resObj, std::move(updateFunc) }; resKeyArray_.emplace_back(key); diff --git a/frameworks/core/common/resource/resource_parse_utils.cpp b/frameworks/core/common/resource/resource_parse_utils.cpp index 97c71e1d2f2c8c0d65d393e82a8993c04e3be845..654a03917a87a90dc295aab8bd27cdd1aab9f47b 100644 --- a/frameworks/core/common/resource/resource_parse_utils.cpp +++ b/frameworks/core/common/resource/resource_parse_utils.cpp @@ -356,12 +356,12 @@ bool ResourceParseUtils::ParseResFontFamilies(const RefPtr& resO void ResourceParseUtils::InvertColorWithResource(const RefPtr& resObj, Color& result, const ColorMode& colorMode) { - if (isReloading_ && !resObj->HasDarkResource() && (colorMode == ColorMode::DARK) && - (colorMode != resObj->GetColorMode()) && - (resObj->GetColorMode() != ColorMode::COLOR_MODE_UNDEFINED)) { + if (!isReloading_ || (resObj->GetColorMode() == ColorMode::COLOR_MODE_UNDEFINED)) { + return; + } + if ((colorMode == ColorMode::DARK) && !resObj->HasDarkResource()) { result = ColorInverter::Invert(result, resObj->GetInstanceId(), resObj->GetNodeTag()); } - resObj->SetColor(result); resObj->SetColorMode(colorMode); } @@ -383,12 +383,14 @@ bool ResourceParseUtils::ParseResColor(const RefPtr& resObj, Col auto colorMode = Container::CurrentColorMode(); if (!resObj->IsResource()) { - if (isReloading_ && (colorMode != resObj->GetColorMode() && - (resObj->GetColorMode() != ColorMode::COLOR_MODE_UNDEFINED))) { + if (resObj->GetColorMode() == ColorMode::COLOR_MODE_UNDEFINED) { + return false; + } + if (isReloading_ && (colorMode == ColorMode::DARK)) { result = ColorInverter::Invert(resObj->GetColor(), resObj->GetInstanceId(), resObj->GetNodeTag()); - resObj->SetColor(result); + } else { + result = resObj->GetColor(); } - result = resObj->GetColor(); resObj->SetColorMode(colorMode); return true; } diff --git a/test/unittest/core/common/resource/pattern_resource_manager_test.cpp b/test/unittest/core/common/resource/pattern_resource_manager_test.cpp index 8d6eb12c21a4db4f3f145567980dc78c6c1ff642..b0ed3c016e2b5a3271a711de851cc24d459d04de 100644 --- a/test/unittest/core/common/resource/pattern_resource_manager_test.cpp +++ b/test/unittest/core/common/resource/pattern_resource_manager_test.cpp @@ -81,7 +81,7 @@ HWTEST_F(PatternResourceManagerTest, PatternResourceManagerTest002, TestSize.Lev { /** * @tc.steps: step1. AddResource. - * @tc.expect: resMap_ size is 3 + * @tc.expect: resMap_ size is 1 */ auto manager = AceType::MakeRefPtr(); auto func = [](const RefPtr& resObj) { return; }; @@ -89,4 +89,24 @@ HWTEST_F(PatternResourceManagerTest, PatternResourceManagerTest002, TestSize.Lev manager->AddResource("key", resObj, func); EXPECT_FALSE(manager->Empty()); } + +/** + * @tc.name: PatternResourceManagerTest003 + * @tc.desc: Test PatternResourceManager. + * @tc.type: FUNC + */ +HWTEST_F(PatternResourceManagerTest, PatternResourceManagerTest003, TestSize.Level1) +{ + /** + * @tc.steps: step1. AddResource. + * @tc.steps: step2. AddResource as same key. + * @tc.expect: resMap_ size is 1 + */ + auto manager = AceType::MakeRefPtr(); + auto func = [](const RefPtr& resObj) { return; }; + RefPtr resObj = AceType::MakeRefPtr(); + manager->AddResource("key", resObj, func); + manager->AddResource("key", resObj, func); + EXPECT_EQ(manager->resKeyArray_.size(), 1); +} } // namespace OHOS::Ace diff --git a/test/unittest/core/common/resource/resource_parse_utils_test.cpp b/test/unittest/core/common/resource/resource_parse_utils_test.cpp index abde0a2e43da3e9a3daaa42cd6d31fc998400f7b..71b4228ae22700b62c46e09b8991dc36a912a64c 100644 --- a/test/unittest/core/common/resource/resource_parse_utils_test.cpp +++ b/test/unittest/core/common/resource/resource_parse_utils_test.cpp @@ -181,6 +181,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest004, TestSize.Level1) Color color = Color::WHITE; resObj->SetColor(color); resObj->SetIsResource(false); + resObj->SetColorMode(ColorMode::LIGHT); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); /** @@ -201,6 +202,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest004, TestSize.Level1) resObjParamsList, "com.example.test", "entry", 100000); resObjWithName->SetColor(color); resObjWithName->SetIsResource(false); + resObjWithName->SetColorMode(ColorMode::DARK); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObjWithName, color)); ResourceParseUtils::SetIsReloading(false); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObjWithName, color)); @@ -258,6 +260,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest005, TestSize.Level1) resObj->SetColor(color); resObj->SetIsResource(false); ResourceParseUtils::SetIsReloading(false); + resObj->SetColorMode(ColorMode::LIGHT); Color result; ResourceParseUtils::ParseResColor(resObj, result); EXPECT_EQ(color, result); @@ -272,7 +275,7 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest006, TestSize.Level1) { /** * @tc.steps: step1. ParseResColor with different colormode. - * @tc.expect: ParseResColor return True. + * @tc.expect: ParseResColor return True except colormode undefined. */ RefPtr resObj = AceType::MakeRefPtr(); Color color = Color::WHITE; @@ -280,10 +283,10 @@ HWTEST_F(ResourceParseUtilsTest, ResourceParseUtilsTest006, TestSize.Level1) resObj->SetIsResource(false); resObj->SetColorMode(ColorMode::COLOR_MODE_UNDEFINED); ResourceParseUtils::SetIsReloading(false); - EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); + EXPECT_FALSE(ResourceParseUtils::ParseResColor(resObj, color)); resObj->SetColorMode(ColorMode::DARK); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); - resObj->SetColorMode(ColorMode::LIGHT); + ResourceParseUtils::SetIsReloading(true); EXPECT_TRUE(ResourceParseUtils::ParseResColor(resObj, color)); } } // namespace OHOS::Ace diff --git a/test/unittest/frameworks/core/common/color_inverter_test.cpp b/test/unittest/frameworks/core/common/color_inverter_test.cpp index f6d80bfe9b9ce614e78553245f2ff5b4c20410dd..6e796e2c03147706dcc9819a84b1f0546dd947bf 100644 --- a/test/unittest/frameworks/core/common/color_inverter_test.cpp +++ b/test/unittest/frameworks/core/common/color_inverter_test.cpp @@ -159,7 +159,8 @@ HWTEST_F(ColorInverterTest, ColorInverterTest005, TestSize.Level1) */ static const uint8_t fullColor = 255; Color full = Color::FromRGB(fullColor, fullColor, fullColor); - EXPECT_EQ(ColorInverter::DefaultInverter(0), full.GetValue()); + Color invertColor = Color::FromRGB(0, 0, 0); + EXPECT_EQ(ColorInverter::DefaultInverter(invertColor.GetValue()), full.GetValue()); } /** @@ -339,4 +340,21 @@ HWTEST_F(ColorInverterTest, ColorInverterTest011, TestSize.Level1) EXPECT_EQ(managerMapNew.size(), 1 + 1); } +/** + * @tc.name: ColorInverterTest0012 + * @tc.desc: ColorInverter::DefaultInverter + * @tc.type: FUNC + */ +HWTEST_F(ColorInverterTest, ColorInverterTest0012, TestSize.Level1) +{ + /** + * @tc.steps: step1. Call DefaultInverter With ARGB color + * @tc.expected: DefaultInverter Give Back Right Value + */ + static const uint8_t fullColor = 255; + static const uint8_t halfAlpha = 128; + Color full = Color::FromARGB(halfAlpha, fullColor, fullColor, fullColor); + Color invertColor = Color::FromARGB(halfAlpha, 0, 0, 0); + EXPECT_EQ(ColorInverter::DefaultInverter(full.GetValue()), invertColor.GetValue()); +} } // namespace OHOS::Ace