• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "adapter/ohos/osal/resource_adapter_impl_v2.h"
17 
18 #include <dirent.h>
19 #include <queue>
20 #include <unordered_set>
21 
22 #include "drawable_descriptor.h"
23 #include "resource_adapter_impl_v2.h"
24 
25 #include "adapter/ohos/entrance/ace_container.h"
26 #include "adapter/ohos/osal/resource_convertor.h"
27 #include "core/common/resource/resource_manager.h"
28 #include "core/pipeline_ng/pipeline_context.h"
29 
30 namespace OHOS::Ace {
31 namespace {
32 constexpr uint32_t OHOS_THEME_ID = 125829872; // ohos_theme
33 const Color ERROR_VALUE_COLOR = Color(0xff000000);
34 
CheckThemeId(int32_t & themeId)35 void CheckThemeId(int32_t& themeId)
36 {
37     if (themeId >= 0) {
38         return;
39     }
40     themeId = OHOS_THEME_ID;
41 }
42 
43 const std::unordered_set<std::string> PATTERN_NOT_SYNC_LOAD_SET = { THEME_PATTERN_CHECKBOX, THEME_PATTERN_DATA_PANEL,
44     THEME_PATTERN_RADIO, THEME_PATTERN_SWIPER, THEME_PATTERN_SWITCH, THEME_PATTERN_TOOLBAR, THEME_PATTERN_TOGGLE,
45     THEME_PATTERN_TOAST, THEME_PATTERN_DIALOG, THEME_PATTERN_DRAG_BAR, THEME_PATTERN_CLOSE_ICON,
46     THEME_PATTERN_SEMI_MODAL, THEME_PATTERN_BADGE, THEME_PATTERN_CALENDAR, THEME_PATTERN_CARD, THEME_PATTERN_CLOCK,
47     THEME_PATTERN_COUNTER, THEME_PATTERN_DIVIDER, THEME_PATTERN_FOCUS_ANIMATION, THEME_PATTERN_GRID,
48     THEME_PATTERN_HYPERLINK, THEME_PATTERN_ICON, THEME_PATTERN_IMAGE, THEME_PATTERN_LIST, THEME_PATTERN_MARQUEE,
49     THEME_PATTERN_NAVIGATION_BAR, THEME_PATTERN_PIECE, THEME_PATTERN_POPUP, THEME_PATTERN_QRCODE, THEME_PATTERN_RATING,
50     THEME_PATTERN_REFRESH, THEME_PATTERN_SCROLL_BAR, THEME_PATTERN_SEARCH, THEME_PATTERN_TAB, THEME_PATTERN_SLIDER,
51     THEME_PATTERN_RICH_EDITOR, THEME_PATTERN_VIDEO, THEME_PATTERN_INDEXER, THEME_PATTERN_APP_BAR,
52     THEME_PATTERN_ADVANCED_PATTERN, THEME_PATTERN_SECURITY_COMPONENT, THEME_PATTERN_FORM, THEME_PATTERN_SIDE_BAR,
53     THEME_PATTERN_PATTERN_LOCK, THEME_PATTERN_GAUGE, THEME_PATTERN_SHEET, THEME_PATTERN_AGING_ADAPATION_DIALOG,
54     THEME_BLUR_STYLE_COMMON, THEME_PATTERN_SHADOW, THEME_PATTERN_SCROLLABLE,
55     THEME_PATTERN_APP };
56 
57 const std::unordered_set<std::string> PATTERN_SYNC_LOAD_SET = { THEME_PATTERN_BUTTON, THEME_PATTERN_CAMERA,
58     THEME_PATTERN_LIST_ITEM, THEME_PATTERN_ARC_LIST, THEME_PATTERN_ARC_LIST_ITEM, THEME_PATTERN_PICKER,
59     THEME_PATTERN_PROGRESS, THEME_PATTERN_SELECT, THEME_PATTERN_STEPPER, THEME_PATTERN_TEXT, THEME_PATTERN_TEXTFIELD,
60     THEME_PATTERN_TEXT_OVERLAY, THEME_PATTERN_CONTAINER_MODAL };
61 
62 const std::string PATTERN_ASYNC_LOAD_LIST[] = { THEME_BLUR_STYLE_COMMON, THEME_PATTERN_ICON, THEME_PATTERN_SHADOW };
63 constexpr char RESOURCE_TOKEN_PATTERN[] = "\\[.+?\\]\\.(\\S+?\\.\\S+)";
64 
IsDirExist(const std::string & path)65 bool IsDirExist(const std::string& path)
66 {
67     char realPath[PATH_MAX] = { 0x00 };
68     CHECK_NULL_RETURN(realpath(path.c_str(), realPath), false);
69     DIR* dir = opendir(realPath);
70     CHECK_NULL_RETURN(dir, false);
71     closedir(dir);
72     return true;
73 }
74 
ParseDimensionUnit(const std::string & unit)75 DimensionUnit ParseDimensionUnit(const std::string& unit)
76 {
77     if (unit == "px") {
78         return DimensionUnit::PX;
79     } else if (unit == "fp") {
80         return DimensionUnit::FP;
81     } else if (unit == "lpx") {
82         return DimensionUnit::LPX;
83     } else if (unit == "%") {
84         return DimensionUnit::PERCENT;
85     } else {
86         return DimensionUnit::VP;
87     }
88 };
89 } // namespace
90 
CreateV2()91 RefPtr<ResourceAdapter> ResourceAdapter::CreateV2()
92 {
93     return AceType::MakeRefPtr<ResourceAdapterImplV2>();
94 }
95 
CreateNewResourceAdapter(const std::string & bundleName,const std::string & moduleName)96 RefPtr<ResourceAdapter> ResourceAdapter::CreateNewResourceAdapter(
97     const std::string& bundleName, const std::string& moduleName)
98 {
99     auto container = Container::CurrentSafely();
100     CHECK_NULL_RETURN(container, nullptr);
101     auto aceContainer = AceType::DynamicCast<Platform::AceContainer>(container);
102     CHECK_NULL_RETURN(aceContainer, nullptr);
103 
104     RefPtr<ResourceAdapter> newResourceAdapter = nullptr;
105     auto context = aceContainer->GetAbilityContextByModule(bundleName, moduleName);
106     if (context) {
107         auto resourceManager = context->GetResourceManager();
108         auto resourceAdapterV2 = AceType::MakeRefPtr<ResourceAdapterImplV2>(resourceManager);
109         resourceAdapterV2->SetAppHasDarkRes(aceContainer->GetResourceConfiguration().GetAppHasDarkRes());
110         newResourceAdapter = resourceAdapterV2;
111     } else {
112         newResourceAdapter = ResourceAdapter::CreateV2();
113         auto resourceInfo = aceContainer->GetResourceInfo();
114         newResourceAdapter->Init(resourceInfo);
115     }
116 
117     auto resConfig = aceContainer->GetResourceConfiguration();
118     auto pipelineContext = NG::PipelineContext::GetCurrentContext();
119     if (pipelineContext && pipelineContext->GetLocalColorMode() != ColorMode::COLOR_MODE_UNDEFINED) {
120         auto localColorMode = pipelineContext->GetLocalColorMode();
121         resConfig.SetColorMode(localColorMode);
122     }
123     newResourceAdapter->UpdateConfig(resConfig);
124 
125     return newResourceAdapter;
126 }
127 
ResourceAdapterImplV2(std::shared_ptr<Global::Resource::ResourceManager> resourceManager)128 ResourceAdapterImplV2::ResourceAdapterImplV2(std::shared_ptr<Global::Resource::ResourceManager> resourceManager)
129 {
130     sysResourceManager_ = resourceManager;
131 }
132 
ResourceAdapterImplV2(std::shared_ptr<Global::Resource::ResourceManager> resourceManager,int32_t instanceId)133 ResourceAdapterImplV2::ResourceAdapterImplV2(
134     std::shared_ptr<Global::Resource::ResourceManager> resourceManager, int32_t instanceId)
135 {
136     sysResourceManager_ = resourceManager;
137     std::shared_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
138     resourceManager->GetResConfig(*resConfig);
139     resConfig_ = resConfig;
140     appHasDarkRes_ = resConfig->GetAppDarkRes();
141     auto container = Platform::AceContainer::GetContainer(instanceId);
142     if (container) {
143         std::string hapPath = container->GetHapPath();
144         std::string resPath = container->GetPackagePathStr();
145         packagePathStr_ = (hapPath.empty() || IsDirExist(resPath)) ? resPath : std::string();
146     }
147 }
148 
ResourceAdapterImplV2(std::shared_ptr<Global::Resource::ResourceManager> resourceManager,const ResourceInfo & resourceInfo)149 ResourceAdapterImplV2::ResourceAdapterImplV2(
150     std::shared_ptr<Global::Resource::ResourceManager> resourceManager, const ResourceInfo& resourceInfo)
151 {
152     std::string resPath = resourceInfo.GetPackagePath();
153     std::string hapPath = resourceInfo.GetHapPath();
154     std::string resIndexPath = hapPath.empty() ? (resPath + "resources.index") : hapPath;
155     packagePathStr_ = (hapPath.empty() || IsDirExist(resPath)) ? resPath : std::string();
156 
157     auto resConfig = ConvertConfigToGlobal(resourceInfo.GetResourceConfiguration());
158     sysResourceManager_ = resourceManager;
159     if (resConfig != nullptr) {
160         sysResourceManager_->UpdateResConfig(*resConfig);
161         TAG_LOGI(AceLogTag::ACE_RESOURCE, "ResourceAdapter UpdateResConfig with colorMode %{public}s",
162             (resConfig->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK ? "dark" : "light"));
163     }
164     resConfig_ = resConfig;
165     appHasDarkRes_ = resourceInfo.GetResourceConfiguration().GetAppHasDarkRes();
166 }
167 
Init(const ResourceInfo & resourceInfo)168 void ResourceAdapterImplV2::Init(const ResourceInfo& resourceInfo)
169 {
170     std::string resPath = resourceInfo.GetPackagePath();
171     std::string hapPath = resourceInfo.GetHapPath();
172     auto resConfig = ConvertConfigToGlobal(resourceInfo.GetResourceConfiguration());
173     std::shared_ptr<Global::Resource::ResourceManager> newResMgr(Global::Resource::CreateResourceManager());
174     std::string resIndexPath = hapPath.empty() ? (resPath + "resources.index") : hapPath;
175     newResMgr->AddResource(resIndexPath.c_str());
176     if (resConfig != nullptr) {
177         newResMgr->UpdateResConfig(*resConfig);
178         TAG_LOGI(AceLogTag::ACE_RESOURCE, "ResourceAdapter Init with colorMode %{public}s",
179             (resConfig->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK ? "dark" : "light"));
180     }
181     sysResourceManager_ = newResMgr;
182     packagePathStr_ = (hapPath.empty() || IsDirExist(resPath)) ? resPath : std::string();
183     resConfig_ = resConfig;
184     appHasDarkRes_ = resourceInfo.GetResourceConfiguration().GetAppHasDarkRes();
185 }
186 
LocaleDiff(const std::shared_ptr<Global::Resource::ResConfig> & oldResConfig,const std::shared_ptr<Global::Resource::ResConfig> & newResConfig)187 bool LocaleDiff(const std::shared_ptr<Global::Resource::ResConfig>& oldResConfig,
188     const std::shared_ptr<Global::Resource::ResConfig>& newResConfig)
189 {
190     auto oldLocaleInfo = oldResConfig->GetLocaleInfo();
191     auto newLocaleInfo = newResConfig->GetLocaleInfo();
192     if ((!oldLocaleInfo && newLocaleInfo) || (oldLocaleInfo && !newLocaleInfo)) {
193         return true;
194     }
195     if (oldLocaleInfo && newLocaleInfo) {
196         if (!StringUtils::CStringEqual(oldLocaleInfo->getLanguage(), newLocaleInfo->getLanguage()) ||
197             !StringUtils::CStringEqual(oldLocaleInfo->getScript(), newLocaleInfo->getScript()) ||
198             !StringUtils::CStringEqual(oldLocaleInfo->getCountry(), newLocaleInfo->getCountry())) {
199             return true;
200         }
201     }
202     auto oldPreferredLocaleInfo = oldResConfig->GetPreferredLocaleInfo();
203     auto newPreferredLocaleInfo = newResConfig->GetPreferredLocaleInfo();
204     if ((!oldPreferredLocaleInfo && newPreferredLocaleInfo) || (oldPreferredLocaleInfo && !newPreferredLocaleInfo)) {
205         return true;
206     }
207     if (oldPreferredLocaleInfo && newPreferredLocaleInfo) {
208         if (!StringUtils::CStringEqual(oldPreferredLocaleInfo->getLanguage(), newPreferredLocaleInfo->getLanguage()) ||
209             !StringUtils::CStringEqual(oldPreferredLocaleInfo->getScript(), newPreferredLocaleInfo->getScript()) ||
210             !StringUtils::CStringEqual(oldPreferredLocaleInfo->getCountry(), newPreferredLocaleInfo->getCountry())) {
211             return true;
212         }
213     }
214     return false;
215 }
216 
NeedUpdateResConfig(const std::shared_ptr<Global::Resource::ResConfig> & oldResConfig,const std::shared_ptr<Global::Resource::ResConfig> & newResConfig)217 bool ResourceAdapterImplV2::NeedUpdateResConfig(const std::shared_ptr<Global::Resource::ResConfig>& oldResConfig,
218     const std::shared_ptr<Global::Resource::ResConfig>& newResConfig)
219 {
220     CHECK_NULL_RETURN(oldResConfig, true);
221 
222     return LocaleDiff(oldResConfig, newResConfig) || oldResConfig->GetDeviceType() != newResConfig->GetDeviceType() ||
223            oldResConfig->GetDirection() != newResConfig->GetDirection() ||
224            oldResConfig->GetScreenDensity() != newResConfig->GetScreenDensity() ||
225            oldResConfig->GetColorMode() != newResConfig->GetColorMode() ||
226            oldResConfig->GetInputDevice() != newResConfig->GetInputDevice();
227 }
228 
UpdateConfig(const ResourceConfiguration & config,bool themeFlag)229 void ResourceAdapterImplV2::UpdateConfig(const ResourceConfiguration& config, bool themeFlag)
230 {
231     std::lock_guard<std::mutex> lock(updateResConfigMutex_);
232     auto resConfig = ConvertConfigToGlobal(config);
233     auto needUpdateResConfig = NeedUpdateResConfig(resConfig_, resConfig) || themeFlag;
234     if (sysResourceManager_ && resConfig != nullptr && needUpdateResConfig) {
235         sysResourceManager_->UpdateResConfig(*resConfig, themeFlag);
236     }
237     resConfig_ = resConfig;
238 }
239 using ResType = OHOS::Global::Resource::ResType;
240 using ResData = OHOS::Global::Resource::ResourceManager::ResData;
241 using ThemeResTuple = std::tuple<std::string, ResType, std::string>;
GetTheme(int32_t themeId)242 RefPtr<ThemeStyle> ResourceAdapterImplV2::GetTheme(int32_t themeId)
243 {
244     CheckThemeId(themeId);
245     auto theme = AceType::MakeRefPtr<ResourceThemeStyle>(AceType::Claim(this));
246     auto resourceManager = GetResourceManager();
247     std::map<std::string, ResData> themeOutValue;
248     if (resourceManager) {
249         Global::Resource::RState getThemeRet = resourceManager->GetThemeDataById(themeId, themeOutValue);
250         if (getThemeRet != Global::Resource::RState::SUCCESS) {
251             LOGW("GetThemeDataById failed, error code=%{public}d, now load ohos_theme.", getThemeRet);
252             getThemeRet = resourceManager->GetThemeDataById(OHOS_THEME_ID, themeOutValue);
253             if (getThemeRet != Global::Resource::RState::SUCCESS) {
254                 LOGW("load ohos_theme failed, error code=%{public}d", getThemeRet);
255                 return nullptr;
256             }
257         }
258     }
259     std::queue<ThemeResTuple> themeQueue;
260     for (auto eachTheme : themeOutValue) {
261         std::string patternTag = eachTheme.first;         // e.g. advanced_pattern
262         ResType patternType = eachTheme.second.resType;   // e.g. 22
263         std::string patternData = eachTheme.second.value; // e.g. 125830098
264         themeQueue.push(std::make_tuple(patternTag, patternType, patternData));
265     }
266     while (!themeQueue.empty()) {
267         ThemeResTuple themeQueueFront = themeQueue.front();
268         themeQueue.pop();
269         std::string patternTag = std::get<0>(themeQueueFront);  // e.g. advanced_pattern
270         ResType patternType = std::get<1>(themeQueueFront);     // e.g. 22
271         std::string patternData = std::get<2>(themeQueueFront); // e.g. 125830098
272         if (patternType == ResType::PATTERN) {
273             patternNameMap_[patternTag] = StringUtils::StringToUintCheck(patternData);
274         }
275         if (patternType == ResType::PATTERN && PATTERN_SYNC_LOAD_SET.find(patternTag) != PATTERN_SYNC_LOAD_SET.end()) {
276             // is theme pattern and sync load
277             ResourceThemeStyle::RawAttrMap attrMap;
278             std::map<std::string, ResData> patternOutValue;
279             resourceManager->GetPatternDataById(StringUtils::StringToInt(patternData), patternOutValue);
280             for (auto eachPattern : patternOutValue) {
281                 auto patternKey = eachPattern.first;
282                 auto patternValue = eachPattern.second.value;
283                 attrMap[patternKey] = patternValue;
284             }
285             if (attrMap.empty()) {
286                 continue;
287             }
288             theme->patternAttrs_[patternTag] = attrMap;
289         } else if (patternType == ResType::PATTERN &&
290                    PATTERN_NOT_SYNC_LOAD_SET.find(patternTag) == PATTERN_NOT_SYNC_LOAD_SET.end()) {
291             // is nested pattern
292             std::map<std::string, ResData> patternOutValue;
293             resourceManager->GetPatternDataById(StringUtils::StringToInt(patternData), patternOutValue);
294             for (auto eachPattern : patternOutValue) {
295                 auto sonPatternKey = eachPattern.first;           // e.g. advanced_pattern
296                 auto sonPatternType = eachPattern.second.resType; // e.g. 22
297                 auto sonPatternValue = eachPattern.second.value;  // e.g. 125830098
298                 themeQueue.push(std::make_tuple(sonPatternKey, sonPatternType, sonPatternValue));
299             }
300         } else if (patternType == ResType::COLOR || patternType == ResType::FLOAT || patternType == ResType::STRING ||
301                    patternType == ResType::SYMBOL) {
302             theme->rawAttrs_[patternTag] = patternData;
303         } else if (patternType != ResType::PATTERN) {
304             LOGW("GetTheme found unknown ResType:%{public}d", patternType);
305         }
306     }
307     if (theme->patternAttrs_.empty() && theme->rawAttrs_.empty()) {
308         return nullptr;
309     }
310     theme->ParseContent();
311     theme->patternAttrs_.clear();
312 
313     PreloadTheme(themeId, theme);
314     return theme;
315 }
316 
PreloadTheme(int32_t themeId,RefPtr<ResourceThemeStyle> theme)317 void ResourceAdapterImplV2::PreloadTheme(int32_t themeId, RefPtr<ResourceThemeStyle> theme)
318 {
319     auto container = Container::CurrentSafely();
320     CHECK_NULL_VOID(container);
321     auto manager = GetResourceManager();
322     CHECK_NULL_VOID(manager);
323     auto taskExecutor = GetTaskExecutor();
324     CHECK_NULL_VOID(taskExecutor);
325 
326     // post an asynchronous task to preload themes in PATTERN_ASYNC_LOAD_LIST
327     auto task = [manager, resourceThemeStyle = WeakPtr<ResourceThemeStyle>(theme), weak = WeakClaim(this)]() -> void {
328         auto themeStyle = resourceThemeStyle.Upgrade();
329         CHECK_NULL_VOID(themeStyle);
330         auto adapter = weak.Upgrade();
331         CHECK_NULL_VOID(adapter);
332         for (size_t i = 0; i < sizeof(PATTERN_ASYNC_LOAD_LIST) / sizeof(PATTERN_ASYNC_LOAD_LIST[0]); ++i) {
333             std::string patternName = PATTERN_ASYNC_LOAD_LIST[i];
334             themeStyle->PushBackCheckThemeStyleVector(patternName);
335             auto style = adapter->GetPatternByName(patternName);
336             if (style) {
337                 ResValueWrapper value = { .type = ThemeConstantsType::PATTERN, .value = style };
338                 themeStyle->SetAttr(patternName, value);
339             }
340         }
341 
342         themeStyle->SetPromiseValue();
343     };
344 
345     // isolation of loading card themes
346     if (!container->IsFormRender()) {
347         taskExecutor->PostTask(task, TaskExecutor::TaskType::BACKGROUND, "ArkUILoadTheme");
348     }
349 }
350 
GetTaskExecutor()351 RefPtr<TaskExecutor> ResourceAdapterImplV2::GetTaskExecutor()
352 {
353     auto context = NG::PipelineContext::GetCurrentContextSafely();
354     CHECK_NULL_RETURN(context, nullptr);
355     return context->GetTaskExecutor();
356 }
357 
GetPatternByName(const std::string & patternName)358 RefPtr<ThemeStyle> ResourceAdapterImplV2::GetPatternByName(const std::string& patternName)
359 {
360     auto patternStyle = AceType::MakeRefPtr<ResourceThemeStyle>(AceType::Claim(this));
361     patternStyle->SetName(patternName);
362     auto manager = GetResourceManager();
363     if (manager) {
364         ResourceThemeStyle::RawAttrMap attrMap;
365         uint32_t id = 0;
366         Global::Resource::RState state;
367         bool patternNameFound = true;
368         if (!patternNameMap_.count(patternName)) {
369             patternNameFound = false;
370             constexpr char flag[] = "ohos_";
371             std::string patternTag = std::string(flag) + patternName;
372             state = manager->GetPatternByName(patternTag.c_str(), attrMap);
373         } else {
374             id = patternNameMap_[patternName];
375             state = manager->GetPatternById(id, attrMap);
376         }
377         if (state != Global::Resource::SUCCESS) {
378             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get pattern by name error, name=%{public}s", patternName.c_str());
379             if (patternNameFound) {
380                 state = manager->GetPatternById(id, attrMap);
381             } else {
382                 state = manager->GetPatternByName(patternName.c_str(), attrMap);
383             }
384             if (state != Global::Resource::SUCCESS) {
385                 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get pattern by name error, name=%{public}s", patternName.c_str());
386                 auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
387                 ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId() : -1,
388                     patternName, "Pattern", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
389             } else if (attrMap.empty()) {
390                 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get pattern %{public}s empty!", patternName.c_str());
391             }
392         } else if (attrMap.empty()) {
393             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get pattern %{public}s empty!", patternName.c_str());
394         }
395         patternStyle->rawAttrs_ = attrMap;
396         patternStyle->ParseContent();
397     }
398     return patternStyle;
399 }
400 
GetColor(uint32_t resId)401 Color ResourceAdapterImplV2::GetColor(uint32_t resId)
402 {
403     uint32_t result = 0;
404     auto manager = GetResourceManager();
405     CHECK_NULL_RETURN(manager, Color(result));
406     auto state = manager->GetColorById(resId, result);
407     if (state != Global::Resource::SUCCESS) {
408         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get color by id error, id=%{public}u", resId);
409         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
410         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
411             std::to_string(resId), "Color", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
412         return ERROR_VALUE_COLOR;
413     }
414     return Color(result);
415 }
416 
GetColorByName(const std::string & resName)417 Color ResourceAdapterImplV2::GetColorByName(const std::string& resName)
418 {
419     uint32_t result = 0;
420     auto actualResName = GetActualResourceName(resName);
421     auto manager = GetResourceManager();
422     CHECK_NULL_RETURN(manager, Color(result));
423     auto state = manager->GetColorByName(actualResName.c_str(), result);
424     if (state != Global::Resource::SUCCESS) {
425         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get color by name error, name=%{public}s, errorCode=%{public}d",
426             resName.c_str(), state);
427         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
428         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
429             resName, "Color", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
430     }
431     return Color(result);
432 }
433 
GetDimension(uint32_t resId)434 Dimension ResourceAdapterImplV2::GetDimension(uint32_t resId)
435 {
436     float dimensionFloat = 0.0f;
437 #ifdef NG_BUILD
438     std::string unit;
439     auto manager = GetResourceManager();
440     if (manager) {
441         auto state = manager->GetFloatById(resId, dimensionFloat, unit);
442         if (state != Global::Resource::SUCCESS) {
443             TAG_LOGW(AceLogTag::ACE_RESOURCE, "NG Get dimension by id error, id=%{public}u, errorCode=%{public}d",
444                 resId, state);
445             auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
446             ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
447                 std::to_string(resId), "Dimension", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
448         }
449     }
450     return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
451 #else
452     if (Container::IsCurrentUseNewPipeline()) {
453         std::string unit;
454         auto manager = GetResourceManager();
455         if (manager) {
456             auto state = manager->GetFloatById(resId, dimensionFloat, unit);
457             if (state != Global::Resource::SUCCESS) {
458                 TAG_LOGW(AceLogTag::ACE_RESOURCE, "NG: Get dimension by id error, id=%{public}u, errorCode=%{public}d",
459                     resId, state);
460                 auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
461                 ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
462                     std::to_string(resId), "Dimension", host ? host->GetTag().c_str() : "",
463                     GetCurrentTimestamp(), state));
464             }
465         }
466         return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
467     }
468 
469     auto manager = GetResourceManager();
470     CHECK_NULL_RETURN(manager, Dimension(static_cast<double>(dimensionFloat)));
471     auto state = manager->GetFloatById(resId, dimensionFloat);
472     if (state != Global::Resource::SUCCESS) {
473         TAG_LOGW(
474             AceLogTag::ACE_RESOURCE, "Get dimension by id error, id=%{public}u, errorCode=%{public}d", resId, state);
475         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
476         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
477             std::to_string(resId), "Dimension", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
478     }
479     return Dimension(static_cast<double>(dimensionFloat));
480 #endif
481 }
482 
GetDimensionByName(const std::string & resName)483 Dimension ResourceAdapterImplV2::GetDimensionByName(const std::string& resName)
484 {
485     float dimensionFloat = 0.0f;
486     auto actualResName = GetActualResourceName(resName);
487     auto manager = GetResourceManager();
488     CHECK_NULL_RETURN(manager, Dimension());
489     std::string unit;
490     auto state = manager->GetFloatByName(actualResName.c_str(), dimensionFloat, unit);
491     if (state != Global::Resource::SUCCESS) {
492         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get dimension by name error, resName=%{public}s, errorCode=%{public}d",
493             resName.c_str(), state);
494         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
495         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
496             resName, "Dimension", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
497     }
498     return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
499 }
500 
GetString(uint32_t resId)501 std::string ResourceAdapterImplV2::GetString(uint32_t resId)
502 {
503     std::string strResult = "";
504     auto manager = GetResourceManager();
505     CHECK_NULL_RETURN(manager, strResult);
506     auto state = manager->GetStringById(resId, strResult);
507     if (state != Global::Resource::SUCCESS) {
508         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get string by id error, id=%{public}u, errorCode=%{public}d", resId, state);
509         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
510         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
511             std::to_string(resId), "String", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
512     }
513     return strResult;
514 }
515 
GetStringByName(const std::string & resName)516 std::string ResourceAdapterImplV2::GetStringByName(const std::string& resName)
517 {
518     std::string strResult = "";
519     auto actualResName = GetActualResourceName(resName);
520     auto manager = GetResourceManager();
521     CHECK_NULL_RETURN(manager, strResult);
522     auto state = manager->GetStringByName(actualResName.c_str(), strResult);
523     if (state != Global::Resource::SUCCESS) {
524         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get string by name error, resName=%{public}s, errorCode=%{public}d",
525             resName.c_str(), state);
526         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
527         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
528             resName, "String", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
529     }
530     return strResult;
531 }
532 
GetPluralString(uint32_t resId,int quantity)533 std::string ResourceAdapterImplV2::GetPluralString(uint32_t resId, int quantity)
534 {
535     std::string strResult = "";
536     auto manager = GetResourceManager();
537     CHECK_NULL_RETURN(manager, strResult);
538     auto state = manager->GetPluralStringById(resId, quantity, strResult);
539     if (state != Global::Resource::SUCCESS) {
540         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get plural string by id error, id=%{public}u, errorCode=%{public}d", resId,
541             state);
542         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
543         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
544             std::to_string(resId), "PluralString", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
545     }
546     return strResult;
547 }
548 
GetPluralStringByName(const std::string & resName,int quantity)549 std::string ResourceAdapterImplV2::GetPluralStringByName(const std::string& resName, int quantity)
550 {
551     std::string strResult = "";
552     auto actualResName = GetActualResourceName(resName);
553     auto manager = GetResourceManager();
554     CHECK_NULL_RETURN(manager, strResult);
555     auto state = manager->GetPluralStringByName(actualResName.c_str(), quantity, strResult);
556     if (state != Global::Resource::SUCCESS) {
557         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get plural string by name error, resName=%{public}s, errorCode=%{public}d",
558             resName.c_str(), state);
559         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
560         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
561             resName, "PluralString", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
562     }
563     return strResult;
564 }
565 
GetStringArray(uint32_t resId) const566 std::vector<std::string> ResourceAdapterImplV2::GetStringArray(uint32_t resId) const
567 {
568     std::vector<std::string> strResults;
569     auto manager = GetResourceManager();
570     CHECK_NULL_RETURN(manager, strResults);
571     auto state = manager->GetStringArrayById(resId, strResults);
572     if (state != Global::Resource::SUCCESS) {
573         TAG_LOGW(
574             AceLogTag::ACE_RESOURCE, "Get stringArray by id error, id=%{public}u, errorCode=%{public}d", resId, state);
575         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
576         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
577             std::to_string(resId), "StringArray", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
578     }
579     return strResults;
580 }
581 
GetStringArrayByName(const std::string & resName) const582 std::vector<std::string> ResourceAdapterImplV2::GetStringArrayByName(const std::string& resName) const
583 {
584     std::vector<std::string> strResults;
585     auto actualResName = GetActualResourceName(resName);
586     auto manager = GetResourceManager();
587     CHECK_NULL_RETURN(manager, strResults);
588     auto state = manager->GetStringArrayByName(actualResName.c_str(), strResults);
589     if (state != Global::Resource::SUCCESS) {
590         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get stringArray by name error, resName=%{public}s, errorCode=%{public}d",
591             resName.c_str(), state);
592         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
593         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
594             resName, "StringArray", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
595     }
596     return strResults;
597 }
598 
GetDouble(uint32_t resId)599 double ResourceAdapterImplV2::GetDouble(uint32_t resId)
600 {
601     float result = 0.0f;
602     auto manager = GetResourceManager();
603     CHECK_NULL_RETURN(manager, static_cast<double>(result));
604     auto state = manager->GetFloatById(resId, result);
605     if (state != Global::Resource::SUCCESS) {
606         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get double by id error, id=%{public}u, errorCode=%{public}d", resId, state);
607         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
608         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
609             std::to_string(resId), "Double", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
610     }
611     return static_cast<double>(result);
612 }
613 
GetDoubleByName(const std::string & resName)614 double ResourceAdapterImplV2::GetDoubleByName(const std::string& resName)
615 {
616     float result = 0.0f;
617     auto actualResName = GetActualResourceName(resName);
618     auto manager = GetResourceManager();
619     CHECK_NULL_RETURN(manager, static_cast<double>(result));
620     auto state = manager->GetFloatByName(actualResName.c_str(), result);
621     if (state != Global::Resource::SUCCESS) {
622         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get double by name error, resName=%{public}s, errorCode=%{public}d",
623             resName.c_str(), state);
624         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
625         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
626             resName, "Double", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
627     }
628     return static_cast<double>(result);
629 }
630 
GetInt(uint32_t resId)631 int32_t ResourceAdapterImplV2::GetInt(uint32_t resId)
632 {
633     int32_t result = 0;
634     auto manager = GetResourceManager();
635     CHECK_NULL_RETURN(manager, result);
636     auto state = manager->GetIntegerById(resId, result);
637     if (state != Global::Resource::SUCCESS) {
638         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get int by id error, id=%{public}u, errorCode=%{public}d", resId, state);
639         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
640         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
641             std::to_string(resId), "Int", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
642     }
643     return result;
644 }
645 
GetIntByName(const std::string & resName)646 int32_t ResourceAdapterImplV2::GetIntByName(const std::string& resName)
647 {
648     int32_t result = 0;
649     auto actualResName = GetActualResourceName(resName);
650     auto manager = GetResourceManager();
651     CHECK_NULL_RETURN(manager, result);
652     auto state = manager->GetIntegerByName(actualResName.c_str(), result);
653     if (state != Global::Resource::SUCCESS) {
654         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get int by name error, resName=%{public}s, errorCode=%{public}d",
655             resName.c_str(), state);
656         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
657         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
658             resName, "Int", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
659     }
660     return result;
661 }
662 
GetIntArray(uint32_t resId) const663 std::vector<uint32_t> ResourceAdapterImplV2::GetIntArray(uint32_t resId) const
664 {
665     std::vector<int> intVectorResult;
666     {
667         auto manager = GetResourceManager();
668         if (manager) {
669             auto state = manager->GetIntArrayById(resId, intVectorResult);
670             if (state != Global::Resource::SUCCESS) {
671                 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get intArray by id error, id=%{public}u, errorCode=%{public}d",
672                     resId, state);
673                 auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
674                 ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
675                     std::to_string(resId), "IntArray", host ? host->GetTag().c_str() : "",
676                     GetCurrentTimestamp(), state));
677             }
678         }
679     }
680 
681     std::vector<uint32_t> result(intVectorResult.size());
682     std::transform(
683         intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
684     return result;
685 }
686 
GetIntArrayByName(const std::string & resName) const687 std::vector<uint32_t> ResourceAdapterImplV2::GetIntArrayByName(const std::string& resName) const
688 {
689     std::vector<int> intVectorResult;
690     auto actualResName = GetActualResourceName(resName);
691     auto manager = GetResourceManager();
692     CHECK_NULL_RETURN(manager, {});
693     auto state = manager->GetIntArrayByName(actualResName.c_str(), intVectorResult);
694     if (state != Global::Resource::SUCCESS) {
695         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get intArray by name error, resName=%{public}s, errorCode=%{public}d",
696             resName.c_str(), state);
697         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
698         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
699             resName, "IntArray", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
700     }
701 
702     std::vector<uint32_t> result(intVectorResult.size());
703     std::transform(
704         intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
705     return result;
706 }
707 
GetBoolean(uint32_t resId) const708 bool ResourceAdapterImplV2::GetBoolean(uint32_t resId) const
709 {
710     bool result = false;
711     auto manager = GetResourceManager();
712     CHECK_NULL_RETURN(manager, result);
713     auto state = manager->GetBooleanById(resId, result);
714     if (state != Global::Resource::SUCCESS) {
715         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get boolean by id error, id=%{public}u, errorCode=%{public}d", resId, state);
716         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
717         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
718             std::to_string(resId), "Boolean", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
719     }
720     return result;
721 }
722 
GetBooleanByName(const std::string & resName) const723 bool ResourceAdapterImplV2::GetBooleanByName(const std::string& resName) const
724 {
725     bool result = false;
726     auto actualResName = GetActualResourceName(resName);
727     auto manager = GetResourceManager();
728     CHECK_NULL_RETURN(manager, result);
729     auto state = manager->GetBooleanByName(actualResName.c_str(), result);
730     if (state != Global::Resource::SUCCESS) {
731         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get boolean by name error, resName=%{public}s, errorCode=%{public}d",
732             resName.c_str(), state);
733         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
734         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
735             resName, "Boolean", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
736     }
737     return result;
738 }
739 
GetPixelMap(uint32_t resId)740 std::shared_ptr<Media::PixelMap> ResourceAdapterImplV2::GetPixelMap(uint32_t resId)
741 {
742     auto manager = GetResourceManager();
743 
744     CHECK_NULL_RETURN(manager, nullptr);
745     Napi::DrawableDescriptor::DrawableType drawableType;
746     Global::Resource::RState state;
747     auto drawableDescriptor =
748         Napi::DrawableDescriptorFactory::Create(resId, sysResourceManager_, state, drawableType, 0);
749     if (state != Global::Resource::SUCCESS) {
750         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Failed to Create drawableDescriptor by %{public}d, errorCode=%{public}d",
751             resId, state);
752         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
753         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
754             std::to_string(resId), "PixelMap", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
755         return nullptr;
756     }
757     CHECK_NULL_RETURN(drawableDescriptor, nullptr);
758     return drawableDescriptor->GetPixelMap();
759 }
760 
GetMediaPath(uint32_t resId)761 std::string ResourceAdapterImplV2::GetMediaPath(uint32_t resId)
762 {
763     std::string mediaPath = "";
764     auto manager = GetResourceManager();
765     CHECK_NULL_RETURN(manager, "");
766     auto state = manager->GetMediaById(resId, mediaPath);
767     if (state != Global::Resource::SUCCESS) {
768         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get media by id error, id=%{public}u, errorCode=%{public}u", resId, state);
769         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
770         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
771             std::to_string(resId), "MediaPath", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
772         return "";
773     }
774     if (SystemProperties::GetUnZipHap()) {
775         return "file:///" + mediaPath;
776     }
777     auto pos = mediaPath.find_last_of('.');
778     if (pos == std::string::npos) {
779         return "";
780     }
781     return "resource:///" + std::to_string(resId) + mediaPath.substr(pos);
782 }
783 
GetMediaPathByName(const std::string & resName)784 std::string ResourceAdapterImplV2::GetMediaPathByName(const std::string& resName)
785 {
786     std::string mediaPath = "";
787     auto actualResName = GetActualResourceName(resName);
788     {
789         auto manager = GetResourceManager();
790         CHECK_NULL_RETURN(manager, "");
791         auto state = manager->GetMediaByName(actualResName.c_str(), mediaPath);
792         if (state != Global::Resource::SUCCESS) {
793             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get media path by name error, resName=%{public}s, errorCode=%{public}u",
794                 resName.c_str(), state);
795             auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
796             ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
797                 resName, "MediaPath", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
798             return "";
799         }
800     }
801     if (SystemProperties::GetUnZipHap()) {
802         return "file:///" + mediaPath;
803     }
804     auto pos = mediaPath.find_last_of('.');
805     if (pos == std::string::npos) {
806         return "";
807     }
808     return "resource:///" + actualResName + mediaPath.substr(pos);
809 }
810 
GetRawfile(const std::string & fileName)811 std::string ResourceAdapterImplV2::GetRawfile(const std::string& fileName)
812 {
813     // as web component not support resource format: resource://RAWFILE/{fileName}, use old format
814     if (!packagePathStr_.empty()) {
815         std::string outPath;
816         auto manager = GetResourceManager();
817         CHECK_NULL_RETURN(manager, "");
818         // Adapt to the input like: "file:///index.html?a=1", before the new solution comes.
819         auto it = std::find_if(fileName.begin(), fileName.end(), [](char c) { return (c == '#') || (c == '?'); });
820         std::string params;
821         std::string newFileName = fileName;
822         if (it != fileName.end()) {
823             newFileName = std::string(fileName.begin(), it);
824             params = std::string(it, fileName.end());
825         }
826         auto state = manager->GetRawFilePathByName(newFileName, outPath);
827         if (state != Global::Resource::SUCCESS) {
828             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get rawFile error, filename:%{public}s, error:%{public}u",
829                 fileName.c_str(), state);
830             auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
831             ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
832                 fileName, "RawFile", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
833             return "";
834         }
835         return "file:///" + outPath + params;
836     }
837     std::regex regex(RESOURCE_TOKEN_PATTERN);
838     std::smatch results;
839     std::string newFIleName = fileName;
840     if (std::regex_match(fileName, results, regex)) {
841         newFIleName = results[1];
842     }
843     return "resource://RAWFILE/" + newFIleName;
844 }
845 
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest)846 bool ResourceAdapterImplV2::GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)
847 {
848     auto manager = GetResourceManager();
849     CHECK_NULL_RETURN(manager, false);
850     auto state = manager->GetRawFileFromHap(rawFile, len, dest);
851     if (state != Global::Resource::SUCCESS || !dest) {
852         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get rawFile from hap error, raw filename:%{public}s, error:%{public}u",
853             rawFile.c_str(), state);
854         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
855         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
856             rawFile, "RawFile", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
857         return false;
858     }
859     return true;
860 }
861 
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)862 bool ResourceAdapterImplV2::GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest,
863     const std::string& bundleName, const std::string& moduleName)
864 {
865     auto manager = GetResourceManager();
866     CHECK_NULL_RETURN(manager, false);
867     auto state = manager->GetRawFileFromHap(rawFile, len, dest);
868     if (state != Global::Resource::SUCCESS || !dest) {
869         TAG_LOGW(AceLogTag::ACE_RESOURCE,
870             "Get rawFile from hap error, raw filename:%{public}s, bundleName:%{public}s, moduleName:%{public}s, "
871             "error:%{public}u",
872             rawFile.c_str(), bundleName.c_str(), moduleName.c_str(), state);
873         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
874         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
875             rawFile, "RawFile", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
876         return false;
877     }
878     return true;
879 }
880 
GetMediaData(uint32_t resId,size_t & len,std::unique_ptr<uint8_t[]> & dest)881 bool ResourceAdapterImplV2::GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)
882 {
883     auto manager = GetResourceManager();
884     CHECK_NULL_RETURN(manager, false);
885     auto state = manager->GetMediaDataById(resId, len, dest);
886     if (state != Global::Resource::SUCCESS) {
887         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get media data by id error, id:%{public}u, error:%{public}u", resId, state);
888         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
889         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
890             std::to_string(resId), "MediaData", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
891         return false;
892     }
893     return true;
894 }
895 
GetMediaData(uint32_t resId,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)896 bool ResourceAdapterImplV2::GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest,
897     const std::string& bundleName, const std::string& moduleName)
898 {
899     auto manager = GetResourceManager();
900     CHECK_NULL_RETURN(manager, false);
901     auto state = manager->GetMediaDataById(resId, len, dest);
902     if (state != Global::Resource::SUCCESS) {
903         TAG_LOGW(AceLogTag::ACE_RESOURCE,
904             "Get media data by id error, id:%{public}u, bundleName:%{public}s, moduleName:%{public}s, error:%{public}u",
905             resId, bundleName.c_str(), moduleName.c_str(), state);
906         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
907         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
908             std::to_string(resId), "MediaData", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
909         return false;
910     }
911     return true;
912 }
913 
GetMediaData(const std::string & resName,size_t & len,std::unique_ptr<uint8_t[]> & dest)914 bool ResourceAdapterImplV2::GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest)
915 {
916     auto manager = GetResourceManager();
917     CHECK_NULL_RETURN(manager, false);
918     auto state = manager->GetMediaDataByName(resName.c_str(), len, dest);
919     if (state != Global::Resource::SUCCESS) {
920         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get media data by name error, resName:%{public}s, error:%{public}u",
921             resName.c_str(), state);
922         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
923         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
924             resName, "MediaData", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
925         return false;
926     }
927     return true;
928 }
929 
GetMediaData(const std::string & resName,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)930 bool ResourceAdapterImplV2::GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest,
931     const std::string& bundleName, const std::string& moduleName)
932 {
933     auto manager = GetResourceManager();
934     CHECK_NULL_RETURN(manager, false);
935     auto state = manager->GetMediaDataByName(resName.c_str(), len, dest);
936     if (state != Global::Resource::SUCCESS) {
937         TAG_LOGW(AceLogTag::ACE_RESOURCE,
938             "Get media data by name error, resName:%{public}s, bundleName:%{public}s, moduleName:%{public}s, "
939             "error:%{public}u",
940             resName.c_str(), bundleName.c_str(), moduleName.c_str(), state);
941         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
942         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
943             resName, "MediaData", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
944         return false;
945     }
946     return true;
947 }
948 
GetRawFileDescription(const std::string & rawfileName,RawfileDescription & rawfileDescription) const949 bool ResourceAdapterImplV2::GetRawFileDescription(
950     const std::string& rawfileName, RawfileDescription& rawfileDescription) const
951 {
952     OHOS::Global::Resource::ResourceManager::RawFileDescriptor descriptor;
953     auto manager = GetResourceManager();
954     CHECK_NULL_RETURN(manager, false);
955     auto state = manager->GetRawFileDescriptorFromHap(rawfileName, descriptor);
956     if (state != Global::Resource::SUCCESS) {
957         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get raw file description error, rawFileName:%{public}s, error:%{public}u",
958             rawfileName.c_str(), state);
959         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
960         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
961             rawfileName, "RawFileDescription", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
962         return false;
963     }
964     rawfileDescription.fd = descriptor.fd;
965     rawfileDescription.offset = descriptor.offset;
966     rawfileDescription.length = descriptor.length;
967     return true;
968 }
969 
CloseRawFileDescription(const std::string & rawfileName) const970 bool ResourceAdapterImplV2::CloseRawFileDescription(const std::string &rawfileName) const
971 {
972     auto manager = GetResourceManager();
973     CHECK_NULL_RETURN(manager, false);
974     auto state = manager->CloseRawFileDescriptor(rawfileName);
975     if (state != Global::Resource::SUCCESS) {
976         LOGE("Close RawFile Description error, error:%{public}u", state);
977         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
978         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
979             rawfileName, "RawFileDescription", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
980         return false;
981     }
982     return true;
983 }
984 
GetRawFD(const std::string & rawfileName,RawfileDescription & rawfileDescription) const985 bool ResourceAdapterImplV2::GetRawFD(const std::string& rawfileName, RawfileDescription& rawfileDescription) const
986 {
987     OHOS::Global::Resource::ResourceManager::RawFileDescriptor descriptor;
988     auto manager = GetResourceManager();
989     CHECK_NULL_RETURN(manager, false);
990     auto state = manager->GetRawFdNdkFromHap(rawfileName, descriptor);
991     if (state != Global::Resource::SUCCESS) {
992         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get raw fd(no cache) error, rawFileName:%{public}s, error:%{public}u",
993             rawfileName.c_str(), state);
994         return false;
995     }
996     rawfileDescription.fd = descriptor.fd;
997     rawfileDescription.offset = descriptor.offset;
998     rawfileDescription.length = descriptor.length;
999     return true;
1000 }
1001 
GetMediaById(const int32_t & resId,std::string & mediaPath) const1002 bool ResourceAdapterImplV2::GetMediaById(const int32_t& resId, std::string& mediaPath) const
1003 {
1004     auto manager = GetResourceManager();
1005     CHECK_NULL_RETURN(manager, false);
1006     auto state = manager->GetMediaById(resId, mediaPath);
1007     if (state != Global::Resource::SUCCESS) {
1008         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get media by id error, resId:%{public}d, error:%{public}u", resId, state);
1009         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
1010         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
1011             std::to_string(resId), "Media", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
1012         return false;
1013     }
1014     return true;
1015 }
1016 
GetActualResourceName(const std::string & resName) const1017 std::string ResourceAdapterImplV2::GetActualResourceName(const std::string& resName) const
1018 {
1019     auto index = resName.find_last_of('.');
1020     if (index == std::string::npos) {
1021         return {};
1022     }
1023     return resName.substr(index + 1, resName.length() - index - 1);
1024 }
1025 
GetResourceLimitKeys() const1026 uint32_t ResourceAdapterImplV2::GetResourceLimitKeys() const
1027 {
1028     auto manager = GetResourceManager();
1029     CHECK_NULL_RETURN(manager, 0);
1030     return manager->GetResourceLimitKeys();
1031 }
1032 
GetSymbolByName(const char * resName) const1033 uint32_t ResourceAdapterImplV2::GetSymbolByName(const char* resName) const
1034 {
1035     uint32_t result = 0;
1036     auto actualResName = GetActualResourceName(resName);
1037     auto manager = GetResourceManager();
1038     CHECK_NULL_RETURN(manager, -1);
1039     auto state = manager->GetSymbolByName(actualResName.c_str(), result);
1040     if (state != Global::Resource::SUCCESS) {
1041         TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get symbol by name error, name=%{public}s, errorCode=%{public}d",
1042             resName, state);
1043         auto host = NG::ViewStackProcessor::GetInstance()->GetMainElementNode();
1044         ResourceManager::GetInstance().AddResourceLoadError(ResourceErrorInfo(host ? host->GetId(): -1,
1045             resName, "Symbol", host ? host->GetTag().c_str() : "", GetCurrentTimestamp(), state));
1046     }
1047     return result;
1048 }
1049 
GetSymbolById(uint32_t resId) const1050 uint32_t ResourceAdapterImplV2::GetSymbolById(uint32_t resId) const
1051 {
1052     uint32_t result = 0;
1053     auto manager = GetResourceManager();
1054     CHECK_NULL_RETURN(manager, -1);
1055     manager->GetSymbolById(resId, result);
1056     return result;
1057 }
1058 
UpdateColorMode(ColorMode colorMode)1059 void ResourceAdapterImplV2::UpdateColorMode(ColorMode colorMode)
1060 {
1061     RefPtr<Container> container = Container::Current();
1062     CHECK_NULL_VOID(container);
1063     auto aceContainer = AceType::DynamicCast<Platform::AceContainer>(container);
1064     CHECK_NULL_VOID(aceContainer);
1065 
1066     auto resConfig = aceContainer->GetResourceConfiguration();
1067     resConfig.SetColorMode(colorMode);
1068     UpdateConfig(resConfig, false);
1069 }
1070 
GetResourceColorMode() const1071 ColorMode ResourceAdapterImplV2::GetResourceColorMode() const
1072 {
1073     CHECK_NULL_RETURN(resConfig_, ColorMode::LIGHT);
1074     if (resConfig_->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK && !resConfig_->GetAppColorMode() &&
1075         !appHasDarkRes_) {
1076         return ColorMode::LIGHT;
1077     }
1078     return resConfig_->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK ? ColorMode::DARK : ColorMode::LIGHT;
1079 }
1080 
SetAppHasDarkRes(bool hasDarkRes)1081 void ResourceAdapterImplV2::SetAppHasDarkRes(bool hasDarkRes)
1082 {
1083     appHasDarkRes_ = hasDarkRes;
1084 }
1085 
GetOverrideResourceAdapter(const ResourceConfiguration & config,const ConfigurationChange & configurationChange)1086 RefPtr<ResourceAdapter> ResourceAdapterImplV2::GetOverrideResourceAdapter(
1087     const ResourceConfiguration& config, const ConfigurationChange& configurationChange)
1088 {
1089     CHECK_NULL_RETURN(sysResourceManager_, nullptr);
1090     std::shared_ptr<Global::Resource::ResConfig> overrideResConfig(Global::Resource::CreateResConfig());
1091     sysResourceManager_->GetOverrideResConfig(*overrideResConfig);
1092     if (configurationChange.colorModeUpdate) {
1093         overrideResConfig->SetColorMode(ConvertColorModeToGlobal(config.GetColorMode()));
1094     }
1095     if (configurationChange.directionUpdate) {
1096         overrideResConfig->SetDirection(ConvertDirectionToGlobal(config.GetOrientation()));
1097     }
1098     if (configurationChange.dpiUpdate) {
1099         overrideResConfig->SetScreenDensity(config.GetDensity());
1100     }
1101     auto overrideResMgr = sysResourceManager_->GetOverrideResourceManager(overrideResConfig);
1102     return AceType::MakeRefPtr<ResourceAdapterImplV2>(overrideResMgr);
1103 }
1104 
ExistDarkResById(const std::string & resourceId)1105 bool ResourceAdapterImplV2::ExistDarkResById(const std::string& resourceId)
1106 {
1107     auto manager = GetResourceManager();
1108     CHECK_NULL_RETURN(manager, false);
1109     auto resId = StringUtils::StringToUintCheck(resourceId, UINT32_MAX);
1110     if (resId == UINT32_MAX) {
1111         return false;
1112     }
1113     auto colorMode = GetResourceColorMode();
1114     bool colorChanged = false;
1115     if (colorMode == ColorMode::LIGHT) {
1116         UpdateColorMode(ColorMode::DARK);
1117         colorChanged = true;
1118     }
1119     std::shared_ptr<Global::Resource::ResConfig> appResCfg(Global::Resource::CreateResConfig());
1120     auto state = manager->GetResConfigById(resId, *appResCfg);
1121     if (colorChanged) {
1122         UpdateColorMode(ColorMode::LIGHT);
1123     }
1124     return (state == Global::Resource::SUCCESS) &&
1125         (appResCfg->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK);
1126 }
1127 
ExistDarkResByName(const std::string & resourceName,const std::string & resourceType)1128 bool ResourceAdapterImplV2::ExistDarkResByName(const std::string& resourceName, const std::string& resourceType)
1129 {
1130     auto manager = GetResourceManager();
1131     CHECK_NULL_RETURN(manager, false);
1132     auto resType = StringUtils::StringToUintCheck(resourceType, UINT32_MAX);
1133     if (resType < OHOS::Global::Resource::ResType::VALUES ||
1134         resType > OHOS::Global::Resource::ResType::MAX_RES_TYPE) {
1135         return false;
1136     }
1137     auto type = static_cast<OHOS::Global::Resource::ResType>(resType);
1138     auto colorMode = GetResourceColorMode();
1139     bool colorChanged = false;
1140     if (colorMode == ColorMode::LIGHT) {
1141         UpdateColorMode(ColorMode::DARK);
1142         colorChanged = true;
1143     }
1144     std::shared_ptr<Global::Resource::ResConfig> appResCfg(Global::Resource::CreateResConfig());
1145     auto state = manager->GetResConfigByName(resourceName, type, *appResCfg);
1146     if (colorChanged) {
1147         UpdateColorMode(ColorMode::LIGHT);
1148     }
1149     return (state == Global::Resource::SUCCESS) &&
1150         (appResCfg->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK);
1151 }
1152 
GetResId(const std::string & resTypeName) const1153 uint32_t ResourceAdapterImplV2::GetResId(const std::string &resTypeName) const
1154 {
1155     uint32_t resId = -1;
1156     auto manager = GetResourceManager();
1157     CHECK_NULL_RETURN(manager, -1);
1158     manager->GetResId(resTypeName, resId);
1159     return resId;
1160 }
1161 } // namespace OHOS::Ace
1162