• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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