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