1 /*
2 * Copyright (c) 2023-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 "native_interface.h"
17 #include "node/animate_impl.h"
18 #include "node/dialog_model.h"
19 #include "node/gesture_impl.h"
20 #include "node/node_model.h"
21 #include "node_extened.h"
22
23 #include "base/log/log_wrapper.h"
24
25 namespace {
26
27 constexpr int32_t CURRENT_NATIVE_NODE_API_VERSION = 1;
28 constexpr int32_t NATIVE_DIALOG_VERSION_0 = 0;
29 constexpr int32_t NATIVE_DIALOG_VERSION_1 = 1;
30 constexpr int32_t NATIVE_DIALOG_VERSION_2 = 2;
31 constexpr int32_t NATIVE_DIALOG_VERSION_3 = 3;
32
33 ArkUI_NativeNodeAPI_Compatible nodeImpl_compatible = {
34 CURRENT_NATIVE_NODE_API_VERSION,
35 OHOS::Ace::NodeModel::CreateNode,
36 OHOS::Ace::NodeModel::DisposeNode,
37 OHOS::Ace::NodeModel::AddChild,
38 OHOS::Ace::NodeModel::RemoveChild,
39 OHOS::Ace::NodeModel::InsertChildAfter,
40 OHOS::Ace::NodeModel::InsertChildBefore,
41 OHOS::Ace::NodeModel::InsertChildAt,
42 OHOS::Ace::NodeModel::SetAttribute,
43 OHOS::Ace::NodeModel::GetAttribute,
44 OHOS::Ace::NodeModel::ResetAttribute,
45 OHOS::Ace::NodeModel::RegisterNodeEvent,
46 OHOS::Ace::NodeModel::UnregisterNodeEvent,
47 OHOS::Ace::NodeModel::RegisterOnEvent,
48 OHOS::Ace::NodeModel::UnregisterOnEvent,
49 OHOS::Ace::NodeModel::MarkDirty,
50 };
51
52 ArkUI_NativeNodeAPI_1 nodeImpl_1 = {
53 CURRENT_NATIVE_NODE_API_VERSION,
54 OHOS::Ace::NodeModel::CreateNode,
55 OHOS::Ace::NodeModel::DisposeNode,
56 OHOS::Ace::NodeModel::AddChild,
57 OHOS::Ace::NodeModel::RemoveChild,
58 OHOS::Ace::NodeModel::InsertChildAfter,
59 OHOS::Ace::NodeModel::InsertChildBefore,
60 OHOS::Ace::NodeModel::InsertChildAt,
61 OHOS::Ace::NodeModel::SetAttribute,
62 OHOS::Ace::NodeModel::GetAttribute,
63 OHOS::Ace::NodeModel::ResetAttribute,
64 OHOS::Ace::NodeModel::RegisterNodeEvent,
65 OHOS::Ace::NodeModel::UnregisterNodeEvent,
66 OHOS::Ace::NodeModel::RegisterOnEvent,
67 OHOS::Ace::NodeModel::UnregisterOnEvent,
68 OHOS::Ace::NodeModel::MarkDirty,
69 OHOS::Ace::NodeModel::GetTotalChildCount,
70 OHOS::Ace::NodeModel::GetChildAt,
71 OHOS::Ace::NodeModel::GetFirstChild,
72 OHOS::Ace::NodeModel::GetLastChild,
73 OHOS::Ace::NodeModel::GetPreviousSibling,
74 OHOS::Ace::NodeModel::GetNextSibling,
75 OHOS::Ace::NodeModel::RegisterNodeCustomEvent,
76 OHOS::Ace::NodeModel::UnregisterNodeCustomEvent,
77 OHOS::Ace::NodeModel::RegisterNodeCustomReceiver,
78 OHOS::Ace::NodeModel::UnregisterNodeCustomEventReceiver,
79 OHOS::Ace::NodeModel::SetMeasuredSize,
80 OHOS::Ace::NodeModel::SetLayoutPosition,
81 OHOS::Ace::NodeModel::GetMeasuredSize,
82 OHOS::Ace::NodeModel::GetLayoutPosition,
83 OHOS::Ace::NodeModel::MeasureNode,
84 OHOS::Ace::NodeModel::LayoutNode,
85 OHOS::Ace::NodeModel::AddNodeEventReceiver,
86 OHOS::Ace::NodeModel::RemoveNodeEventReceiver,
87 OHOS::Ace::NodeModel::AddNodeCustomEventReceiver,
88 OHOS::Ace::NodeModel::RemoveNodeCustomEventReceiver,
89 OHOS::Ace::NodeModel::SetUserData,
90 OHOS::Ace::NodeModel::GetUserData,
91 OHOS::Ace::NodeModel::SetLengthMetricUnit,
92 OHOS::Ace::NodeModel::GetParent,
93 OHOS::Ace::NodeModel::RemoveAllChildren,
94 };
95
96 ArkUI_NativeDialogAPI_1 dialogImpl_1 = {
97 OHOS::Ace::DialogModel::Create,
98 OHOS::Ace::DialogModel::Dispose,
99 OHOS::Ace::DialogModel::SetContent,
100 OHOS::Ace::DialogModel::RemoveContent,
101 OHOS::Ace::DialogModel::SetContentAlignment,
102 OHOS::Ace::DialogModel::ResetContentAlignment,
103 OHOS::Ace::DialogModel::SetModalMode,
104 OHOS::Ace::DialogModel::SetAutoCancel,
105 OHOS::Ace::DialogModel::SetMask,
106 OHOS::Ace::DialogModel::SetBackgroundColor,
107 OHOS::Ace::DialogModel::SetCornerRadius,
108 OHOS::Ace::DialogModel::SetGridColumnCount,
109 OHOS::Ace::DialogModel::EnableCustomStyle,
110 OHOS::Ace::DialogModel::EnableCustomAnimation,
111 OHOS::Ace::DialogModel::RegisterOnWillDismiss,
112 OHOS::Ace::DialogModel::Show,
113 OHOS::Ace::DialogModel::Close,
114 OHOS::Ace::DialogModel::RegisterOnWillDismissWithUserData,
115 };
116
117 ArkUI_NativeDialogAPI_2 dialogImpl_2 = {
118 dialogImpl_1,
119 OHOS::Ace::DialogModel::SetKeyboardAvoidDistance,
120 OHOS::Ace::DialogModel::SetLevelMode,
121 OHOS::Ace::DialogModel::SetLevelUniqueId,
122 OHOS::Ace::DialogModel::SetImmersiveMode,
123 };
124
125 ArkUI_NativeDialogAPI_3 dialogImpl_3 = {
126 dialogImpl_1,
127 dialogImpl_2,
128 OHOS::Ace::DialogModel::SetLevelOrder,
129 OHOS::Ace::DialogModel::RegisterOnWillAppear,
130 OHOS::Ace::DialogModel::RegisterOnDidAppear,
131 OHOS::Ace::DialogModel::RegisterOnWillDisappear,
132 OHOS::Ace::DialogModel::RegisterOnDidDisappear,
133 OHOS::Ace::DialogModel::SetBorderWidth,
134 OHOS::Ace::DialogModel::SetBorderColor,
135 OHOS::Ace::DialogModel::SetBorderStyle,
136 OHOS::Ace::DialogModel::SetWidth,
137 OHOS::Ace::DialogModel::SetHeight,
138 OHOS::Ace::DialogModel::SetShadow,
139 OHOS::Ace::DialogModel::SetCustomShadow,
140 OHOS::Ace::DialogModel::SetBackgroundBlurStyle,
141 OHOS::Ace::DialogModel::SetKeyboardAvoidMode,
142 OHOS::Ace::DialogModel::EnableHoverMode,
143 OHOS::Ace::DialogModel::SetHoverModeArea,
144 OHOS::Ace::DialogModel::SetFocusable,
145 };
146
147 constexpr int32_t CURRENT_NATIVE_GESTURE_API_VERSION = 1;
148 ArkUI_NativeGestureAPI_1 gestureImpl_1 = {
149 CURRENT_NATIVE_GESTURE_API_VERSION,
150 OHOS::Ace::GestureModel::CreateTapGesture,
151 OHOS::Ace::GestureModel::CreateLongPressGesture,
152 OHOS::Ace::GestureModel::CreatePanGesture,
153 OHOS::Ace::GestureModel::CreatePinchGesture,
154 OHOS::Ace::GestureModel::CreateRotationGesture,
155 OHOS::Ace::GestureModel::CreateSwipeGesture,
156 OHOS::Ace::GestureModel::CreateGroupGesture,
157 OHOS::Ace::GestureModel::DisposeGesture,
158 OHOS::Ace::GestureModel::AddChildGesture,
159 OHOS::Ace::GestureModel::RemoveChildGesture,
160 OHOS::Ace::GestureModel::SetGestureEventTarget,
161 OHOS::Ace::GestureModel::AddGestureToNode,
162 OHOS::Ace::GestureModel::RemoveGestureFromNode,
163 OHOS::Ace::GestureModel::SetGestureInterrupterToNode,
164 OHOS::Ace::GestureModel::GetGestureType,
165 OHOS::Ace::GestureModel::SetInnerGestureParallelTo,
166 OHOS::Ace::GestureModel::CreateTapGestureWithDistanceThreshold,
167 };
168
169 ArkUI_NativeGestureAPI_2 gestureImpl_2 = {
170 &gestureImpl_1,
171 OHOS::Ace::GestureModel::SetGestureInterrupterToNodeWithUserData,
172 };
173
174 ArkUI_NativeAnimateAPI_1 animateImpl_1 = {
175 OHOS::Ace::AnimateModel::AnimateTo,
176 OHOS::Ace::AnimateModel::KeyframeAnimateTo,
177 OHOS::Ace::AnimateModel::CreateAnimator,
178 OHOS::Ace::AnimateModel::DisposeAnimator,
179 };
180
181 } // namespace
182
183 #ifdef __cplusplus
184 extern "C" {
185 #endif
186
OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type,int32_t version)187 void* OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type, int32_t version)
188 {
189 if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
190 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
191 "fail to get %{public}d node api family of %{public}d version, impl library is not found", type, version);
192 return nullptr;
193 }
194 switch (type) {
195 case ARKUI_NATIVE_NODE: {
196 switch (version) {
197 case 0:
198 case 1:
199 return &nodeImpl_compatible;
200 default: {
201 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
202 "fail to get basic node api family, version is incorrect: %{public}d", version);
203 return nullptr;
204 }
205 }
206 break;
207 }
208 case ARKUI_NATIVE_DIALOG: {
209 switch (version) {
210 case NATIVE_DIALOG_VERSION_0:
211 case NATIVE_DIALOG_VERSION_1:
212 return &dialogImpl_1;
213 case NATIVE_DIALOG_VERSION_2:
214 return &dialogImpl_2;
215 case NATIVE_DIALOG_VERSION_3:
216 return &dialogImpl_3;
217 default: {
218 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
219 "fail to get dialog api family, version is incorrect: %{public}d", version);
220 return nullptr;
221 }
222 }
223 }
224 case ARKUI_NATIVE_GESTURE: {
225 switch (version) {
226 case 0:
227 case 1:
228 return &gestureImpl_1;
229 case 2:
230 return &gestureImpl_2;
231 default: {
232 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
233 "fail to get gesture api family, version is incorrect: %{public}d", version);
234 return nullptr;
235 }
236 }
237 break;
238 }
239 default: {
240 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
241 "fail to get %{public}d node api family, version is incorrect: %{public}d", type, version);
242 return nullptr;
243 }
244 }
245 }
246
OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type,int32_t version)247 void* OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type, int32_t version)
248 {
249 return OH_ArkUI_QueryModuleInterface(type, version);
250 }
251
OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type,const char * structName)252 void* OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type, const char* structName)
253 {
254 if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
255 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
256 "fail to get %{public}d node api family, impl library is not found", type);
257 return nullptr;
258 }
259 switch (type) {
260 case ARKUI_NATIVE_NODE:
261 if (strcmp(structName, "ArkUI_NativeNodeAPI_1") == 0) {
262 return &nodeImpl_1;
263 }
264 break;
265 case ARKUI_NATIVE_DIALOG:
266 if (strcmp(structName, "ArkUI_NativeDialogAPI_1") == 0) {
267 return &dialogImpl_1;
268 } else if (strcmp(structName, "ArkUI_NativeDialogAPI_2") == 0) {
269 return &dialogImpl_2;
270 } else if (strcmp(structName, "ArkUI_NativeDialogAPI_3") == 0) {
271 return &dialogImpl_3;
272 }
273 break;
274 case ARKUI_NATIVE_GESTURE:
275 if (strcmp(structName, "ArkUI_NativeGestureAPI_1") == 0) {
276 return &gestureImpl_1;
277 } else if (strcmp(structName, "ArkUI_NativeGestureAPI_2") == 0) {
278 return &gestureImpl_2;
279 }
280 break;
281 case ARKUI_NATIVE_ANIMATE:
282 if (strcmp(structName, "ArkUI_NativeAnimateAPI_1") == 0) {
283 return &animateImpl_1;
284 }
285 break;
286 default:
287 break;
288 }
289 return nullptr;
290 }
291
292 #ifdef __cplusplus
293 };
294 #endif
295