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