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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_THEME_THEME_CONSTANTS_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_THEME_THEME_CONSTANTS_H
18 
19 #include <unordered_map>
20 
21 #include "base/geometry/dimension.h"
22 #include "base/image/pixel_map.h"
23 #include "base/resource/asset_manager.h"
24 #include "base/resource/internal_resource.h"
25 #include "base/utils/macros.h"
26 #include "core/components/common/layout/constants.h"
27 #include "core/components/common/properties/color.h"
28 #include "core/components/common/properties/edge.h"
29 #include "core/components/common/properties/radius.h"
30 #include "core/components/common/properties/text_style.h"
31 #include "core/components/theme/resource_adapter.h"
32 #include "core/components/theme/theme_attributes.h"
33 #include "core/components/theme/theme_style.h"
34 namespace OHOS::Ace {
35 
36 class ACE_FORCE_EXPORT ThemeConstants : public AceType {
37     DECLARE_ACE_TYPE(ThemeConstants, AceType);
38 
39 public:
ThemeConstants(RefPtr<ResourceAdapter> resourceAdapter)40     explicit ThemeConstants(RefPtr<ResourceAdapter> resourceAdapter) : resAdapter_(resourceAdapter) {}
41     ~ThemeConstants() override = default;
42 
43     /*
44      * Init properties at platform.
45      */
46     static void InitDeviceType();
47 
InitResource(const ResourceInfo & resourceInfo)48     void InitResource(const ResourceInfo& resourceInfo)
49     {
50         if (resAdapter_) {
51             resAdapter_->Init(resourceInfo);
52         }
53     }
54 
UpdateConfig(const ResourceConfiguration & config)55     void UpdateConfig(const ResourceConfiguration& config)
56     {
57         if (resAdapter_) {
58             resAdapter_->UpdateConfig(config);
59         }
60     }
61 
62     void ParseTheme();
63 
64     /*
65      * Get color value from platform constants.
66      * Color::BLACK will be returned if value not found or corresponding value is not Color.
67      * @param[in] key Target color key.
68      * @return Color corresponding to the key.
69      */
70     Color GetColor(uint32_t key) const;
71 
72     /*
73      * Get color value from platform constants.
74      * Color::BLACK will be returned if value not found or corresponding value is not Color.
75      * @param[in] key Target color key.
76      * @return Color corresponding to the name.
77      */
78     Color GetColorByName(const std::string& resName) const;
79 
80     /*
81      * Get dimension value from platform constants.
82      * Dimension with 0.0 will be returned if not found or value is not Dimension.
83      * @param[in] key Target dimension key.
84      * @return Dimension corresponding to the key.
85      */
86     Dimension GetDimension(uint32_t key) const;
87 
88     /*
89      * Get dimension value from platform constants.
90      * Dimension with 0.0 will be returned if not found or value is not Dimension.
91      * @param[in] name Target dimension name.
92      * @return Dimension corresponding to the name.
93      */
94     Dimension GetDimensionByName(const std::string& resName) const;
95 
96     /*
97      * Get int32_t value from platform constants.
98      * NOTE: -1 will be returned if not found or value is not int32_t.
99      * @param[in] key Target key.
100      * @return Int value corresponding to the key.
101      */
102     int32_t GetInt(uint32_t key) const;
103 
104     /*
105      * Get int32_t value from platform constants.
106      * NOTE: -1 will be returned if not found or value is not int32_t.
107      * @param[in] key Target key.
108      * @return Int value corresponding to the key.
109      */
110     int32_t GetIntByName(const std::string& resName) const;
111 
112     /*
113      * Get double value from platform constants.
114      * NOTE: 0.0 will be returned if not found or value is not double.
115      * @param[in] key Target key.
116      * @return Double value corresponding to the key.
117      */
118     double GetDouble(uint32_t key) const;
119 
120     /*
121      * Get double value from platform constants.
122      * NOTE: 0.0 will be returned if not found or value is not double.
123      * @param[in] key Target key.
124      * @return Double value corresponding to the key.
125      */
126     double GetDoubleByName(const std::string& resName) const;
127 
128     /*
129      * Get string value from platform constants.
130      * NOTE: empty string will be returned if not found or value is not string.
131      * @param[in] key Target key.
132      * @return String value corresponding to the key.
133      */
134     std::string GetString(uint32_t key) const;
135 
136     /*
137      * Get string value from platform constants.
138      * NOTE: empty string will be returned if not found or value is not string.
139      * @param[in] key Target key.
140      * @return String value corresponding to the key.
141      */
142     std::string GetStringByName(const std::string& resName) const;
143 
144     /*
145      * Get plural string value from platform constants.
146      * NOTE: empty string will be returned if not found.
147      * @param[in] key Target key, count Target plural string quantity.
148      * @return plural string value corresponding to the key and count.
149      */
150     std::string GetPluralString(uint32_t key, int count) const;
151 
152     /*
153      * Get plural string value from platform constants.
154      * NOTE: empty string will be returned if not found.
155      * @param[in] key Target key, count Target plural string quantity.
156      * @return plural string value corresponding to the name and count.
157      */
158     std::string GetPluralStringByName(const std::string& resName, int count) const;
159 
160     /*
161      * Get bool value from platform constants.
162      * NOTE: false will be returned if not found or value is not boolean.
163      * @param[in] key Target key.
164      * @return bool value corresponding to the key.
165      */
166     bool GetBoolean(uint32_t key) const;
167 
168     /*
169      * Get bool value from platform constants.
170      * NOTE: false will be returned if not found or value is not boolean.
171      * @param[in] key Target key.
172      * @return bool value corresponding to the name.
173      */
174     bool GetBooleanByName(const std::string& resName) const;
175 
176     /*
177      * Get int value from platform constants.
178      * NOTE: false will be returned if not found or value is not uint32_t.
179      * @param[in] key Target key.
180      * @return uint32_t value corresponding to the name.
181      */
182     uint32_t GetSymbolByName(const char *name) const;
183 
184     /*
185      * Get int array value from platform constants.
186      * NOTE: empty array will be returned if not found or value is not boolean.
187      * @param[in] key Target key.
188      * @return int array value corresponding to the key.
189      */
190     std::vector<uint32_t> GetIntArray(uint32_t key) const;
191 
192     /*
193      * Get int array value from platform constants.
194      * NOTE: empty array will be returned if not found or value is not boolean.
195      * @param[in] key Target key.
196      * @return int array value corresponding to the name.
197      */
198     std::vector<uint32_t> GetIntArrayByName(const std::string& resName) const;
199 
200     /*
201      * Get ResourceId from platform constants.
202      * NOTE: ResourceId::NO_ID will be returned if not found or value is not ResourceId.
203      */
204     InternalResource::ResourceId GetResourceId(uint32_t key) const;
205 
206     /*
207      * Get PixelMap from platform constants.
208      * NOTE: nullptr will be returned if getPixelMap failed.
209      */
210     std::shared_ptr<Media::PixelMap> GetPixelMap(uint32_t key) const;
211 
212     /*
213      * Get string array value from platform constants.
214      * NOTE: empty array will be returned if not found or value is not boolean.
215      * @param[in] key Target key.
216      * @return string array value corresponding to the key.
217      */
218     std::vector<std::string> GetStringArray(uint32_t key) const;
219 
220     /*
221      * Get string array value from platform constants.
222      * NOTE: empty array will be returned if not found or value is not boolean.
223      * @param[in] key Target key.
224      * @return string array value corresponding to the name.
225      */
226     std::vector<std::string> GetStringArrayByName(const std::string& resName) const;
227 
228     /*
229      * Get media path value from platform constants.
230      * NOTE: empty string will be returned if not found.
231      * @param[in] key Target key.
232      * @return media path value corresponding to the key.
233      */
234     std::string GetMediaPath(uint32_t key) const;
235 
236     /*
237      * Get media path value from platform constants.
238      * NOTE: empty string will be returned if not found.
239      * @param[in] key Target key.
240      * @return media path value corresponding to the name.
241      */
242     std::string GetMediaPathByName(const std::string& resName) const;
243 
244     /*
245      * Get rawfile path.
246      * NOTE: empty string will be returned if not found.
247      * @param[in] fileName Target file name.
248      * @return rawfile path value corresponding to file name.
249      */
250     std::string GetRawfile(const std::string& fileName) const;
251 
252     /*
253      * Get rawfile file description.
254      * NOTE: false value will be returned if not found.
255      * @param[in] rawfileName Target rawfile, rawfileDescription Target file info.
256      * @return success or not to get file info.
257      */
258     bool GetRawFileDescription(const std::string& rawfileName, RawfileDescription& rawfileDescription) const;
259 
260     /*
261      * Close rawfile file description.
262      * NOTE: false value will be returned if not found.
263      * @param[in] rawfileName Target rawfile.
264      * @return success or not to close file info.
265      */
266     bool CloseRawFileDescription(const std::string& rawfileName) const;
267 
268     /*
269      * Get resource media file path.
270      * NOTE: false value will be returned if not found.
271      * @param[in] resId Target resource id, mediaPath Target media path.
272      * @return success or not to get media path.
273      */
274     bool GetMediaById(const int32_t& resId, std::string& mediaPath) const;
275 
276     template<class T>
GetMediaResource(T & resId,std::ostream & dest)277     bool GetMediaResource(T& resId, std::ostream& dest) const
278     {
279         if (!resAdapter_) {
280             return false;
281         }
282         return resAdapter_->GetResource(resId, dest);
283     }
284 
285     template<class T>
GetMediaData(T & resId,size_t & len,std::unique_ptr<uint8_t[]> & dest)286     bool GetMediaData(T& resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)
287     {
288         if (!resAdapter_) {
289             return false;
290         }
291         return resAdapter_->GetMediaData(resId, len, dest);
292     }
293 
294     template<class T>
GetMediaData(T & resId,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)295     bool GetMediaData(T& resId, size_t& len, std::unique_ptr<uint8_t[]>& dest, const std::string& bundleName,
296         const std::string& moduleName)
297     {
298         if (!resAdapter_) {
299             return false;
300         }
301         return resAdapter_->GetMediaData(resId, len, dest, bundleName, moduleName);
302     }
303 
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest)304     bool GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)
305     {
306         if (!resAdapter_) {
307             return false;
308         }
309         return resAdapter_->GetRawFileData(rawFile, len, dest);
310     }
311 
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)312     bool GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest,
313         const std::string& bundleName, const std::string& moduleName)
314     {
315         if (!resAdapter_) {
316             return false;
317         }
318         return resAdapter_->GetRawFileData(rawFile, len, dest, bundleName, moduleName);
319     }
320 
321     bool GetResourceIdByName(const std::string& resName, const std::string& resType, uint32_t& resId) const;
322 
323     void LoadCustomStyle(const RefPtr<AssetManager>& assetManager);
324 
325     /*
326      * Load theme from system resource.
327      */
328     void LoadTheme(int32_t themeId);
329 
GetThemeStyle()330     RefPtr<ThemeStyle> GetThemeStyle() const
331     {
332         return currentThemeStyle_;
333     }
334 
335     void SetColorScheme(ColorScheme colorScheme);
336 
HasCustomStyle(uint32_t key)337     bool HasCustomStyle(uint32_t key) const
338     {
339         return customStyleMap_.find(key) != customStyleMap_.end();
340     }
341 
UpdateThemeConstants(const std::string & bundleName,const std::string & moduleName)342     void UpdateThemeConstants(const std::string& bundleName, const std::string& moduleName)
343     {
344         if (resAdapter_) {
345             resAdapter_->UpdateResourceManager(bundleName, moduleName);
346         }
347     }
348 
GetResourceLimitKeys()349     uint32_t GetResourceLimitKeys() const
350     {
351         CHECK_NULL_RETURN(resAdapter_, 0);
352         return resAdapter_->GetResourceLimitKeys();
353     }
354 
GetResourceAdapter()355     RefPtr<ResourceAdapter> GetResourceAdapter()
356     {
357         return resAdapter_;
358     }
359 
GetPatternByName(const std::string & patternName)360     RefPtr<ThemeStyle> GetPatternByName(const std::string& patternName)
361     {
362         if (!currentThemeStyle_) {
363             TAG_LOGE(AceLogTag::ACE_THEME, "Get theme by name error: currentThemeStyle_ is null");
364             return nullptr;
365         }
366         currentThemeStyle_->CheckThemeStyleLoaded(patternName);
367         auto patternStyle = currentThemeStyle_->GetAttr<RefPtr<ThemeStyle>>(patternName, nullptr);
368         if (!patternStyle && resAdapter_) {
369             patternStyle = resAdapter_->GetPatternByName(patternName);
370             ResValueWrapper value = { .type = ThemeConstantsType::PATTERN,
371                 .value = patternStyle };
372             currentThemeStyle_->SetAttr(patternName, value);
373         }
374         return patternStyle;
375     }
376 
377 private:
378     static const ResValueWrapper* GetPlatformConstants(uint32_t key);
379     static const ResValueWrapper* styleMapDefault[];
380     static uint32_t DefaultMapCount;
381 #ifdef WEARABLE_PRODUCT
382     static const ResValueWrapper* styleMapWatch[];
383     static uint32_t WatchMapCount;
384 #else
385     static const ResValueWrapper* styleMapTv[];
386     static uint32_t TvMapCount;
387 #endif
388 
389     ResValueWrapper GetValue(uint32_t key) const;
390     double GetBlendAlpha(const BlendAlpha& blendAlpha) const;
391     void ParseCustomStyle(const std::string& content);
392     void LoadFile(const RefPtr<Asset>& asset);
393 
394     RefPtr<ResourceAdapter> resAdapter_;
395     RefPtr<ThemeStyle> currentThemeStyle_;
396     ThemeConstantsMap customStyleMap_;
397 
398     ACE_DISALLOW_COPY_AND_MOVE(ThemeConstants);
399 };
400 
401 } // namespace OHOS::Ace
402 
403 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_THEME_THEME_CONSTANTS_H
404