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
16 #include "core/interfaces/native/node/view_model.h"
17
18 #include <optional>
19
20 #include "base/log/log_wrapper.h"
21 #include "base/memory/ace_type.h"
22 #include "base/utils/utils.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/base/group_node.h"
25 #include "core/components_ng/base/ui_node.h"
26 #include "core/components_ng/pattern/calendar_picker/calendar_picker_model_ng.h"
27 #include "core/components_ng/pattern/common_view/common_view_model_ng.h"
28 #include "core/components_ng/pattern/canvas/canvas_model_ng.h"
29 #include "core/components_ng/pattern/linear_layout/column_model_ng.h"
30 #include "core/components_ng/pattern/linear_layout/row_model_ng.h"
31 #include "core/components_ng/pattern/list/list_model_ng.h"
32 #include "core/components_ng/pattern/list/list_item_model_ng.h"
33 #include "core/components_ng/pattern/list/list_item_group_model_ng.h"
34 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
35 #include "core/components_ng/pattern/picker/datepicker_model_ng.h"
36 #include "core/components_ng/pattern/scroll/scroll_model_ng.h"
37 #include "core/components_ng/pattern/shape/circle_model_ng.h"
38 #include "core/components_ng/pattern/stack/stack_model_ng.h"
39 #include "core/components_ng/pattern/tabs/tab_content_model_ng.h"
40 #include "core/components_ng/pattern/tabs/tabs_model_ng.h"
41 #include "core/components_ng/pattern/text/span/span_object.h"
42 #include "core/components_ng/pattern/text_field/text_field_model_ng.h"
43 #include "core/components_ng/pattern/text/image_span_view.h"
44 #include "core/components_ng/pattern/text/text_model_ng.h"
45 #include "core/components_ng/pattern/text/span_model_ng.h"
46 #include "core/components_ng/pattern/text_picker/textpicker_model_ng.h"
47 #include "core/components_ng/pattern/time_picker/timepicker_model_ng.h"
48 #include "core/components_ng/pattern/toggle/toggle_model_ng.h"
49 #include "core/components_ng/pattern/image/image_model_ng.h"
50 #include "core/components_ng/pattern/list/list_model_ng.h"
51 #include "core/components_ng/pattern/loading_progress/loading_progress_model_ng.h"
52 #include "core/components_ng/pattern/swiper/swiper_model_ng.h"
53 #include "core/components_ng/pattern/button/button_model_ng.h"
54 #include "core/components_ng/pattern/progress/progress_model_ng.h"
55 #include "core/components_ng/pattern/checkbox/checkbox_model_ng.h"
56 #include "core/components_ng/pattern/linear_layout/column_model_ng.h"
57 #include "core/components_ng/pattern/linear_layout/row_model_ng.h"
58 #include "core/components_ng/pattern/flex/flex_model_ng.h"
59 #include "core/components_ng/pattern/refresh/refresh_model_ng.h"
60 #include "core/components_ng/pattern/xcomponent/xcomponent_model_ng.h"
61 #include "core/components_ng/pattern/slider/slider_model_ng.h"
62 #include "core/components_ng/pattern/waterflow/water_flow_model_ng.h"
63 #include "core/components_ng/pattern/waterflow/water_flow_item_model_ng.h"
64 #include "core/components_ng/pattern/relative_container/relative_container_model_ng.h"
65 #include "core/components_ng/pattern/grid/grid_model_ng.h"
66 #include "core/components_ng/pattern/grid/grid_item_model_ng.h"
67 #include "core/components_ng/pattern/grid_col/grid_col_model_ng.h"
68 #include "core/components_ng/pattern/grid_row/grid_row_model_ng.h"
69 #include "core/components_ng/pattern/blank/blank_model_ng.h"
70 #include "core/components_ng/pattern/custom_frame_node/custom_pattern.h"
71 #include "core/components_ng/pattern/divider/divider_model_ng.h"
72 #include "core/components_ng/pattern/indexer/indexer_model_ng.h"
73 #include "core/components_ng/pattern/search/search_model_ng.h"
74 #include "core/components_ng/pattern/radio/radio_model_ng.h"
75 #include "core/components_ng/pattern/image_animator/image_animator_model_ng.h"
76 #include "core/components_ng/pattern/select/select_model_ng.h"
77 #include "core/interfaces/native/node/node_api.h"
78 #include "core/pipeline/base/element_register.h"
79
80 namespace OHOS::Ace::NG::ViewModel {
81
82 ArkUIAPICallbackMethod* callbacks = nullptr;
83
createTextNode(ArkUI_Int32 nodeId)84 void* createTextNode(ArkUI_Int32 nodeId)
85 {
86 auto frameNode = TextModelNG::CreateFrameNode(nodeId, "");
87 CHECK_NULL_RETURN(frameNode, nullptr);
88 frameNode->IncRefCount();
89 return AceType::RawPtr(frameNode);
90 }
91
createSpanNode(ArkUI_Int32 nodeId)92 void* createSpanNode(ArkUI_Int32 nodeId)
93 {
94 auto spanNode = SpanModelNG::CreateSpanNode(nodeId, "");
95 CHECK_NULL_RETURN(spanNode, nullptr);
96 spanNode->IncRefCount();
97 return AceType::RawPtr(spanNode);
98 }
99
createImageSpanNode(ArkUI_Int32 nodeId)100 void* createImageSpanNode(ArkUI_Int32 nodeId)
101 {
102 auto imageSpanNode = ImageSpanView::CreateFrameNode(nodeId);
103 CHECK_NULL_RETURN(imageSpanNode, nullptr);
104 imageSpanNode->IncRefCount();
105 return AceType::RawPtr(imageSpanNode);
106 }
107
createImageNode(ArkUI_Int32 nodeId)108 void* createImageNode(ArkUI_Int32 nodeId)
109 {
110 RefPtr<PixelMap> pixmap = nullptr;
111 auto frameNode = ImageModelNG::CreateFrameNode(nodeId, "", pixmap, "", "", false);
112 CHECK_NULL_RETURN(frameNode, nullptr);
113 frameNode->IncRefCount();
114 return AceType::RawPtr(frameNode);
115 }
116
createToggleNode(ArkUI_Int32 nodeId)117 void* createToggleNode(ArkUI_Int32 nodeId)
118 {
119 auto frameNode = ToggleModelNG::CreateFrameNode(nodeId, NG::ToggleType::SWITCH, false);
120 CHECK_NULL_RETURN(frameNode, nullptr);
121 frameNode->IncRefCount();
122 return AceType::RawPtr(frameNode);
123 }
124
createLoadingProgress(ArkUI_Int32 nodeId)125 void* createLoadingProgress(ArkUI_Int32 nodeId)
126 {
127 auto frameNode = LoadingProgressModelNG::CreateFrameNode(nodeId);
128 CHECK_NULL_RETURN(frameNode, nullptr);
129 frameNode->IncRefCount();
130 return AceType::RawPtr(frameNode);
131 }
132
createTextInputNode(ArkUI_Int32 nodeId)133 void* createTextInputNode(ArkUI_Int32 nodeId)
134 {
135 auto frameNode = TextFieldModelNG::CreateFrameNode(nodeId, "", "", false);
136 CHECK_NULL_RETURN(frameNode, nullptr);
137 frameNode->IncRefCount();
138 return AceType::RawPtr(frameNode);
139 }
140
createStackNode(ArkUI_Int32 nodeId)141 void* createStackNode(ArkUI_Int32 nodeId)
142 {
143 auto frameNode = StackModelNG::CreateFrameNode(nodeId);
144 CHECK_NULL_RETURN(frameNode, nullptr);
145 frameNode->IncRefCount();
146 return AceType::RawPtr(frameNode);
147 }
148
createScrollNode(ArkUI_Int32 nodeId)149 void* createScrollNode(ArkUI_Int32 nodeId)
150 {
151 auto frameNode = ScrollModelNG::CreateFrameNode(nodeId);
152 CHECK_NULL_RETURN(frameNode, nullptr);
153 frameNode->IncRefCount();
154 return AceType::RawPtr(frameNode);
155 }
156
createListNode(ArkUI_Int32 nodeId)157 void* createListNode(ArkUI_Int32 nodeId)
158 {
159 auto frameNode = ListModelNG::CreateFrameNode(nodeId);
160 CHECK_NULL_RETURN(frameNode, nullptr);
161 frameNode->IncRefCount();
162 return AceType::RawPtr(frameNode);
163 }
164
createSwiperNode(ArkUI_Int32 nodeId)165 void* createSwiperNode(ArkUI_Int32 nodeId)
166 {
167 auto frameNode = SwiperModelNG::CreateFrameNode(nodeId);
168 CHECK_NULL_RETURN(frameNode, nullptr);
169 frameNode->IncRefCount();
170 return AceType::RawPtr(frameNode);
171 }
172
createTextAreaNode(ArkUI_Int32 nodeId)173 void* createTextAreaNode(ArkUI_Int32 nodeId)
174 {
175 auto frameNode = TextFieldModelNG::CreateFrameNode(nodeId, "", "", true);
176 CHECK_NULL_RETURN(frameNode, nullptr);
177 frameNode->IncRefCount();
178 return AceType::RawPtr(frameNode);
179 }
180
createButtonNode(ArkUI_Int32 nodeId)181 void* createButtonNode(ArkUI_Int32 nodeId)
182 {
183 auto frameNode = ButtonModelNG::CreateFrameNode(nodeId);
184 CHECK_NULL_RETURN(frameNode, nullptr);
185 frameNode->IncRefCount();
186 return AceType::RawPtr(frameNode);
187 }
188
createProgressNode(ArkUI_Int32 nodeId)189 void* createProgressNode(ArkUI_Int32 nodeId)
190 {
191 auto frameNode = ProgressModelNG::CreateFrameNode(nodeId, 0, 100, NG::ProgressType::LINEAR);
192 CHECK_NULL_RETURN(frameNode, nullptr);
193 frameNode->IncRefCount();
194 return AceType::RawPtr(frameNode);
195 }
196
createCheckBoxNode(ArkUI_Int32 nodeId)197 void* createCheckBoxNode(ArkUI_Int32 nodeId)
198 {
199 auto frameNode = CheckBoxModelNG::CreateFrameNode(nodeId);
200 CHECK_NULL_RETURN(frameNode, nullptr);
201 frameNode->IncRefCount();
202 return AceType::RawPtr(frameNode);
203 }
204
createColumnNode(ArkUI_Int32 nodeId)205 void* createColumnNode(ArkUI_Int32 nodeId)
206 {
207 auto frameNode = ColumnModelNG::CreateFrameNode(nodeId);
208 CHECK_NULL_RETURN(frameNode, nullptr);
209 frameNode->IncRefCount();
210 return AceType::RawPtr(frameNode);
211 }
212
createRowNode(ArkUI_Int32 nodeId)213 void* createRowNode(ArkUI_Int32 nodeId)
214 {
215 auto frameNode = RowModelNG::CreateFrameNode(nodeId);
216 CHECK_NULL_RETURN(frameNode, nullptr);
217 frameNode->IncRefCount();
218 return AceType::RawPtr(frameNode);
219 }
220
createFlexNode(ArkUI_Int32 nodeId)221 void* createFlexNode(ArkUI_Int32 nodeId)
222 {
223 auto frameNode = FlexModelNG::CreateFrameNode(nodeId);
224 CHECK_NULL_RETURN(frameNode, nullptr);
225 frameNode->IncRefCount();
226 return AceType::RawPtr(frameNode);
227 }
228
createListItemNode(ArkUI_Int32 nodeId)229 void* createListItemNode(ArkUI_Int32 nodeId)
230 {
231 auto frameNode = ListItemModelNG::CreateFrameNode(nodeId);
232 CHECK_NULL_RETURN(frameNode, nullptr);
233 frameNode->IncRefCount();
234 return AceType::RawPtr(frameNode);
235 }
236
createRefreshNode(ArkUI_Int32 nodeId)237 void* createRefreshNode(ArkUI_Int32 nodeId)
238 {
239 auto frameNode = RefreshModelNG::CreateFrameNode(nodeId);
240 CHECK_NULL_RETURN(frameNode, nullptr);
241 frameNode->IncRefCount();
242 return AceType::RawPtr(frameNode);
243 }
244
createRootNode(ArkUI_Int32 nodeId)245 void* createRootNode(ArkUI_Int32 nodeId)
246 {
247 auto container = Container::Current();
248 CHECK_NULL_RETURN(container, nullptr);
249 RefPtr<PipelineBase> pipeline;
250 pipeline = container->GetPipelineContext();
251 CHECK_NULL_RETURN(pipeline, nullptr);
252 auto context = AceType::DynamicCast<NG::PipelineContext>(pipeline);
253 CHECK_NULL_RETURN(context, nullptr);
254 auto stageManager = context->GetStageManager();
255 CHECK_NULL_RETURN(stageManager, nullptr);
256 auto stageNode = stageManager->GetStageNode();
257 TAG_LOGD(AceLogTag::ACE_NATIVE_NODE, "createRootNode: stageNode %{public}p", AceType::RawPtr(stageNode));
258 return AceType::RawPtr(stageNode);
259 }
260
createComponentRootNode(ArkUI_Int32 nodeId)261 void* createComponentRootNode(ArkUI_Int32 nodeId)
262 {
263 auto frameNode = CommonViewModelNG::CreateFrameNode(nodeId);
264 CHECK_NULL_RETURN(frameNode, nullptr);
265 frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
266 frameNode->IncRefCount();
267 TAG_LOGD(AceLogTag::ACE_NATIVE_NODE, "createComponentRootNode: frameNode %{public}p", AceType::RawPtr(frameNode));
268 return AceType::RawPtr(frameNode);
269 }
270
271 #ifdef XCOMPONENT_SUPPORTED
createXComponentNode(ArkUI_Int32 nodeId)272 void* createXComponentNode(ArkUI_Int32 nodeId)
273 {
274 auto frameNode = XComponentModelNG::CreateFrameNode(nodeId, "", XComponentType::SURFACE, "");
275 frameNode->IncRefCount();
276 return AceType::RawPtr(frameNode);
277 }
278
createXComponentNodeWithParams(ArkUI_Int32 nodeId,const ArkUI_Params & params)279 void* createXComponentNodeWithParams(ArkUI_Int32 nodeId, const ArkUI_Params& params)
280 {
281 ArkUI_XComponent_Params* xcParams = (ArkUI_XComponent_Params*)(¶ms);
282 CHECK_NULL_RETURN(xcParams, nullptr);
283 auto frameNode = XComponentModelNG::CreateTypeNode(nodeId, xcParams);
284 frameNode->IncRefCount();
285 return AceType::RawPtr(frameNode);
286 }
287 #endif
288
createListItemGroupNode(ArkUI_Int32 nodeId)289 void* createListItemGroupNode(ArkUI_Int32 nodeId)
290 {
291 auto frameNode = ListItemGroupModelNG::CreateFrameNode(nodeId);
292 CHECK_NULL_RETURN(frameNode, nullptr);
293 frameNode->IncRefCount();
294 return AceType::RawPtr(frameNode);
295 }
296
createSliderNode(ArkUI_Int32 nodeId)297 void* createSliderNode(ArkUI_Int32 nodeId)
298 {
299 auto frameNode = SliderModelNG::CreateFrameNode(nodeId);
300 CHECK_NULL_RETURN(frameNode, nullptr);
301 frameNode->IncRefCount();
302 return AceType::RawPtr(frameNode);
303 }
304
createCanvasNode(ArkUI_Int32 nodeId)305 void* createCanvasNode(ArkUI_Int32 nodeId)
306 {
307 auto frameNode = CanvasModelNG::CreateFrameNode(nodeId);
308 frameNode->IncRefCount();
309 return AceType::RawPtr(frameNode);
310 }
311
createDatePickerNode(ArkUI_Int32 nodeId)312 void* createDatePickerNode(ArkUI_Int32 nodeId)
313 {
314 auto frameNode = DatePickerModelNG::CreateFrameNode(nodeId);
315 CHECK_NULL_RETURN(frameNode, nullptr);
316 frameNode->IncRefCount();
317 return AceType::RawPtr(frameNode);
318 }
319
createTimePickerNode(ArkUI_Int32 nodeId)320 void* createTimePickerNode(ArkUI_Int32 nodeId)
321 {
322 auto frameNode = TimePickerModelNG::CreateFrameNode(nodeId);
323 CHECK_NULL_RETURN(frameNode, nullptr);
324 frameNode->IncRefCount();
325 return AceType::RawPtr(frameNode);
326 }
327
createTextPickerNode(ArkUI_Int32 nodeId)328 void* createTextPickerNode(ArkUI_Int32 nodeId)
329 {
330 auto frameNode = TextPickerModelNG::CreateFrameNode(nodeId);
331 CHECK_NULL_RETURN(frameNode, nullptr);
332 frameNode->IncRefCount();
333 return AceType::RawPtr(frameNode);
334 }
335
createCalendarPickerNode(ArkUI_Int32 nodeId)336 void* createCalendarPickerNode(ArkUI_Int32 nodeId)
337 {
338 auto frameNode = CalendarPickerModelNG::CreateFrameNode(nodeId);
339 CHECK_NULL_RETURN(frameNode, nullptr);
340 frameNode->IncRefCount();
341 return AceType::RawPtr(frameNode);
342 }
343
createCustomNode(ArkUI_Int32 nodeId)344 void* createCustomNode(ArkUI_Int32 nodeId)
345 {
346 auto frameNode = FrameNode::CreateFrameNode("Custom", nodeId, AceType::MakeRefPtr<CustomPattern>());
347 CHECK_NULL_RETURN(frameNode, nullptr);
348 frameNode->IncRefCount();
349 return AceType::RawPtr(frameNode);
350 }
351
createNavigationNode(ArkUI_Int32 nodeId)352 void* createNavigationNode(ArkUI_Int32 nodeId)
353 {
354 auto frameNode = NavigationModelNG::CreateFrameNode(nodeId);
355 frameNode->IncRefCount();
356 return AceType::RawPtr(frameNode);
357 }
358
createWaterFlowNode(ArkUI_Int32 nodeId)359 void* createWaterFlowNode(ArkUI_Int32 nodeId)
360 {
361 auto frameNode = WaterFlowModelNG::CreateFrameNode(nodeId);
362 CHECK_NULL_RETURN(frameNode, nullptr);
363 frameNode->IncRefCount();
364 return AceType::RawPtr(frameNode);
365 }
366
createFlowItemNode(ArkUI_Int32 nodeId)367 void* createFlowItemNode(ArkUI_Int32 nodeId)
368 {
369 auto frameNode = WaterFlowItemModelNG::CreateFrameNode(nodeId);
370 CHECK_NULL_RETURN(frameNode, nullptr);
371 frameNode->IncRefCount();
372 return AceType::RawPtr(frameNode);
373 }
374
createRelativeContainerNode(ArkUI_Int32 nodeId)375 void* createRelativeContainerNode(ArkUI_Int32 nodeId)
376 {
377 auto frameNode = RelativeContainerModelNG::CreateFrameNode(nodeId);
378 CHECK_NULL_RETURN(frameNode, nullptr);
379 frameNode->IncRefCount();
380 return AceType::RawPtr(frameNode);
381 }
382
createGridNode(ArkUI_Int32 nodeId)383 void* createGridNode(ArkUI_Int32 nodeId)
384 {
385 auto frameNode = GridModelNG::CreateFrameNode(nodeId);
386 CHECK_NULL_RETURN(frameNode, nullptr);
387 frameNode->IncRefCount();
388 return AceType::RawPtr(frameNode);
389 }
390
createTabsNode(ArkUI_Int32 nodeId)391 void* createTabsNode(ArkUI_Int32 nodeId)
392 {
393 auto frameNode = TabsModelNG::CreateFrameNode(nodeId);
394 frameNode->IncRefCount();
395 return AceType::RawPtr(frameNode);
396 }
397
createGridItemNode(ArkUI_Int32 nodeId)398 void* createGridItemNode(ArkUI_Int32 nodeId)
399 {
400 auto frameNode = GridItemModelNG::CreateFrameNode(nodeId);
401 CHECK_NULL_RETURN(frameNode, nullptr);
402 frameNode->IncRefCount();
403 return AceType::RawPtr(frameNode);
404 }
405
createRadioNode(ArkUI_Int32 nodeId)406 void* createRadioNode(ArkUI_Int32 nodeId)
407 {
408 auto frameNode = RadioModelNG::CreateFrameNode(nodeId);
409 CHECK_NULL_RETURN(frameNode, nullptr);
410 frameNode->IncRefCount();
411 return AceType::RawPtr(frameNode);
412 }
413
createBlankNode(ArkUI_Int32 nodeId)414 void* createBlankNode(ArkUI_Int32 nodeId)
415 {
416 auto frameNode = BlankModelNG::CreateFrameNode(nodeId);
417 CHECK_NULL_RETURN(frameNode, nullptr);
418 frameNode->IncRefCount();
419 return AceType::RawPtr(frameNode);
420 }
421
createDividerNode(ArkUI_Int32 nodeId)422 void* createDividerNode(ArkUI_Int32 nodeId)
423 {
424 auto frameNode = DividerModelNG::CreateFrameNode(nodeId);
425 CHECK_NULL_RETURN(frameNode, nullptr);
426 frameNode->IncRefCount();
427 return AceType::RawPtr(frameNode);
428 }
429
createSearchNode(ArkUI_Int32 nodeId)430 void* createSearchNode(ArkUI_Int32 nodeId)
431 {
432 auto frameNode = SearchModelNG::CreateFrameNode(nodeId);
433 CHECK_NULL_RETURN(frameNode, nullptr);
434 frameNode->IncRefCount();
435 return AceType::RawPtr(frameNode);
436 }
437
createGridRowNode(ArkUI_Int32 nodeId)438 void* createGridRowNode(ArkUI_Int32 nodeId)
439 {
440 auto frameNode = GridRowModelNG::CreateFrameNode(nodeId);
441 CHECK_NULL_RETURN(frameNode, nullptr);
442 frameNode->IncRefCount();
443 return AceType::RawPtr(frameNode);
444 }
445
createGridColNode(ArkUI_Int32 nodeId)446 void* createGridColNode(ArkUI_Int32 nodeId)
447 {
448 auto frameNode = GridColModelNG::CreateFrameNode(nodeId);
449 CHECK_NULL_RETURN(frameNode, nullptr);
450 frameNode->IncRefCount();
451 return AceType::RawPtr(frameNode);
452 }
453
createCircleNode(ArkUI_Int32 nodeId)454 void* createCircleNode(ArkUI_Int32 nodeId)
455 {
456 auto frameNode = CircleModelNG::CreateFrameNode(nodeId);
457 CHECK_NULL_RETURN(frameNode, nullptr);
458 frameNode->IncRefCount();
459 return AceType::RawPtr(frameNode);
460 }
461
createTabContentNode(ArkUI_Int32 nodeId)462 void* createTabContentNode(ArkUI_Int32 nodeId)
463 {
464 auto frameNode = TabContentModelNG::CreateFrameNode(nodeId);
465 CHECK_NULL_RETURN(frameNode, nullptr);
466 frameNode->IncRefCount();
467 return AceType::RawPtr(frameNode);
468 }
469
createImageAnimatorNode(ArkUI_Int32 nodeId)470 void* createImageAnimatorNode(ArkUI_Int32 nodeId)
471 {
472 auto frameNode = ImageAnimatorModelNG::CreateFrameNode(nodeId);
473 frameNode->IncRefCount();
474 return AceType::RawPtr(frameNode);
475 }
476
createAlphabetIndexerNode(ArkUI_Int32 nodeId)477 void* createAlphabetIndexerNode(ArkUI_Int32 nodeId)
478 {
479 auto frameNode = IndexerModelNG::CreateFrameNode(nodeId);
480 frameNode->IncRefCount();
481 return AceType::RawPtr(frameNode);
482 }
483
createSelectNode(ArkUI_Int32 nodeId)484 void* createSelectNode(ArkUI_Int32 nodeId)
485 {
486 auto frameNode = SelectModelNG::CreateFrameNode(nodeId);
487 frameNode->IncRefCount();
488 return AceType::RawPtr(frameNode);
489 }
490
createCustomSpanNode(ArkUI_Int32 nodeId)491 void* createCustomSpanNode(ArkUI_Int32 nodeId)
492 {
493 auto customSpanNode = CustomSpanNode::CreateFrameNode(nodeId);
494 CHECK_NULL_RETURN(customSpanNode, nullptr);
495 customSpanNode->IncRefCount();
496 return AceType::RawPtr(customSpanNode);
497 }
498
499 using createArkUIFrameNode = void*(ArkUI_Int32 nodeId);
500
501 static createArkUIFrameNode* createArkUIFrameNodes[] = {
502 nullptr,
503 createTextNode,
504 createSpanNode,
505 createImageSpanNode,
506 createImageNode,
507 createToggleNode,
508 createLoadingProgress,
509 createTextInputNode,
510 createStackNode,
511 createScrollNode,
512 createListNode,
513 createSwiperNode,
514 createTextAreaNode,
515 createButtonNode,
516 createProgressNode,
517 createCheckBoxNode,
518 createColumnNode,
519 createRowNode,
520 createFlexNode,
521 createListItemNode,
522 createTabsNode,
523 nullptr,
524 nullptr,
525 createSliderNode,
526 createCanvasNode,
527 createRadioNode, // Radio
528 createGridNode,
529 #ifdef XCOMPONENT_SUPPORTED
530 createXComponentNode,
531 #else
532 nullptr,
533 #endif
534 nullptr,
535 createRefreshNode,
536 createRootNode,
537 createComponentRootNode,
538 createListItemGroupNode,
539 createDatePickerNode,
540 createTimePickerNode,
541 createTextPickerNode,
542 createCalendarPickerNode,
543 createGridItemNode,
544 createCustomNode,
545 createWaterFlowNode,
546 createFlowItemNode,
547 createRelativeContainerNode,
548 createBlankNode,
549 createDividerNode,
550 createSearchNode,
551 createGridRowNode,
552 createGridColNode,
553 createImageAnimatorNode,
554 createCircleNode,
555 createTabContentNode,
556 createAlphabetIndexerNode,
557 createSelectNode,
558 createNavigationNode,
559 createCustomSpanNode,
560 };
561
CreateNode(ArkUINodeType tag,ArkUI_Int32 nodeId)562 void* CreateNode(ArkUINodeType tag, ArkUI_Int32 nodeId)
563 {
564 if (tag >= sizeof(createArkUIFrameNodes) / sizeof(createArkUIFrameNode*)) {
565 TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to create %{public}d type of node", tag);
566 return nullptr;
567 }
568 CHECK_NULL_RETURN(createArkUIFrameNodes[tag], nullptr);
569 if (nodeId == ARKUI_AUTO_GENERATE_NODE_ID) {
570 nodeId = ElementRegister::GetInstance()->MakeUniqueId();
571 }
572 return createArkUIFrameNodes[tag](nodeId);
573 }
574
CreateNodeWithParams(ArkUINodeType tag,ArkUI_Int32 nodeId,const ArkUI_Params & params)575 void* CreateNodeWithParams(ArkUINodeType tag, ArkUI_Int32 nodeId, const ArkUI_Params& params)
576 {
577 if (tag >= sizeof(createArkUIFrameNodes) / sizeof(createArkUIFrameNode*)) {
578 TAG_LOGE(AceLogTag::ACE_NATIVE_NODE, "fail to create %{public}d type of node", tag);
579 return nullptr;
580 }
581 CHECK_NULL_RETURN(createArkUIFrameNodes[tag], nullptr);
582 if (nodeId == ARKUI_AUTO_GENERATE_NODE_ID) {
583 nodeId = ElementRegister::GetInstance()->MakeUniqueId();
584 }
585 #ifdef XCOMPONENT_SUPPORTED
586 if (tag == ArkUINodeType::ARKUI_XCOMPONENT) {
587 return createXComponentNodeWithParams(nodeId, params);
588 }
589 #endif
590 return createArkUIFrameNodes[tag](nodeId);
591 }
592
GetName(void * nativePtr)593 ArkUI_CharPtr GetName(void* nativePtr)
594 {
595 CHECK_NULL_RETURN(nativePtr, nullptr);
596 auto* frameNode = reinterpret_cast<UINode*>(nativePtr);
597 return frameNode->GetTag().c_str();
598 }
599
DisposeNode(void * nativePtr)600 void DisposeNode(void* nativePtr)
601 {
602 CHECK_NULL_VOID(nativePtr);
603 auto* uiNode = reinterpret_cast<UINode*>(nativePtr);
604 auto* frameNode = AceType::DynamicCast<FrameNode>(uiNode);
605 if (frameNode) {
606 frameNode->SetExtensionHandler(nullptr);
607 }
608 uiNode->DecRefCount();
609 }
610
AddChild(void * parentNode,void * childNode)611 void AddChild(void* parentNode, void* childNode)
612 {
613 CHECK_NULL_VOID(parentNode);
614 CHECK_NULL_VOID(childNode);
615 auto* parent = reinterpret_cast<UINode*>(parentNode);
616 auto* child = reinterpret_cast<UINode*>(childNode);
617 parent->AddChild(AceType::Claim(child));
618 auto* frameNode = AceType::DynamicCast<FrameNode>(child);
619 if (frameNode) {
620 frameNode->OnMountToParentDone();
621 }
622 }
623
RemoveChild(void * parentNode,void * childNode)624 void RemoveChild(void* parentNode, void* childNode)
625 {
626 CHECK_NULL_VOID(parentNode);
627 CHECK_NULL_VOID(childNode);
628 auto* parent = reinterpret_cast<UINode*>(parentNode);
629 auto* child = reinterpret_cast<UINode*>(childNode);
630 child->MarkRemoving();
631 parent->RemoveChild(AceType::Claim(child), true);
632 }
633
InsertChildAt(void * parentNode,void * childNode,int32_t position)634 void InsertChildAt(void* parentNode, void* childNode, int32_t position)
635 {
636 CHECK_NULL_VOID(parentNode);
637 CHECK_NULL_VOID(childNode);
638 auto* parent = reinterpret_cast<UINode*>(parentNode);
639 auto* child = reinterpret_cast<UINode*>(childNode);
640 parent->AddChild(AceType::Claim(child), position);
641 auto* frameNode = AceType::DynamicCast<FrameNode>(child);
642 if (frameNode) {
643 frameNode->OnMountToParentDone();
644 }
645 }
646
InsertChildAfter(void * parentNode,void * childNode,void * siblingNode)647 void InsertChildAfter(void* parentNode, void* childNode, void* siblingNode)
648 {
649 CHECK_NULL_VOID(parentNode);
650 CHECK_NULL_VOID(childNode);
651 auto* parent = reinterpret_cast<UINode*>(parentNode);
652 auto* child = reinterpret_cast<UINode*>(childNode);
653
654 if (AceType::InstanceOf<GroupNode>(parent)) {
655 auto* groupNode = AceType::DynamicCast<GroupNode>(parent);
656 groupNode->AddChildToGroup(AceType::Claim(child));
657 parent->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
658 return;
659 }
660 auto* sibling = reinterpret_cast<UINode*>(siblingNode);
661 if (sibling) {
662 parent->AddChildAfter(AceType::Claim(child), AceType::Claim(sibling));
663 } else {
664 parent->AddChild(AceType::Claim(child));
665 }
666 auto* frameNode = AceType::DynamicCast<FrameNode>(child);
667 if (frameNode) {
668 frameNode->OnMountToParentDone();
669 }
670 }
671
InsertChildBefore(void * parentNode,void * childNode,void * siblingNode)672 void InsertChildBefore(void* parentNode, void* childNode, void* siblingNode)
673 {
674 CHECK_NULL_VOID(parentNode);
675 CHECK_NULL_VOID(childNode);
676 auto* parent = reinterpret_cast<UINode*>(parentNode);
677 auto* child = reinterpret_cast<UINode*>(childNode);
678
679 if (AceType::InstanceOf<GroupNode>(parent)) {
680 auto* groupNode = AceType::DynamicCast<GroupNode>(parent);
681 groupNode->AddChildToGroup(AceType::Claim(child));
682 parent->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
683 return;
684 }
685 auto* sibling = reinterpret_cast<UINode*>(siblingNode);
686 if (sibling) {
687 parent->AddChildBefore(AceType::Claim(child), AceType::Claim(sibling));
688 } else {
689 parent->AddChild(AceType::Claim(child));
690 }
691 auto* frameNode = AceType::DynamicCast<FrameNode>(child);
692 if (frameNode) {
693 frameNode->OnMountToParentDone();
694 }
695 }
696
RegisterCompanion(void * node,int peerId,ArkUI_Int32 flags)697 void RegisterCompanion(void* node, int peerId, ArkUI_Int32 flags)
698 {
699 if (flags == ArkUIAPINodeFlags::NONE) {
700 return;
701 }
702 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(node));
703 if (frameNode) {
704 // create extension and set to frameNode extension holder.
705 auto companion = AceType::MakeRefPtr<ExtensionCompanionNode>(peerId, flags, node);
706 frameNode->SetExtensionHandler(companion);
707 }
708 }
709
GetCompanion(void * nodePtr)710 ExtensionCompanionNode* GetCompanion(void* nodePtr)
711 {
712 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
713 if (frameNode) {
714 return AceType::DynamicCast<ExtensionCompanionNode>(frameNode->GetExtensionHandler());
715 }
716 return nullptr;
717 }
718
SetCustomCallback(ArkUIVMContext context,void * nodePtr,ArkUI_Int32 callback)719 void SetCustomCallback(ArkUIVMContext context, void* nodePtr, ArkUI_Int32 callback)
720 {
721 auto* node = GetCompanion(nodePtr);
722 CHECK_NULL_VOID(node);
723 node->SetCallbackId(context, callback);
724 }
725
SetCallbackMethod(ArkUIAPICallbackMethod * method)726 void SetCallbackMethod(ArkUIAPICallbackMethod* method)
727 {
728 callbacks = method;
729 }
730
GetCallbackMethod()731 ArkUIAPICallbackMethod* GetCallbackMethod()
732 {
733 return callbacks;
734 }
735
MeasureNode(ArkUIVMContext context,ArkUINodeHandle nodePtr,ArkUI_Float32 * data)736 ArkUI_Int32 MeasureNode(ArkUIVMContext context, ArkUINodeHandle nodePtr, ArkUI_Float32* data)
737 {
738 // call frameNode measure.
739 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
740 if (frameNode) {
741 std::optional<LayoutConstraintF> constraint = std::make_optional<LayoutConstraintF>();
742 //minWidth
743 constraint->minSize.SetWidth(data[0]);
744 //minHeight
745 constraint->minSize.SetHeight(data[1]);
746 //maxWidth
747 constraint->maxSize.SetWidth(data[2]);
748 //maxHeight
749 constraint->maxSize.SetHeight(data[3]);
750 //minWidth == maxWidth
751 if (data[0] == data[2]) {
752 constraint->selfIdealSize.SetWidth(data[0]);
753 }
754 //minHeight == maxHeight
755 if (data[1] == data[3]) {
756 constraint->selfIdealSize.SetHeight(data[1]);
757 }
758 //percentReferenceWidth
759 constraint->percentReference.SetWidth(data[4]);
760 //percentReferenceHeight
761 constraint->percentReference.SetHeight(data[5]);
762 frameNode->SetActive(true);
763 frameNode->Measure(constraint);
764 }
765 return 0;
766 }
767
LayoutNode(ArkUIVMContext context,ArkUINodeHandle nodePtr,ArkUI_Float32 (* data)[2])768 ArkUI_Int32 LayoutNode(ArkUIVMContext context, ArkUINodeHandle nodePtr, ArkUI_Float32 (*data)[2])
769 {
770 // call frameNode layout.
771 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
772 if (frameNode) {
773 frameNode->SetActive(true);
774 frameNode->GetGeometryNode()->SetMarginFrameOffsetX((*data)[0]);
775 frameNode->GetGeometryNode()->SetMarginFrameOffsetY((*data)[1]);
776 frameNode->Layout();
777 }
778 return 0;
779 }
780
DrawNode(ArkUIVMContext context,ArkUINodeHandle nodePtr,ArkUI_Float32 * data)781 ArkUI_Int32 DrawNode(ArkUIVMContext context, ArkUINodeHandle nodePtr, ArkUI_Float32* data)
782 {
783 // rsnode draw by data, no need to directly call.
784 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
785 if (frameNode) {
786 frameNode->SetActive(true);
787 auto task = frameNode->CreateRenderTask();
788 if (task) {
789 (*task)();
790 }
791 }
792 return 0;
793 }
794
SetAttachNodePtr(ArkUINodeHandle nodePtr,void * attachNode)795 void SetAttachNodePtr(ArkUINodeHandle nodePtr, void* attachNode)
796 {
797 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
798 if (frameNode) {
799 frameNode->SetExternalData(attachNode);
800 }
801 }
802
GetAttachNodePtr(ArkUINodeHandle nodePtr)803 void* GetAttachNodePtr(ArkUINodeHandle nodePtr)
804 {
805 auto* frameNode = AceType::DynamicCast<FrameNode>(reinterpret_cast<UINode*>(nodePtr));
806 CHECK_NULL_RETURN(frameNode, nullptr);
807 return frameNode->GetExternalData();
808 }
809
IsBuilderNode(void * nodePtr)810 ArkUI_Bool IsBuilderNode(void* nodePtr)
811 {
812 CHECK_NULL_RETURN(nodePtr, false);
813 auto* node = reinterpret_cast<UINode*>(nodePtr);
814 return static_cast<ArkUI_Int32>(node->GetNodeStatus()) != 0 ;
815 }
816 } // namespace OHOS::Ace::NG::ViewModel
817