diff --git a/services/bundlemgr/include/bundle_resource/bundle_resource_parser.h b/services/bundlemgr/include/bundle_resource/bundle_resource_parser.h index dddba70696c0409ebbbd8518a1dbaeb1611270be..93e3c8ca642422c1ee836093b1d55cc35f26662a 100644 --- a/services/bundlemgr/include/bundle_resource/bundle_resource_parser.h +++ b/services/bundlemgr/include/bundle_resource/bundle_resource_parser.h @@ -41,6 +41,8 @@ public: // parse clone bundle resource info bool ParserCloneResourceInfo(const int32_t appIndex, std::vector &resourceInfos); + bool ParserCloneResourceInfo(const int32_t appIndex, ResourceInfo &resourceInfos); + bool ParseResourceInfosNoTheme(const int32_t userId, std::vector &resourceInfos); bool ParseIconResourceInfosWithTheme(const int32_t userId, std::vector &resourceInfos); diff --git a/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp b/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp index 7b0f339dd7409fc87c7aa196c6b0d39445182a60..e7e8fd7207754415e9d8ebcf10576de3b75baf4b 100644 --- a/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp +++ b/services/bundlemgr/src/bundle_resource/bundle_resource_manager.cpp @@ -737,6 +737,12 @@ bool BundleResourceManager::AddDynamicIconResource( resourceInfo.bundleName_ = bundleName; resourceInfo.appIndex_ = appIndex; if (userId != Constants::UNSPECIFIED_USERID) { + // process icon with badge + BundleResourceParser parser; + if ((appIndex > 0) && (!parser.ParserCloneResourceInfo(appIndex, resourceInfo))) { + APP_LOGE("parse clone resource failed -n %{public}s -u %{public}d -a %{public}d", + bundleName.c_str(), userId, appIndex); + } if (!bundleResourceIconRdb_->AddResourceIconInfo(userId, IconResourceType::DYNAMIC_ICON, resourceInfo)) { APP_LOGE("add dynamic icon failed -n %{public}s -u %{public}d -a %{public}d", bundleName.c_str(), userId, appIndex); @@ -756,9 +762,16 @@ bool BundleResourceManager::AddDynamicIconResource( resourceInfo.appIndex_ = 0; ret &= bundleResourceIconRdb_->AddResourceIconInfo(user, IconResourceType::DYNAMIC_ICON, resourceInfo); auto appIndexes = dataMgr->GetCloneAppIndexes(bundleName, user); + // process icon with badge + BundleResourceParser parser; for (const auto &index : appIndexes) { - resourceInfo.appIndex_ = index; - ret &= bundleResourceIconRdb_->AddResourceIconInfo(user, IconResourceType::DYNAMIC_ICON, resourceInfo); + ResourceInfo newResourceInfo = resourceInfo; + newResourceInfo.appIndex_ = index; + if (!parser.ParserCloneResourceInfo(index, newResourceInfo)) { + APP_LOGE("parse clone resource failed -n %{public}s -u %{public}d -a %{public}d", + bundleName.c_str(), user, index); + } + ret &= bundleResourceIconRdb_->AddResourceIconInfo(user, IconResourceType::DYNAMIC_ICON, newResourceInfo); } } if (!ret) { diff --git a/services/bundlemgr/src/bundle_resource/bundle_resource_parser.cpp b/services/bundlemgr/src/bundle_resource/bundle_resource_parser.cpp index 0a6b889cf143f7e120d1009b398d179e1d820fd5..fde6d85b43a5db133073e724ba366d8710085b0a 100644 --- a/services/bundlemgr/src/bundle_resource/bundle_resource_parser.cpp +++ b/services/bundlemgr/src/bundle_resource/bundle_resource_parser.cpp @@ -506,6 +506,22 @@ bool BundleResourceParser::ParserCloneResourceInfo( #endif } +bool BundleResourceParser::ParserCloneResourceInfo(const int32_t appIndex, ResourceInfo &resourceInfo) +{ + if (appIndex <= 0) { + APP_LOGE("-n %{public}s appIndex %{public}d is invalid", resourceInfo.GetKey().c_str(), appIndex); + return false; + } + std::vector resourceInfos; + resourceInfos.emplace_back(resourceInfo); + if (ParserCloneResourceInfo(appIndex, resourceInfos) && !resourceInfos.empty()) { + resourceInfo.icon_ = resourceInfos[0].icon_; + return true; + } + APP_LOGE("-n %{public}s appIndex %{public}d parse badge failed", resourceInfo.GetKey().c_str(), appIndex); + return false; +} + bool BundleResourceParser::ParseResourceInfosNoTheme( const int32_t userId, std::vector &resourceInfos) { diff --git a/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp b/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp index 94028b5faa835979ef71e92c54a9d842cf0dae87..dcf1af1535b7f39ac5c2bc4d9ac44ebb86a2560e 100644 --- a/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp +++ b/services/bundlemgr/test/unittest/bms_bundle_resource_test/bms_bundle_resource_test.cpp @@ -5537,6 +5537,135 @@ HWTEST_F(BmsBundleResourceTest, AddDynamicIconResource_0010, Function | SmallTes } } +/** + * @tc.number: AddDynamicIconResource_0020 + * Function: AddDynamicIconResource + * @tc.name: test + * @tc.desc: 1. system running normally + * 2. test AddDynamicIconResource + */ +HWTEST_F(BmsBundleResourceTest, AddDynamicIconResource_0020, Function | SmallTest | Level0) +{ + ErrCode installResult = InstallBundle(HAP_FILE_PATH1); + EXPECT_EQ(installResult, ERR_OK); + + auto manager = DelayedSingleton::GetInstance(); + EXPECT_NE(manager, nullptr); + if (manager != nullptr) { + ResourceInfo resourceInfo; + resourceInfo.icon_ = "111"; + bool ret = manager->AddDynamicIconResource(BUNDLE_NAME_NOT_EXIST, USERID, 1, resourceInfo); + EXPECT_TRUE(ret); + ret = manager->DeleteDynamicIconResource(BUNDLE_NAME_NOT_EXIST, USERID, 1); + EXPECT_TRUE(ret); + + BundleResourceRdb resourceRdb; + BundleResourceInfo info; + ret = manager->GetBundleResourceInfo(BUNDLE_NAME, + static_cast(ResourceFlag::GET_RESOURCE_INFO_ALL), info); + EXPECT_TRUE(ret); + resourceInfo.icon_ = info.icon; + ret = manager->AddDynamicIconResource(BUNDLE_NAME_NOT_EXIST, USERID, 2, resourceInfo); + EXPECT_TRUE(ret); + ret = manager->DeleteDynamicIconResource(BUNDLE_NAME_NOT_EXIST, USERID, 2); + EXPECT_TRUE(ret); + } + + ErrCode unInstallResult = UnInstallBundle(BUNDLE_NAME); + EXPECT_EQ(unInstallResult, ERR_OK); +} + +/** + * @tc.number: AddDynamicIconResource_0030 + * Function: AddDynamicIconResource + * @tc.name: test + * @tc.desc: 1. system running normally + * 2. test AddDynamicIconResource + */ +HWTEST_F(BmsBundleResourceTest, AddDynamicIconResource_0030, Function | SmallTest | Level0) +{ + ErrCode installResult = InstallBundle(HAP_FILE_PATH1); + EXPECT_EQ(installResult, ERR_OK); + + auto savedDataMgr = DelayedSingleton::GetInstance()->GetDataMgr(); + InnerBundleUserInfo innerBundleUserInfo; + innerBundleUserInfo.bundleUserInfo.userId = USERID; + InnerBundleCloneInfo innerBundleCloneInfo; + innerBundleCloneInfo.appIndex = 1; + innerBundleCloneInfo.userId = USERID; + innerBundleUserInfo.cloneInfos["1"] = innerBundleCloneInfo; + InnerBundleInfo bundleInfo; + bundleInfo.innerBundleUserInfos_["_100"] = innerBundleUserInfo; + savedDataMgr->bundleInfos_[BUNDLE_NAME_NOT_EXIST] = bundleInfo; + auto manager = DelayedSingleton::GetInstance(); + EXPECT_NE(manager, nullptr); + if (manager != nullptr) { + ResourceInfo resourceInfo; + resourceInfo.icon_ = "111"; + bool ret = manager->AddDynamicIconResource(BUNDLE_NAME_NOT_EXIST, Constants::UNSPECIFIED_USERID, 0, + resourceInfo); + EXPECT_TRUE(ret); + ret = manager->DeleteDynamicIconResource(BUNDLE_NAME_NOT_EXIST, Constants::UNSPECIFIED_USERID, 0); + EXPECT_TRUE(ret); + + BundleResourceRdb resourceRdb; + BundleResourceInfo info; + ret = manager->GetBundleResourceInfo(BUNDLE_NAME, + static_cast(ResourceFlag::GET_RESOURCE_INFO_ALL), info); + EXPECT_TRUE(ret); + resourceInfo.icon_ = info.icon; + ret = manager->AddDynamicIconResource(BUNDLE_NAME_NOT_EXIST, Constants::UNSPECIFIED_USERID, 0, resourceInfo); + EXPECT_TRUE(ret); + ret = manager->DeleteDynamicIconResource(BUNDLE_NAME_NOT_EXIST, Constants::UNSPECIFIED_USERID, 0); + EXPECT_TRUE(ret); + } + + auto iter = savedDataMgr->bundleInfos_.find(BUNDLE_NAME_NOT_EXIST); + if (iter != savedDataMgr->bundleInfos_.end()) { + savedDataMgr->bundleInfos_.erase(iter); + } + + ErrCode unInstallResult = UnInstallBundle(BUNDLE_NAME); + EXPECT_EQ(unInstallResult, ERR_OK); +} + +/** + * @tc.number: ParserCloneResourceInfo_0010 + * Function: ParserCloneResourceInfo + * @tc.name: test + * @tc.desc: 1. system running normally + * 2. test ParserCloneResourceInfo + */ +HWTEST_F(BmsBundleResourceTest, ParserCloneResourceInfo_0010, Function | SmallTest | Level0) +{ + ErrCode installResult = InstallBundle(HAP_FILE_PATH1); + EXPECT_EQ(installResult, ERR_OK); + + ResourceInfo resourceInfo; + BundleResourceParser bundleResourceParser; + bool ret = bundleResourceParser.ParserCloneResourceInfo(0, resourceInfo); + EXPECT_FALSE(ret); + + resourceInfo.icon_ = "111"; + ret = bundleResourceParser.ParserCloneResourceInfo(1, resourceInfo); + EXPECT_FALSE(ret); + + auto manager = DelayedSingleton::GetInstance(); + EXPECT_NE(manager, nullptr); + if (manager != nullptr) { + BundleResourceInfo info; + ret = manager->GetBundleResourceInfo(BUNDLE_NAME, + static_cast(ResourceFlag::GET_RESOURCE_INFO_ALL), info); + EXPECT_TRUE(ret); + resourceInfo.icon_ = info.icon; + } + + ret = bundleResourceParser.ParserCloneResourceInfo(2, resourceInfo); + EXPECT_TRUE(ret); + ErrCode unInstallResult = UnInstallBundle(BUNDLE_NAME); + EXPECT_EQ(unInstallResult, ERR_OK); +} + /** * @tc.number: AddAllResourceInfo_0010 * Function: AddAllResourceInfo @@ -5729,9 +5858,13 @@ HWTEST_F(BmsBundleResourceTest, AddCloneBundleResourceInfoWhenInstall_0010, Func EXPECT_FALSE(ret); ret = manager->AddCloneBundleResourceInfoWhenInstall(BUNDLE_NAME, USERID, 1, false); EXPECT_TRUE(ret); + ret = manager->DeleteCloneBundleResourceInfoWhenUninstall(BUNDLE_NAME, USERID, 1, false); + EXPECT_TRUE(ret); OHOS::ForceCreateDirectory(THEME_B_ICON_BUNDLE_NAME); ret = manager->AddCloneBundleResourceInfoWhenInstall(BUNDLE_NAME, USERID, 2, false); EXPECT_TRUE(ret); + ret = manager->DeleteCloneBundleResourceInfoWhenUninstall(BUNDLE_NAME, USERID, 2, false); + EXPECT_TRUE(ret); OHOS::ForceRemoveDirectory(THEME_BUNDLE_NAME_PATH); }