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