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 constexpr int32_t CURRENT_NATIVE_GESTURE_API_VERSION = 1;
117 ArkUI_NativeGestureAPI_1 gestureImpl_1 = {
118 CURRENT_NATIVE_GESTURE_API_VERSION,
119 OHOS::Ace::GestureModel::CreateTapGesture,
120 OHOS::Ace::GestureModel::CreateLongPressGesture,
121 OHOS::Ace::GestureModel::CreatePanGesture,
122 OHOS::Ace::GestureModel::CreatePinchGesture,
123 OHOS::Ace::GestureModel::CreateRotationGesture,
124 OHOS::Ace::GestureModel::CreateSwipeGesture,
125 OHOS::Ace::GestureModel::CreateGroupGesture,
126 OHOS::Ace::GestureModel::DisposeGesture,
127 OHOS::Ace::GestureModel::AddChildGesture,
128 OHOS::Ace::GestureModel::RemoveChildGesture,
129 OHOS::Ace::GestureModel::SetGestureEventTarget,
130 OHOS::Ace::GestureModel::AddGestureToNode,
131 OHOS::Ace::GestureModel::RemoveGestureFromNode,
132 OHOS::Ace::GestureModel::SetGestureInterrupterToNode,
133 OHOS::Ace::GestureModel::GetGestureType,
134 OHOS::Ace::GestureModel::SetInnerGestureParallelTo,
135 OHOS::Ace::GestureModel::CreateTapGestureWithDistanceThreshold,
136 };
137
138 ArkUI_NativeAnimateAPI_1 animateImpl_1 = {
139 OHOS::Ace::AnimateModel::AnimateTo,
140 OHOS::Ace::AnimateModel::KeyframeAnimateTo,
141 OHOS::Ace::AnimateModel::CreateAnimator,
142 OHOS::Ace::AnimateModel::DisposeAnimator,
143 };
144
145 } // namespace
146
147 #ifdef __cplusplus
148 extern "C" {
149 #endif
150
OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type,int32_t version)151 void* OH_ArkUI_QueryModuleInterface(ArkUI_NativeAPIVariantKind type, int32_t version)
152 {
153 if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
154 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
155 "fail to get %{public}d node api family of %{public}d version, impl library is not found", type, version);
156 return nullptr;
157 }
158 switch (type) {
159 case ARKUI_NATIVE_NODE: {
160 switch (version) {
161 case 0:
162 case 1:
163 return &nodeImpl_compatible;
164 default: {
165 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
166 "fail to get basic node api family, version is incorrect: %{public}d", version);
167 return nullptr;
168 }
169 }
170 break;
171 }
172 case ARKUI_NATIVE_DIALOG: {
173 switch (version) {
174 case 0:
175 case 1:
176 return &dialogImpl_1;
177 default: {
178 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
179 "fail to get dialog api family, version is incorrect: %{public}d", version);
180 return nullptr;
181 }
182 }
183 }
184 case ARKUI_NATIVE_GESTURE: {
185 switch (version) {
186 case 0:
187 case 1:
188 return &gestureImpl_1;
189 default: {
190 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
191 "fail to get gesture api family, version is incorrect: %{public}d", version);
192 return nullptr;
193 }
194 }
195 break;
196 }
197 default: {
198 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
199 "fail to get %{public}d node api family, version is incorrect: %{public}d", type, version);
200 return nullptr;
201 }
202 }
203 }
204
OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type,int32_t version)205 void* OH_ArkUI_GetNativeAPI(ArkUI_NativeAPIVariantKind type, int32_t version)
206 {
207 return OH_ArkUI_QueryModuleInterface(type, version);
208 }
209
OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type,const char * structName)210 void* OH_ArkUI_QueryModuleInterfaceByName(ArkUI_NativeAPIVariantKind type, const char* structName)
211 {
212 if (!OHOS::Ace::NodeModel::InitialFullImpl()) {
213 TAG_LOGE(OHOS::Ace::AceLogTag::ACE_NATIVE_NODE,
214 "fail to get %{public}d node api family, impl library is not found", type);
215 return nullptr;
216 }
217 switch (type) {
218 case ARKUI_NATIVE_NODE:
219 if (strcmp(structName, "ArkUI_NativeNodeAPI_1") == 0) {
220 return &nodeImpl_1;
221 }
222 break;
223 case ARKUI_NATIVE_DIALOG:
224 if (strcmp(structName, "ArkUI_NativeDialogAPI_1") == 0) {
225 return &dialogImpl_1;
226 }
227 break;
228 case ARKUI_NATIVE_GESTURE:
229 if (strcmp(structName, "ArkUI_NativeGestureAPI_1") == 0) {
230 return &gestureImpl_1;
231 }
232 break;
233 case ARKUI_NATIVE_ANIMATE:
234 if (strcmp(structName, "ArkUI_NativeAnimateAPI_1") == 0) {
235 return &animateImpl_1;
236 }
237 break;
238 default:
239 break;
240 }
241 return nullptr;
242 }
243
244 #ifdef __cplusplus
245 };
246 #endif
247