1 /*
2 * Copyright (c) 2024 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 <cstdint>
17 #include <cstdlib>
18 #include <vector>
19
20 #include "native_type.h"
21 #include "node_model.h"
22 #include "node_extened.h"
23
24 #include "base/utils/utils.h"
25 #include "base/error/error_code.h"
26 #include "core/interfaces/arkoala/arkoala_api.h"
27 #include "core/components_v2/inspector/inspector_constants.h"
28
29 #ifdef __cplusplus
30 extern "C" {
31 #endif
32
OH_ArkUI_NodeUtils_GetLayoutSize(ArkUI_NodeHandle node,ArkUI_IntSize * size)33 int32_t OH_ArkUI_NodeUtils_GetLayoutSize(ArkUI_NodeHandle node, ArkUI_IntSize* size)
34 {
35 if (node == nullptr) {
36 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
37 }
38 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
39 ArkUI_Int32* tempSize = new ArkUI_Int32[2];
40 impl->getNodeModifiers()->getFrameNodeModifier()->getLayoutSize(node->uiNodeHandle, tempSize);
41 size->width = tempSize[0];
42 size->height = tempSize[1];
43 return OHOS::Ace::ERROR_CODE_NO_ERROR;
44 }
45
OH_ArkUI_NodeUtils_GetLayoutPosition(ArkUI_NodeHandle node,ArkUI_IntOffset * localOffset)46 int32_t OH_ArkUI_NodeUtils_GetLayoutPosition(ArkUI_NodeHandle node, ArkUI_IntOffset* localOffset)
47 {
48 if (node == nullptr) {
49 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
50 }
51 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
52 auto value = impl->getNodeModifiers()->getFrameNodeModifier()->getLayoutPositionWithoutMargin(node->uiNodeHandle);
53 localOffset->x = static_cast<int32_t>(value[0]);
54 localOffset->y = static_cast<int32_t>(value[1]);
55
56 return OHOS::Ace::ERROR_CODE_NO_ERROR;
57 }
58
OH_ArkUI_NodeUtils_GetLayoutPositionInWindow(ArkUI_NodeHandle node,ArkUI_IntOffset * globalOffset)59 int32_t OH_ArkUI_NodeUtils_GetLayoutPositionInWindow(ArkUI_NodeHandle node, ArkUI_IntOffset* globalOffset)
60 {
61 if (node == nullptr) {
62 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
63 }
64 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
65 ArkUI_Float32 tempOffset[2];
66 impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToWindow(node->uiNodeHandle, &tempOffset, false);
67 globalOffset->x = tempOffset[0];
68 globalOffset->y = tempOffset[1];
69
70 return OHOS::Ace::ERROR_CODE_NO_ERROR;
71 }
72
OH_ArkUI_NodeUtils_GetLayoutPositionInScreen(ArkUI_NodeHandle node,ArkUI_IntOffset * screenOffset)73 int32_t OH_ArkUI_NodeUtils_GetLayoutPositionInScreen(ArkUI_NodeHandle node, ArkUI_IntOffset* screenOffset)
74 {
75 if (node == nullptr) {
76 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
77 }
78 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
79 ArkUI_Float32 tempOffset[2];
80 impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToScreen(node->uiNodeHandle, &tempOffset, false);
81 screenOffset->x = tempOffset[0];
82 screenOffset->y = tempOffset[1];
83
84 return OHOS::Ace::ERROR_CODE_NO_ERROR;
85 }
86
OH_ArkUI_NodeUtils_GetPositionWithTranslateInWindow(ArkUI_NodeHandle node,ArkUI_IntOffset * translateOffset)87 int32_t OH_ArkUI_NodeUtils_GetPositionWithTranslateInWindow(ArkUI_NodeHandle node, ArkUI_IntOffset* translateOffset)
88 {
89 if (node == nullptr) {
90 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
91 }
92 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
93 ArkUI_Float32 tempOffset[2];
94 impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToWindowWithTransform(
95 node->uiNodeHandle, &tempOffset, false);
96 translateOffset->x = tempOffset[0];
97 translateOffset->y = tempOffset[1];
98
99 return OHOS::Ace::ERROR_CODE_NO_ERROR;
100 }
101
OH_ArkUI_NodeUtils_GetPositionWithTranslateInScreen(ArkUI_NodeHandle node,ArkUI_IntOffset * translateOffset)102 int32_t OH_ArkUI_NodeUtils_GetPositionWithTranslateInScreen(ArkUI_NodeHandle node, ArkUI_IntOffset* translateOffset)
103 {
104 if (node == nullptr) {
105 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
106 }
107 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
108 ArkUI_Float32 tempOffset[2];
109 impl->getNodeModifiers()->getFrameNodeModifier()->getPositionToScreenWithTransform(
110 node->uiNodeHandle, &tempOffset, false);
111 translateOffset->x = tempOffset[0];
112 translateOffset->y = tempOffset[1];
113
114 return OHOS::Ace::ERROR_CODE_NO_ERROR;
115 }
116
OH_ArkUI_RegisterSystemColorModeChangeEvent(ArkUI_NodeHandle node,void * userData,void (* onColorModeChange)(ArkUI_SystemColorMode colorMode,void * userData))117 int32_t OH_ArkUI_RegisterSystemColorModeChangeEvent(
118 ArkUI_NodeHandle node, void* userData, void (*onColorModeChange)(ArkUI_SystemColorMode colorMode, void* userData))
119 {
120 if (node == nullptr) {
121 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
122 }
123 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
124 impl->getNodeModifiers()->getFrameNodeModifier()->setSystemColorModeChangeEvent(
125 node->uiNodeHandle, userData, reinterpret_cast<void*>(onColorModeChange));
126
127 return OHOS::Ace::ERROR_CODE_NO_ERROR;
128 }
129
OH_ArkUI_UnregisterSystemColorModeChangeEvent(ArkUI_NodeHandle node)130 void OH_ArkUI_UnregisterSystemColorModeChangeEvent(ArkUI_NodeHandle node)
131 {
132 if (node == nullptr) {
133 return;
134 }
135 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
136 impl->getNodeModifiers()->getFrameNodeModifier()->resetSystemColorModeChangeEvent(node->uiNodeHandle);
137 }
138
OH_ArkUI_RegisterSystemFontStyleChangeEvent(ArkUI_NodeHandle node,void * userData,void (* onFontStyleChange)(ArkUI_SystemFontStyleEvent * event,void * userData))139 int32_t OH_ArkUI_RegisterSystemFontStyleChangeEvent(
140 ArkUI_NodeHandle node, void* userData, void (*onFontStyleChange)(ArkUI_SystemFontStyleEvent* event, void* userData))
141 {
142 if (node == nullptr) {
143 return OHOS::Ace::ERROR_CODE_PARAM_INVALID;
144 }
145 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
146 impl->getNodeModifiers()->getFrameNodeModifier()->setSystemFontStyleChangeEvent(
147 node->uiNodeHandle, userData, reinterpret_cast<void*>(onFontStyleChange));
148
149 return OHOS::Ace::ERROR_CODE_NO_ERROR;
150 }
151
OH_ArkUI_UnregisterSystemFontStyleChangeEvent(ArkUI_NodeHandle node)152 void OH_ArkUI_UnregisterSystemFontStyleChangeEvent(ArkUI_NodeHandle node)
153 {
154 if (node == nullptr) {
155 return;
156 }
157 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
158 impl->getNodeModifiers()->getFrameNodeModifier()->resetSystemFontStyleChangeEvent(node->uiNodeHandle);
159 }
160
OH_ArkUI_SystemFontStyleEvent_GetFontSizeScale(const ArkUI_SystemFontStyleEvent * event)161 float OH_ArkUI_SystemFontStyleEvent_GetFontSizeScale(const ArkUI_SystemFontStyleEvent* event)
162 {
163 return event->fontSize;
164 }
165
OH_ArkUI_SystemFontStyleEvent_GetFontWeightScale(const ArkUI_SystemFontStyleEvent * event)166 float OH_ArkUI_SystemFontStyleEvent_GetFontWeightScale(const ArkUI_SystemFontStyleEvent* event)
167 {
168 return event->fontWeight;
169 }
170
OH_ArkUI_NodeUtils_AddCustomProperty(ArkUI_NodeHandle node,const char * name,const char * value)171 void OH_ArkUI_NodeUtils_AddCustomProperty(ArkUI_NodeHandle node, const char* name, const char* value)
172 {
173 if (node == nullptr) {
174 return;
175 }
176 if (name == nullptr || value == nullptr) {
177 LOGF("AddCustomProperty input params name or value is nullptr");
178 abort();
179 }
180 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
181 impl->getNodeModifiers()->getFrameNodeModifier()->addCustomProperty(node->uiNodeHandle, name, value);
182 }
183
OH_ArkUI_NodeUtils_RemoveCustomProperty(ArkUI_NodeHandle node,const char * name)184 void OH_ArkUI_NodeUtils_RemoveCustomProperty(ArkUI_NodeHandle node, const char* name)
185 {
186 if (node == nullptr) {
187 return;
188 }
189 if (name == nullptr) {
190 LOGF("RemoveCustomProperty input params name is nullptr");
191 abort();
192 }
193 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
194 impl->getNodeModifiers()->getFrameNodeModifier()->removeCustomProperty(node->uiNodeHandle, name);
195 }
196
OH_ArkUI_NodeUtils_GetCustomProperty(ArkUI_NodeHandle node,const char * name,ArkUI_CustomProperty ** handle)197 int32_t OH_ArkUI_NodeUtils_GetCustomProperty(ArkUI_NodeHandle node, const char* name, ArkUI_CustomProperty** handle)
198 {
199 if (node == nullptr || name == nullptr) {
200 return ARKUI_ERROR_CODE_PARAM_INVALID;
201 }
202 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
203 char* value = nullptr;
204 impl->getNodeModifiers()->getFrameNodeModifier()->getCustomProperty(node->uiNodeHandle, name, &value);
205 *handle = new ArkUI_CustomProperty({ .value = value });
206
207 return OHOS::Ace::ERROR_CODE_NO_ERROR;
208 }
209
GetArkUINode(ArkUINodeHandle node)210 ArkUI_NodeHandle GetArkUINode(ArkUINodeHandle node)
211 {
212 CHECK_NULL_RETURN(node, nullptr);
213 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
214 void* attachNode = impl->getExtendedAPI()->getAttachNodePtr(node);
215 if (attachNode) {
216 return reinterpret_cast<ArkUI_NodeHandle>(attachNode);
217 }
218 ArkUI_Node* arkUINode = new ArkUI_Node({ -1, node, false });
219 impl->getExtendedAPI()->setAttachNodePtr((arkUINode)->uiNodeHandle, reinterpret_cast<void*>(arkUINode));
220 return reinterpret_cast<ArkUI_NodeHandle>(arkUINode);
221 }
222
OH_ArkUI_NodeUtils_GetActiveChildrenInfo(ArkUI_NodeHandle head,ArkUI_ActiveChildrenInfo ** handle)223 int32_t OH_ArkUI_NodeUtils_GetActiveChildrenInfo(ArkUI_NodeHandle head, ArkUI_ActiveChildrenInfo** handle)
224 {
225 CHECK_NULL_RETURN(head, ARKUI_ERROR_CODE_PARAM_INVALID);
226 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
227 CHECK_NULL_RETURN(impl, ARKUI_ERROR_CODE_PARAM_INVALID);
228 ArkUINodeHandle* innerNodes = nullptr;
229 int32_t totalSize = 0;
230 impl->getNodeModifiers()->getFrameNodeModifier()->getActiveChildrenInfo(
231 head->uiNodeHandle, &innerNodes, &totalSize);
232 *handle = new ArkUI_ActiveChildrenInfo({ .nodeList = nullptr, .nodeCount = totalSize });
233 (*handle)->nodeCount = totalSize;
234 if (totalSize > 0) {
235 (*handle)->nodeList = new ArkUI_NodeHandle[totalSize] {};
236 for (int32_t i = 0; i < totalSize; i++) {
237 ((*handle)->nodeList[i]) = GetArkUINode(innerNodes[i]);
238 }
239 }
240 delete[] innerNodes;
241 return OHOS::Ace::ERROR_CODE_NO_ERROR;
242 }
243
OH_ArkUI_NodeUtils_GetParentInPageTree(ArkUI_NodeHandle node)244 ArkUI_NodeHandle OH_ArkUI_NodeUtils_GetParentInPageTree(ArkUI_NodeHandle node)
245 {
246 if (node == nullptr) {
247 return nullptr;
248 }
249 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
250 auto* attachNode = impl->getNodeModifiers()->getFrameNodeModifier()->getParent(node->uiNodeHandle);
251 return GetArkUINode(attachNode);
252 }
253
OH_ArkUI_NodeUtils_GetCurrentPageRootNode(ArkUI_NodeHandle node)254 ArkUI_NodeHandle OH_ArkUI_NodeUtils_GetCurrentPageRootNode(ArkUI_NodeHandle node)
255 {
256 if (node == nullptr) {
257 return nullptr;
258 }
259 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
260 auto* attachNode = impl->getNodeModifiers()->getFrameNodeModifier()->getCurrentPageRootNode(node->uiNodeHandle);
261 return GetArkUINode(attachNode);
262 }
263
OH_ArkUI_NodeUtils_IsCreatedByNDK(ArkUI_NodeHandle node)264 bool OH_ArkUI_NodeUtils_IsCreatedByNDK(ArkUI_NodeHandle node)
265 {
266 if (node == nullptr) {
267 return 0;
268 }
269 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
270 return impl->getNodeModifiers()->getFrameNodeModifier()->getNodeTag(node->uiNodeHandle);
271 }
272
OH_ArkUI_NodeUtils_GetNodeType(ArkUI_NodeHandle node)273 int32_t OH_ArkUI_NodeUtils_GetNodeType(ArkUI_NodeHandle node)
274 {
275 if (node == nullptr) {
276 return -1;
277 }
278 if (node->type != -1) {
279 return node->type;
280 }
281
282 static const std::unordered_map<std::string, ArkUI_NodeType> nodeTypeMap = {
283 { OHOS::Ace::V2::TEXT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT },
284 { OHOS::Ace::V2::SPAN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SPAN },
285 { OHOS::Ace::V2::IMAGE_SPAN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE_SPAN },
286 { OHOS::Ace::V2::IMAGE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE },
287 { OHOS::Ace::V2::TOGGLE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TOGGLE },
288 { OHOS::Ace::V2::LOADING_PROGRESS_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LOADING_PROGRESS },
289 { OHOS::Ace::V2::TEXTINPUT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_INPUT },
290 { OHOS::Ace::V2::TEXTAREA_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_AREA },
291 { OHOS::Ace::V2::BUTTON_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_BUTTON },
292 { OHOS::Ace::V2::PROGRESS_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_PROGRESS },
293 { OHOS::Ace::V2::CHECK_BOX_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CHECKBOX },
294 { OHOS::Ace::V2::XCOMPONENT_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_XCOMPONENT },
295 { OHOS::Ace::V2::DATE_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_DATE_PICKER },
296 { OHOS::Ace::V2::TIME_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TIME_PICKER },
297 { OHOS::Ace::V2::TEXT_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_TEXT_PICKER },
298 { OHOS::Ace::V2::CALENDAR_PICKER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CALENDAR_PICKER },
299 { OHOS::Ace::V2::SLIDER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SLIDER },
300 { OHOS::Ace::V2::RADIO_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_RADIO },
301 { OHOS::Ace::V2::IMAGE_ANIMATOR_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_IMAGE_ANIMATOR },
302 { OHOS::Ace::V2::STACK_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_STACK },
303 { OHOS::Ace::V2::SWIPER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SWIPER },
304 { OHOS::Ace::V2::SCROLL_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_SCROLL },
305 { OHOS::Ace::V2::LIST_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST },
306 { OHOS::Ace::V2::LIST_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST_ITEM },
307 { OHOS::Ace::V2::LIST_ITEM_GROUP_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_LIST_ITEM_GROUP },
308 { OHOS::Ace::V2::COLUMN_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_COLUMN },
309 { OHOS::Ace::V2::ROW_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_ROW },
310 { OHOS::Ace::V2::FLEX_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_FLEX },
311 { OHOS::Ace::V2::REFRESH_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_REFRESH },
312 { OHOS::Ace::V2::WATERFLOW_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_WATER_FLOW },
313 { OHOS::Ace::V2::FLOW_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_FLOW_ITEM },
314 { OHOS::Ace::V2::RELATIVE_CONTAINER_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_RELATIVE_CONTAINER },
315 { OHOS::Ace::V2::GRID_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_GRID },
316 { OHOS::Ace::V2::GRID_ITEM_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_GRID_ITEM },
317 { OHOS::Ace::V2::CUSTOM_SPAN_NODE_ETS_TAG, ArkUI_NodeType::ARKUI_NODE_CUSTOM_SPAN },
318 };
319
320 const auto* impl = OHOS::Ace::NodeModel::GetFullImpl();
321 auto value = impl->getNodeModifiers()->getFrameNodeModifier()->getNodeType(node->uiNodeHandle);
322 auto iter = nodeTypeMap.find(value);
323 if (iter != nodeTypeMap.end()) {
324 return iter->second;
325 }
326 return -1;
327 }
328
OH_ArkUI_CustomProperty_Destroy(ArkUI_CustomProperty * handle)329 void OH_ArkUI_CustomProperty_Destroy(ArkUI_CustomProperty* handle)
330 {
331 delete[] handle->value;
332 handle->value = nullptr;
333 delete handle;
334 handle = nullptr;
335 }
336
OH_ArkUI_CustomProperty_GetStringValue(ArkUI_CustomProperty * handle)337 const char* OH_ArkUI_CustomProperty_GetStringValue(ArkUI_CustomProperty* handle)
338 {
339 if (!handle) {
340 LOGF("CustomProperty is nullptr");
341 abort();
342 }
343 return handle->value;
344 }
345
OH_ArkUI_ActiveChildrenInfo_Destroy(ArkUI_ActiveChildrenInfo * handle)346 void OH_ArkUI_ActiveChildrenInfo_Destroy(ArkUI_ActiveChildrenInfo* handle)
347 {
348 delete[] handle->nodeList;
349 handle->nodeList = nullptr;
350 delete handle;
351 handle = nullptr;
352 }
353
OH_ArkUI_ActiveChildrenInfo_GetNodeByIndex(ArkUI_ActiveChildrenInfo * handle,int32_t index)354 ArkUI_NodeHandle OH_ArkUI_ActiveChildrenInfo_GetNodeByIndex(ArkUI_ActiveChildrenInfo* handle, int32_t index)
355 {
356 if (!handle) {
357 LOGF("ActiveChildrenInfo is nullptr");
358 abort();
359 }
360 if (index < handle->nodeCount && index >= 0) {
361 return handle->nodeList[index];
362 }
363 return nullptr;
364 }
365
OH_ArkUI_ActiveChildrenInfo_GetCount(ArkUI_ActiveChildrenInfo * handle)366 int32_t OH_ArkUI_ActiveChildrenInfo_GetCount(ArkUI_ActiveChildrenInfo* handle)
367 {
368 if (!handle) {
369 LOGF("ActiveChildrenInfo is nullptr");
370 abort();
371 }
372 return handle->nodeCount;
373 }
374
375 #ifdef __cplusplus
376 };
377 #endif
378