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