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