• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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