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