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