1 /*
2 * Copyright (c) 2023 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 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_nav_destination_bridge.h"
16
17 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_navigation_utils.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "bridge/declarative_frontend/jsview/js_navigation_utils.h"
20 #include "bridge/declarative_frontend/jsview/js_utils.h"
21 #include "core/components_ng/base/view_stack_model.h"
22 #include "core/components_ng/pattern/navrouter/navdestination_model_ng.h"
23 #include "bridge/declarative_frontend/jsview/js_navdestination_context.h"
24 namespace OHOS::Ace::NG {
25 constexpr int NUM_0 = 0;
26 constexpr int NUM_1 = 1;
27 constexpr int NUM_2 = 2;
28 constexpr int32_t JS_EMUN_TRANSITIONTYPE_NONE = 1;
29 constexpr int32_t JS_EMUN_TRANSITIONTYPE_TITLE = 2;
30 constexpr int32_t JS_EMUN_TRANSITIONTYPE_CONTENT = 3;
31 constexpr int32_t JS_ENUM_TRANSITIONTYPE_FADE = 4;
32 constexpr int32_t JS_ENUM_TRANSITIONTYPE_EXPLODE = 5;
33 constexpr int32_t JS_ENUM_TRANSITIONTYPE_SLIDE_RIGHT = 6;
34 constexpr int32_t JS_ENUM_TRANSITIONTYPE_SLIDE_BOTTOM = 7;
35 constexpr int32_t MIN_INFO_LENGTH = 2;
36 constexpr uint32_t ARGC_TWO = 2;
37 constexpr char MORE_BUTTON_OPTIONS_PROPERTY[] = "moreButtonOptions";
38
39 // sources in js_window_utils.h
40 enum class ApiOrientation : uint32_t {
41 BEGIN = 0,
42 UNSPECIFIED = BEGIN,
43 PORTRAIT = 1,
44 LANDSCAPE = 2,
45 PORTRAIT_INVERTED = 3,
46 LANDSCAPE_INVERTED = 4,
47 AUTO_ROTATION = 5,
48 AUTO_ROTATION_PORTRAIT = 6,
49 AUTO_ROTATION_LANDSCAPE = 7,
50 AUTO_ROTATION_RESTRICTED = 8,
51 AUTO_ROTATION_PORTRAIT_RESTRICTED = 9,
52 AUTO_ROTATION_LANDSCAPE_RESTRICTED = 10,
53 LOCKED = 11,
54 AUTO_ROTATION_UNSPECIFIED = 12,
55 USER_ROTATION_PORTRAIT = 13,
56 USER_ROTATION_LANDSCAPE = 14,
57 USER_ROTATION_PORTRAIT_INVERTED = 15,
58 USER_ROTATION_LANDSCAPE_INVERTED = 16,
59 FOLLOW_DESKTOP = 17,
60 END = FOLLOW_DESKTOP,
61 };
62
63 const std::map<ApiOrientation, Orientation> JS_TO_NATIVE_ORIENTATION_MAP {
64 {ApiOrientation::UNSPECIFIED, Orientation::UNSPECIFIED },
65 {ApiOrientation::PORTRAIT, Orientation::VERTICAL },
66 {ApiOrientation::LANDSCAPE, Orientation::HORIZONTAL },
67 {ApiOrientation::PORTRAIT_INVERTED, Orientation::REVERSE_VERTICAL },
68 {ApiOrientation::LANDSCAPE_INVERTED, Orientation::REVERSE_HORIZONTAL },
69 {ApiOrientation::AUTO_ROTATION, Orientation::SENSOR },
70 {ApiOrientation::AUTO_ROTATION_PORTRAIT, Orientation::SENSOR_VERTICAL },
71 {ApiOrientation::AUTO_ROTATION_LANDSCAPE, Orientation::SENSOR_HORIZONTAL },
72 {ApiOrientation::AUTO_ROTATION_RESTRICTED, Orientation::AUTO_ROTATION_RESTRICTED },
73 {ApiOrientation::AUTO_ROTATION_PORTRAIT_RESTRICTED, Orientation::AUTO_ROTATION_PORTRAIT_RESTRICTED },
74 {ApiOrientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED, Orientation::AUTO_ROTATION_LANDSCAPE_RESTRICTED },
75 {ApiOrientation::LOCKED, Orientation::LOCKED },
76 {ApiOrientation::AUTO_ROTATION_UNSPECIFIED, Orientation::AUTO_ROTATION_UNSPECIFIED },
77 {ApiOrientation::USER_ROTATION_PORTRAIT, Orientation::USER_ROTATION_PORTRAIT },
78 {ApiOrientation::USER_ROTATION_LANDSCAPE, Orientation::USER_ROTATION_LANDSCAPE },
79 {ApiOrientation::USER_ROTATION_PORTRAIT_INVERTED, Orientation::USER_ROTATION_PORTRAIT_INVERTED },
80 {ApiOrientation::USER_ROTATION_LANDSCAPE_INVERTED, Orientation::USER_ROTATION_LANDSCAPE_INVERTED },
81 {ApiOrientation::FOLLOW_DESKTOP, Orientation::FOLLOW_DESKTOP },
82 };
83
ParseTransitionType(int32_t value)84 NavigationSystemTransitionType ParseTransitionType(int32_t value)
85 {
86 switch (value) {
87 case JS_EMUN_TRANSITIONTYPE_NONE:
88 return NG::NavigationSystemTransitionType::NONE;
89 case JS_EMUN_TRANSITIONTYPE_TITLE:
90 return NG::NavigationSystemTransitionType::TITLE;
91 case JS_EMUN_TRANSITIONTYPE_CONTENT:
92 return NG::NavigationSystemTransitionType::CONTENT;
93 case JS_ENUM_TRANSITIONTYPE_FADE:
94 return NG::NavigationSystemTransitionType::FADE;
95 case JS_ENUM_TRANSITIONTYPE_EXPLODE:
96 return NG::NavigationSystemTransitionType::EXPLODE;
97 case JS_ENUM_TRANSITIONTYPE_SLIDE_RIGHT:
98 return NG::NavigationSystemTransitionType::SLIDE_RIGHT;
99 case JS_ENUM_TRANSITIONTYPE_SLIDE_BOTTOM:
100 return NG::NavigationSystemTransitionType::SLIDE_BOTTOM;
101 default:
102 return NG::NavigationSystemTransitionType::DEFAULT;
103 }
104 }
105
SetToolBarConfiguration(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue NavDestinationBridge::SetToolBarConfiguration(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108 EcmaVM* vm = runtimeCallInfo->GetVM();
109 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
110 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
111 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
112 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
113 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
114 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
115 NavDestinationModelNG::ResetResObj(
116 frameNode, NavDestinationPatternType::NAV_DESTINATION, "navDestination.toolbarConfiguration");
117 using namespace OHOS::Ace::Framework;
118 JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
119 bool hideText = false;
120 JSNavigationUtils::ParseHideToolBarText(info, hideText);
121 NavDestinationModel::GetInstance()->SetHideItemText(hideText);
122 if (info[NUM_1]->IsUndefined() || info[NUM_1]->IsArray()) {
123 std::vector<NG::BarItem> toolBarItems;
124 if (info[NUM_1]->IsArray()) {
125 auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
126 JSNavigationUtils::ParseToolbarItemsConfiguration(
127 targetNode, info, JSRef<JSArray>::Cast(info[NUM_1]), toolBarItems);
128 }
129 NG::MoreButtonOptions toolbarMoreButtonOptions;
130 if (info.Length() > MIN_INFO_LENGTH) {
131 auto optObjValue = info[MIN_INFO_LENGTH];
132 if (optObjValue->IsObject()) {
133 auto optObj = JSRef<JSObject>::Cast(optObjValue);
134 auto moreButtonProperty = optObj->GetProperty(MORE_BUTTON_OPTIONS_PROPERTY);
135 JSNavigationUtils::ParseToolBarMoreButtonOptions(moreButtonProperty, toolbarMoreButtonOptions);
136 }
137 }
138 if (SystemProperties::ConfigChangePerform()) {
139 NavDestinationModel::GetInstance()->SetToolbarConfiguration(
140 std::move(toolBarItems), std::move(toolbarMoreButtonOptions));
141 } else {
142 NavDestinationModel::GetInstance()->SetToolbarMorebuttonOptions(std::move(toolbarMoreButtonOptions));
143 NavDestinationModel::GetInstance()->SetToolbarConfiguration(std::move(toolBarItems));
144 }
145 } else if (info[NUM_1]->IsObject()) {
146 auto arg1Value = info[NUM_1];
147 if (arg1Value->IsObject()) {
148 auto builderObj = JSRef<JSObject>::Cast(arg1Value);
149 auto builderFuncParam = builderObj->GetProperty("builder");
150 if (builderFuncParam->IsFunction()) {
151 ViewStackModel::GetInstance()->NewScope();
152 JsFunction jsBuilderFunc(builderFuncParam);
153 jsBuilderFunc.Execute();
154 auto customNode = ViewStackModel::GetInstance()->Finish();
155 NavDestinationModel::GetInstance()->SetCustomToolBar(customNode);
156 }
157 }
158 }
159 NG::NavigationToolbarOptions options;
160 NavDestinationModelNG::ResetResObj(
161 frameNode, NavDestinationPatternType::NAV_DESTINATION, "navigation.navigationToolbarOptions");
162 JSNavigationUtils::ParseToolbarOptions(info, options, NUM_2);
163 NavDestinationModel::GetInstance()->SetToolBarOptions(std::move(options));
164 return panda::JSValueRef::Undefined(vm);
165 }
166
ResetToolBarConfiguration(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue NavDestinationBridge::ResetToolBarConfiguration(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169 EcmaVM* vm = runtimeCallInfo->GetVM();
170 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
171 return panda::JSValueRef::Undefined(vm);
172 }
173
SetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)174 ArkUINativeModuleValue NavDestinationBridge::SetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
175 {
176 EcmaVM *vm = runtimeCallInfo->GetVM();
177 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
178 CHECK_EQUAL_RETURN(runtimeCallInfo->GetArgsNumber() < ARGC_TWO, true, panda::JSValueRef::Undefined(vm));
179 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
180 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
181 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
182 Color color;
183 RefPtr<ResourceObject> backgroundColorResObj;
184 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
185 auto nodeInfo = ArkTSUtils::MakeNativeNodeInfo(nativeNode);
186 if (!ArkTSUtils::ParseJsColorAlpha(vm, secondArg, color, backgroundColorResObj, nodeInfo)) {
187 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationBackgroundColor(nativeNode);
188 return panda::JSValueRef::Undefined(vm);
189 }
190 auto bgColorRawPtr = AceType::RawPtr(backgroundColorResObj);
191 GetArkUINodeModifiers()->getNavDestinationModifier()->setNavDestinationBackgroundColor(
192 nativeNode, color.GetValue(), bgColorRawPtr);
193 return panda::JSValueRef::Undefined(vm);
194 }
195
ResetBackgroundColor(ArkUIRuntimeCallInfo * runtimeCallInfo)196 ArkUINativeModuleValue NavDestinationBridge::ResetBackgroundColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
197 {
198 EcmaVM* vm = runtimeCallInfo->GetVM();
199 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
200 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
201 CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
202 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
203 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationBackgroundColor(nativeNode);
204 return panda::JSValueRef::Undefined(vm);
205 }
206
SetHideTitleBar(ArkUIRuntimeCallInfo * runtimeCallInfo)207 ArkUINativeModuleValue NavDestinationBridge::SetHideTitleBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
208 {
209 EcmaVM* vm = runtimeCallInfo->GetVM();
210 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
211 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
212 Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
213 const int32_t argsNum = 2; // 2: parameter index
214 Local<JSValueRef> animatedArg = runtimeCallInfo->GetCallArgRef(argsNum);
215 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
216 bool hide = false;
217 bool animated = false;
218 if (!hideArg->IsNull() && !hideArg->IsUndefined() && hideArg->IsBoolean()) {
219 hide = hideArg->ToBoolean(vm)->Value();
220 }
221 if (!animatedArg->IsNull() && !animatedArg->IsUndefined() && animatedArg->IsBoolean()) {
222 animated = animatedArg->ToBoolean(vm)->Value();
223 }
224 GetArkUINodeModifiers()->getNavDestinationModifier()->setHideTitleBar(nativeNode, hide, animated);
225 return panda::JSValueRef::Undefined(vm);
226 }
227
ResetHideTitleBar(ArkUIRuntimeCallInfo * runtimeCallInfo)228 ArkUINativeModuleValue NavDestinationBridge::ResetHideTitleBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
229 {
230 EcmaVM* vm = runtimeCallInfo->GetVM();
231 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
232 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
233 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
234 GetArkUINodeModifiers()->getNavDestinationModifier()->resetHideTitleBar(nativeNode);
235 return panda::JSValueRef::Undefined(vm);
236 }
237
SetHideToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue NavDestinationBridge::SetHideToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
239 {
240 EcmaVM* vm = runtimeCallInfo->GetVM();
241 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
242 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
243 Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
244 const int32_t argsNum = 2; // 2: parameter index
245 Local<JSValueRef> animatedArg = runtimeCallInfo->GetCallArgRef(argsNum);
246 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
247 bool hide = false;
248 bool animated = false;
249 if (!hideArg->IsNull() && !hideArg->IsUndefined() && hideArg->IsBoolean()) {
250 hide = hideArg->ToBoolean(vm)->Value();
251 }
252 if (!animatedArg->IsNull() && !animatedArg->IsUndefined() && animatedArg->IsBoolean()) {
253 animated = animatedArg->ToBoolean(vm)->Value();
254 }
255 GetArkUINodeModifiers()->getNavDestinationModifier()->setNavDestinationHideToolBar(nativeNode, hide, animated);
256 return panda::JSValueRef::Undefined(vm);
257 }
258
ResetHideToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)259 ArkUINativeModuleValue NavDestinationBridge::ResetHideToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
260 {
261 EcmaVM* vm = runtimeCallInfo->GetVM();
262 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
263 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
264 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
265 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationHideToolBar(nativeNode);
266 return panda::JSValueRef::Undefined(vm);
267 }
268
SetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)269 ArkUINativeModuleValue NavDestinationBridge::SetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
270 {
271 EcmaVM* vm = runtimeCallInfo->GetVM();
272 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
273 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
274 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
275 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
276 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
277 NavDestinationModelNG::ResetResObj(
278 frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.backButtonIcon.icon");
279
280 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
281 std::string src;
282 RefPtr<ResourceObject> backButtonIconResObj;
283 auto noPixMap = Framework::JSViewAbstract::ParseJsMedia(info[1], src, backButtonIconResObj);
284
285 RefPtr<PixelMap> pixMap = nullptr;
286 #if defined(PIXEL_MAP_SUPPORTED)
287 if (!noPixMap) {
288 pixMap = CreatePixelMapFromNapiValue(info[1]);
289 }
290 #endif
291 std::string bundleName;
292 std::string moduleName;
293
294 Framework::JSViewAbstract::GetJsMediaBundleInfo(info[1], bundleName, moduleName);
295 if (SystemProperties::ConfigChangePerform() && backButtonIconResObj) {
296 NavDestinationModelNG::SetBackButtonIcon(frameNode, noPixMap, pixMap, backButtonIconResObj);
297 } else {
298 NavDestinationModelNG::SetBackButtonIcon(frameNode, src, noPixMap, pixMap);
299 }
300 return panda::JSValueRef::Undefined(vm);
301 }
302
SetHideBackButton(ArkUIRuntimeCallInfo * runtimeCallInfo)303 ArkUINativeModuleValue NavDestinationBridge::SetHideBackButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
304 {
305 EcmaVM* vm = runtimeCallInfo->GetVM();
306 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
307 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
308 Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
309 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
310 if (hideArg->IsBoolean()) {
311 bool hide = hideArg->ToBoolean(vm)->Value();
312 GetArkUINodeModifiers()->getNavDestinationModifier()->setNavDestinationHideBackButton(nativeNode, hide);
313 } else {
314 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationHideBackButton(nativeNode);
315 }
316 return panda::JSValueRef::Undefined(vm);
317 }
318
ResetHideBackButton(ArkUIRuntimeCallInfo * runtimeCallInfo)319 ArkUINativeModuleValue NavDestinationBridge::ResetHideBackButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
320 {
321 EcmaVM* vm = runtimeCallInfo->GetVM();
322 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
323 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
324 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
325 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationHideBackButton(nativeNode);
326 return panda::JSValueRef::Undefined(vm);
327 }
328
ResetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)329 ArkUINativeModuleValue NavDestinationBridge::ResetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
330 {
331 EcmaVM* vm = runtimeCallInfo->GetVM();
332 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
333 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
334 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
335 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
336 NavDestinationModelNG::ResetResObj(
337 frameNode, NavDestinationPatternType::TITLE_BAR, "navDestination.backButtonIcon.icon");
338 bool noPixMap = false;
339 RefPtr<PixelMap> pixMap = nullptr;
340 std::string src;
341 NavDestinationModelNG::SetBackButtonIcon(frameNode, src, noPixMap, pixMap);
342 return panda::JSValueRef::Undefined(vm);
343 }
344
SetNavDestinationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)345 ArkUINativeModuleValue NavDestinationBridge::SetNavDestinationMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
346 {
347 EcmaVM* vm = runtimeCallInfo->GetVM();
348 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
349 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
350 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
351 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
352
353 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
354 if (!info[1]->IsNumber()) {
355 // set default back ground color
356 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationMode(nativeNode);
357 return panda::JSValueRef::Undefined(vm);
358 }
359 auto mode = info[1]->ToNumber<int32_t>();
360 NavDestinationModelNG::SetNavDestinationMode(frameNode, static_cast<NG::NavDestinationMode>(mode));
361 return panda::JSValueRef::Undefined(vm);
362 }
363
ResetNavDestinationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)364 ArkUINativeModuleValue NavDestinationBridge::ResetNavDestinationMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
365 {
366 EcmaVM* vm = runtimeCallInfo->GetVM();
367 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
368 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
369 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
370 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationMode(nativeNode);
371 return panda::JSValueRef::Undefined(vm);
372 }
373
SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)374 ArkUINativeModuleValue NavDestinationBridge::SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo *runtimeCallInfo)
375 {
376 EcmaVM* vm = runtimeCallInfo->GetVM();
377 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
378 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
379 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
380 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
381 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
382 std::string typeCppStr;
383 std::string edgesCppStr;
384 if (secondArg->IsString(vm)) {
385 typeCppStr = secondArg->ToString(vm)->ToString(vm);
386 } else {
387 //type system
388 typeCppStr = "0";
389 }
390
391 if (thirdArg->IsString(vm)) {
392 edgesCppStr = thirdArg->ToString(vm)->ToString(vm);
393 } else {
394 //edge top and bottom
395 edgesCppStr = "0|1";
396 }
397 const char* typeStr = typeCppStr.c_str();
398 const char* edgesStr = edgesCppStr.c_str();
399 GetArkUINodeModifiers()->getNavDestinationModifier()->setIgnoreLayoutSafeArea(nativeNode, typeStr, edgesStr);
400 return panda::JSValueRef::Undefined(vm);
401 }
402
ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)403 ArkUINativeModuleValue NavDestinationBridge::ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo* runtimeCallInfo)
404 {
405 EcmaVM* vm = runtimeCallInfo->GetVM();
406 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
407 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
408 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
409 GetArkUINodeModifiers()->getNavDestinationModifier()->resetIgnoreLayoutSafeArea(nativeNode);
410 return panda::JSValueRef::Undefined(vm);
411 }
412
SetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)413 ArkUINativeModuleValue NavDestinationBridge::SetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
414 {
415 EcmaVM* vm = runtimeCallInfo->GetVM();
416 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
417 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
418 Local<JSValueRef> titleArg = runtimeCallInfo->GetCallArgRef(1);
419 Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(2);
420 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
421 std::string title;
422 std::string subtitle;
423 bool hasMain = false;
424 bool hasSub = false;
425 RefPtr<ResourceObject> titleResObj;
426 RefPtr<ResourceObject> subtitleResObj;
427 if (ArkTSUtils::ParseJsString(vm, titleArg, title, titleResObj)) {
428 // Resource and string type.
429 subtitle = "";
430 hasMain = true;
431 hasSub = false;
432 } else if (titleArg->IsObject(vm)) {
433 // NavigationCommonTitle
434 auto obj = titleArg->ToObject(vm);
435 auto main = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "main"));
436 auto sub = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "sub"));
437 hasMain = ArkTSUtils::ParseJsString(vm, main, title, titleResObj);
438 hasSub = ArkTSUtils::ParseJsString(vm, sub, subtitle, subtitleResObj);
439 // NavigationCustomTitle or CustomBuilder is not supported
440 } else {
441 GetArkUINodeModifiers()->getNavDestinationModifier()->resetTitle(nativeNode);
442 return panda::JSValueRef::Undefined(vm);
443 }
444
445 ArkUINavigationTitlebarOptions options;
446 if (optionsArg->IsObject(vm)) {
447 NativeNavigationUtils::ParseTitleOptions(vm, optionsArg, nativeNode, options);
448 }
449 ArkUINavigationTitleInfo titleInfo = { hasSub, hasMain, subtitle.c_str(), title.c_str() };
450 auto titleRawPtr = AceType::RawPtr(titleResObj);
451 auto subtitleRawPtr = AceType::RawPtr(subtitleResObj);
452 GetArkUINodeModifiers()->getNavDestinationModifier()->setTitle(nativeNode, titleInfo, options,
453 titleRawPtr, subtitleRawPtr);
454 return panda::JSValueRef::Undefined(vm);
455 }
456
ResetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue NavDestinationBridge::ResetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459 EcmaVM* vm = runtimeCallInfo->GetVM();
460 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
461 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
462 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
463 GetArkUINodeModifiers()->getNavDestinationModifier()->resetTitle(nativeNode);
464 return panda::JSValueRef::Undefined(vm);
465 }
466
SetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)467 ArkUINativeModuleValue NavDestinationBridge::SetMenus(ArkUIRuntimeCallInfo* runtimeCallInfo)
468 {
469 EcmaVM* vm = runtimeCallInfo->GetVM();
470 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
471 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
472 Local<JSValueRef> menusArg = runtimeCallInfo->GetCallArgRef(1);
473 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
474 std::vector<ArkUIBarItem> menuItems;
475 if (menusArg->IsArray(vm)) {
476 NativeNavigationUtils::ParseBarItems(vm, menusArg, menuItems);
477 GetArkUINodeModifiers()->getNavDestinationModifier()->setMenus(nativeNode, menuItems.data(), menuItems.size());
478 // get action and symbolModifier single
479 auto actionSendFunc = GetArkUINodeModifiers()->getNavDestinationModifier()->setMenuItemAction;
480 auto symbolSendFunc = GetArkUINodeModifiers()->getNavDestinationModifier()->setMenuItemSymbol;
481 NativeNavigationUtils::ParseAndSendFunctionParam(runtimeCallInfo, menusArg, actionSendFunc, symbolSendFunc);
482 } else if (menusArg->IsUndefined()) {
483 menuItems = {};
484 GetArkUINodeModifiers()->getNavDestinationModifier()->setMenus(nativeNode, menuItems.data(), menuItems.size());
485 } else if (menusArg->IsObject(vm)) {
486 GetArkUINodeModifiers()->getNavDestinationModifier()->resetMenus(nativeNode);
487 }
488 return panda::JSValueRef::Undefined(vm);
489 }
490
ResetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)491 ArkUINativeModuleValue NavDestinationBridge::ResetMenus(ArkUIRuntimeCallInfo* runtimeCallInfo)
492 {
493 EcmaVM* vm = runtimeCallInfo->GetVM();
494 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
495 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
496 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
497 GetArkUINodeModifiers()->getNavDestinationModifier()->resetMenus(nativeNode);
498 return panda::JSValueRef::Undefined(vm);
499 }
500
SetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)501 ArkUINativeModuleValue NavDestinationBridge::SetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
502 {
503 EcmaVM* vm = runtimeCallInfo->GetVM();
504 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
505 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
506 Local<JSValueRef> recoverableArg = runtimeCallInfo->GetCallArgRef(1);
507 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
508 if (recoverableArg->IsNull() || recoverableArg->IsUndefined() || !recoverableArg->IsBoolean()) {
509 GetArkUINodeModifiers()->getNavDestinationModifier()->resetRecoverable(nativeNode);
510 } else {
511 bool recoverable = recoverableArg->ToBoolean(vm)->Value();
512 GetArkUINodeModifiers()->getNavDestinationModifier()->setRecoverable(nativeNode, recoverable);
513 }
514 return panda::JSValueRef::Undefined(vm);
515 }
516
ResetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)517 ArkUINativeModuleValue NavDestinationBridge::ResetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
518 {
519 EcmaVM* vm = runtimeCallInfo->GetVM();
520 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
521 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
522 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
523 GetArkUINodeModifiers()->getNavDestinationModifier()->resetRecoverable(nativeNode);
524 return panda::JSValueRef::Undefined(vm);
525 }
526
SetNavDestinationSystemTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)527 ArkUINativeModuleValue NavDestinationBridge::SetNavDestinationSystemTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
528 {
529 EcmaVM* vm = runtimeCallInfo->GetVM();
530 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
531 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
532 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
533
534 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
535 if (!info[1]->IsNumber()) {
536 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationSystemTransition(nativeNode);
537 return panda::JSValueRef::Undefined(vm);
538 }
539 auto value = info[1]->ToNumber<int32_t>();
540 NavigationSystemTransitionType type = ParseTransitionType(value);
541 GetArkUINodeModifiers()->getNavDestinationModifier()->setNavDestinationSystemTransition(
542 nativeNode,
543 static_cast<ArkUI_Int32>(type));
544 return panda::JSValueRef::Undefined(vm);
545 }
546
ResetNavDestinationSystemTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)547 ArkUINativeModuleValue NavDestinationBridge::ResetNavDestinationSystemTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
548 {
549 EcmaVM* vm = runtimeCallInfo->GetVM();
550 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
551 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
552 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
553 GetArkUINodeModifiers()->getNavDestinationModifier()->resetNavDestinationSystemTransition(nativeNode);
554 return panda::JSValueRef::Undefined(vm);
555 }
556
SetPreferredOrientation(ArkUIRuntimeCallInfo * runtimeCallInfo)557 ArkUINativeModuleValue NavDestinationBridge::SetPreferredOrientation(ArkUIRuntimeCallInfo* runtimeCallInfo)
558 {
559 EcmaVM* vm = runtimeCallInfo->GetVM();
560 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
561 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
562 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
563
564 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
565 if (!info[1]->IsNumber()) {
566 GetArkUINodeModifiers()->getNavDestinationModifier()->resetPreferredOrientation(nativeNode);
567 return panda::JSValueRef::Undefined(vm);
568 }
569 auto ori = info[1]->ToNumber<int32_t>();
570 if (ori < static_cast<int32_t>(ApiOrientation::BEGIN) || ori > static_cast<int32_t>(ApiOrientation::END)) {
571 GetArkUINodeModifiers()->getNavDestinationModifier()->resetPreferredOrientation(nativeNode);
572 return panda::JSValueRef::Undefined(vm);
573 }
574 ori = static_cast<int32_t>(JS_TO_NATIVE_ORIENTATION_MAP.at(static_cast<ApiOrientation>(ori)));
575 GetArkUINodeModifiers()->getNavDestinationModifier()->setPreferredOrientation(nativeNode, ori);
576 return panda::JSValueRef::Undefined(vm);
577 }
578
ResetPreferredOrientation(ArkUIRuntimeCallInfo * runtimeCallInfo)579 ArkUINativeModuleValue NavDestinationBridge::ResetPreferredOrientation(ArkUIRuntimeCallInfo* runtimeCallInfo)
580 {
581 EcmaVM* vm = runtimeCallInfo->GetVM();
582 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
583 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
584 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
585 GetArkUINodeModifiers()->getNavDestinationModifier()->resetPreferredOrientation(nativeNode);
586 return panda::JSValueRef::Undefined(vm);
587 }
588
SetEnableStatusBar(ArkUIRuntimeCallInfo * runtimeCallInfo)589 ArkUINativeModuleValue NavDestinationBridge::SetEnableStatusBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
590 {
591 EcmaVM* vm = runtimeCallInfo->GetVM();
592 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
593 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
594 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
595
596 ArkUIOptionalBool enable;
597 enable.isSet = false;
598 ArkUIOptionalBool animated;
599 animated.isSet = false;
600 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
601 if (info[1]->IsBoolean()) {
602 enable.isSet = true;
603 enable.value = info[1]->ToBoolean();
604 }
605 if (info[2]->IsBoolean()) {
606 animated.isSet = true;
607 animated.value = info[2]->ToBoolean();
608 }
609 GetArkUINodeModifiers()->getNavDestinationModifier()->setEnableStatusBar(nativeNode, enable, animated);
610 return panda::JSValueRef::Undefined(vm);
611 }
612
ResetEnableStatusBar(ArkUIRuntimeCallInfo * runtimeCallInfo)613 ArkUINativeModuleValue NavDestinationBridge::ResetEnableStatusBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
614 {
615 EcmaVM* vm = runtimeCallInfo->GetVM();
616 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
617 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
618 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
619 GetArkUINodeModifiers()->getNavDestinationModifier()->resetEnableStatusBar(nativeNode);
620 return panda::JSValueRef::Undefined(vm);
621 }
622
SetEnableNavigationIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)623 ArkUINativeModuleValue NavDestinationBridge::SetEnableNavigationIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
624 {
625 EcmaVM* vm = runtimeCallInfo->GetVM();
626 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
627 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
628 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
629 ArkUIOptionalBool enable;
630 enable.isSet = false;
631 Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
632 if (info[1]->IsBoolean()) {
633 enable.isSet = true;
634 enable.value = info[1]->ToBoolean();
635 }
636 GetArkUINodeModifiers()->getNavDestinationModifier()->setEnableNavigationIndicator(nativeNode, enable);
637 return panda::JSValueRef::Undefined(vm);
638 }
639
ResetEnableNavigationIndicator(ArkUIRuntimeCallInfo * runtimeCallInfo)640 ArkUINativeModuleValue NavDestinationBridge::ResetEnableNavigationIndicator(ArkUIRuntimeCallInfo* runtimeCallInfo)
641 {
642 EcmaVM* vm = runtimeCallInfo->GetVM();
643 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
644 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
645 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
646 GetArkUINodeModifiers()->getNavDestinationModifier()->resetEnableNavigationIndicator(nativeNode);
647 return panda::JSValueRef::Undefined(vm);
648 }
649
SetSystemBarStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)650 ArkUINativeModuleValue NavDestinationBridge::SetSystemBarStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
651 {
652 EcmaVM* vm = runtimeCallInfo->GetVM();
653 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
654 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
655 Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_1);
656 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
657 auto nodeModifiers = GetArkUINodeModifiers();
658 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
659 if (styleArg->IsNull() || styleArg->IsUndefined()) {
660 nodeModifiers->getNavDestinationModifier()->resetNavDestinationSystemBarStyle(nativeNode);
661 } else {
662 std::string value;
663 ArkTSUtils::ParseJsString(vm, styleArg, value);
664 auto color = Color::FromString(value);
665 nodeModifiers->getNavDestinationModifier()->setNavDestinationSystemBarStyle(nativeNode, color.GetValue());
666 }
667 return panda::JSValueRef::Undefined(vm);
668 }
669
ResetSystemBarStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)670 ArkUINativeModuleValue NavDestinationBridge::ResetSystemBarStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
671 {
672 EcmaVM* vm = runtimeCallInfo->GetVM();
673 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
674 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
675 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
676 auto nodeModifiers = GetArkUINodeModifiers();
677 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
678 nodeModifiers->getNavDestinationModifier()->resetNavDestinationSystemBarStyle(nativeNode);
679 return panda::JSValueRef::Undefined(vm);
680 }
681
SetOnShown(ArkUIRuntimeCallInfo * runtimeCallInfo)682 ArkUINativeModuleValue NavDestinationBridge::SetOnShown(ArkUIRuntimeCallInfo* runtimeCallInfo)
683 {
684 EcmaVM* vm = runtimeCallInfo->GetVM();
685 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
686 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
687 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
688 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
689 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
690 auto nodeModifiers = GetArkUINodeModifiers();
691 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
692 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
693 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnShown(nativeNode);
694 return panda::JSValueRef::Undefined(vm);
695 }
696 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
697 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
698 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
699 std::function<void()> onShown = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
700 panda::LocalScope pandaScope(vm);
701 panda::TryCatch trycatch(vm);
702 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
703 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
704 };
705 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnShown(nativeNode, reinterpret_cast<void*>(&onShown));
706 return panda::JSValueRef::Undefined(vm);
707 }
708
ResetOnShown(ArkUIRuntimeCallInfo * runtimeCallInfo)709 ArkUINativeModuleValue NavDestinationBridge::ResetOnShown(ArkUIRuntimeCallInfo* runtimeCallInfo)
710 {
711 EcmaVM* vm = runtimeCallInfo->GetVM();
712 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
713 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
714 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
715 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
716 auto nodeModifiers = GetArkUINodeModifiers();
717 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
718 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnShown(nativeNode);
719 return panda::JSValueRef::Undefined(vm);
720 }
721
SetOnHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)722 ArkUINativeModuleValue NavDestinationBridge::SetOnHidden(ArkUIRuntimeCallInfo* runtimeCallInfo)
723 {
724 EcmaVM* vm = runtimeCallInfo->GetVM();
725 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
726 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
727 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
728 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
729 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
730 auto nodeModifiers = GetArkUINodeModifiers();
731 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
732 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
733 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnHidden(nativeNode);
734 return panda::JSValueRef::Undefined(vm);
735 }
736 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
737 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
738 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
739 std::function<void()> OnHidden = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
740 panda::LocalScope pandaScope(vm);
741 panda::TryCatch trycatch(vm);
742 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
743 func->Call(vm, func.ToLocal(), nullptr, 0);
744 };
745 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnHidden(
746 nativeNode, reinterpret_cast<void*>(&OnHidden));
747 return panda::JSValueRef::Undefined(vm);
748 }
749
ResetOnHidden(ArkUIRuntimeCallInfo * runtimeCallInfo)750 ArkUINativeModuleValue NavDestinationBridge::ResetOnHidden(ArkUIRuntimeCallInfo* runtimeCallInfo)
751 {
752 EcmaVM* vm = runtimeCallInfo->GetVM();
753 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
754 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
755 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
756 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
757 auto nodeModifiers = GetArkUINodeModifiers();
758 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
759 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnHidden(nativeNode);
760 return panda::JSValueRef::Undefined(vm);
761 }
762
SetOnWillHide(ArkUIRuntimeCallInfo * runtimeCallInfo)763 ArkUINativeModuleValue NavDestinationBridge::SetOnWillHide(ArkUIRuntimeCallInfo* runtimeCallInfo)
764 {
765 EcmaVM* vm = runtimeCallInfo->GetVM();
766 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
767 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
768 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
769 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
770 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
771 auto nodeModifiers = GetArkUINodeModifiers();
772 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
773 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
774 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillHide(nativeNode);
775 return panda::JSValueRef::Undefined(vm);
776 }
777 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
778 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
779 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
780 std::function<void()> OnWillHide = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
781 panda::LocalScope pandaScope(vm);
782 panda::TryCatch trycatch(vm);
783 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
784 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
785 };
786 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnWillHide(
787 nativeNode, reinterpret_cast<void*>(&OnWillHide));
788 return panda::JSValueRef::Undefined(vm);
789 }
790
ResetOnWillHide(ArkUIRuntimeCallInfo * runtimeCallInfo)791 ArkUINativeModuleValue NavDestinationBridge::ResetOnWillHide(ArkUIRuntimeCallInfo* runtimeCallInfo)
792 {
793 EcmaVM* vm = runtimeCallInfo->GetVM();
794 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
795 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
796 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
797 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
798 auto nodeModifiers = GetArkUINodeModifiers();
799 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
800 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillHide(nativeNode);
801 return panda::JSValueRef::Undefined(vm);
802 }
803
SetOnWillAppear(ArkUIRuntimeCallInfo * runtimeCallInfo)804 ArkUINativeModuleValue NavDestinationBridge::SetOnWillAppear(ArkUIRuntimeCallInfo* runtimeCallInfo)
805 {
806 EcmaVM* vm = runtimeCallInfo->GetVM();
807 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
808 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
809 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
810 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
811 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
812 auto nodeModifiers = GetArkUINodeModifiers();
813 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
814 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
815 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillAppear(nativeNode);
816 return panda::JSValueRef::Undefined(vm);
817 }
818 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
819 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
820 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
821 std::function<void()> OnWillAppear = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
822 panda::LocalScope pandaScope(vm);
823 panda::TryCatch trycatch(vm);
824 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
825 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
826 };
827 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnWillAppear(
828 nativeNode, reinterpret_cast<void*>(&OnWillAppear));
829 return panda::JSValueRef::Undefined(vm);
830 }
831
ResetOnWillAppear(ArkUIRuntimeCallInfo * runtimeCallInfo)832 ArkUINativeModuleValue NavDestinationBridge::ResetOnWillAppear(ArkUIRuntimeCallInfo* runtimeCallInfo)
833 {
834 EcmaVM* vm = runtimeCallInfo->GetVM();
835 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
836 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
837 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
838 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
839 auto nodeModifiers = GetArkUINodeModifiers();
840 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
841 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillAppear(nativeNode);
842 return panda::JSValueRef::Undefined(vm);
843 }
844
SetOnWillShow(ArkUIRuntimeCallInfo * runtimeCallInfo)845 ArkUINativeModuleValue NavDestinationBridge::SetOnWillShow(ArkUIRuntimeCallInfo* runtimeCallInfo)
846 {
847 EcmaVM* vm = runtimeCallInfo->GetVM();
848 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
849 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
850 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
851 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
852 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
853 auto nodeModifiers = GetArkUINodeModifiers();
854 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
855 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
856 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillShow(nativeNode);
857 return panda::JSValueRef::Undefined(vm);
858 }
859 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
860 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
861 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
862 std::function<void()> OnWillShow = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
863 panda::LocalScope pandaScope(vm);
864 panda::TryCatch trycatch(vm);
865 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
866 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
867 };
868 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnWillShow(
869 nativeNode, reinterpret_cast<void*>(&OnWillShow));
870 return panda::JSValueRef::Undefined(vm);
871 }
872
ResetOnWillShow(ArkUIRuntimeCallInfo * runtimeCallInfo)873 ArkUINativeModuleValue NavDestinationBridge::ResetOnWillShow(ArkUIRuntimeCallInfo* runtimeCallInfo)
874 {
875 EcmaVM* vm = runtimeCallInfo->GetVM();
876 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
877 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
878 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
879 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
880 auto nodeModifiers = GetArkUINodeModifiers();
881 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
882 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillShow(nativeNode);
883 return panda::JSValueRef::Undefined(vm);
884 }
885
SetOnWillDisappear(ArkUIRuntimeCallInfo * runtimeCallInfo)886 ArkUINativeModuleValue NavDestinationBridge::SetOnWillDisappear(ArkUIRuntimeCallInfo* runtimeCallInfo)
887 {
888 EcmaVM* vm = runtimeCallInfo->GetVM();
889 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
890 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
891 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
892 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
893 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
894 auto nodeModifiers = GetArkUINodeModifiers();
895 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
896 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
897 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillDisappear(nativeNode);
898 return panda::JSValueRef::Undefined(vm);
899 }
900 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
901 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
902 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
903 std::function<void()> OnWillDisappear = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() {
904 panda::LocalScope pandaScope(vm);
905 panda::TryCatch trycatch(vm);
906 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
907 func->Call(vm, func.ToLocal(), nullptr, NUM_0);
908 };
909 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnWillDisappear(
910 nativeNode, reinterpret_cast<void*>(&OnWillDisappear));
911 return panda::JSValueRef::Undefined(vm);
912 }
913
ResetOnWillDisappear(ArkUIRuntimeCallInfo * runtimeCallInfo)914 ArkUINativeModuleValue NavDestinationBridge::ResetOnWillDisappear(ArkUIRuntimeCallInfo* runtimeCallInfo)
915 {
916 EcmaVM* vm = runtimeCallInfo->GetVM();
917 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
918 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
919 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
920 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
921 auto nodeModifiers = GetArkUINodeModifiers();
922 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
923 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnWillDisappear(nativeNode);
924 return panda::JSValueRef::Undefined(vm);
925 }
926
SetOnBackPressed(ArkUIRuntimeCallInfo * runtimeCallInfo)927 ArkUINativeModuleValue NavDestinationBridge::SetOnBackPressed(ArkUIRuntimeCallInfo* runtimeCallInfo)
928 {
929 EcmaVM* vm = runtimeCallInfo->GetVM();
930 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
931 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
932 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(NUM_1);
933 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
934 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
935 auto nodeModifiers = GetArkUINodeModifiers();
936 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
937 if (callbackArg->IsNull() || callbackArg->IsUndefined() || !callbackArg->IsFunction(vm)) {
938 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnBackPressed(nativeNode);
939 return panda::JSValueRef::Undefined(vm);
940 }
941 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
942 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
943 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
944 std::function<bool()> onBackPressed = [vm, func = panda::CopyableGlobal(vm, func), frameNode]() -> bool {
945 panda::LocalScope pandaScope(vm);
946 panda::TryCatch trycatch(vm);
947 PipelineContext::SetCallBackNode(AceType::Claim(frameNode));
948 auto result = func->Call(vm, func.ToLocal(), nullptr, NUM_0);
949 return result->ToBoolean(vm)->Value();
950 };
951 nodeModifiers->getNavDestinationModifier()->setNavDestinationOnBackPressed(
952 nativeNode, reinterpret_cast<void*>(&onBackPressed));
953 return panda::JSValueRef::Undefined(vm);
954 }
955
ResetOnBackPressed(ArkUIRuntimeCallInfo * runtimeCallInfo)956 ArkUINativeModuleValue NavDestinationBridge::ResetOnBackPressed(ArkUIRuntimeCallInfo* runtimeCallInfo)
957 {
958 EcmaVM* vm = runtimeCallInfo->GetVM();
959 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
960 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
961 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
962 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
963 auto nodeModifiers = GetArkUINodeModifiers();
964 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
965 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnBackPressed(nativeNode);
966 return panda::JSValueRef::Undefined(vm);
967 }
968
SetOnReady(ArkUIRuntimeCallInfo * runtimeCallInfo)969 ArkUINativeModuleValue NavDestinationBridge::SetOnReady(ArkUIRuntimeCallInfo* runtimeCallInfo)
970 {
971 EcmaVM* vm = runtimeCallInfo->GetVM();
972 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
973 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
974 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
975 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
976 using namespace OHOS::Ace::Framework;
977 JsiCallbackInfo callbackArg = JsiCallbackInfo(runtimeCallInfo);
978 auto nodeModifiers = GetArkUINodeModifiers();
979 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
980 if (!callbackArg[NUM_1]->IsFunction()) {
981 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnReady(nativeNode);
982 return panda::JSValueRef::Undefined(vm);
983 }
984 auto onReadyCallback = AceType::MakeRefPtr<JsFunction>(JSRef<JSObject>(), JSRef<JSFunc>::Cast(callbackArg[NUM_1]));
985 auto onReady = [execCtx = callbackArg.GetExecutionContext(), func = std::move(onReadyCallback)](
986 RefPtr<NG::NavDestinationContext> context) {
987 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
988 auto jsContext = JSClass<JSNavDestinationContext>::NewInstance();
989 auto jsNavDestinationContext = Referenced::Claim(jsContext->Unwrap<JSNavDestinationContext>());
990 CHECK_NULL_VOID(jsNavDestinationContext);
991 jsNavDestinationContext->SetNavDestinationContext(context);
992 ACE_SCORING_EVENT("NavDestination.onReady");
993 JSRef<JSVal> params[NUM_1];
994 params[NUM_0] = jsContext;
995 func->ExecuteJS(NUM_1, params);
996 };
997 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
998 NavDestinationModelNG::SetOnReady(frameNode, std::move(onReady));
999 return panda::JSValueRef::Undefined(vm);
1000 }
1001
ResetOnReady(ArkUIRuntimeCallInfo * runtimeCallInfo)1002 ArkUINativeModuleValue NavDestinationBridge::ResetOnReady(ArkUIRuntimeCallInfo* runtimeCallInfo)
1003 {
1004 EcmaVM* vm = runtimeCallInfo->GetVM();
1005 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1006 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1007 CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
1008 auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1009 auto nodeModifiers = GetArkUINodeModifiers();
1010 CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1011 nodeModifiers->getNavDestinationModifier()->resetNavDestinationOnReady(nativeNode);
1012 return panda::JSValueRef::Undefined(vm);
1013 }
1014 } // namespace OHOS::Ace::NG
1015