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