1 /*
2 * Copyright (c) 2023 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 "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_text_timer_bridge.h"
16 #include "base/utils/string_utils.h"
17 #include "base/utils/utils.h"
18 #include "frameworks/base/geometry/calc_dimension.h"
19 #include "frameworks/base/geometry/dimension.h"
20 #include "frameworks/bridge/declarative_frontend/engine/jsi/jsi_value_conversions.h"
21 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
22 #include "frameworks/bridge/declarative_frontend/jsview/js_texttimer.h"
23 #include "core/components/declaration/texttimer/texttimer_declaration.h"
24 #include "core/components_ng/pattern/texttimer/text_timer_model_ng.h"
25
26 namespace OHOS::Ace::NG {
27 namespace {
28 constexpr int32_t NUM_0 = 0;
29 constexpr int32_t NUM_1 = 1;
30 constexpr int32_t NUM_2 = 2;
31 constexpr int32_t NUM_3 = 3;
32 constexpr int32_t NUM_4 = 4;
33 constexpr int32_t NUM_5 = 5;
34 constexpr int32_t NUM_6 = 6;
35 constexpr int32_t NUM_7 = 7;
36 constexpr bool DEFAULT_COUNT_DOWN = false;
37 constexpr double MAX_COUNT_DOWN = 86400000.0;
38 const std::string DEFAULT_STR = "-1";
39 const char* TEXTTIMER_NODEPTR_OF_UINODE = "nodePtr_";
40 } // namespace
41
SetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)42 ArkUINativeModuleValue TextTimerBridge::SetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
43 {
44 EcmaVM* vm = runtimeCallInfo->GetVM();
45 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
46 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
47 Local<JSValueRef> paramArg = runtimeCallInfo->GetCallArgRef(NUM_1);
48 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
49 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
50 Color color;
51 auto nodeModifiers = GetArkUINodeModifiers();
52 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
53 if (!ArkTSUtils::ParseJsColorAlpha(vm, paramArg, color)) {
54 nodeModifiers->getTextTimerModifier()->resetFontColor(nativeNode);
55 } else {
56 nodeModifiers->getTextTimerModifier()->setFontColor(nativeNode, color.GetValue());
57 }
58 return panda::JSValueRef::Undefined(vm);
59 }
60
ResetFontColor(ArkUIRuntimeCallInfo * runtimeCallInfo)61 ArkUINativeModuleValue TextTimerBridge::ResetFontColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
62 {
63 EcmaVM* vm = runtimeCallInfo->GetVM();
64 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
65 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
66 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
67 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
68 auto nodeModifiers = GetArkUINodeModifiers();
69 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
70 nodeModifiers->getTextTimerModifier()->resetFontColor(nativeNode);
71 return panda::JSValueRef::Undefined(vm);
72 }
73
SetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)74 ArkUINativeModuleValue TextTimerBridge::SetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
75 {
76 EcmaVM* vm = runtimeCallInfo->GetVM();
77 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
78 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
79 Local<JSValueRef> fontSizeArg = runtimeCallInfo->GetCallArgRef(NUM_1);
80 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
81 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
82 CalcDimension fontSize;
83 auto nodeModifiers = GetArkUINodeModifiers();
84 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
85 if (!ArkTSUtils::ParseJsDimensionFp(vm, fontSizeArg, fontSize) || fontSize.Value() < 0 ||
86 fontSize.Unit() == DimensionUnit::PERCENT) {
87 nodeModifiers->getTextTimerModifier()->resetFontSize(nativeNode);
88 } else {
89 nodeModifiers->getTextTimerModifier()->setFontSize(
90 nativeNode, fontSize.Value(), static_cast<int32_t>(fontSize.Unit()));
91 }
92 return panda::JSValueRef::Undefined(vm);
93 }
94
ResetFontSize(ArkUIRuntimeCallInfo * runtimeCallInfo)95 ArkUINativeModuleValue TextTimerBridge::ResetFontSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
96 {
97 EcmaVM* vm = runtimeCallInfo->GetVM();
98 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
99 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
100 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
101 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
102 auto nodeModifiers = GetArkUINodeModifiers();
103 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
104 nodeModifiers->getTextTimerModifier()->resetFontSize(nativeNode);
105 return panda::JSValueRef::Undefined(vm);
106 }
107
SetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)108 ArkUINativeModuleValue TextTimerBridge::SetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
109 {
110 EcmaVM* vm = runtimeCallInfo->GetVM();
111 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
112 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
113 Local<JSValueRef> paramArg = runtimeCallInfo->GetCallArgRef(NUM_1);
114 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
115 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
116 auto nodeModifiers = GetArkUINodeModifiers();
117 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
118 if (paramArg->IsNumber()) {
119 uint32_t fontStyle = paramArg->Uint32Value(vm);
120 if (fontStyle < static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL) ||
121 fontStyle > static_cast<uint32_t>(OHOS::Ace::FontStyle::ITALIC)) {
122 fontStyle = static_cast<uint32_t>(OHOS::Ace::FontStyle::NORMAL);
123 }
124 nodeModifiers->getTextTimerModifier()->setFontStyle(nativeNode, fontStyle);
125 } else {
126 nodeModifiers->getTextTimerModifier()->resetFontStyle(nativeNode);
127 }
128 return panda::JSValueRef::Undefined(vm);
129 }
130
ResetFontStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)131 ArkUINativeModuleValue TextTimerBridge::ResetFontStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
132 {
133 EcmaVM* vm = runtimeCallInfo->GetVM();
134 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
135 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
136 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
137 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
138 auto nodeModifiers = GetArkUINodeModifiers();
139 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
140 nodeModifiers->getTextTimerModifier()->resetFontStyle(nativeNode);
141 return panda::JSValueRef::Undefined(vm);
142 }
143
SetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)144 ArkUINativeModuleValue TextTimerBridge::SetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
145 {
146 EcmaVM* vm = runtimeCallInfo->GetVM();
147 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
148 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
149 Local<JSValueRef> fontWeightArg = runtimeCallInfo->GetCallArgRef(NUM_1);
150 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
151 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
152 std::string fontWeight;
153 if (!fontWeightArg->IsNull()) {
154 if (fontWeightArg->IsNumber()) {
155 fontWeight = std::to_string(fontWeightArg->Int32Value(vm));
156 } else if (fontWeightArg->IsString(vm)) {
157 fontWeight = fontWeightArg->ToString(vm)->ToString(vm);
158 }
159 }
160 auto nodeModifiers = GetArkUINodeModifiers();
161 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
162 nodeModifiers->getTextTimerModifier()->setFontWeight(nativeNode, fontWeight.c_str());
163 return panda::JSValueRef::Undefined(vm);
164 }
165
ResetFontWeight(ArkUIRuntimeCallInfo * runtimeCallInfo)166 ArkUINativeModuleValue TextTimerBridge::ResetFontWeight(ArkUIRuntimeCallInfo* runtimeCallInfo)
167 {
168 EcmaVM* vm = runtimeCallInfo->GetVM();
169 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
170 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
171 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
172 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
173 auto nodeModifiers = GetArkUINodeModifiers();
174 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
175 nodeModifiers->getTextTimerModifier()->resetFontWeight(nativeNode);
176 return panda::JSValueRef::Undefined(vm);
177 }
178
SetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)179 ArkUINativeModuleValue TextTimerBridge::SetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
180 {
181 EcmaVM* vm = runtimeCallInfo->GetVM();
182 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
183 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
184 Local<JSValueRef> fontFamilyArg = runtimeCallInfo->GetCallArgRef(NUM_1);
185 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
186 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
187
188 std::string fontFamilyStr;
189 auto nodeModifiers = GetArkUINodeModifiers();
190 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
191 if (!ArkTSUtils::ParseJsFontFamiliesToString(vm, fontFamilyArg, fontFamilyStr)) {
192 nodeModifiers->getTextTimerModifier()->resetFontFamily(nativeNode);
193 return panda::JSValueRef::Undefined(vm);
194 }
195 nodeModifiers->getTextTimerModifier()->setFontFamily(nativeNode, fontFamilyStr.c_str());
196 return panda::JSValueRef::Undefined(vm);
197 }
198
ResetFontFamily(ArkUIRuntimeCallInfo * runtimeCallInfo)199 ArkUINativeModuleValue TextTimerBridge::ResetFontFamily(ArkUIRuntimeCallInfo* runtimeCallInfo)
200 {
201 EcmaVM* vm = runtimeCallInfo->GetVM();
202 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
203 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
204 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
205 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
206
207 auto nodeModifiers = GetArkUINodeModifiers();
208 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
209 nodeModifiers->getTextTimerModifier()->resetFontFamily(nativeNode);
210 return panda::JSValueRef::Undefined(vm);
211 }
212
SetFormat(ArkUIRuntimeCallInfo * runtimeCallInfo)213 ArkUINativeModuleValue TextTimerBridge::SetFormat(ArkUIRuntimeCallInfo* runtimeCallInfo)
214 {
215 EcmaVM* vm = runtimeCallInfo->GetVM();
216 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
217 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
218 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
219 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
220 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
221 auto nodeModifiers = GetArkUINodeModifiers();
222 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
223 if (!secondArg->IsString(vm)) {
224 nodeModifiers->getTextTimerModifier()->resetFormat(nativeNode);
225 }
226 std::string format = secondArg->ToString(vm)->ToString(vm);
227 nodeModifiers->getTextTimerModifier()->setFormat(nativeNode, format.c_str());
228 return panda::JSValueRef::Undefined(vm);
229 }
230
ResetFormat(ArkUIRuntimeCallInfo * runtimeCallInfo)231 ArkUINativeModuleValue TextTimerBridge::ResetFormat(ArkUIRuntimeCallInfo* runtimeCallInfo)
232 {
233 EcmaVM* vm = runtimeCallInfo->GetVM();
234 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
235 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
236 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
237 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
238 auto nodeModifiers = GetArkUINodeModifiers();
239 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
240 nodeModifiers->getTextTimerModifier()->resetFormat(nativeNode);
241 return panda::JSValueRef::Undefined(vm);
242 }
243
SetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)244 ArkUINativeModuleValue TextTimerBridge::SetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
245 {
246 EcmaVM* vm = runtimeCallInfo->GetVM();
247 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
248 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
249 Local<JSValueRef> lengthArg = runtimeCallInfo->GetCallArgRef(NUM_7);
250 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
251 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
252 if (!lengthArg->IsNumber() || lengthArg->Uint32Value(vm) == 0) {
253 return panda::JSValueRef::Undefined(vm);
254 }
255 uint32_t length = lengthArg->Uint32Value(vm);
256 auto radiusArray = std::make_unique<double[]>(length);
257 auto typeArray = std::make_unique<uint32_t[]>(length);
258 auto colorArray = std::make_unique<uint32_t[]>(length);
259 auto offsetXArray = std::make_unique<double[]>(length);
260 auto offsetYArray = std::make_unique<double[]>(length);
261 auto fillArray = std::make_unique<uint32_t[]>(length);
262 bool radiusParseResult = ArkTSUtils::ParseArray<double>(
263 vm, runtimeCallInfo->GetCallArgRef(NUM_1), radiusArray.get(), length, ArkTSUtils::parseShadowRadius);
264 bool typeParseResult = ArkTSUtils::ParseArray<uint32_t>(
265 vm, runtimeCallInfo->GetCallArgRef(NUM_2), typeArray.get(), length, ArkTSUtils::parseShadowType);
266 bool colorParseResult = ArkTSUtils::ParseArray<uint32_t>(
267 vm, runtimeCallInfo->GetCallArgRef(NUM_3), colorArray.get(), length, ArkTSUtils::parseShadowColor);
268 bool offsetXParseResult = ArkTSUtils::ParseArray<double>(
269 vm, runtimeCallInfo->GetCallArgRef(NUM_4), offsetXArray.get(), length, ArkTSUtils::parseShadowOffset);
270 bool offsetYParseResult = ArkTSUtils::ParseArray<double>(
271 vm, runtimeCallInfo->GetCallArgRef(NUM_5), offsetYArray.get(), length, ArkTSUtils::parseShadowOffset);
272 bool fillParseResult = ArkTSUtils::ParseArray<uint32_t>(
273 vm, runtimeCallInfo->GetCallArgRef(NUM_6), fillArray.get(), length, ArkTSUtils::parseShadowFill);
274 if (!radiusParseResult || !colorParseResult || !offsetXParseResult ||
275 !offsetYParseResult || !fillParseResult || !typeParseResult) {
276 return panda::JSValueRef::Undefined(vm);
277 }
278 auto textShadowArray = std::make_unique<ArkUITextShadowStruct[]>(length);
279 CHECK_NULL_RETURN(textShadowArray.get(), panda::JSValueRef::Undefined(vm));
280 for (uint32_t i = 0; i < length; i++) {
281 textShadowArray[i].radius = radiusArray[i];
282 textShadowArray[i].type = typeArray[i];
283 textShadowArray[i].color = colorArray[i];
284 textShadowArray[i].offsetX = offsetXArray[i];
285 textShadowArray[i].offsetY = offsetYArray[i];
286 textShadowArray[i].fill = fillArray[i];
287 }
288 auto nodeModifiers = GetArkUINodeModifiers();
289 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
290 nodeModifiers->getTextTimerModifier()->setTextShadow(nativeNode, textShadowArray.get(), length);
291 return panda::JSValueRef::Undefined(vm);
292 }
293
ResetTextShadow(ArkUIRuntimeCallInfo * runtimeCallInfo)294 ArkUINativeModuleValue TextTimerBridge::ResetTextShadow(ArkUIRuntimeCallInfo* runtimeCallInfo)
295 {
296 EcmaVM* vm = runtimeCallInfo->GetVM();
297 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
298 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
299 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
300 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
301 auto nodeModifiers = GetArkUINodeModifiers();
302 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
303 nodeModifiers->getTextTimerModifier()->resetTextShadow(nativeNode);
304 return panda::JSValueRef::Undefined(vm);
305 }
306
SetContentModifierBuilder(ArkUIRuntimeCallInfo * runtimeCallInfo)307 ArkUINativeModuleValue TextTimerBridge::SetContentModifierBuilder(ArkUIRuntimeCallInfo* runtimeCallInfo)
308 {
309 EcmaVM* vm = runtimeCallInfo->GetVM();
310 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
311 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
312 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
313 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
314 auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
315 if (!secondArg->IsObject(vm)) {
316 TextTimerModelNG::SetBuilderFunc(frameNode, nullptr);
317 return panda::JSValueRef::Undefined(vm);
318 }
319 panda::CopyableGlobal<panda::ObjectRef> obj(vm, secondArg);
320 TextTimerModelNG::SetBuilderFunc(frameNode,
321 [vm, frameNode, obj = std::move(obj), containerId = Container::CurrentId()](
322 TextTimerConfiguration config) -> RefPtr<FrameNode> {
323 ContainerScope scope(containerId);
324 auto context = ArkTSUtils::GetContext(vm);
325 CHECK_EQUAL_RETURN(context->IsUndefined(), true, nullptr);
326 const char* keysOfTextTimer[] = { "count", "isCountDown", "started", "enabled", "elapsedTime"};
327 Local<JSValueRef> valuesOfTextTimer[] = {
328 panda::NumberRef::New(vm, config.count_),
329 panda::BooleanRef::New(vm, config.isCountDown_),
330 panda::BooleanRef::New(vm, config.started_),
331 panda::BooleanRef::New(vm, config.enabled_),
332 panda::NumberRef::New(vm, static_cast<int64_t>(config.elapsedTime_))};
333 auto textTimer = panda::ObjectRef::NewWithNamedProperties(vm,
334 ArraySize(keysOfTextTimer), keysOfTextTimer, valuesOfTextTimer);
335 textTimer->SetNativePointerFieldCount(vm, 1);
336 textTimer->SetNativePointerField(vm, 0, static_cast<void*>(frameNode));
337 panda::Local<panda::JSValueRef> params[2] = { context, textTimer };
338 LocalScope pandaScope(vm);
339 panda::TryCatch trycatch(vm);
340 auto jsObject = obj.ToLocal();
341 auto makeFunc = jsObject->Get(vm, panda::StringRef::NewFromUtf8(vm, "makeContentModifierNode"));
342 CHECK_EQUAL_RETURN(makeFunc->IsFunction(vm), false, nullptr);
343 panda::Local<panda::FunctionRef> func = makeFunc;
344 auto result = func->Call(vm, jsObject, params, 2);
345 JSNApi::ExecutePendingJob(vm);
346 CHECK_EQUAL_RETURN(result.IsEmpty() || trycatch.HasCaught() || !result->IsObject(vm), true, nullptr);
347 auto resultObj = result->ToObject(vm);
348 panda::Local<panda::JSValueRef> nodeptr =
349 resultObj->Get(vm, panda::StringRef::NewFromUtf8(vm, TEXTTIMER_NODEPTR_OF_UINODE));
350 CHECK_EQUAL_RETURN(nodeptr.IsEmpty() || nodeptr->IsUndefined() || nodeptr->IsNull(), true, nullptr);
351 auto* frameNode = reinterpret_cast<FrameNode*>(nodeptr->ToNativePointer(vm)->Value());
352 CHECK_NULL_RETURN(frameNode, nullptr);
353 return AceType::Claim(frameNode);
354 });
355 return panda::JSValueRef::Undefined(vm);
356 }
357
SetTextTimerOptions(ArkUIRuntimeCallInfo * runtimeCallInfo)358 ArkUINativeModuleValue TextTimerBridge::SetTextTimerOptions(ArkUIRuntimeCallInfo* runtimeCallInfo)
359 {
360 EcmaVM* vm = runtimeCallInfo->GetVM();
361 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
362 Local<JSValueRef> nodeVal = runtimeCallInfo->GetCallArgRef(NUM_0);
363 Local<JSValueRef> isCountDownVal = runtimeCallInfo->GetCallArgRef(NUM_1);
364 Local<JSValueRef> countVal = runtimeCallInfo->GetCallArgRef(NUM_2);
365 Local<JSValueRef> controllerVal = runtimeCallInfo->GetCallArgRef(NUM_3);
366 CHECK_NULL_RETURN(nodeVal->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
367 auto nativeNode = nodePtr(nodeVal->ToNativePointer(vm)->Value());
368 bool isCountDown = DEFAULT_COUNT_DOWN;
369 double count = TIME_DEFAULT_COUNT;
370 if (isCountDownVal->IsBoolean()) {
371 isCountDown = isCountDownVal->BooleaValue(vm);
372 if (isCountDown && countVal->IsNumber()) {
373 auto tempCount = countVal->ToNumber(vm)->Value();
374 if (tempCount > 0 && tempCount < MAX_COUNT_DOWN) {
375 count = tempCount;
376 }
377 }
378 }
379 auto nodeModifiers = GetArkUINodeModifiers();
380 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
381 nodeModifiers->getTextTimerModifier()->setTextTimerOptions(nativeNode, isCountDown, count);
382 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
383 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
384 if (controllerVal->IsObject(vm)) {
385 auto* jsController = Framework::JSRef<Framework::JSObject>(Framework::JSObject(controllerVal->ToObject(vm)))
386 ->Unwrap<Framework::JSTextTimerController>();
387 if (jsController) {
388 auto pointer = TextTimerModelNG::GetJSTextTimerController(frameNode);
389 auto preController = static_cast<Framework::JSTextTimerController*>(Referenced::RawPtr(pointer));
390 if (preController) {
391 preController->SetController(nullptr);
392 }
393 TextTimerModelNG::SetJSTextTimerController(
394 frameNode, Referenced::Claim(static_cast<Referenced*>(jsController)));
395 auto controller = TextTimerModelNG::InitTextController(frameNode);
396 jsController->SetInstanceId(Container::CurrentId());
397 jsController->SetController(controller);
398 }
399 } else {
400 auto pointer = TextTimerModelNG::GetJSTextTimerController(frameNode);
401 auto preController = static_cast<Framework::JSTextTimerController*>(Referenced::RawPtr(pointer));
402 if (preController) {
403 preController->SetController(nullptr);
404 }
405 TextTimerModelNG::SetJSTextTimerController(frameNode, nullptr);
406 }
407
408 return panda::JSValueRef::Undefined(vm);
409 }
410
SetTextTimerOnTimer(ArkUIRuntimeCallInfo * runtimeCallInfo)411 ArkUINativeModuleValue TextTimerBridge::SetTextTimerOnTimer(ArkUIRuntimeCallInfo* runtimeCallInfo)
412 {
413 EcmaVM* vm = runtimeCallInfo->GetVM();
414 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
415 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
416 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
417 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
418 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
419 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
420 GetArkUINodeModifiers()->getTextTimerModifier()->resetTextTimerOnTimer(nativeNode);
421 return panda::JSValueRef::Undefined(vm);
422 }
423 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
424 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
425 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
426
427 std::function<void(int64_t, int64_t)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
428 const int64_t first, const int64_t last) {
429 panda::LocalScope pandaScope(vm);
430 panda::TryCatch trycatch(vm);
431 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
432
433 panda::Local<panda::NumberRef> firstParam = panda::NumberRef::New(vm, first);
434 panda::Local<panda::NumberRef> lastParam = panda::NumberRef::New(vm, last);
435 // 2: Array length
436 panda::Local<panda::JSValueRef> params[2] = { firstParam, lastParam };
437 func->Call(vm, func.ToLocal(), params, 2); // 2: Array length
438 };
439 GetArkUINodeModifiers()->getTextTimerModifier()->setTextTimerOnTimer(
440 nativeNode, reinterpret_cast<void*>(&callback));
441 return panda::JSValueRef::Undefined(vm);
442 }
443
ResetTextTimerOnTimer(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue TextTimerBridge::ResetTextTimerOnTimer(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446 EcmaVM* vm = runtimeCallInfo->GetVM();
447 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
448 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
449 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
450 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
451 GetArkUINodeModifiers()->getTextTimerModifier()->resetTextTimerOnTimer(nativeNode);
452 return panda::JSValueRef::Undefined(vm);
453 }
454 } // namespace OHOS::Ace::NG
455