1 /*
2 * Copyright (c) 2021-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/preview/osal/resource_adapter_impl_standard.h"
17
18 #include "adapter/preview/entrance/ace_container.h"
19 #include "adapter/ohos/osal/resource_theme_style.h"
20 #include "adapter/preview/entrance/ace_application_info.h"
21 #include "adapter/preview/osal/resource_convertor.h"
22 #include "base/log/log.h"
23 #include "core/common/container.h"
24 #include "core/components/theme/theme_attributes.h"
25 #include "core/pipeline_ng/pipeline_context.h"
26 #include "frameworks/simulator/ability_simulator/include/ability_context.h"
27
28 namespace OHOS::Ace {
29
30 namespace {
31 #ifdef WINDOWS_PLATFORM
32 constexpr char DELIMITER[] = "\\";
33 #else
34 constexpr char DELIMITER[] = "/";
35 #endif
36
37 constexpr uint32_t OHOS_THEME_ID = 125829872; // ohos_theme
38
CheckThemeId(int32_t & themeId)39 void CheckThemeId(int32_t& themeId)
40 {
41 if (themeId >= 0) {
42 return;
43 }
44 themeId = OHOS_THEME_ID;
45 }
46
47 const char* PATTERN_MAP[] = {
48 THEME_PATTERN_BUTTON,
49 THEME_PATTERN_CHECKBOX,
50 THEME_PATTERN_DATA_PANEL,
51 THEME_PATTERN_RADIO,
52 THEME_PATTERN_SWIPER,
53 THEME_PATTERN_SWITCH,
54 THEME_PATTERN_TOOLBAR,
55 THEME_PATTERN_TOGGLE,
56 THEME_PATTERN_TOAST,
57 THEME_PATTERN_DIALOG,
58 THEME_PATTERN_DRAG_BAR,
59 THEME_PATTERN_CLOSE_ICON,
60 THEME_PATTERN_SEMI_MODAL,
61 // append
62 THEME_PATTERN_BADGE,
63 THEME_PATTERN_CALENDAR,
64 THEME_PATTERN_CAMERA,
65 THEME_PATTERN_CARD,
66 THEME_PATTERN_CLOCK,
67 THEME_PATTERN_COUNTER,
68 THEME_PATTERN_DIVIDER,
69 THEME_PATTERN_FOCUS_ANIMATION,
70 THEME_PATTERN_GRID,
71 THEME_PATTERN_IMAGE,
72 THEME_PATTERN_LIST,
73 THEME_PATTERN_LIST_ITEM,
74 THEME_PATTERN_ARC_LIST,
75 THEME_PATTERN_ARC_LIST_ITEM,
76 THEME_PATTERN_MARQUEE,
77 THEME_PATTERN_NAVIGATION_BAR,
78 THEME_PATTERN_PICKER,
79 THEME_PATTERN_PIECE,
80 THEME_PATTERN_POPUP,
81 THEME_PATTERN_PROGRESS,
82 THEME_PATTERN_QRCODE,
83 THEME_PATTERN_RATING,
84 THEME_PATTERN_REFRESH,
85 THEME_PATTERN_SCROLL_BAR,
86 THEME_PATTERN_SEARCH,
87 THEME_PATTERN_SELECT,
88 THEME_PATTERN_SLIDER,
89 THEME_PATTERN_STEPPER,
90 THEME_PATTERN_TAB,
91 THEME_PATTERN_TEXT,
92 THEME_PATTERN_TEXTFIELD,
93 THEME_PATTERN_TEXT_OVERLAY,
94 THEME_PATTERN_VIDEO,
95 THEME_PATTERN_ICON,
96 THEME_PATTERN_INDEXER,
97 THEME_PATTERN_APP_BAR,
98 THEME_PATTERN_SECURITY_COMPONENT,
99 THEME_PATTERN_SIDE_BAR,
100 THEME_PATTERN_PATTERN_LOCK,
101 THEME_PATTERN_HYPERLINK,
102 THEME_PATTERN_GAUGE,
103 THEME_PATTERN_SHEET,
104 THEME_BLUR_STYLE_COMMON,
105 THEME_PATTERN_SHADOW,
106 THEME_PATTERN_RICH_EDITOR,
107 THEME_PATTERN_CONTAINER_MODAL,
108 THEME_PATTERN_APP
109 };
110 } // namespace
111
Create()112 RefPtr<ResourceAdapter> ResourceAdapter::Create()
113 {
114 return AceType::MakeRefPtr<ResourceAdapterImpl>();
115 }
116
ParseDimensionUnit(const std::string & unit)117 DimensionUnit ParseDimensionUnit(const std::string& unit)
118 {
119 if (unit == "px") {
120 return DimensionUnit::PX;
121 } else if (unit == "fp") {
122 return DimensionUnit::FP;
123 } else if (unit == "lpx") {
124 return DimensionUnit::LPX;
125 } else if (unit == "%") {
126 return DimensionUnit::PERCENT;
127 } else {
128 return DimensionUnit::VP;
129 }
130 }
131
ResourceAdapterImpl(std::shared_ptr<Global::Resource::ResourceManager> resourceManager)132 ResourceAdapterImpl::ResourceAdapterImpl(std::shared_ptr<Global::Resource::ResourceManager> resourceManager)
133 {
134 resourceManager_ = resourceManager;
135 }
136
Init(const ResourceInfo & resourceInfo)137 void ResourceAdapterImpl::Init(const ResourceInfo& resourceInfo)
138 {
139 std::string appResPath = resourceInfo.GetPackagePath();
140 std::string sysResPath = resourceInfo.GetSystemPackagePath();
141 std::string hmsResPath = resourceInfo.GetHmsPackagePath();
142 auto resConfig = ConvertConfigToGlobal(resourceInfo.GetResourceConfiguration());
143 std::shared_ptr<Global::Resource::ResourceManager> newResMgr(Global::Resource::CreateResourceManager());
144
145 std::string appResIndexPath = appResPath + DELIMITER + "resources.index";
146 auto appResRet = newResMgr->AddResource(appResIndexPath.c_str());
147 std::string sysResIndexPath = sysResPath + DELIMITER + "resources.index";
148 auto sysResRet = newResMgr->AddResource(sysResIndexPath.c_str());
149 if (!hmsResPath.empty()) {
150 std::string hmsResIndexPath =
151 hmsResPath + DELIMITER + "resources" + DELIMITER + "resources" + DELIMITER + "resources.index";
152 newResMgr->AddResource(hmsResIndexPath.c_str());
153 }
154
155 if (resConfig != nullptr) {
156 auto configRet = newResMgr->UpdateResConfig(*resConfig);
157 LOGI("AddAppRes result=%{public}d, AddSysRes result=%{public}d, UpdateResConfig result=%{public}d, "
158 "ori=%{public}d, dpi=%{public}f, device=%{public}d",
159 appResRet, sysResRet, configRet, resConfig->GetDirection(), resConfig->GetScreenDensity(),
160 resConfig->GetDeviceType());
161 }
162
163 Platform::AceApplicationInfoImpl::GetInstance().SetResourceManager(newResMgr);
164 resourceManager_ = newResMgr;
165 packagePathStr_ = appResPath;
166 }
167
SetAppHasDarkRes(bool hasDarkRes)168 void ResourceAdapterImpl::SetAppHasDarkRes(bool hasDarkRes)
169 {
170 appHasDarkRes_ = hasDarkRes;
171 }
172
CreateNewResourceAdapter(const std::string & bundleName,const std::string & moduleName)173 RefPtr<ResourceAdapter> ResourceAdapter::CreateNewResourceAdapter(
174 const std::string& bundleName, const std::string& moduleName)
175 {
176 auto container = Container::CurrentSafely();
177 CHECK_NULL_RETURN(container, nullptr);
178 auto aceContainer = AceType::DynamicCast<Platform::AceContainer>(container);
179 CHECK_NULL_RETURN(aceContainer, nullptr);
180
181 RefPtr<ResourceAdapter> newResourceAdapter = nullptr;
182 auto context = aceContainer->GetAbilityContextByModule(bundleName, moduleName);
183 if (context) {
184 auto resourceManager = context->GetResourceManager();
185 auto resourceAdapterImpl = AceType::MakeRefPtr<ResourceAdapterImpl>(resourceManager);
186 resourceAdapterImpl->SetAppHasDarkRes(aceContainer->GetResourceConfiguration().GetAppHasDarkRes());
187 newResourceAdapter = resourceAdapterImpl;
188 } else {
189 newResourceAdapter = ResourceAdapter::Create();
190 auto resourceInfo = aceContainer->GetResourceInfo();
191 newResourceAdapter->Init(resourceInfo);
192 }
193
194 auto resConfig = aceContainer->GetResourceConfiguration();
195 auto pipelineContext = NG::PipelineContext::GetCurrentContext();
196 if (pipelineContext && pipelineContext->GetLocalColorMode() != ColorMode::COLOR_MODE_UNDEFINED) {
197 auto localColorMode = pipelineContext->GetLocalColorMode();
198 resConfig.SetColorMode(localColorMode);
199 }
200 newResourceAdapter->UpdateConfig(resConfig);
201
202 return newResourceAdapter;
203 }
204
UpdateConfig(const ResourceConfiguration & config,bool themeFlag)205 void ResourceAdapterImpl::UpdateConfig(const ResourceConfiguration& config, bool themeFlag)
206 {
207 auto resConfig = ConvertConfigToGlobal(config);
208 LOGI("UpdateConfig ori=%{public}d, dpi=%{public}f, device=%{public}d", resConfig->GetDirection(),
209 resConfig->GetScreenDensity(), resConfig->GetDeviceType());
210 if (resConfig != nullptr) {
211 resourceManager_->UpdateResConfig(*resConfig);
212 }
213 }
214
GetTheme(int32_t themeId)215 RefPtr<ThemeStyle> ResourceAdapterImpl::GetTheme(int32_t themeId)
216 {
217 CheckThemeId(themeId);
218 auto theme = AceType::MakeRefPtr<ResourceThemeStyle>(AceType::Claim(this));
219 constexpr char OHFlag[] = "ohos_"; // fit with resource/base/theme.json and pattern.json
220 if (resourceManager_) {
221 auto ret = resourceManager_->GetThemeById(themeId, theme->rawAttrs_);
222 for (size_t i = 0; i < sizeof(PATTERN_MAP) / sizeof(PATTERN_MAP[0]); i++) {
223 ResourceThemeStyle::RawAttrMap attrMap;
224 std::string patternTag = PATTERN_MAP[i];
225 std::string patternName = std::string(OHFlag) + PATTERN_MAP[i];
226 ret = resourceManager_->GetPatternByName(patternName.c_str(), attrMap);
227 if (attrMap.empty()) {
228 continue;
229 }
230 theme->patternAttrs_[patternTag] = attrMap;
231 }
232 LOGI("themeId=%{public}d, ret=%{public}d, attr size=%{public}zu, pattern size=%{public}zu", themeId, ret,
233 theme->rawAttrs_.size(), theme->patternAttrs_.size());
234 }
235
236 if (theme->patternAttrs_.empty() && theme->rawAttrs_.empty()) {
237 LOGW("theme resource get failed, use default theme config.");
238 return nullptr;
239 }
240
241 theme->ParseContent();
242 theme->patternAttrs_.clear();
243 return theme;
244 };
245
GetColor(uint32_t resId)246 Color ResourceAdapterImpl::GetColor(uint32_t resId)
247 {
248 uint32_t result = 0;
249 if (resourceManager_) {
250 auto state = resourceManager_->GetColorById(resId, result);
251 if (state != Global::Resource::SUCCESS) {
252 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetColor error, id=%{public}u", resId);
253 }
254 }
255 return Color(result);
256 }
257
GetColorByName(const std::string & resName)258 Color ResourceAdapterImpl::GetColorByName(const std::string& resName)
259 {
260 uint32_t result = 0;
261 if (resourceManager_) {
262 auto index = resName.find_last_of('.');
263 auto actualResName = resName.substr(index + 1, resName.length() - index - 1);
264 auto state = resourceManager_->GetColorByName(actualResName.c_str(), result);
265 if (state != Global::Resource::SUCCESS) {
266 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetColorByName error, name=%{public}s", resName.c_str());
267 }
268 }
269 return Color(result);
270 }
271
GetDimension(uint32_t resId)272 Dimension ResourceAdapterImpl::GetDimension(uint32_t resId)
273 {
274 float dimensionFloat = 0.0f;
275 std::string unit = "";
276 if (resourceManager_) {
277 auto state = resourceManager_->GetFloatById(resId, dimensionFloat, unit);
278 if (state != Global::Resource::SUCCESS) {
279 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetDimension error, id=%{public}u", resId);
280 }
281 }
282 return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
283 }
284
GetDimensionByName(const std::string & resName)285 Dimension ResourceAdapterImpl::GetDimensionByName(const std::string& resName)
286 {
287 float dimensionFloat = 0.0f;
288 std::string unit = "";
289 if (resourceManager_) {
290 auto index = resName.find_last_of('.');
291 auto actualResName = resName.substr(index + 1, resName.length() - index - 1);
292 auto state = resourceManager_->GetFloatByName(actualResName.c_str(), dimensionFloat, unit);
293 if (state != Global::Resource::SUCCESS) {
294 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetDimensionByName error, name=%{public}s", resName.c_str());
295 }
296 }
297 return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
298 }
299
GetString(uint32_t resId)300 std::string ResourceAdapterImpl::GetString(uint32_t resId)
301 {
302 std::string strResult = "";
303 if (resourceManager_) {
304 auto state = resourceManager_->GetStringById(resId, strResult);
305 if (state != Global::Resource::SUCCESS) {
306 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetString error, id=%{public}u", resId);
307 }
308 }
309 return strResult;
310 }
311
GetStringByName(const std::string & resName)312 std::string ResourceAdapterImpl::GetStringByName(const std::string& resName)
313 {
314 std::string strResult = "";
315 auto actualResName = GetActualResourceName(resName);
316 if (resourceManager_) {
317 auto state = resourceManager_->GetStringByName(actualResName.c_str(), strResult);
318 if (state != Global::Resource::SUCCESS) {
319 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get string by name error, resName=%{public}s, errorCode=%{public}d",
320 resName.c_str(), state);
321 }
322 }
323 return strResult;
324 }
325
GetPluralString(uint32_t resId,int quantity)326 std::string ResourceAdapterImpl::GetPluralString(uint32_t resId, int quantity)
327 {
328 std::string strResult = "";
329 if (resourceManager_) {
330 auto state = resourceManager_->GetPluralStringById(resId, quantity, strResult);
331 if (state != Global::Resource::SUCCESS) {
332 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetPluralString error, id=%{public}u", resId);
333 }
334 }
335 return strResult;
336 }
337
GetPluralStringByName(const std::string & resName,int quantity)338 std::string ResourceAdapterImpl::GetPluralStringByName(const std::string& resName, int quantity)
339 {
340 std::string strResult = "";
341 auto actualResName = GetActualResourceName(resName);
342 if (resourceManager_) {
343 auto state = resourceManager_->GetPluralStringByName(actualResName.c_str(), quantity, strResult);
344 if (state != Global::Resource::SUCCESS) {
345 TAG_LOGW(AceLogTag::ACE_RESOURCE,
346 "Get plural string by name error, resName=%{public}s, errorCode=%{public}d", resName.c_str(), state);
347 }
348 }
349 return strResult;
350 }
351
GetStringArray(uint32_t resId) const352 std::vector<std::string> ResourceAdapterImpl::GetStringArray(uint32_t resId) const
353 {
354 std::vector<std::string> strResults;
355 if (resourceManager_) {
356 auto state = resourceManager_->GetStringArrayById(resId, strResults);
357 if (state != Global::Resource::SUCCESS) {
358 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetStringArray error, id=%{public}u", resId);
359 }
360 }
361 return strResults;
362 }
363
GetStringArrayByName(const std::string & resName) const364 std::vector<std::string> ResourceAdapterImpl::GetStringArrayByName(const std::string& resName) const
365 {
366 std::vector<std::string> strResults;
367 auto actualResName = GetActualResourceName(resName);
368 if (resourceManager_) {
369 auto state = resourceManager_->GetStringArrayByName(actualResName.c_str(), strResults);
370 if (state != Global::Resource::SUCCESS) {
371 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get stringArray by name error, resName=%{public}s, errorCode=%{public}d",
372 resName.c_str(), state);
373 }
374 }
375 return strResults;
376 }
377
GetDouble(uint32_t resId)378 double ResourceAdapterImpl::GetDouble(uint32_t resId)
379 {
380 float result = 0.0f;
381 if (resourceManager_) {
382 auto state = resourceManager_->GetFloatById(resId, result);
383 if (state != Global::Resource::SUCCESS) {
384 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetDouble error, id=%{public}u", resId);
385 }
386 }
387 return static_cast<double>(result);
388 }
389
GetDoubleByName(const std::string & resName)390 double ResourceAdapterImpl::GetDoubleByName(const std::string& resName)
391 {
392 float result = 0.0f;
393 auto actualResName = GetActualResourceName(resName);
394 if (resourceManager_) {
395 auto state = resourceManager_->GetFloatByName(actualResName.c_str(), result);
396 if (state != Global::Resource::SUCCESS) {
397 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get double by name error, resName=%{public}s, errorCode=%{public}d",
398 resName.c_str(), state);
399 }
400 }
401 return static_cast<double>(result);
402 }
403
GetInt(uint32_t resId)404 int32_t ResourceAdapterImpl::GetInt(uint32_t resId)
405 {
406 int32_t result = 0;
407 if (resourceManager_) {
408 auto state = resourceManager_->GetIntegerById(resId, result);
409 if (state != Global::Resource::SUCCESS) {
410 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetInt error, id=%{public}u", resId);
411 }
412 }
413 return result;
414 }
415
GetIntByName(const std::string & resName)416 int32_t ResourceAdapterImpl::GetIntByName(const std::string& resName)
417 {
418 int32_t result = 0;
419 auto actualResName = GetActualResourceName(resName);
420 if (resourceManager_) {
421 auto state = resourceManager_->GetIntegerByName(actualResName.c_str(), result);
422 if (state != Global::Resource::SUCCESS) {
423 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get int by name error, resName=%{public}s, errorCode=%{public}d",
424 resName.c_str(), state);
425 }
426 }
427 return result;
428 }
429
GetIntArray(uint32_t resId) const430 std::vector<uint32_t> ResourceAdapterImpl::GetIntArray(uint32_t resId) const
431 {
432 std::vector<int> intVectorResult;
433 if (resourceManager_) {
434 auto state = resourceManager_->GetIntArrayById(resId, intVectorResult);
435 if (state != Global::Resource::SUCCESS) {
436 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetIntArray error, id=%{public}u", resId);
437 }
438 }
439 std::vector<uint32_t> result(intVectorResult.size());
440 std::transform(
441 intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
442 return result;
443 }
444
GetIntArrayByName(const std::string & resName) const445 std::vector<uint32_t> ResourceAdapterImpl::GetIntArrayByName(const std::string& resName) const
446 {
447 std::vector<int> intVectorResult;
448 auto actualResName = GetActualResourceName(resName);
449 if (resourceManager_) {
450 auto state = resourceManager_->GetIntArrayByName(actualResName.c_str(), intVectorResult);
451 if (state != Global::Resource::SUCCESS) {
452 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get intArray by name error, resName=%{public}s, errorCode=%{public}d",
453 resName.c_str(), state);
454 }
455 }
456
457 std::vector<uint32_t> result(intVectorResult.size());
458 std::transform(
459 intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
460 return result;
461 }
462
GetBoolean(uint32_t resId) const463 bool ResourceAdapterImpl::GetBoolean(uint32_t resId) const
464 {
465 bool result = false;
466 if (resourceManager_) {
467 auto state = resourceManager_->GetBooleanById(resId, result);
468 if (state != Global::Resource::SUCCESS) {
469 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetBoolean error, id=%{public}u", resId);
470 }
471 }
472 return result;
473 }
474
GetBooleanByName(const std::string & resName) const475 bool ResourceAdapterImpl::GetBooleanByName(const std::string& resName) const
476 {
477 bool result = false;
478 auto actualResName = GetActualResourceName(resName);
479 if (resourceManager_) {
480 auto state = resourceManager_->GetBooleanByName(actualResName.c_str(), result);
481 if (state != Global::Resource::SUCCESS) {
482 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get boolean by name error, resName=%{public}s, errorCode=%{public}d",
483 resName.c_str(), state);
484 }
485 }
486 return result;
487 }
488
GetMediaPath(uint32_t resId)489 std::string ResourceAdapterImpl::GetMediaPath(uint32_t resId)
490 {
491 std::string mediaPath = "";
492 if (resourceManager_) {
493 auto state = resourceManager_->GetMediaById(resId, mediaPath);
494 if (state != Global::Resource::SUCCESS) {
495 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetMediaPath error, id=%{public}u", resId);
496 return "";
497 }
498 // The Media file directory starts with file// on the PC Preview
499 return "file://" + mediaPath;
500 }
501 return "";
502 }
503
GetMediaPathByName(const std::string & resName)504 std::string ResourceAdapterImpl::GetMediaPathByName(const std::string& resName)
505 {
506 std::string mediaPath = "";
507 auto actualResName = GetActualResourceName(resName);
508 if (resourceManager_) {
509 auto state = resourceManager_->GetMediaByName(actualResName.c_str(), mediaPath);
510 if (state != Global::Resource::SUCCESS) {
511 TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetMediaPathByName error, resName=%{public}s, errorCode=%{public}u",
512 resName.c_str(), state);
513 return "";
514 }
515 // The Media file directory starts with file// on the PC Preview
516 return "file://" + mediaPath;
517 }
518 return "";
519 }
520
GetRawfile(const std::string & fileName)521 std::string ResourceAdapterImpl::GetRawfile(const std::string& fileName)
522 {
523 // The rawfile file directory starts with file// on the PC Preview
524 return "file://" + packagePathStr_ + "/resources/rawfile/" + fileName;
525 }
526
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest)527 bool ResourceAdapterImpl::GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)
528 {
529 return false;
530 }
531
GetMediaData(uint32_t resId,size_t & len,std::unique_ptr<uint8_t[]> & dest)532 bool ResourceAdapterImpl::GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)
533 {
534 return false;
535 }
536
GetMediaData(const std::string & resName,size_t & len,std::unique_ptr<uint8_t[]> & dest)537 bool ResourceAdapterImpl::GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest)
538 {
539 return false;
540 }
541
UpdateResourceManager(const std::string & bundleName,const std::string & moduleName)542 void ResourceAdapterImpl::UpdateResourceManager(const std::string& bundleName, const std::string& moduleName)
543 {
544 return;
545 }
546
GetActualResourceName(const std::string & resName)547 std::string ResourceAdapterImpl::GetActualResourceName(const std::string& resName)
548 {
549 auto index = resName.find_last_of('.');
550 if (index == std::string::npos) {
551 LOGE("GetActualResourceName error, incorrect resName format.");
552 return {};
553 }
554 return resName.substr(index + 1, resName.length() - index - 1);
555 }
556
GetSymbolById(uint32_t resId) const557 uint32_t ResourceAdapterImpl::GetSymbolById(uint32_t resId) const
558 {
559 uint32_t result = 0;
560 if (resourceManager_) {
561 resourceManager_->GetSymbolById(resId, result);
562 }
563 return result;
564 }
565
GetSymbolByName(const char * resName) const566 uint32_t ResourceAdapterImpl::GetSymbolByName(const char* resName) const
567 {
568 uint32_t result = 0;
569 auto actualResName = GetActualResourceName(resName);
570 if (resourceManager_) {
571 auto state = resourceManager_->GetSymbolByName(actualResName.c_str(), result);
572 if (state != Global::Resource::SUCCESS) {
573 TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get symbol by name error, name=%{public}s, errorCode=%{public}d",
574 resName, state);
575 }
576 }
577 return result;
578 }
579
GetResourceColorMode() const580 ColorMode ResourceAdapterImpl::GetResourceColorMode() const
581 {
582 CHECK_NULL_RETURN(resourceManager_, ColorMode::LIGHT);
583 std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
584 resourceManager_->GetResConfig(*resConfig);
585 return resConfig->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK ? ColorMode::DARK : ColorMode::LIGHT;
586 }
587
GetOverrideResourceAdapter(const ResourceConfiguration & config,const ConfigurationChange & configurationChange)588 RefPtr<ResourceAdapter> ResourceAdapterImpl::GetOverrideResourceAdapter(
589 const ResourceConfiguration& config, const ConfigurationChange& configurationChange)
590 {
591 std::shared_ptr<Global::Resource::ResConfig> overrideResConfig(Global::Resource::CreateResConfig());
592 resourceManager_->GetOverrideResConfig(*overrideResConfig);
593 if (configurationChange.colorModeUpdate) {
594 overrideResConfig->SetColorMode(ConvertColorModeToGlobal(config.GetColorMode()));
595 }
596 if (configurationChange.directionUpdate) {
597 overrideResConfig->SetDirection(ConvertDirectionToGlobal(config.GetOrientation()));
598 }
599 if (configurationChange.dpiUpdate) {
600 overrideResConfig->SetScreenDensity(config.GetDensity());
601 }
602 auto overrideResMgr = resourceManager_->GetOverrideResourceManager(overrideResConfig);
603 return AceType::MakeRefPtr<ResourceAdapterImpl>(overrideResMgr);
604 }
605 } // namespace OHOS::Ace
606