• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2022 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      * Get resource media file path.
262      * NOTE: false value will be returned if not found.
263      * @param[in] resId Target resource id, mediaPath Target media path.
264      * @return success or not to get media path.
265      */
266     bool GetMediaById(const int32_t& resId, std::string& mediaPath) const;
267 
268     template<class T>
GetMediaResource(T & resId,std::ostream & dest)269     bool GetMediaResource(T& resId, std::ostream& dest) const
270     {
271         if (!resAdapter_) {
272             return false;
273         }
274         return resAdapter_->GetResource(resId, dest);
275     }
276 
277     template<class T>
GetMediaData(T & resId,size_t & len,std::unique_ptr<uint8_t[]> & dest)278     bool GetMediaData(T& resId, size_t& len, std::unique_ptr<uint8_t[]>& dest)
279     {
280         if (!resAdapter_) {
281             return false;
282         }
283         return resAdapter_->GetMediaData(resId, len, dest);
284     }
285 
286     template<class T>
GetMediaData(T & resId,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)287     bool GetMediaData(T& resId, size_t& len, std::unique_ptr<uint8_t[]>& dest, const std::string& bundleName,
288         const std::string& moduleName)
289     {
290         if (!resAdapter_) {
291             return false;
292         }
293         return resAdapter_->GetMediaData(resId, len, dest, bundleName, moduleName);
294     }
295 
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest)296     bool GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest)
297     {
298         if (!resAdapter_) {
299             return false;
300         }
301         return resAdapter_->GetRawFileData(rawFile, len, dest);
302     }
303 
GetRawFileData(const std::string & rawFile,size_t & len,std::unique_ptr<uint8_t[]> & dest,const std::string & bundleName,const std::string & moduleName)304     bool GetRawFileData(const std::string& rawFile, size_t& len, std::unique_ptr<uint8_t[]>& dest,
305         const std::string& bundleName, const std::string& moduleName)
306     {
307         if (!resAdapter_) {
308             return false;
309         }
310         return resAdapter_->GetRawFileData(rawFile, len, dest, bundleName, moduleName);
311     }
312 
313     bool GetResourceIdByName(const std::string& resName, const std::string& resType, uint32_t& resId) const;
314 
315     void LoadCustomStyle(const RefPtr<AssetManager>& assetManager);
316 
317     /*
318      * Load theme from system resource.
319      */
320     void LoadTheme(int32_t themeId);
321 
GetThemeStyle()322     RefPtr<ThemeStyle> GetThemeStyle() const
323     {
324         return currentThemeStyle_;
325     }
326 
327     void SetColorScheme(ColorScheme colorScheme);
328 
HasCustomStyle(uint32_t key)329     bool HasCustomStyle(uint32_t key) const
330     {
331         return customStyleMap_.find(key) != customStyleMap_.end();
332     }
333 
UpdateThemeConstants(const std::string & bundleName,const std::string & moduleName)334     void UpdateThemeConstants(const std::string& bundleName, const std::string& moduleName)
335     {
336         if (resAdapter_) {
337             resAdapter_->UpdateResourceManager(bundleName, moduleName);
338         }
339     }
340 
GetResourceLimitKeys()341     uint32_t GetResourceLimitKeys() const
342     {
343         CHECK_NULL_RETURN(resAdapter_, 0);
344         return resAdapter_->GetResourceLimitKeys();
345     }
346 
GetResourceAdapter()347     RefPtr<ResourceAdapter> GetResourceAdapter()
348     {
349         return resAdapter_;
350     }
351 
GetPatternByName(const std::string & patternName)352     RefPtr<ThemeStyle> GetPatternByName(const std::string& patternName)
353     {
354         if (!currentThemeStyle_) {
355             TAG_LOGE(AceLogTag::ACE_THEME, "Get theme by name error: currentThemeStyle_ is null");
356             return nullptr;
357         }
358         currentThemeStyle_->CheckThemeStyleLoaded(patternName);
359         auto patternStyle = currentThemeStyle_->GetAttr<RefPtr<ThemeStyle>>(patternName, nullptr);
360         if (!patternStyle && resAdapter_) {
361             patternStyle = resAdapter_->GetPatternByName(patternName);
362             ResValueWrapper value = { .type = ThemeConstantsType::PATTERN,
363                 .value = patternStyle };
364             currentThemeStyle_->SetAttr(patternName, value);
365         }
366         return patternStyle;
367     }
368 
369 private:
370     static const ResValueWrapper* GetPlatformConstants(uint32_t key);
371     static const ResValueWrapper* styleMapDefault[];
372     static uint32_t DefaultMapCount;
373 #ifdef WEARABLE_PRODUCT
374     static const ResValueWrapper* styleMapWatch[];
375     static uint32_t WatchMapCount;
376 #else
377     static const ResValueWrapper* styleMapTv[];
378     static uint32_t TvMapCount;
379 #endif
380 
381     ResValueWrapper GetValue(uint32_t key) const;
382     double GetBlendAlpha(const BlendAlpha& blendAlpha) const;
383     void ParseCustomStyle(const std::string& content);
384     void LoadFile(const RefPtr<Asset>& asset);
385 
386     RefPtr<ResourceAdapter> resAdapter_;
387     RefPtr<ThemeStyle> currentThemeStyle_;
388     ThemeConstantsMap customStyleMap_;
389 
390     ACE_DISALLOW_COPY_AND_MOVE(ThemeConstants);
391 };
392 
393 } // namespace OHOS::Ace
394 
395 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_THEME_THEME_CONSTANTS_H
396