• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 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 #include "view_abstract.h"
16 
17 #include <regex>
18 
19 #include "cj_lambda.h"
20 
21 #include "base/geometry/calc_dimension.h"
22 #include "base/geometry/dimension.h"
23 #include "core/components_ng/base/view_abstract.h"
24 #include "core/components_ng/base/view_abstract_model.h"
25 #include "core/components_ng/base/view_stack_processor.h"
26 #include "core/components_v2/extensions/events/on_area_change_extension.h"
27 #include "core/gestures/long_press_gesture.h"
28 #include "core/pipeline/base/constants.h"
29 
30 using namespace OHOS::Ace;
31 using namespace OHOS::Ace::Framework;
32 
33 namespace OHOS::Ace::Framework {
34 namespace {
35 const char DEFAULT_HAR_BUNDLE_NAME[] = "__harDefaultBundleName__";
36 const char DEFAULT_HAR_MODULE_NAME[] = "__harDefaultModuleName__";
37 const std::regex RESOURCE_APP_STRING_PLACEHOLDER(R"(\%((\d+)(\$)){0,1}([dsf]))", std::regex::icase);
38 const std::regex FLOAT_PATTERN(R"(-?(0|[1-9]\d*)(\.\d+))", std::regex::icase);
39 const std::string RESOURCE_TOKEN_PATTERN = "(app|sys|\\[.+?\\])\\.(\\S+?)\\.(\\S+)";
40 const std::string RESOURCE_NAME_PATTERN = "\\[(.+?)\\]";
41 constexpr int32_t UNKNOWN_RESOURCE_ID = -1;
42 constexpr int32_t UNKNOWN_RESOURCE_TYPE = -1;
43 constexpr uint32_t COLOR_ALPHA_OFFSET = 24;
44 constexpr uint32_t COLOR_ALPHA_VALUE = 0xFF000000;
45 
ColorAlphaAdapt(uint32_t origin)46 uint32_t ColorAlphaAdapt(uint32_t origin)
47 {
48     uint32_t result = origin;
49     if ((origin >> COLOR_ALPHA_OFFSET) == 0) {
50         result = origin | COLOR_ALPHA_VALUE;
51     }
52     return result;
53 }
54 
GetBundleNameFromContainer()55 std::string GetBundleNameFromContainer()
56 {
57     auto container = Container::Current();
58     CHECK_NULL_RETURN(container, "");
59     return container->GetBundleName();
60 }
61 
GetModuleNameFromContainer()62 std::string GetModuleNameFromContainer()
63 {
64     auto container = Container::Current();
65     CHECK_NULL_RETURN(container, "");
66     return container->GetModuleName();
67 }
68 
CompleteResourceObjectFromParams(int32_t resId,NativeResourceObject & obj,std::string & targetModule,ResourceType & resType,std::string & resName)69 void CompleteResourceObjectFromParams(
70     int32_t resId, NativeResourceObject& obj, std::string& targetModule, ResourceType& resType, std::string& resName)
71 {
72     auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
73     if (!params->IsArray()) {
74         LOGE("Resource params type error.");
75         return;
76     }
77     if (resId != UNKNOWN_RESOURCE_ID) {
78         return;
79     }
80     auto identityValue = params->GetArrayItem(0);
81     if (!identityValue->IsString()) {
82         return;
83     }
84     auto identity = identityValue->GetString();
85     if (!ViewAbstract::ParseDollarResource(
86             identity, targetModule, resType, resName, obj.type == UNKNOWN_RESOURCE_TYPE)) {
87         return;
88     }
89     std::regex resNameRegex(RESOURCE_NAME_PATTERN);
90     std::smatch resNameResults;
91     if (std::regex_match(targetModule, resNameResults, resNameRegex)) {
92         auto result = resNameResults[1].str();
93         obj.moduleName = strdup(result.c_str());
94     }
95     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
96         obj.type = static_cast<int32_t>(resType);
97     }
98 }
99 
GetReplaceContentStr(int pos,const std::string & type,std::unique_ptr<JsonValue> & params,int32_t containCount)100 std::string GetReplaceContentStr(
101     int pos, const std::string& type, std::unique_ptr<JsonValue>& params, int32_t containCount)
102 {
103     auto index = pos + containCount;
104     if (index < 0) {
105         return std::string();
106     }
107     auto item = params->GetArrayItem(index);
108     if (type == "d") {
109         if (item->IsNumber()) {
110             return std::to_string(item->GetInt());
111         }
112     } else if (type == "s") {
113         if (item->IsString()) {
114             return item->GetString();
115         }
116     } else if (type == "f") {
117         if (item->IsNumber()) {
118             return std::to_string(item->GetDouble());
119         }
120     }
121     return std::string();
122 }
123 
ReplaceHolder(std::string & originStr,std::unique_ptr<JsonValue> & params,int32_t containCount)124 void ReplaceHolder(std::string& originStr, std::unique_ptr<JsonValue>& params, int32_t containCount)
125 {
126     auto size = params->GetArraySize();
127     if (containCount == size) {
128         return;
129     }
130     std::string::const_iterator start = originStr.begin();
131     std::string::const_iterator end = originStr.end();
132     std::smatch matches;
133     bool shortHolderType = false;
134     bool firstMatch = true;
135     int searchTime = 0;
136     while (std::regex_search(start, end, matches, RESOURCE_APP_STRING_PLACEHOLDER)) {
137         std::string pos = matches[2];
138         std::string type = matches[4];
139         if (firstMatch) {
140             firstMatch = false;
141             shortHolderType = pos.length() == 0;
142         } else {
143             if (shortHolderType ^ (pos.length() == 0)) {
144                 return;
145             }
146         }
147 
148         std::string replaceContentStr;
149         if (shortHolderType) {
150             replaceContentStr = GetReplaceContentStr(searchTime, type, params, containCount);
151         } else {
152             replaceContentStr = GetReplaceContentStr(StringUtils::StringToInt(pos) - 1, type, params, containCount);
153         }
154 
155         originStr.replace(matches[0].first - originStr.begin(), matches[0].length(), replaceContentStr);
156         start = originStr.begin() + matches.prefix().length() + replaceContentStr.length();
157         end = originStr.end();
158         searchTime++;
159     }
160 }
161 } // namespace
162 
GetResourceObject(const NativeResourceObject & obj)163 RefPtr<ResourceObject> GetResourceObject(const NativeResourceObject& obj)
164 {
165     auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
166     if (!params->IsArray()) {
167         return nullptr;
168     }
169     std::vector<ResourceObjectParams> resObjParamsList;
170     auto size = params->GetArraySize();
171     for (int32_t i = 0; i < size; i++) {
172         auto item = params->GetArrayItem(i);
173         ResourceObjectParams resObjParams {};
174         if (item->IsString()) {
175             resObjParams.value = item->GetString();
176             resObjParams.type = ResourceObjectParamType::STRING;
177         } else if (item->IsNumber()) {
178             if (std::regex_match(std::to_string(item->GetDouble()), FLOAT_PATTERN)) {
179                 resObjParams.value = std::to_string(item->GetDouble());
180                 resObjParams.type = ResourceObjectParamType::FLOAT;
181             } else {
182                 resObjParams.value = std::to_string(item->GetInt());
183                 resObjParams.type = ResourceObjectParamType::INT;
184             }
185         }
186         resObjParamsList.push_back(resObjParams);
187     }
188     auto resourceObject = AceType::MakeRefPtr<ResourceObject>(
189         obj.id, obj.type, resObjParamsList, obj.bundleName, obj.moduleName, Container::CurrentIdSafely());
190     return resourceObject;
191 }
192 
GetResourceObjectByBundleAndModule(const NativeResourceObject & obj)193 RefPtr<ResourceObject> GetResourceObjectByBundleAndModule(const NativeResourceObject& obj)
194 {
195     auto resourceObject =
196         AceType::MakeRefPtr<ResourceObject>(obj.bundleName, obj.moduleName, Container::CurrentIdSafely());
197     return resourceObject;
198 }
199 
CreateResourceWrapper(const NativeResourceObject & obj,RefPtr<ResourceObject> & resourceObject)200 RefPtr<ResourceWrapper> CreateResourceWrapper(const NativeResourceObject& obj, RefPtr<ResourceObject>& resourceObject)
201 {
202     RefPtr<ResourceAdapter> resourceAdapter = nullptr;
203     RefPtr<ThemeConstants> themeConstants = nullptr;
204     if (SystemProperties::GetResourceDecoupling()) {
205         resourceAdapter = ResourceManager::GetInstance().GetOrCreateResourceAdapter(resourceObject);
206         if (!resourceAdapter) {
207             return nullptr;
208         }
209     } else {
210         themeConstants = ViewAbstract::GetThemeConstants(obj.bundleName, obj.moduleName);
211         if (!themeConstants) {
212             return nullptr;
213         }
214     }
215     auto resourceWrapper = AceType::MakeRefPtr<ResourceWrapper>(themeConstants, resourceAdapter);
216     return resourceWrapper;
217 }
218 
CreateResourceWrapper()219 RefPtr<ResourceWrapper> CreateResourceWrapper()
220 {
221     RefPtr<ResourceAdapter> resourceAdapter = nullptr;
222     RefPtr<ThemeConstants> themeConstants = nullptr;
223     if (SystemProperties::GetResourceDecoupling()) {
224         resourceAdapter = ResourceManager::GetInstance().GetResourceAdapter(Container::CurrentIdSafely());
225         if (!resourceAdapter) {
226             return nullptr;
227         }
228     } else {
229         themeConstants = ViewAbstract::GetThemeConstants();
230         if (!themeConstants) {
231             return nullptr;
232         }
233     }
234     auto resourceWrapper = AceType::MakeRefPtr<ResourceWrapper>(themeConstants, resourceAdapter);
235     return resourceWrapper;
236 }
237 
GetThemeConstants(const std::string & bundleName,const std::string & moduleName)238 RefPtr<ThemeConstants> ViewAbstract::GetThemeConstants(const std::string& bundleName, const std::string& moduleName)
239 {
240     auto currentObj = Container::Current();
241     if (!currentObj) {
242         LOGW("container is null");
243         return nullptr;
244     }
245     auto pipelineContext = currentObj->GetPipelineContext();
246     if (!pipelineContext) {
247         LOGE("pipeline context is null!");
248         return nullptr;
249     }
250     auto themeManager = pipelineContext->GetThemeManager();
251     if (!themeManager) {
252         LOGE("theme manager is null!");
253         return nullptr;
254     }
255     return themeManager->GetThemeConstants(bundleName, moduleName);
256 }
257 
CjEnabled(bool enabled)258 void ViewAbstract::CjEnabled(bool enabled)
259 {
260     ViewAbstractModel::GetInstance()->SetEnabled(enabled);
261 }
262 
CompleteResourceObject(NativeResourceObject & obj,std::string & bundleName,std::string & moduleName)263 void ViewAbstract::CompleteResourceObject(NativeResourceObject& obj, std::string& bundleName, std::string& moduleName)
264 {
265     int32_t resId = UNKNOWN_RESOURCE_ID;
266     CompleteResourceObjectInner(obj, bundleName, moduleName, resId);
267 }
268 
CompleteResourceObjectWithBundleName(NativeResourceObject & obj,std::string & bundleName,std::string & moduleName,int32_t & resId)269 void ViewAbstract::CompleteResourceObjectWithBundleName(
270     NativeResourceObject& obj, std::string& bundleName, std::string& moduleName, int32_t& resId)
271 {
272     CompleteResourceObjectInner(obj, bundleName, moduleName, resId);
273 }
274 
CompleteResourceObjectInner(NativeResourceObject & obj,std::string & bundleName,std::string & moduleName,int32_t & resIdValue)275 void ViewAbstract::CompleteResourceObjectInner(
276     NativeResourceObject& obj, std::string& bundleName, std::string& moduleName, int32_t& resIdValue)
277 {
278     ResourceType resType;
279     std::string targetModule;
280     std::string resName;
281     resIdValue = obj.id;
282     if (resIdValue == UNKNOWN_RESOURCE_ID) {
283         CompleteResourceObjectFromParams(resIdValue, obj, targetModule, resType, resName);
284     }
285     bundleName = obj.bundleName;
286     moduleName = obj.moduleName;
287 
288     if ((bundleName.empty() && !moduleName.empty()) || bundleName == DEFAULT_HAR_BUNDLE_NAME) {
289         bundleName = GetBundleNameFromContainer();
290         obj.bundleName = bundleName.c_str();
291     }
292     if (moduleName == DEFAULT_HAR_MODULE_NAME) {
293         moduleName = GetModuleNameFromContainer();
294         obj.moduleName = moduleName.c_str();
295     }
296 }
297 
ConvertResourceType(const std::string & typeName,ResourceType & resType)298 bool ViewAbstract::ConvertResourceType(const std::string& typeName, ResourceType& resType)
299 {
300     static const std::unordered_map<std::string, ResourceType> resTypeMap {
301         { "color", ResourceType::COLOR },
302         { "media", ResourceType::MEDIA },
303         { "float", ResourceType::FLOAT },
304         { "string", ResourceType::STRING },
305         { "plural", ResourceType::PLURAL },
306         { "pattern", ResourceType::PATTERN },
307         { "boolean", ResourceType::BOOLEAN },
308         { "integer", ResourceType::INTEGER },
309         { "strarray", ResourceType::STRARRAY },
310         { "intarray", ResourceType::INTARRAY },
311         { "symbol", ResourceType::SYMBOL },
312     };
313     auto it = resTypeMap.find(typeName);
314     if (it == resTypeMap.end()) {
315         return false;
316     }
317     resType = it->second;
318     return true;
319 }
320 
ParseDollarResource(const std::string & resPath,std::string & targetModule,ResourceType & resType,std::string & resName,bool isParseType)321 bool ViewAbstract::ParseDollarResource(const std::string& resPath, std::string& targetModule, ResourceType& resType,
322     std::string& resName, bool isParseType)
323 {
324     std::smatch results;
325     std::regex tokenRegex(RESOURCE_TOKEN_PATTERN);
326     if (!std::regex_match(resPath, results, tokenRegex)) {
327         return false;
328     }
329     targetModule = results[1];
330     std::string typeName = results[2];
331     if (isParseType && !ConvertResourceType(typeName, resType)) {
332         return false;
333     }
334     resName = resPath;
335     return true;
336 }
337 
ParseCjString(NativeResourceObject & obj,std::string & result)338 bool ViewAbstract::ParseCjString(NativeResourceObject& obj, std::string& result)
339 {
340     std::string bundleName;
341     std::string moduleName;
342     CompleteResourceObject(obj, bundleName, moduleName);
343     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
344         return false;
345     }
346     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
347     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
348     if (!resourceWrapper) {
349         return false;
350     }
351     auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
352     if (!params->IsArray()) {
353         LOGE("Resource params type error.");
354         return false;
355     }
356     if (obj.id == UNKNOWN_RESOURCE_ID) {
357         if (!obj.paramsJsonStr) {
358             return false;
359         }
360         auto param = params->GetArrayItem(0);
361         if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
362             auto originStr = resourceWrapper->GetStringByName(param->GetString());
363             ReplaceHolder(originStr, params, 1);
364             result = originStr;
365         } else if (obj.type == static_cast<int32_t>(ResourceType::PLURAL)) {
366             auto countVal = params->GetArrayItem(1);
367             if (!countVal->IsNumber()) {
368                 return false;
369             }
370             int count = countVal->GetInt();
371             auto pluralStr = resourceWrapper->GetPluralStringByName(param->GetString(), count);
372             ReplaceHolder(pluralStr, params, 2);
373             result = pluralStr;
374         } else {
375             return false;
376         }
377         return true;
378     }
379     if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
380         auto originStr = resourceWrapper->GetString(static_cast<uint32_t>(obj.id));
381         ReplaceHolder(originStr, params, 0);
382         result = originStr;
383     } else if (obj.type == static_cast<int32_t>(ResourceType::PLURAL)) {
384         auto countVal = params->GetArrayItem(0);
385         if (!countVal->IsNumber()) {
386             return false;
387         }
388         int count = countVal->GetInt();
389         auto pluralStr = resourceWrapper->GetPluralString(static_cast<uint32_t>(obj.id), count);
390         ReplaceHolder(pluralStr, params, 1);
391         result = pluralStr;
392     } else if (obj.type == static_cast<int32_t>(ResourceType::FLOAT)) {
393         result = std::to_string(resourceWrapper->GetDouble(static_cast<uint32_t>(obj.id)));
394     } else if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
395         result = std::to_string(resourceWrapper->GetInt(static_cast<uint32_t>(obj.id)));
396     } else {
397         return false;
398     }
399     return true;
400 }
401 
ParseCjMedia(NativeResourceObject & obj,std::string & result)402 bool ViewAbstract::ParseCjMedia(NativeResourceObject& obj, std::string& result)
403 {
404     std::string bundleName;
405     std::string moduleName;
406     CompleteResourceObject(obj, bundleName, moduleName);
407     return ParseCjMediaInternal(obj, result);
408 }
409 
ParseCjMediaInternal(NativeResourceObject & obj,std::string & result)410 bool ViewAbstract::ParseCjMediaInternal(NativeResourceObject& obj, std::string& result)
411 {
412     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
413         return false;
414     }
415     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
416     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
417     if (!resourceWrapper) {
418         return false;
419     }
420     if (obj.type == static_cast<int32_t>(ResourceType::RAWFILE)) {
421         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
422         if (!params->IsArray()) {
423             return false;
424         }
425         auto param = params->GetArrayItem(0);
426         if (!param->IsString()) {
427             return false;
428         }
429         auto fileName = param->GetString();
430         result = resourceWrapper->GetRawfile(fileName);
431         return true;
432     }
433     if (obj.id == -1) {
434         if (!obj.paramsJsonStr) {
435             return false;
436         }
437         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
438         if (!params->IsArray()) {
439             return false;
440         }
441         auto param = params->GetArrayItem(0);
442         if (obj.type == static_cast<int32_t>(ResourceType::MEDIA)) {
443             result = resourceWrapper->GetMediaPathByName(param->GetString());
444             return true;
445         }
446         if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
447             result = resourceWrapper->GetStringByName(param->GetString());
448             return true;
449         }
450         return false;
451     } else if (obj.type == static_cast<int32_t>(ResourceType::MEDIA)) {
452         result = resourceWrapper->GetMediaPath(static_cast<uint32_t>(obj.id));
453         return true;
454     } else if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
455         result = resourceWrapper->GetString(static_cast<uint32_t>(obj.id));
456         return true;
457     }
458     return false;
459 }
460 
ParseCjSymbolId(NativeResourceObject & obj,uint32_t & result)461 bool ViewAbstract::ParseCjSymbolId(NativeResourceObject& obj, uint32_t& result)
462 {
463     std::string bundleName;
464     std::string moduleName;
465     CompleteResourceObject(obj, bundleName, moduleName);
466     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
467         return false;
468     }
469     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
470     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
471     if (!resourceWrapper) {
472         return false;
473     }
474     if (obj.id == -1) {
475         if (!obj.paramsJsonStr) {
476             return false;
477         }
478         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
479         if (!params->IsArray()) {
480             return false;
481         }
482         auto param = params->GetArrayItem(0);
483         auto symbol = resourceWrapper->GetSymbolByName(param->GetString().c_str());
484         if (!symbol) {
485             return false;
486         }
487         result = symbol;
488         return true;
489     }
490     if (obj.type == static_cast<int32_t>(ResourceType::SYMBOL)) {
491         result = resourceWrapper->GetSymbolById(static_cast<uint32_t>(obj.id));
492         return true;
493     }
494     return false;
495 }
496 
ParseCjColor(NativeResourceObject & obj,Color & result)497 bool ViewAbstract::ParseCjColor(NativeResourceObject& obj, Color& result)
498 {
499     std::string bundleName;
500     std::string moduleName;
501     CompleteResourceObject(obj, bundleName, moduleName);
502     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
503         return false;
504     }
505     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
506     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
507     if (!resourceWrapper) {
508         return false;
509     }
510     if (obj.id == -1) {
511         if (!obj.paramsJsonStr) {
512             return false;
513         }
514         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
515         if (!params->IsArray()) {
516             return false;
517         }
518         auto param = params->GetArrayItem(0);
519         result = resourceWrapper->GetColorByName(param->GetString());
520         return true;
521     }
522     if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
523         auto value = resourceWrapper->GetString(static_cast<uint32_t>(obj.id));
524         return Color::ParseColorString(value, result);
525     }
526     if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
527         auto value = resourceWrapper->GetInt(static_cast<uint32_t>(obj.id));
528         result = Color(ColorAlphaAdapt(value));
529         return true;
530     }
531     if (obj.type == static_cast<int32_t>(ResourceType::COLOR)) {
532         result = resourceWrapper->GetColor(static_cast<uint32_t>(obj.id));
533         result.SetResourceId(static_cast<uint32_t>(obj.id));
534         return true;
535     }
536     return false;
537 }
538 
ParseCjDimension(NativeResourceObject & obj,CalcDimension & result,DimensionUnit defaultUnit,bool isSupportPercent)539 bool ViewAbstract::ParseCjDimension(
540     NativeResourceObject& obj, CalcDimension& result, DimensionUnit defaultUnit, bool isSupportPercent)
541 {
542     std::string bundleName;
543     std::string moduleName;
544     CompleteResourceObject(obj, bundleName, moduleName);
545     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
546         return false;
547     }
548     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
549     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
550     if (!resourceWrapper) {
551         return false;
552     }
553     if (obj.id == -1) {
554         if (!obj.paramsJsonStr) {
555             return false;
556         }
557         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
558         if (!params->IsArray()) {
559             return false;
560         }
561         auto param = params->GetArrayItem(0);
562         if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
563             auto value = resourceWrapper->GetStringByName(param->GetString());
564             return StringUtils::StringToCalcDimensionNG(value, result, false, defaultUnit);
565         }
566         if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
567             auto value = std::to_string(resourceWrapper->GetIntByName(param->GetString()));
568             return StringUtils::StringToDimensionWithUnitNG(value, result, defaultUnit);
569         }
570         result = resourceWrapper->GetDimensionByName(param->GetString());
571         return true;
572     }
573     if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
574         auto value = resourceWrapper->GetString(static_cast<uint32_t>(obj.id));
575         return StringUtils::StringToCalcDimensionNG(value, result, false, defaultUnit);
576     }
577     if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
578         auto value = std::to_string(resourceWrapper->GetInt(static_cast<uint32_t>(obj.id)));
579         return StringUtils::StringToDimensionWithUnitNG(value, result, defaultUnit);
580     }
581     if (obj.type == static_cast<int32_t>(ResourceType::FLOAT)) {
582         result = resourceWrapper->GetDimension(static_cast<uint32_t>(obj.id));
583         return true;
584     }
585     return false;
586 }
587 
ParseCjDimensionVP(NativeResourceObject & obj,CalcDimension & result,bool isSupportPercent)588 bool ViewAbstract::ParseCjDimensionVP(NativeResourceObject& obj, CalcDimension& result, bool isSupportPercent)
589 {
590     return ParseCjDimension(obj, result, DimensionUnit::VP, isSupportPercent);
591 }
592 
ParseCjDimensionFP(NativeResourceObject & obj,CalcDimension & result,bool isSupportPercent)593 bool ViewAbstract::ParseCjDimensionFP(NativeResourceObject& obj, CalcDimension& result, bool isSupportPercent)
594 {
595     return ParseCjDimension(obj, result, DimensionUnit::FP, isSupportPercent);
596 }
597 
ParseCjDouble(NativeResourceObject & obj,double & result)598 bool ViewAbstract::ParseCjDouble(NativeResourceObject& obj, double& result)
599 {
600     std::string bundleName;
601     std::string moduleName;
602     CompleteResourceObject(obj, bundleName, moduleName);
603     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
604         return false;
605     }
606     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
607     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
608     if (!resourceWrapper) {
609         return false;
610     }
611     if (obj.id == -1) {
612         if (!obj.paramsJsonStr) {
613             return false;
614         }
615         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
616         if (!params->IsArray()) {
617             return false;
618         }
619         auto param = params->GetArrayItem(0);
620         if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
621             auto value = resourceWrapper->GetStringByName(param->GetString());
622             return StringUtils::StringToDouble(value, result);
623         }
624         if (obj.type == static_cast<int32_t>(ResourceType::FLOAT)) {
625             result = resourceWrapper->GetDoubleByName(param->GetString());
626             return true;
627         }
628         if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
629             result = resourceWrapper->GetIntByName(param->GetString());
630             return true;
631         }
632         return false;
633     }
634     if (obj.type == static_cast<int32_t>(ResourceType::STRING)) {
635         auto value = resourceWrapper->GetString(static_cast<uint32_t>(obj.id));
636         return StringUtils::StringToDouble(value, result);
637     }
638     if (obj.type == static_cast<int32_t>(ResourceType::FLOAT)) {
639         result = resourceWrapper->GetDouble(static_cast<uint32_t>(obj.id));
640         return true;
641     }
642     if (obj.type == static_cast<int32_t>(ResourceType::INTEGER)) {
643         result = resourceWrapper->GetInt(static_cast<uint32_t>(obj.id));
644         return true;
645     }
646     return false;
647 }
648 
ParseCjInteger(NativeResourceObject & obj,int32_t & result)649 bool ViewAbstract::ParseCjInteger(NativeResourceObject& obj, int32_t& result)
650 {
651     return ParseCjInteger<int32_t>(obj, result);
652 }
653 
ParseCjInteger(NativeResourceObject & obj,uint32_t & result)654 bool ViewAbstract::ParseCjInteger(NativeResourceObject& obj, uint32_t& result)
655 {
656     return ParseCjInteger<uint32_t>(obj, result);
657 }
658 
ParseCjBool(NativeResourceObject & obj,bool & result)659 bool ViewAbstract::ParseCjBool(NativeResourceObject& obj, bool& result)
660 {
661     std::string bundleName;
662     std::string moduleName;
663     CompleteResourceObject(obj, bundleName, moduleName);
664     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
665         return false;
666     }
667     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
668     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
669     if (!resourceWrapper) {
670         return false;
671     }
672     if (obj.id == -1) {
673         if (!obj.paramsJsonStr) {
674             return false;
675         }
676         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
677         if (!params->IsArray()) {
678             return false;
679         }
680         auto param = params->GetArrayItem(0);
681         if (obj.type == static_cast<int32_t>(ResourceType::BOOLEAN)) {
682             result = resourceWrapper->GetBooleanByName(param->GetString());
683             return true;
684         }
685         return false;
686     }
687 
688     if (obj.type == static_cast<int32_t>(ResourceType::BOOLEAN)) {
689         result = resourceWrapper->GetBoolean(static_cast<uint32_t>(obj.id));
690         return true;
691     }
692     return false;
693 }
694 
ParseCjIntegerArray(NativeResourceObject & obj,std::vector<uint32_t> & result)695 bool ViewAbstract::ParseCjIntegerArray(NativeResourceObject& obj, std::vector<uint32_t>& result)
696 {
697     std::string bundleName;
698     std::string moduleName;
699     CompleteResourceObject(obj, bundleName, moduleName);
700     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
701         return false;
702     }
703     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
704     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
705     if (!resourceWrapper) {
706         return false;
707     }
708     if (obj.id == -1) {
709         if (!obj.paramsJsonStr) {
710             return false;
711         }
712         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
713         if (!params->IsArray()) {
714             return false;
715         }
716         auto param = params->GetArrayItem(0);
717         if (obj.type == static_cast<int32_t>(ResourceType::INTARRAY)) {
718             result = resourceWrapper->GetIntArrayByName(param->GetString());
719             return true;
720         }
721         return false;
722     }
723     if (obj.type == static_cast<int32_t>(ResourceType::INTARRAY)) {
724         result = resourceWrapper->GetIntArray(static_cast<uint32_t>(obj.id));
725         return true;
726     }
727     return false;
728 }
729 
ParseCjStringArray(NativeResourceObject & obj,std::vector<std::string> & result)730 bool ViewAbstract::ParseCjStringArray(NativeResourceObject& obj, std::vector<std::string>& result)
731 {
732     std::string bundleName;
733     std::string moduleName;
734     CompleteResourceObject(obj, bundleName, moduleName);
735     if (obj.type == UNKNOWN_RESOURCE_TYPE) {
736         return false;
737     }
738     auto resourceObject = GetResourceObjectByBundleAndModule(obj);
739     auto resourceWrapper = CreateResourceWrapper(obj, resourceObject);
740     if (!resourceWrapper) {
741         return false;
742     }
743     if (obj.id == -1) {
744         if (!obj.paramsJsonStr) {
745             return false;
746         }
747         auto params = JsonUtil::ParseJsonString(obj.paramsJsonStr);
748         if (!params->IsArray()) {
749             return false;
750         }
751         auto param = params->GetArrayItem(0);
752         if (obj.type == static_cast<int32_t>(ResourceType::STRARRAY)) {
753             result = resourceWrapper->GetStringArrayByName(param->GetString());
754             return true;
755         }
756         return false;
757     }
758     if (obj.type == static_cast<int32_t>(ResourceType::STRARRAY)) {
759         result = resourceWrapper->GetStringArray(static_cast<uint32_t>(obj.id));
760         return true;
761     }
762     return false;
763 }
764 
ParseOnCreateMenu(CjOnCreateMenu & cjOnCreateMenu,NG::OnCreateMenuCallback & onCreateMenuCallback)765 void ViewAbstract::ParseOnCreateMenu(CjOnCreateMenu& cjOnCreateMenu, NG::OnCreateMenuCallback& onCreateMenuCallback)
766 {
767     WeakPtr<NG::FrameNode> frameNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
768     auto cjCallback = [func = CJLambda::Create(cjOnCreateMenu), node = frameNode, instanceId = Container::CurrentId()](
769                           const std::vector<NG::MenuItemParam>& systemMenuItems) -> std::vector<NG::MenuOptionsParam> {
770         ContainerScope scope(instanceId);
771         auto pipelineContext = PipelineContext::GetCurrentContext();
772         std::vector<NG::MenuOptionsParam> menuParams;
773         CHECK_NULL_RETURN(pipelineContext, menuParams);
774         pipelineContext->UpdateCurrentActiveNode(node);
775         auto cjMenuItems = new std::vector<FfiTextMenuItem>(systemMenuItems.size());
776         for (size_t i = 0; i < systemMenuItems.size(); i++) {
777             FfiTextMenuItem item;
778             auto content = systemMenuItems[i].menuOptionsParam.content;
779             auto icon = systemMenuItems[i].menuOptionsParam.icon;
780             item.content = content.has_value() ? Utils::MallocCString(content.value()) : Utils::MallocCString("");
781             item.icon = icon.has_value() ? Utils::MallocCString(icon.value()) : Utils::MallocCString("");
782             item.id = Utils::MallocCString(systemMenuItems[i].menuOptionsParam.id);
783             (*cjMenuItems)[i] = item;
784         }
785         auto vectorResult = func(cjMenuItems);
786         auto menuItemsArray = reinterpret_cast<std::vector<FfiTextMenuItem>*>(vectorResult);
787         for (size_t i = 0; i < menuItemsArray->size(); i++) {
788             auto ffiMenuItem = (*menuItemsArray)[i];
789             NG::MenuOptionsParam menuOptionsParam;
790             menuOptionsParam.content =
791                 ffiMenuItem.content.value ? std::make_optional(ffiMenuItem.content.value) : std::nullopt;
792             menuOptionsParam.icon = ffiMenuItem.icon.value ? std::make_optional(ffiMenuItem.icon.value) : std::nullopt;
793             menuOptionsParam.id = ffiMenuItem.id.value;
794             menuParams.emplace_back(menuOptionsParam);
795         }
796         delete menuItemsArray;
797         return menuParams;
798     };
799     onCreateMenuCallback = cjCallback;
800 }
801 
ParseOnMenuItemClick(CjOnMenuItemClick & cjOnMenuItemClick,NG::OnMenuItemClickCallback & onMenuItemClick)802 void ViewAbstract::ParseOnMenuItemClick(
803     CjOnMenuItemClick& cjOnMenuItemClick, NG::OnMenuItemClickCallback& onMenuItemClick)
804 {
805     WeakPtr<NG::FrameNode> frameNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
806     auto cjCallback = [func = CJLambda::Create(cjOnMenuItemClick), node = frameNode,
807                           instanceId = Container::CurrentId()](NG::MenuItemParam menuOptionsParam) -> bool {
808         ContainerScope scope(instanceId);
809         auto pipelineContext = PipelineContext::GetCurrentContext();
810         CHECK_NULL_RETURN(pipelineContext, false);
811         pipelineContext->UpdateCurrentActiveNode(node);
812         auto content = menuOptionsParam.menuOptionsParam.content;
813         auto icon = menuOptionsParam.menuOptionsParam.icon;
814         FfiTextMenuItem ffiTextMenuItem;
815         ffiTextMenuItem.content =
816             content.has_value() ? Utils::MallocCString(content.value()) : Utils::MallocCString("");
817         ffiTextMenuItem.icon = icon.has_value() ? Utils::MallocCString(icon.value()) : Utils::MallocCString("");
818         ffiTextMenuItem.id = Utils::MallocCString(menuOptionsParam.menuOptionsParam.id);
819         return func(ffiTextMenuItem, menuOptionsParam.start, menuOptionsParam.end);
820     };
821     onMenuItemClick = cjCallback;
822 }
823 
ParseEditMenuOptions(CjOnCreateMenu & cjOnCreateMenu,CjOnMenuItemClick & cjOnMenuItemClick,NG::OnCreateMenuCallback & onCreateMenuCallback,NG::OnMenuItemClickCallback & onMenuItemClick)824 bool ViewAbstract::ParseEditMenuOptions(CjOnCreateMenu& cjOnCreateMenu, CjOnMenuItemClick& cjOnMenuItemClick,
825     NG::OnCreateMenuCallback& onCreateMenuCallback, NG::OnMenuItemClickCallback& onMenuItemClick)
826 {
827     ParseOnCreateMenu(cjOnCreateMenu, onCreateMenuCallback);
828     ParseOnMenuItemClick(cjOnMenuItemClick, onMenuItemClick);
829     return true;
830 }
831 } // namespace OHOS::Ace::Framework
832