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