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     THEME_PATTERN_LINEAR_INDICATOR
104 };
105 } // namespace
106 
Create()107 RefPtr<ResourceAdapter> ResourceAdapter::Create()
108 {
109     return AceType::MakeRefPtr<ResourceAdapterImpl>();
110 }
111 
ParseDimensionUnit(const std::string& unit)112 DimensionUnit ParseDimensionUnit(const std::string& unit)
113 {
114     if (unit == "px") {
115         return DimensionUnit::PX;
116     } else if (unit == "fp") {
117         return DimensionUnit::FP;
118     } else if (unit == "lpx") {
119         return DimensionUnit::LPX;
120     } else if (unit == "%") {
121         return DimensionUnit::PERCENT;
122     } else {
123         return DimensionUnit::VP;
124     }
125 }
126 
ResourceAdapterImpl(std::shared_ptr<Global::Resource::ResourceManager> resourceManager)127 ResourceAdapterImpl::ResourceAdapterImpl(std::shared_ptr<Global::Resource::ResourceManager> resourceManager)
128 {
129     resourceManager_ = resourceManager;
130 }
131 
Init(const ResourceInfo& resourceInfo)132 void ResourceAdapterImpl::Init(const ResourceInfo& resourceInfo)
133 {
134     std::string appResPath = resourceInfo.GetPackagePath();
135     std::string sysResPath = resourceInfo.GetSystemPackagePath();
136     std::string hmsResPath = resourceInfo.GetHmsPackagePath();
137     auto resConfig = ConvertConfigToGlobal(resourceInfo.GetResourceConfiguration());
138     std::shared_ptr<Global::Resource::ResourceManager> newResMgr(Global::Resource::CreateResourceManager());
139 
140     std::string appResIndexPath = appResPath + DELIMITER + "resources.index";
141     auto appResRet = newResMgr->AddResource(appResIndexPath.c_str());
142     std::string sysResIndexPath = sysResPath + DELIMITER + "resources.index";
143     auto sysResRet = newResMgr->AddResource(sysResIndexPath.c_str());
144     if (!hmsResPath.empty()) {
145         std::string hmsResIndexPath =
146             hmsResPath + DELIMITER + "resources" + DELIMITER + "resources" + DELIMITER + "resources.index";
147         newResMgr->AddResource(hmsResIndexPath.c_str());
148     }
149 
150     if (resConfig != nullptr) {
151         auto configRet = newResMgr->UpdateResConfig(*resConfig);
152         LOGI("AddAppRes result=%{public}d, AddSysRes result=%{public}d,  UpdateResConfig result=%{public}d, "
153              "ori=%{public}d, dpi=%{public}f, device=%{public}d",
154             appResRet, sysResRet, configRet, resConfig->GetDirection(), resConfig->GetScreenDensity(),
155             resConfig->GetDeviceType());
156     }
157 
158     Platform::AceApplicationInfoImpl::GetInstance().SetResourceManager(newResMgr);
159     resourceManager_ = newResMgr;
160     packagePathStr_ = appResPath;
161 }
162 
CreateNewResourceAdapter( const std::string& bundleName, const std::string& moduleName)163 RefPtr<ResourceAdapter> ResourceAdapter::CreateNewResourceAdapter(
164     const std::string& bundleName, const std::string& moduleName)
165 {
166     TAG_LOGW(AceLogTag::ACE_RESOURCE,
167         "Cannot preview the component from the %{public}s module, because it contains a resource reference. Preview it "
168         "in the %{public}s module instead.",
169         moduleName.c_str(), moduleName.c_str());
170     return nullptr;
171 }
172 
UpdateConfig(const ResourceConfiguration& config, bool themeFlag)173 void ResourceAdapterImpl::UpdateConfig(const ResourceConfiguration& config, bool themeFlag)
174 {
175     auto resConfig = ConvertConfigToGlobal(config);
176     LOGI("UpdateConfig ori=%{public}d, dpi=%{public}f, device=%{public}d", resConfig->GetDirection(),
177         resConfig->GetScreenDensity(), resConfig->GetDeviceType());
178     if (resConfig != nullptr) {
179         resourceManager_->UpdateResConfig(*resConfig);
180     }
181 }
182 
GetTheme(int32_t themeId)183 RefPtr<ThemeStyle> ResourceAdapterImpl::GetTheme(int32_t themeId)
184 {
185     CheckThemeId(themeId);
186     auto theme = AceType::MakeRefPtr<ResourceThemeStyle>(AceType::Claim(this));
187     constexpr char OHFlag[] = "ohos_"; // fit with resource/base/theme.json and pattern.json
188     if (resourceManager_) {
189         auto ret = resourceManager_->GetThemeById(themeId, theme->rawAttrs_);
190         for (size_t i = 0; i < sizeof(PATTERN_MAP) / sizeof(PATTERN_MAP[0]); i++) {
191             ResourceThemeStyle::RawAttrMap attrMap;
192             std::string patternTag = PATTERN_MAP[i];
193             std::string patternName = std::string(OHFlag) + PATTERN_MAP[i];
194             ret = resourceManager_->GetPatternByName(patternName.c_str(), attrMap);
195             if (attrMap.empty()) {
196                 continue;
197             }
198             theme->patternAttrs_[patternTag] = attrMap;
199         }
200         LOGI("themeId=%{public}d, ret=%{public}d, attr size=%{public}zu, pattern size=%{public}zu", themeId, ret,
201             theme->rawAttrs_.size(), theme->patternAttrs_.size());
202     }
203 
204     if (theme->patternAttrs_.empty() && theme->rawAttrs_.empty()) {
205         LOGW("theme resource get failed, use default theme config.");
206         return nullptr;
207     }
208 
209     theme->ParseContent();
210     theme->patternAttrs_.clear();
211     return theme;
212 };
213 
GetColor(uint32_t resId)214 Color ResourceAdapterImpl::GetColor(uint32_t resId)
215 {
216     uint32_t result = 0;
217     if (resourceManager_) {
218         auto state = resourceManager_->GetColorById(resId, result);
219         if (state != Global::Resource::SUCCESS) {
220             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetColor error, id=%{public}u", resId);
221         }
222     }
223     return Color(result);
224 }
225 
GetColorByName(const std::string& resName)226 Color ResourceAdapterImpl::GetColorByName(const std::string& resName)
227 {
228     uint32_t result = 0;
229     if (resourceManager_) {
230         auto index = resName.find_last_of('.');
231         auto actualResName = resName.substr(index + 1, resName.length() - index - 1);
232         auto state = resourceManager_->GetColorByName(actualResName.c_str(), result);
233         if (state != Global::Resource::SUCCESS) {
234             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetColorByName error, name=%{public}s", resName.c_str());
235         }
236     }
237     return Color(result);
238 }
239 
GetDimension(uint32_t resId)240 Dimension ResourceAdapterImpl::GetDimension(uint32_t resId)
241 {
242     float dimensionFloat = 0.0f;
243     std::string unit = "";
244     if (resourceManager_) {
245         auto state = resourceManager_->GetFloatById(resId, dimensionFloat, unit);
246         if (state != Global::Resource::SUCCESS) {
247             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetDimension error, id=%{public}u", resId);
248         }
249     }
250     return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
251 }
252 
GetDimensionByName(const std::string& resName)253 Dimension ResourceAdapterImpl::GetDimensionByName(const std::string& resName)
254 {
255     float dimensionFloat = 0.0f;
256     std::string unit = "";
257     if (resourceManager_) {
258         auto index = resName.find_last_of('.');
259         auto actualResName = resName.substr(index + 1, resName.length() - index - 1);
260         auto state = resourceManager_->GetFloatByName(actualResName.c_str(), dimensionFloat, unit);
261         if (state != Global::Resource::SUCCESS) {
262             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetDimensionByName error, name=%{public}s", resName.c_str());
263         }
264     }
265     return Dimension(static_cast<double>(dimensionFloat), ParseDimensionUnit(unit));
266 }
267 
GetString(uint32_t resId)268 std::string ResourceAdapterImpl::GetString(uint32_t resId)
269 {
270     std::string strResult = "";
271     if (resourceManager_) {
272         auto state = resourceManager_->GetStringById(resId, strResult);
273         if (state != Global::Resource::SUCCESS) {
274             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetString error, id=%{public}u", resId);
275         }
276     }
277     return strResult;
278 }
279 
GetStringByName(const std::string& resName)280 std::string ResourceAdapterImpl::GetStringByName(const std::string& resName)
281 {
282     std::string strResult = "";
283     auto actualResName = GetActualResourceName(resName);
284     if (resourceManager_) {
285         auto state = resourceManager_->GetStringByName(actualResName.c_str(), strResult);
286         if (state != Global::Resource::SUCCESS) {
287             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get string by name error, resName=%{public}s, errorCode=%{public}d",
288                 resName.c_str(), state);
289         }
290     }
291     return strResult;
292 }
293 
GetPluralString(uint32_t resId, int quantity)294 std::string ResourceAdapterImpl::GetPluralString(uint32_t resId, int quantity)
295 {
296     std::string strResult = "";
297     if (resourceManager_) {
298         auto state = resourceManager_->GetPluralStringById(resId, quantity, strResult);
299         if (state != Global::Resource::SUCCESS) {
300             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetPluralString error, id=%{public}u", resId);
301         }
302     }
303     return strResult;
304 }
305 
GetPluralStringByName(const std::string& resName, int quantity)306 std::string ResourceAdapterImpl::GetPluralStringByName(const std::string& resName, int quantity)
307 {
308     std::string strResult = "";
309     auto actualResName = GetActualResourceName(resName);
310     if (resourceManager_) {
311         auto state = resourceManager_->GetPluralStringByName(actualResName.c_str(), quantity, strResult);
312         if (state != Global::Resource::SUCCESS) {
313             TAG_LOGW(AceLogTag::ACE_RESOURCE,
314                 "Get plural string by name error, resName=%{public}s, errorCode=%{public}d", resName.c_str(), state);
315         }
316     }
317     return strResult;
318 }
319 
GetStringArray(uint32_t resId) const320 std::vector<std::string> ResourceAdapterImpl::GetStringArray(uint32_t resId) const
321 {
322     std::vector<std::string> strResults;
323     if (resourceManager_) {
324         auto state = resourceManager_->GetStringArrayById(resId, strResults);
325         if (state != Global::Resource::SUCCESS) {
326             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetStringArray error, id=%{public}u", resId);
327         }
328     }
329     return strResults;
330 }
331 
GetStringArrayByName(const std::string& resName) const332 std::vector<std::string> ResourceAdapterImpl::GetStringArrayByName(const std::string& resName) const
333 {
334     std::vector<std::string> strResults;
335     auto actualResName = GetActualResourceName(resName);
336     if (resourceManager_) {
337         auto state = resourceManager_->GetStringArrayByName(actualResName.c_str(), strResults);
338         if (state != Global::Resource::SUCCESS) {
339             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get stringArray by name error, resName=%{public}s, errorCode=%{public}d",
340                 resName.c_str(), state);
341         }
342     }
343     return strResults;
344 }
345 
GetDouble(uint32_t resId)346 double ResourceAdapterImpl::GetDouble(uint32_t resId)
347 {
348     float result = 0.0f;
349     if (resourceManager_) {
350         auto state = resourceManager_->GetFloatById(resId, result);
351         if (state != Global::Resource::SUCCESS) {
352             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetDouble error, id=%{public}u", resId);
353         }
354     }
355     return static_cast<double>(result);
356 }
357 
GetDoubleByName(const std::string& resName)358 double ResourceAdapterImpl::GetDoubleByName(const std::string& resName)
359 {
360     float result = 0.0f;
361     auto actualResName = GetActualResourceName(resName);
362     if (resourceManager_) {
363         auto state = resourceManager_->GetFloatByName(actualResName.c_str(), result);
364         if (state != Global::Resource::SUCCESS) {
365             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get double by name error, resName=%{public}s, errorCode=%{public}d",
366                 resName.c_str(), state);
367         }
368     }
369     return static_cast<double>(result);
370 }
371 
GetInt(uint32_t resId)372 int32_t ResourceAdapterImpl::GetInt(uint32_t resId)
373 {
374     int32_t result = 0;
375     if (resourceManager_) {
376         auto state = resourceManager_->GetIntegerById(resId, result);
377         if (state != Global::Resource::SUCCESS) {
378             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetInt error, id=%{public}u", resId);
379         }
380     }
381     return result;
382 }
383 
GetIntByName(const std::string& resName)384 int32_t ResourceAdapterImpl::GetIntByName(const std::string& resName)
385 {
386     int32_t result = 0;
387     auto actualResName = GetActualResourceName(resName);
388     if (resourceManager_) {
389         auto state = resourceManager_->GetIntegerByName(actualResName.c_str(), result);
390         if (state != Global::Resource::SUCCESS) {
391             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get int by name error, resName=%{public}s, errorCode=%{public}d",
392                 resName.c_str(), state);
393         }
394     }
395     return result;
396 }
397 
GetIntArray(uint32_t resId) const398 std::vector<uint32_t> ResourceAdapterImpl::GetIntArray(uint32_t resId) const
399 {
400     std::vector<int> intVectorResult;
401     if (resourceManager_) {
402         auto state = resourceManager_->GetIntArrayById(resId, intVectorResult);
403         if (state != Global::Resource::SUCCESS) {
404             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetIntArray error, id=%{public}u", resId);
405         }
406     }
407     std::vector<uint32_t> result;
408     std::transform(
409         intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
410     return result;
411 }
412 
GetIntArrayByName(const std::string& resName) const413 std::vector<uint32_t> ResourceAdapterImpl::GetIntArrayByName(const std::string& resName) const
414 {
415     std::vector<int> intVectorResult;
416     auto actualResName = GetActualResourceName(resName);
417     if (resourceManager_) {
418         auto state = resourceManager_->GetIntArrayByName(actualResName.c_str(), intVectorResult);
419         if (state != Global::Resource::SUCCESS) {
420             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get intArray by name error, resName=%{public}s, errorCode=%{public}d",
421                 resName.c_str(), state);
422         }
423     }
424 
425     std::vector<uint32_t> result;
426     std::transform(
427         intVectorResult.begin(), intVectorResult.end(), result.begin(), [](int x) { return static_cast<uint32_t>(x); });
428     return result;
429 }
430 
GetBoolean(uint32_t resId) const431 bool ResourceAdapterImpl::GetBoolean(uint32_t resId) const
432 {
433     bool result = false;
434     if (resourceManager_) {
435         auto state = resourceManager_->GetBooleanById(resId, result);
436         if (state != Global::Resource::SUCCESS) {
437             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetBoolean error, id=%{public}u", resId);
438         }
439     }
440     return result;
441 }
442 
GetBooleanByName(const std::string& resName) const443 bool ResourceAdapterImpl::GetBooleanByName(const std::string& resName) const
444 {
445     bool result = false;
446     auto actualResName = GetActualResourceName(resName);
447     if (resourceManager_) {
448         auto state = resourceManager_->GetBooleanByName(actualResName.c_str(), result);
449         if (state != Global::Resource::SUCCESS) {
450             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get boolean by name error, resName=%{public}s, errorCode=%{public}d",
451                 resName.c_str(), state);
452         }
453     }
454     return result;
455 }
456 
GetMediaPath(uint32_t resId)457 std::string ResourceAdapterImpl::GetMediaPath(uint32_t resId)
458 {
459     std::string mediaPath = "";
460     if (resourceManager_) {
461         auto state = resourceManager_->GetMediaById(resId, mediaPath);
462         if (state != Global::Resource::SUCCESS) {
463             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetMediaPath error, id=%{public}u", resId);
464             return "";
465         }
466         // The Media file directory starts with file// on the PC Preview
467         return "file://" + mediaPath;
468     }
469     return "";
470 }
471 
GetMediaPathByName(const std::string& resName)472 std::string ResourceAdapterImpl::GetMediaPathByName(const std::string& resName)
473 {
474     std::string mediaPath = "";
475     auto actualResName = GetActualResourceName(resName);
476     if (resourceManager_) {
477         auto state = resourceManager_->GetMediaByName(actualResName.c_str(), mediaPath);
478         if (state != Global::Resource::SUCCESS) {
479             TAG_LOGW(AceLogTag::ACE_RESOURCE, "GetMediaPathByName error, resName=%{public}s, errorCode=%{public}u",
480                 resName.c_str(), state);
481             return "";
482         }
483         // The Media file directory starts with file// on the PC Preview
484         return "file://" + mediaPath;
485     }
486     return "";
487 }
488 
GetRawfile(const std::string& fileName)489 std::string ResourceAdapterImpl::GetRawfile(const std::string& fileName)
490 {
491     // The rawfile file directory starts with file// on the PC Preview
492     return "file://" + packagePathStr_ + "/resources/rawfile/" + fileName;
493 }
494 
GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)495 bool ResourceAdapterImpl::GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)
496 {
497     return false;
498 }
499 
GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)500 bool ResourceAdapterImpl::GetMediaData(uint32_t resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)
501 {
502     return false;
503 }
504 
GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest)505 bool ResourceAdapterImpl::GetMediaData(const std::string& resName, size_t& len, std::unique_ptr<uint8_t[]>& dest)
506 {
507     return false;
508 }
509 
UpdateResourceManager(const std::string& bundleName, const std::string& moduleName)510 void ResourceAdapterImpl::UpdateResourceManager(const std::string& bundleName, const std::string& moduleName)
511 {
512     return;
513 }
514 
GetActualResourceName(const std::string& resName)515 std::string ResourceAdapterImpl::GetActualResourceName(const std::string& resName)
516 {
517     auto index = resName.find_last_of('.');
518     if (index == std::string::npos) {
519         LOGE("GetActualResourceName error, incorrect resName format.");
520         return {};
521     }
522     return resName.substr(index + 1, resName.length() - index - 1);
523 }
524 
GetSymbolById(uint32_t resId) const525 uint32_t ResourceAdapterImpl::GetSymbolById(uint32_t resId) const
526 {
527     uint32_t result = 0;
528     resourceManager_->GetSymbolById(resId, result);
529     return result;
530 }
531 
GetSymbolByName(const char* resName) const532 uint32_t ResourceAdapterImpl::GetSymbolByName(const char* resName) const
533 {
534     uint32_t result = 0;
535     auto actualResName = GetActualResourceName(resName);
536     if (resourceManager_) {
537         auto state = resourceManager_->GetSymbolByName(actualResName.c_str(), result);
538         if (state != Global::Resource::SUCCESS) {
539             TAG_LOGW(AceLogTag::ACE_RESOURCE, "Get symbol by name error, name=%{public}s, errorCode=%{public}d",
540                 resName, state);
541         }
542     }
543     return result;
544 }
545 
GetResourceColorMode() const546 ColorMode ResourceAdapterImpl::GetResourceColorMode() const
547 {
548     CHECK_NULL_RETURN(resourceManager_, ColorMode::LIGHT);
549     std::unique_ptr<Global::Resource::ResConfig> resConfig(Global::Resource::CreateResConfig());
550     resourceManager_->GetResConfig(*resConfig);
551     return resConfig->GetColorMode() == OHOS::Global::Resource::ColorMode::DARK ? ColorMode::DARK : ColorMode::LIGHT;
552 }
553 
GetOverrideResourceAdapter( const ResourceConfiguration& config, const ConfigurationChange& configurationChange)554 RefPtr<ResourceAdapter> ResourceAdapterImpl::GetOverrideResourceAdapter(
555     const ResourceConfiguration& config, const ConfigurationChange& configurationChange)
556 {
557     std::shared_ptr<Global::Resource::ResConfig> overrideResConfig(Global::Resource::CreateResConfig());
558     resourceManager_->GetOverrideResConfig(*overrideResConfig);
559     if (configurationChange.colorModeUpdate) {
560         overrideResConfig->SetColorMode(ConvertColorModeToGlobal(config.GetColorMode()));
561     }
562     if (configurationChange.directionUpdate) {
563         overrideResConfig->SetDirection(ConvertDirectionToGlobal(config.GetOrientation()));
564     }
565     if (configurationChange.dpiUpdate) {
566         overrideResConfig->SetScreenDensity(config.GetDensity());
567     }
568     auto overrideResMgr = resourceManager_->GetOverrideResourceManager(overrideResConfig);
569     return AceType::MakeRefPtr<ResourceAdapterImpl>(overrideResMgr);
570 }
571 } // namespace OHOS::Ace
572