• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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