• 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_navigation_bridge.h"
16 
17 #include "bridge/declarative_frontend/engine/functions/js_click_function.h"
18 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
19 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_navigation_utils.h"
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21 #include "bridge/declarative_frontend/jsview/js_navigation_stack.h"
22 #include "bridge/declarative_frontend/jsview/js_navigation_utils.h"
23 #include "bridge/declarative_frontend/jsview/js_utils.h"
24 #include "core/components_ng/base/view_stack_model.h"
25 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
26 #include "core/components_ng/pattern/navigation/navigation_model_data.h"
27 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
28 #include "frameworks/bridge/declarative_frontend/engine/functions/js_navigation_function.h"
29 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
30 namespace OHOS::Ace::NG {} // namespace OHOS::Ace::NG
31 namespace OHOS::Ace::NG {
32 constexpr int NUM_0 = 0;
33 constexpr int NUM_1 = 1;
34 constexpr int NUM_2 = 2;
35 constexpr int32_t MIN_INFO_LENGTH = 2;
36 constexpr int32_t NAVIGATION_ANIMATION_TIMEOUT = 1000; // ms
37 constexpr char MORE_BUTTON_OPTIONS_PROPERTY[] = "moreButtonOptions";
38 
SetHideToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)39 ArkUINativeModuleValue NavigationBridge::SetHideToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
40 {
41     EcmaVM* vm = runtimeCallInfo->GetVM();
42     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
43     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
44     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
45     const int32_t argsNum = 2; // 2: parameter index
46     Local<JSValueRef> animatedArg = runtimeCallInfo->GetCallArgRef(argsNum);
47     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
48     bool hide = false;
49     bool animated = false;
50     if (!hideArg->IsNull() && !hideArg->IsUndefined() && hideArg->IsBoolean()) {
51         hide = hideArg->ToBoolean(vm)->Value();
52     }
53     if (!animatedArg->IsNull() && !animatedArg->IsUndefined() && animatedArg->IsBoolean()) {
54         animated = animatedArg->ToBoolean(vm)->Value();
55     }
56     GetArkUINodeModifiers()->getNavigationModifier()->setHideToolBar(nativeNode, hide, animated);
57     return panda::JSValueRef::Undefined(vm);
58 }
59 
ResetHideToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)60 ArkUINativeModuleValue NavigationBridge::ResetHideToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
61 {
62     EcmaVM* vm = runtimeCallInfo->GetVM();
63     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
64     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
65     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
66     GetArkUINodeModifiers()->getNavigationModifier()->resetHideToolBar(nativeNode);
67     return panda::JSValueRef::Undefined(vm);
68 }
69 
SetOnTitleModeChange(ArkUIRuntimeCallInfo * runtimeCallInfo)70 ArkUINativeModuleValue NavigationBridge::SetOnTitleModeChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
71 {
72     EcmaVM* vm = runtimeCallInfo->GetVM();
73     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
74     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
75     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
76     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
77     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
78     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
79     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
80     auto nodeModifiers = GetArkUINodeModifiers();
81     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
82     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
83         nodeModifiers->getNavigationModifier()->resetOnTitleModeChange(nativeNode);
84         return panda::JSValueRef::Undefined(vm);
85     }
86     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
87     std::function<void(NG::NavigationTitleMode)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
88                                                                 NG::NavigationTitleMode titleMode) {
89         panda::LocalScope pandaScope(vm);
90         panda::TryCatch trycatch(vm);
91         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
92         panda::Local<panda::JSValueRef> params[1] = { panda::IntegerRef::New(vm, static_cast<int32_t>(titleMode)) };
93         func->Call(vm, func.ToLocal(), params, 1);
94     };
95     std::function<void(const BaseEventInfo*)> eventInfoFunc = [vm, func = callback, frameNode](
96                                                                   const BaseEventInfo* baseInfo) {
97         panda::LocalScope pandaScope(vm);
98         panda::TryCatch trycatch(vm);
99         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
100         auto eventInfo = TypeInfoHelper::DynamicCast<NavigationTitleModeChangeEvent>(baseInfo);
101         if (!eventInfo) {
102             return;
103         }
104         auto titleMode = eventInfo->IsMiniBar() ? static_cast<int32_t>(NavigationTitleMode::MINI)
105                                                 : static_cast<int32_t>(NavigationTitleMode::FULL);
106         func(static_cast<NG::NavigationTitleMode>(titleMode));
107     };
108     nodeModifiers->getNavigationModifier()->setOnTitleModeChange(
109         nativeNode, reinterpret_cast<void*>(&callback), reinterpret_cast<void*>(&eventInfoFunc));
110     return panda::JSValueRef::Undefined(vm);
111 }
112 
ResetOnTitleModeChange(ArkUIRuntimeCallInfo * runtimeCallInfo)113 ArkUINativeModuleValue NavigationBridge::ResetOnTitleModeChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
114 {
115     EcmaVM* vm = runtimeCallInfo->GetVM();
116     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
117     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
118     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
119     auto nodeModifiers = GetArkUINodeModifiers();
120     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
121     nodeModifiers->getNavigationModifier()->resetOnTitleModeChange(nativeNode);
122     return panda::JSValueRef::Undefined(vm);
123 }
124 
SetOnNavigationModeChange(ArkUIRuntimeCallInfo * runtimeCallInfo)125 ArkUINativeModuleValue NavigationBridge::SetOnNavigationModeChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
126 {
127     EcmaVM* vm = runtimeCallInfo->GetVM();
128     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
129     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
130     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
131     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
132     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
133     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
134     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
135     auto nodeModifiers = GetArkUINodeModifiers();
136     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
137     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
138         nodeModifiers->getNavigationModifier()->resetOnNavigationModeChange(nativeNode);
139         return panda::JSValueRef::Undefined(vm);
140     }
141     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
142     std::function<void(NG::NavigationMode)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
143                                                            NG::NavigationMode modechange) {
144         panda::LocalScope pandaScope(vm);
145         panda::TryCatch trycatch(vm);
146         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
147         panda::Local<panda::JSValueRef> params[1] = { panda::IntegerRef::New(vm, static_cast<int32_t>(modechange)) };
148         func->Call(vm, func.ToLocal(), params, 1);
149     };
150     nodeModifiers->getNavigationModifier()->setOnNavigationModeChange(
151         nativeNode, reinterpret_cast<void*>(&callback));
152     return panda::JSValueRef::Undefined(vm);
153 }
154 
ResetOnNavigationModeChange(ArkUIRuntimeCallInfo * runtimeCallInfo)155 ArkUINativeModuleValue NavigationBridge::ResetOnNavigationModeChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
156 {
157     EcmaVM* vm = runtimeCallInfo->GetVM();
158     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
159     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
160     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
161     auto nodeModifiers = GetArkUINodeModifiers();
162     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
163     nodeModifiers->getNavigationModifier()->resetOnNavigationModeChange(nativeNode);
164     return panda::JSValueRef::Undefined(vm);
165 }
166 
SetCustomNavContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue NavigationBridge::SetCustomNavContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169     EcmaVM* vm = runtimeCallInfo->GetVM();
170     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
171     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
172     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
173     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
174     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
175     using namespace OHOS::Ace::Framework;
176     JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
177     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
178     auto nodeModifiers = GetArkUINodeModifiers();
179     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
180     if (info.Length() != 2) { // 2: Array length
181         return panda::JSValueRef::Undefined(vm);
182     }
183     if (!info[1]->IsObject()) {
184         return panda::JSValueRef::Undefined(vm);
185     }
186     auto transitionObj = JSRef<JSObject>::Cast(info[1]);
187     if (transitionObj->IsUndefined() || !info[1]->IsFunction()) {
188         return panda::JSValueRef::Undefined(vm);
189     }
190     ParseCustomContentTransition(transitionObj, info);
191     nodeModifiers->getNavigationModifier()->setNavigationIsCustomAnimation(nativeNode, true);
192     return panda::JSValueRef::Undefined(vm);
193 }
194 
ResetCustomNavContentTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)195 ArkUINativeModuleValue NavigationBridge::ResetCustomNavContentTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
196 {
197     EcmaVM* vm = runtimeCallInfo->GetVM();
198     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
199     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
200     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
201     return panda::JSValueRef::Undefined(vm);
202 }
203 
ParseCustomContentTransition(const Framework::JSRef<Framework::JSObject> & transitionObj,const Framework::JsiCallbackInfo & info)204 void NavigationBridge::ParseCustomContentTransition(
205     const Framework::JSRef<Framework::JSObject>& transitionObj, const Framework::JsiCallbackInfo& info)
206 {
207     using namespace OHOS::Ace::Framework;
208     auto jsFunc = AceType::MakeRefPtr<JsNavigationFunction>(JSRef<JSFunc>::Cast(transitionObj));
209     auto executor = [execCtx = info.GetExecutionContext(), func = std::move(jsFunc)](
210                         RefPtr<NG::NavDestinationContext> from, RefPtr<NG::NavDestinationContext> to,
211                         NG::NavigationOperation operation) -> NG::NavigationTransition {
212         NG::NavigationTransition transition;
213         JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx, transition);
214         auto ret = func->Execute(from, to, operation);
215         if (!ret->IsObject()) {
216             return transition.isValid = false, transition;
217         }
218         auto transObj = JSRef<JSObject>::Cast(ret);
219         if (auto interactive = transObj->GetProperty("isInteractive"); interactive->IsBoolean()) {
220             transition.interactive = interactive->ToBoolean();
221         }
222         if (auto timeout = transObj->GetProperty("timeout"); timeout->IsNumber()) {
223             transition.timeout = timeout->ToNumber<int32_t>();
224             transition.timeout = transition.interactive ? transition.timeout :
225                 (transition.timeout < 0 ? NAVIGATION_ANIMATION_TIMEOUT : transition.timeout);
226         }
227         if (auto transitionCtx = transObj->GetProperty("transition"); transitionCtx->IsFunction()) {
228             transition.transition = [execCtx, func = AceType::MakeRefPtr<JsNavigationFunction>(
229                 JSRef<JSFunc>::Cast(transitionCtx))](const RefPtr<NG::NavigationTransitionProxy>& proxy) {
230                 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
231                 ACE_SCORING_EVENT("transition");
232                 func->Execute(proxy);
233             };
234         }
235         if (auto endCb = transObj->GetProperty("onTransitionEnd"); endCb->IsFunction()) {
236             transition.endCallback = [execCtx, func = AceType::MakeRefPtr<JsFunction>(
237                 JSRef<JSObject>(), JSRef<JSFunc>::Cast(endCb))](bool success) {
238                 JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
239                 ACE_SCORING_EVENT("onTransitionEnded");
240                 JSRef<JSVal> args[] = { JSRef<JSVal>::Make(ToJSValue(success)) };
241                 func->ExecuteJS(1, args);
242             };
243         }
244         return transition;
245     };
246     NavigationModel::GetInstance()->SetCustomTransition(executor);
247 }
248 
SetToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)249 ArkUINativeModuleValue NavigationBridge::SetToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
250 {
251     EcmaVM* vm = runtimeCallInfo->GetVM();
252     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
253     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
254     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
255     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
256     std::vector<ArkUIBarItem> toolbarItems;
257     auto nodeModifiers = GetArkUINodeModifiers();
258     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
259     if (valueArg->IsArray(vm) || valueArg->IsObject(vm)) {
260         NativeNavigationUtils::ParseBarItems(vm, valueArg, toolbarItems);
261         nodeModifiers->getNavigationModifier()->setToolBar(
262             nativeNode, toolbarItems.data(), toolbarItems.size());
263     } else if (valueArg->IsUndefined()) {
264         toolbarItems = {};
265         nodeModifiers->getNavigationModifier()->setToolBar(
266             nativeNode, toolbarItems.data(), toolbarItems.size());
267     } else {
268         nodeModifiers->getNavigationModifier()->resetToolBar(nativeNode);
269     }
270     return panda::JSValueRef::Undefined(vm);
271 }
272 
ResetToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)273 ArkUINativeModuleValue NavigationBridge::ResetToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
274 {
275     EcmaVM* vm = runtimeCallInfo->GetVM();
276     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
277     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
278     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
279     auto nodeModifiers = GetArkUINodeModifiers();
280     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
281     nodeModifiers->getNavigationModifier()->resetToolBar(nativeNode);
282     return panda::JSValueRef::Undefined(vm);
283 }
284 
ParseToolBarItems(const JsiCallbackInfo & info,std::list<RefPtr<AceType>> & items)285 void ParseToolBarItems(const JsiCallbackInfo& info, std::list<RefPtr<AceType>>& items)
286 {
287     using namespace OHOS::Ace::Framework;
288     if (info[1]->IsUndefined() || !info[1]->IsArray()) {
289         return;
290     }
291     JSRef<JSArray> jsArray = JSRef<JSArray>::Cast(info[1]);
292     auto length = jsArray->Length();
293     for (size_t i = 0; i < length; i++) {
294         auto item = jsArray->GetValueAt(i);
295         if (!item->IsObject()) {
296             continue;
297         }
298         auto itemObject = JSRef<JSObject>::Cast(item);
299         auto toolBarItem = AceType::MakeRefPtr<ToolBarItem>();
300         auto itemValueObject = itemObject->GetProperty("value");
301         if (itemValueObject->IsString()) {
302             toolBarItem->value = itemValueObject->ToString();
303         }
304         auto itemIconObject = itemObject->GetProperty("icon");
305         std::string icon;
306         Framework::JSViewAbstract::ParseJsMedia(itemIconObject, icon);
307         toolBarItem->icon = icon;
308         auto itemActionValue = itemObject->GetProperty("action");
309         if (itemActionValue->IsFunction()) {
310             auto onClickFunc = AceType::MakeRefPtr<JsClickFunction>(JSRef<JSFunc>::Cast(itemActionValue));
311             auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
312             toolBarItem->action =
313                 EventMarker([func = std::move(onClickFunc), node = targetNode, execCtx = info.GetExecutionContext()]() {
314                     JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
315                     ACE_SCORING_EVENT("Navigation.toolBarItemClick");
316                     PipelineContext::SetCallBackNode(node);
317                     func->Execute();
318                 });
319             auto onClickWithParamFunc = AceType::MakeRefPtr<JsClickFunction>(JSRef<JSFunc>::Cast(itemActionValue));
320             toolBarItem->actionWithParam =
321                 EventMarker([func = std::move(onClickWithParamFunc), node = targetNode,
322                                 execCtx = info.GetExecutionContext()](const BaseEventInfo* info) {
323                     JAVASCRIPT_EXECUTION_SCOPE_WITH_CHECK(execCtx);
324                     ACE_SCORING_EVENT("Navigation.menuItemButtonClick");
325                     PipelineContext::SetCallBackNode(node);
326                     func->Execute();
327                 });
328         }
329         items.push_back(toolBarItem);
330     }
331 }
332 
SetToolBarConfiguration(ArkUIRuntimeCallInfo * runtimeCallInfo)333 ArkUINativeModuleValue NavigationBridge::SetToolBarConfiguration(ArkUIRuntimeCallInfo* runtimeCallInfo)
334 {
335     EcmaVM* vm = runtimeCallInfo->GetVM();
336     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
337     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
338     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
339     auto* frameNode = reinterpret_cast<FrameNode*>(firstArg->ToNativePointer(vm)->Value());
340     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
341     NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAV_BAR, "navigation.toolbarConfiguration");
342     using namespace OHOS::Ace::Framework;
343     JsiCallbackInfo info = JsiCallbackInfo(runtimeCallInfo);
344     bool hideText = false;
345     JSNavigationUtils::ParseHideToolBarText(info, hideText);
346     NavigationModel::GetInstance()->SetHideItemText(hideText);
347     if (info[1]->IsUndefined() || info[1]->IsArray()) {
348         if (NavigationModel::GetInstance()->NeedSetItems()) {
349             std::vector<NG::BarItem> toolbarItems = {};
350             if (!info[1]->IsUndefined()) {
351                 auto targetNode = AceType::WeakClaim(NG::ViewStackProcessor::GetInstance()->GetMainFrameNode());
352                 JSNavigationUtils::ParseToolbarItemsConfiguration(
353                     targetNode, info, JSRef<JSArray>::Cast(info[1]), toolbarItems);
354             }
355             NG::MoreButtonOptions toolbarMoreButtonOptions;
356             if (info.Length() > MIN_INFO_LENGTH && info[NUM_2]->IsObject()) {
357                 auto optObj = JSRef<JSObject>::Cast(info[NUM_2]);
358                 auto moreButtonProperty = optObj->GetProperty(MORE_BUTTON_OPTIONS_PROPERTY);
359                 JSNavigationUtils::ParseToolBarMoreButtonOptions(moreButtonProperty, toolbarMoreButtonOptions);
360             }
361             if (SystemProperties::ConfigChangePerform()) {
362                 NavigationModel::GetInstance()->SetToolbarConfiguration(
363                     std::move(toolbarItems), std::move(toolbarMoreButtonOptions));
364             } else {
365                 NavigationModel::GetInstance()->SetToolbarMorebuttonOptions(std::move(toolbarMoreButtonOptions));
366                 NavigationModel::GetInstance()->SetToolbarConfiguration(std::move(toolbarItems));
367             }
368         } else {
369             std::list<RefPtr<AceType>> items;
370             NavigationModel::GetInstance()->GetToolBarItems(items);
371             ParseToolBarItems(info, items);
372         }
373     } else if (info[1]->IsObject()) {
374         auto builderFuncParam = JSRef<JSObject>::Cast(info[1])->GetProperty("builder");
375         if (builderFuncParam->IsFunction()) {
376             ViewStackModel::GetInstance()->NewScope();
377             JsFunction jsBuilderFunc(builderFuncParam);
378             jsBuilderFunc.Execute();
379             auto customNode = ViewStackModel::GetInstance()->Finish();
380             NavigationModel::GetInstance()->SetCustomToolBar(customNode);
381         }
382     }
383     NG::NavigationToolbarOptions options;
384     NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::NAV_BAR, "navigation.navigationToolbarOptions");
385     JSNavigationUtils::ParseToolbarOptions(info, options, NUM_2);
386     NavigationModel::GetInstance()->SetToolbarOptions(std::move(options));
387     return panda::JSValueRef::Undefined(vm);
388 }
389 
ResetToolBarConfiguration(ArkUIRuntimeCallInfo * runtimeCallInfo)390 ArkUINativeModuleValue NavigationBridge::ResetToolBarConfiguration(ArkUIRuntimeCallInfo* runtimeCallInfo)
391 {
392     EcmaVM* vm = runtimeCallInfo->GetVM();
393     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
394     return panda::JSValueRef::Undefined(vm);
395 }
396 
SetOnNavBarStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)397 ArkUINativeModuleValue NavigationBridge::SetOnNavBarStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
398 {
399     EcmaVM* vm = runtimeCallInfo->GetVM();
400     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
401     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
402     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
403     CHECK_NULL_RETURN(firstArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
404     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
405     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
406     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
407     auto nodeModifiers = GetArkUINodeModifiers();
408     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
409     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
410         nodeModifiers->getNavigationModifier()->resetOnNavBarStateChange(nativeNode);
411         return panda::JSValueRef::Undefined(vm);
412     }
413     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
414     std::function<void(bool)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](bool isNavBarStatus) {
415         panda::LocalScope pandaScope(vm);
416         panda::TryCatch trycatch(vm);
417         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
418         panda::Local<panda::JSValueRef> params[1] = { panda::BooleanRef::New(vm, isNavBarStatus) };
419         func->Call(vm, func.ToLocal(), params, 1);
420     };
421     nodeModifiers->getNavigationModifier()->setOnNavBarStateChange(
422         nativeNode, reinterpret_cast<void*>(&callback));
423     return panda::JSValueRef::Undefined(vm);
424 }
425 
ResetOnNavBarStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)426 ArkUINativeModuleValue NavigationBridge::ResetOnNavBarStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
427 {
428     EcmaVM* vm = runtimeCallInfo->GetVM();
429     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
430     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
431     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
432     auto nodeModifiers = GetArkUINodeModifiers();
433     CHECK_NULL_RETURN(nodeModifiers, panda::NativePointerRef::New(vm, nullptr));
434     nodeModifiers->getNavigationModifier()->resetOnNavBarStateChange(nativeNode);
435     return panda::JSValueRef::Undefined(vm);
436 }
437 
SetTitleMode(ArkUIRuntimeCallInfo * runtimeCallInfo)438 ArkUINativeModuleValue NavigationBridge::SetTitleMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
439 {
440     EcmaVM* vm = runtimeCallInfo->GetVM();
441     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
442     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
443     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
444     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
445     int32_t value;
446     if (valueArg->IsNull() || valueArg->IsUndefined() || !ArkTSUtils::ParseJsInteger(vm, valueArg, value)) {
447         GetArkUINodeModifiers()->getNavigationModifier()->resetTitleMode(nativeNode);
448     } else {
449         GetArkUINodeModifiers()->getNavigationModifier()->setTitleMode(nativeNode, value);
450     }
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
ResetTitleMode(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue NavigationBridge::ResetTitleMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
459     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
460     GetArkUINodeModifiers()->getNavigationModifier()->resetTitleMode(nativeNode);
461     return panda::JSValueRef::Undefined(vm);
462 }
463 
SetHideBackButton(ArkUIRuntimeCallInfo * runtimeCallInfo)464 ArkUINativeModuleValue NavigationBridge::SetHideBackButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
465 {
466     EcmaVM* vm = runtimeCallInfo->GetVM();
467     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
468     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
469     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
470     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
471     if (hideArg->IsBoolean()) {
472         bool hide = hideArg->ToBoolean(vm)->Value();
473         GetArkUINodeModifiers()->getNavigationModifier()->setHideBackButton(nativeNode, hide);
474     } else {
475         GetArkUINodeModifiers()->getNavigationModifier()->resetHideBackButton(nativeNode);
476     }
477     return panda::JSValueRef::Undefined(vm);
478 }
479 
ResetHideBackButton(ArkUIRuntimeCallInfo * runtimeCallInfo)480 ArkUINativeModuleValue NavigationBridge::ResetHideBackButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
481 {
482     EcmaVM* vm = runtimeCallInfo->GetVM();
483     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
484     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
485     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
486     GetArkUINodeModifiers()->getNavigationModifier()->resetHideBackButton(nativeNode);
487     return panda::JSValueRef::Undefined(vm);
488 }
489 
SetSubtitle(ArkUIRuntimeCallInfo * runtimeCallInfo)490 ArkUINativeModuleValue NavigationBridge::SetSubtitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
491 {
492     EcmaVM* vm = runtimeCallInfo->GetVM();
493     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
494     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
495     Local<JSValueRef> subtitleArg = runtimeCallInfo->GetCallArgRef(1);
496     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
497     if (subtitleArg->IsString(vm)) {
498         std::string subtitle = subtitleArg->ToString(vm)->ToString(vm);
499         GetArkUINodeModifiers()->getNavigationModifier()->setSubtitle(nativeNode, subtitle.c_str());
500     } else {
501         GetArkUINodeModifiers()->getNavigationModifier()->resetSubtitle(nativeNode);
502     }
503     return panda::JSValueRef::Undefined(vm);
504 }
505 
ResetSubtitle(ArkUIRuntimeCallInfo * runtimeCallInfo)506 ArkUINativeModuleValue NavigationBridge::ResetSubtitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
507 {
508     EcmaVM* vm = runtimeCallInfo->GetVM();
509     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
510     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
511     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
512     GetArkUINodeModifiers()->getNavigationModifier()->resetSubtitle(nativeNode);
513     return panda::JSValueRef::Undefined(vm);
514 }
515 
SetHideNavBar(ArkUIRuntimeCallInfo * runtimeCallInfo)516 ArkUINativeModuleValue NavigationBridge::SetHideNavBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
517 {
518     EcmaVM* vm = runtimeCallInfo->GetVM();
519     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
520     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
521     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
522     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
523     if (hideArg->IsBoolean()) {
524         bool hide = hideArg->ToBoolean(vm)->Value();
525         GetArkUINodeModifiers()->getNavigationModifier()->setHideNavBar(nativeNode, hide);
526     } else {
527         GetArkUINodeModifiers()->getNavigationModifier()->resetHideNavBar(nativeNode);
528     }
529 
530     return panda::JSValueRef::Undefined(vm);
531 }
532 
ResetHideNavBar(ArkUIRuntimeCallInfo * runtimeCallInfo)533 ArkUINativeModuleValue NavigationBridge::ResetHideNavBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
534 {
535     EcmaVM* vm = runtimeCallInfo->GetVM();
536     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
537     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
538     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
539     GetArkUINodeModifiers()->getNavigationModifier()->resetHideNavBar(nativeNode);
540     return panda::JSValueRef::Undefined(vm);
541 }
542 
SetUsrNavigationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)543 ArkUINativeModuleValue NavigationBridge::SetUsrNavigationMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
544 {
545     EcmaVM* vm = runtimeCallInfo->GetVM();
546     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
547     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
548     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
549     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
550     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
551         GetArkUINodeModifiers()->getNavigationModifier()->resetUsrNavigationMode(nativeNode);
552         return panda::JSValueRef::Undefined(vm);
553     }
554     uint32_t value = valueArg->Uint32Value(vm);
555     GetArkUINodeModifiers()->getNavigationModifier()->setUsrNavigationMode(nativeNode, value);
556     return panda::JSValueRef::Undefined(vm);
557 }
558 
ResetUsrNavigationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)559 ArkUINativeModuleValue NavigationBridge::ResetUsrNavigationMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
560 {
561     EcmaVM* vm = runtimeCallInfo->GetVM();
562     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
563     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
564     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
565     GetArkUINodeModifiers()->getNavigationModifier()->resetUsrNavigationMode(nativeNode);
566     return panda::JSValueRef::Undefined(vm);
567 }
568 
SetHideTitleBar(ArkUIRuntimeCallInfo * runtimeCallInfo)569 ArkUINativeModuleValue NavigationBridge::SetHideTitleBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
570 {
571     EcmaVM* vm = runtimeCallInfo->GetVM();
572     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
573     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
574     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
575     const int32_t argsNum = 2; // 2: parameter index
576     Local<JSValueRef> animatedArg = runtimeCallInfo->GetCallArgRef(argsNum);
577     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
578     bool hide = false;
579     bool animated = false;
580     if (!hideArg->IsNull() && !hideArg->IsUndefined() && hideArg->IsBoolean()) {
581         hide = hideArg->ToBoolean(vm)->Value();
582     }
583     if (!animatedArg->IsNull() && !animatedArg->IsUndefined() && animatedArg->IsBoolean()) {
584         animated = animatedArg->ToBoolean(vm)->Value();
585     }
586     GetArkUINodeModifiers()->getNavigationModifier()->setNavHideTitleBar(nativeNode, hide, animated);
587     return panda::JSValueRef::Undefined(vm);
588 }
589 
ResetHideTitleBar(ArkUIRuntimeCallInfo * runtimeCallInfo)590 ArkUINativeModuleValue NavigationBridge::ResetHideTitleBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
591 {
592     EcmaVM* vm = runtimeCallInfo->GetVM();
593     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
594     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
595     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
596     GetArkUINodeModifiers()->getNavigationModifier()->resetNavHideTitleBar(nativeNode);
597     return panda::JSValueRef::Undefined(vm);
598 }
599 
SetEnableModeChangeAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)600 ArkUINativeModuleValue NavigationBridge::SetEnableModeChangeAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
601 {
602     EcmaVM* vm = runtimeCallInfo->GetVM();
603     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
604     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
605     Local<JSValueRef> enableArg = runtimeCallInfo->GetCallArgRef(1);
606     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
607     if (enableArg->IsBoolean()) {
608         bool isEnable = enableArg->ToBoolean(vm)->Value();
609         GetArkUINodeModifiers()->getNavigationModifier()->setEnableModeChangeAnimation(nativeNode, isEnable);
610         return panda::JSValueRef::Undefined(vm);
611     }
612     GetArkUINodeModifiers()->getNavigationModifier()->setEnableModeChangeAnimation(nativeNode, true);
613     return panda::JSValueRef::Undefined(vm);
614 }
615 
ResetEnableModeChangeAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)616 ArkUINativeModuleValue NavigationBridge::ResetEnableModeChangeAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
617 {
618     EcmaVM* vm = runtimeCallInfo->GetVM();
619     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
620     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
621     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
622     GetArkUINodeModifiers()->getNavigationModifier()->resetEnableModeChangeAnimation(nativeNode);
623     return panda::JSValueRef::Undefined(vm);
624 }
625 
SetSplitPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)626 ArkUINativeModuleValue NavigationBridge::SetSplitPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
627 {
628     EcmaVM* vm = runtimeCallInfo->GetVM();
629     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
630     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
631     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
632     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
633     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
634     if (info[1]->IsObject()) {
635         JSRef<JSObject> contentObject = JSRef<JSObject>::Cast(info[1]);
636         JSRef<JSVal> builderNodeParam = contentObject->GetProperty("builderNode_");
637         if (builderNodeParam->IsObject()) {
638             JSRef<JSObject> builderNodeObject = JSRef<JSObject>::Cast(builderNodeParam);
639             JSRef<JSVal> nodeptr = builderNodeObject->GetProperty("nodePtr_");
640             if (!nodeptr.IsEmpty()) {
641                 auto node = nodePtr(nodeptr->GetLocalHandle()->ToNativePointer(vm)->Value());
642                 GetArkUINodeModifiers()->getNavigationModifier()->setSplitPlaceholder(nativeNode, node);
643                 return panda::JSValueRef::Undefined(vm);
644             }
645         }
646     }
647     GetArkUINodeModifiers()->getNavigationModifier()->resetSplitPlaceholder(nativeNode);
648     return panda::JSValueRef::Undefined(vm);
649 }
650 
ResetSplitPlaceholder(ArkUIRuntimeCallInfo * runtimeCallInfo)651 ArkUINativeModuleValue NavigationBridge::ResetSplitPlaceholder(ArkUIRuntimeCallInfo* runtimeCallInfo)
652 {
653     EcmaVM* vm = runtimeCallInfo->GetVM();
654     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
655     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
656     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
657     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
658     GetArkUINodeModifiers()->getNavigationModifier()->resetSplitPlaceholder(nativeNode);
659     return panda::JSValueRef::Undefined(vm);
660 }
661 
SetNavBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)662 ArkUINativeModuleValue NavigationBridge::SetNavBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
663 {
664     EcmaVM* vm = runtimeCallInfo->GetVM();
665     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
666     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
667     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
668     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
669     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
670         GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarPosition(nativeNode);
671         return panda::JSValueRef::Undefined(vm);
672     }
673     int32_t value = valueArg->Int32Value(vm);
674     GetArkUINodeModifiers()->getNavigationModifier()->setNavBarPosition(nativeNode, value);
675     return panda::JSValueRef::Undefined(vm);
676 }
677 
ResetNavBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)678 ArkUINativeModuleValue NavigationBridge::ResetNavBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
679 {
680     EcmaVM* vm = runtimeCallInfo->GetVM();
681     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
682     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
683     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
684     GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarPosition(nativeNode);
685     return panda::JSValueRef::Undefined(vm);
686 }
687 
SetNavBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)688 ArkUINativeModuleValue NavigationBridge::SetNavBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
689 {
690     EcmaVM* vm = runtimeCallInfo->GetVM();
691     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
692     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
693     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
694     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
695 
696     CalcDimension width;
697     RefPtr<ResourceObject> navBarWidthResObj;
698     if (jsValue->IsNull() || jsValue->IsUndefined() ||
699         !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width, navBarWidthResObj)) {
700         GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarWidth(nativeNode);
701     } else {
702         auto widthRawPtr = AceType::RawPtr(navBarWidthResObj);
703         GetArkUINodeModifiers()->getNavigationModifier()->setNavBarWidth(
704             nativeNode, width.Value(), static_cast<int>(width.Unit()), widthRawPtr);
705     }
706     return panda::JSValueRef::Undefined(vm);
707 }
708 
ResetNavBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)709 ArkUINativeModuleValue NavigationBridge::ResetNavBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
710 {
711     EcmaVM* vm = runtimeCallInfo->GetVM();
712     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
713     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
714     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
715     GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarWidth(nativeNode);
716     return panda::JSValueRef::Undefined(vm);
717 }
718 
SetNavBarWidthRange(ArkUIRuntimeCallInfo * runtimeCallInfo)719 ArkUINativeModuleValue NavigationBridge::SetNavBarWidthRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
720 {
721     EcmaVM* vm = runtimeCallInfo->GetVM();
722     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
723     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
724     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
725     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
726     if (jsValue->IsNull() || jsValue->IsUndefined() || !jsValue->IsArray(vm)) {
727         GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
728         GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
729         return panda::JSValueRef::Undefined(vm);
730     }
731     auto rangeArray = panda::Local<panda::ArrayRef>(jsValue);
732     auto minNavBarWidth = panda::ArrayRef::GetValueAt(vm, rangeArray, 0);
733     CalcDimension minWidth;
734     RefPtr<ResourceObject> minNavBarWidthResObj;
735     if (minNavBarWidth->IsNull() || minNavBarWidth->IsUndefined() ||
736         !ArkTSUtils::ParseJsDimensionVp(vm, minNavBarWidth, minWidth, minNavBarWidthResObj)) {
737         GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
738     } else {
739         auto minNavBarWidthRawPtr = AceType::RawPtr(minNavBarWidthResObj);
740         GetArkUINodeModifiers()->getNavigationModifier()->setMinNavBarWidth(
741             nativeNode, minWidth.Value(), static_cast<int>(minWidth.Unit()), minNavBarWidthRawPtr);
742     }
743     auto maxNavBarWidth = panda::ArrayRef::GetValueAt(vm, rangeArray, 1);
744     CalcDimension maxWidth;
745     RefPtr<ResourceObject> maxNavBarWidthResObj;
746     if (maxNavBarWidth->IsNull() || maxNavBarWidth->IsUndefined() ||
747         !ArkTSUtils::ParseJsDimensionVp(vm, maxNavBarWidth, maxWidth, maxNavBarWidthResObj)) {
748         GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
749     } else {
750         auto maxNavBarWidthRawPtr = AceType::RawPtr(maxNavBarWidthResObj);
751         GetArkUINodeModifiers()->getNavigationModifier()->setMaxNavBarWidth(
752             nativeNode, maxWidth.Value(), static_cast<int>(maxWidth.Unit()), maxNavBarWidthRawPtr);
753     }
754     return panda::JSValueRef::Undefined(vm);
755 }
756 
ResetNavBarWidthRange(ArkUIRuntimeCallInfo * runtimeCallInfo)757 ArkUINativeModuleValue NavigationBridge::ResetNavBarWidthRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
758 {
759     EcmaVM* vm = runtimeCallInfo->GetVM();
760     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
761     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
762     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
763     GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
764     GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
765     return panda::JSValueRef::Undefined(vm);
766 }
767 
SetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)768 ArkUINativeModuleValue NavigationBridge::SetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
769 {
770     EcmaVM* vm = runtimeCallInfo->GetVM();
771     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
772     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
773     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
774     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
775 
776     CalcDimension width;
777     RefPtr<ResourceObject> minContentWidthResObj;
778     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width,
779         minContentWidthResObj)) {
780         GetArkUINodeModifiers()->getNavigationModifier()->resetMinContentWidth(nativeNode);
781     } else {
782         auto widthRawPtr = AceType::RawPtr(minContentWidthResObj);
783         GetArkUINodeModifiers()->getNavigationModifier()->setMinContentWidth(
784             nativeNode, width.Value(), static_cast<int>(width.Unit()), widthRawPtr);
785     }
786     return panda::JSValueRef::Undefined(vm);
787 }
788 
ResetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)789 ArkUINativeModuleValue NavigationBridge::ResetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
790 {
791     EcmaVM* vm = runtimeCallInfo->GetVM();
792     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
793     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
794     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
795     GetArkUINodeModifiers()->getNavigationModifier()->resetMinContentWidth(nativeNode);
796     return panda::JSValueRef::Undefined(vm);
797 }
798 
SetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)799 ArkUINativeModuleValue NavigationBridge::SetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
800 {
801     EcmaVM* vm = runtimeCallInfo->GetVM();
802     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
803     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
804     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
805     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
806     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
807     NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.backButtonIcon.icon");
808 
809     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
810     std::string src;
811     RefPtr<ResourceObject> backButtonIconResObj;
812     auto noPixMap = Framework::JSViewAbstract::ParseJsMedia(info[1], src, backButtonIconResObj);
813     auto isValidImage = false;
814     RefPtr<PixelMap> pixMap = nullptr;
815 #if defined(PIXEL_MAP_SUPPORTED)
816     if (!noPixMap) {
817         pixMap = CreatePixelMapFromNapiValue(info[1]);
818     }
819 #endif
820     if (noPixMap || pixMap != nullptr) {
821         isValidImage = true;
822     }
823     std::string bundleName;
824     std::string moduleName;
825     Framework::JSViewAbstract::GetJsMediaBundleInfo(info[1], bundleName, moduleName);
826     NG::ImageOption imageOption;
827     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
828     auto isSymbol = info[1]->IsObject() && src.empty() && pixMap == nullptr;
829     if (isSymbol) {
830         Framework::JSViewAbstract::SetSymbolOptionApply(info, iconSymbol, info[1]);
831     }
832     imageOption.noPixMap = noPixMap;
833     imageOption.isValidImage = isValidImage;
834     if (SystemProperties::ConfigChangePerform() && backButtonIconResObj) {
835         NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, imageOption, pixMap, backButtonIconResObj);
836     } else {
837         NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, src, imageOption, pixMap);
838     }
839     return panda::JSValueRef::Undefined(vm);
840 }
841 
ResetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)842 ArkUINativeModuleValue NavigationBridge::ResetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
843 {
844     EcmaVM* vm = runtimeCallInfo->GetVM();
845     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
846     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
847     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
848     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
849     NavigationModelNG::ResetResObj(frameNode, NavigationPatternType::TITLE_BAR, "navigation.backButtonIcon.icon");
850     bool noPixMap = false;
851     NG::ImageOption imageOption;
852     imageOption.noPixMap = noPixMap;
853     imageOption.isValidImage = false;
854     RefPtr<PixelMap> pixMap = nullptr;
855     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
856     std::string src;
857     NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, src, imageOption, pixMap);
858     return panda::JSValueRef::Undefined(vm);
859 }
860 
SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)861 ArkUINativeModuleValue NavigationBridge::SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo *runtimeCallInfo)
862 {
863     EcmaVM* vm = runtimeCallInfo->GetVM();
864     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
865     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
866     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
867     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
868     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
869     std::string typeCppStr;
870     std::string edgesCppStr;
871     if (secondArg->IsString(vm)) {
872         typeCppStr = secondArg->ToString(vm)->ToString(vm);
873     } else {
874         //type system
875         typeCppStr = "0";
876     }
877 
878     if (thirdArg->IsString(vm)) {
879         edgesCppStr = thirdArg->ToString(vm)->ToString(vm);
880     } else {
881         //edge top and bottom
882         edgesCppStr = "0|1";
883     }
884     const char* typeStr = typeCppStr.c_str();
885     const char* edgesStr = edgesCppStr.c_str();
886     GetArkUINodeModifiers()->getNavigationModifier()->setNavIgnoreLayoutSafeArea(nativeNode, typeStr, edgesStr);
887     return panda::JSValueRef::Undefined(vm);
888 }
889 
ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)890 ArkUINativeModuleValue NavigationBridge::ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo* runtimeCallInfo)
891 {
892     EcmaVM* vm = runtimeCallInfo->GetVM();
893     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
894     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
895     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
896     GetArkUINodeModifiers()->getNavigationModifier()->resetNavIgnoreLayoutSafeArea(nativeNode);
897     return panda::JSValueRef::Undefined(vm);
898 }
899 
SetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)900 ArkUINativeModuleValue NavigationBridge::SetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
901 {
902     EcmaVM* vm = runtimeCallInfo->GetVM();
903     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
904     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
905     Local<JSValueRef> titleArg = runtimeCallInfo->GetCallArgRef(1);
906     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(2);
907     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
908     std::string title;
909     std::string subtitle;
910     bool hasMain = false;
911     bool hasSub = false;
912     RefPtr<ResourceObject> titleResObj;
913     RefPtr<ResourceObject> subtitleResObj;
914     if (ArkTSUtils::ParseJsString(vm, titleArg, title, titleResObj)) {
915         // Resource and string type.
916         subtitle = "";
917         hasMain = true;
918         hasSub = false;
919     } else if (titleArg->IsObject(vm)) {
920         // NavigationCommonTitle
921         auto obj = titleArg->ToObject(vm);
922         auto main = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "main"));
923         auto sub = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "sub"));
924         hasMain = ArkTSUtils::ParseJsString(vm, main, title, titleResObj);
925         hasSub = ArkTSUtils::ParseJsString(vm, sub, subtitle, subtitleResObj);
926         // NavigationCustomTitle or CustomBuilder is not supported
927     } else {
928         GetArkUINodeModifiers()->getNavigationModifier()->resetNavTitle(nativeNode);
929         return panda::JSValueRef::Undefined(vm);
930     }
931 
932     ArkUINavigationTitlebarOptions options;
933     if (optionsArg->IsObject(vm)) {
934         NativeNavigationUtils::ParseTitleOptions(vm, optionsArg, nativeNode, options);
935     }
936     ArkUINavigationTitleInfo titleInfo = { hasSub, hasMain, subtitle.c_str(), title.c_str() };
937     auto titleRawPtr = AceType::RawPtr(titleResObj);
938     auto subtitleRawPtr = AceType::RawPtr(subtitleResObj);
939     GetArkUINodeModifiers()->getNavigationModifier()->setNavTitle(nativeNode, titleInfo, options,
940         titleRawPtr, subtitleRawPtr);
941     return panda::JSValueRef::Undefined(vm);
942 }
943 
ResetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)944 ArkUINativeModuleValue NavigationBridge::ResetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
945 {
946     EcmaVM* vm = runtimeCallInfo->GetVM();
947     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
948     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
949     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
950     GetArkUINodeModifiers()->getNavigationModifier()->resetNavTitle(nativeNode);
951     return panda::JSValueRef::Undefined(vm);
952 }
953 
SetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)954 ArkUINativeModuleValue NavigationBridge::SetMenus(ArkUIRuntimeCallInfo* runtimeCallInfo)
955 {
956     EcmaVM* vm = runtimeCallInfo->GetVM();
957     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
958     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
959     Local<JSValueRef> menusArg = runtimeCallInfo->GetCallArgRef(1);
960     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
961     std::vector<ArkUIBarItem> menuItems;
962     if (menusArg->IsArray(vm)) {
963         NativeNavigationUtils::ParseBarItems(vm, menusArg, menuItems);
964         GetArkUINodeModifiers()->getNavigationModifier()->setNavMenus(nativeNode, menuItems.data(), menuItems.size());
965         // get action and symbolModifier single
966         auto actionSendFunc = GetArkUINodeModifiers()->getNavigationModifier()->setNavMenuItemAction;
967         auto symbolSendFunc = GetArkUINodeModifiers()->getNavigationModifier()->setNavMenuItemSymbol;
968         NativeNavigationUtils::ParseAndSendFunctionParam(runtimeCallInfo, menusArg, actionSendFunc, symbolSendFunc);
969     } else if (menusArg->IsUndefined()) {
970         menuItems = {};
971         GetArkUINodeModifiers()->getNavigationModifier()->setNavMenus(nativeNode, menuItems.data(), menuItems.size());
972     } else if (menusArg->IsObject(vm)) {
973         GetArkUINodeModifiers()->getNavigationModifier()->resetNavMenus(nativeNode);
974     }
975     return panda::JSValueRef::Undefined(vm);
976 }
977 
ResetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)978 ArkUINativeModuleValue NavigationBridge::ResetMenus(ArkUIRuntimeCallInfo* runtimeCallInfo)
979 {
980     EcmaVM* vm = runtimeCallInfo->GetVM();
981     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
982     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
983     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
984     GetArkUINodeModifiers()->getNavigationModifier()->resetNavMenus(nativeNode);
985     return panda::JSValueRef::Undefined(vm);
986 }
987 
SetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)988 ArkUINativeModuleValue NavigationBridge::SetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
989 {
990     EcmaVM* vm = runtimeCallInfo->GetVM();
991     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
992     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
993     Local<JSValueRef> recoverableArg = runtimeCallInfo->GetCallArgRef(1);
994     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
995     if (recoverableArg->IsNull() || recoverableArg->IsUndefined() || !recoverableArg->IsBoolean()) {
996         GetArkUINodeModifiers()->getNavigationModifier()->resetRecoverable(nativeNode);
997     } else {
998         bool recoverable = recoverableArg->ToBoolean(vm)->Value();
999         GetArkUINodeModifiers()->getNavigationModifier()->setRecoverable(nativeNode, recoverable);
1000     }
1001     return panda::JSValueRef::Undefined(vm);
1002 }
1003 
ResetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)1004 ArkUINativeModuleValue NavigationBridge::ResetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
1005 {
1006     EcmaVM* vm = runtimeCallInfo->GetVM();
1007     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1008     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1009     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1010     GetArkUINodeModifiers()->getNavigationModifier()->resetRecoverable(nativeNode);
1011     return panda::JSValueRef::Undefined(vm);
1012 }
1013 
SetEnableDragBar(ArkUIRuntimeCallInfo * runtimeCallInfo)1014 ArkUINativeModuleValue NavigationBridge::SetEnableDragBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
1015 {
1016     EcmaVM* vm = runtimeCallInfo->GetVM();
1017     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1018     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1019     Local<JSValueRef> enableDragBarArg = runtimeCallInfo->GetCallArgRef(1);
1020     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1021     if (enableDragBarArg->IsNull() || enableDragBarArg->IsUndefined() || !enableDragBarArg->IsBoolean()) {
1022         GetArkUINodeModifiers()->getNavigationModifier()->resetEnableDragBar(nativeNode);
1023     } else {
1024         bool enableDragBar = enableDragBarArg->ToBoolean(vm)->Value();
1025         GetArkUINodeModifiers()->getNavigationModifier()->setEnableDragBar(nativeNode, enableDragBar);
1026     }
1027     return panda::JSValueRef::Undefined(vm);
1028 }
1029 
ResetEnableDragBar(ArkUIRuntimeCallInfo * runtimeCallInfo)1030 ArkUINativeModuleValue NavigationBridge::ResetEnableDragBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
1031 {
1032     EcmaVM* vm = runtimeCallInfo->GetVM();
1033     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1034     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1035     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1036     GetArkUINodeModifiers()->getNavigationModifier()->resetEnableDragBar(nativeNode);
1037     return panda::JSValueRef::Undefined(vm);
1038 }
1039 
SetEnableToolBarAdaptation(ArkUIRuntimeCallInfo * runtimeCallInfo)1040 ArkUINativeModuleValue NavigationBridge::SetEnableToolBarAdaptation(ArkUIRuntimeCallInfo* runtimeCallInfo)
1041 {
1042     EcmaVM* vm = runtimeCallInfo->GetVM();
1043     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1044     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1045     Local<JSValueRef> enableArg = runtimeCallInfo->GetCallArgRef(1);
1046     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1047     if (enableArg->IsNull() || enableArg->IsUndefined() || !enableArg->IsBoolean()) {
1048         GetArkUINodeModifiers()->getNavigationModifier()->resetEnableToolBarAdaptation(nativeNode);
1049     } else {
1050         bool enable = enableArg->ToBoolean(vm)->Value();
1051         GetArkUINodeModifiers()->getNavigationModifier()->setEnableToolBarAdaptation(nativeNode, enable);
1052     }
1053     return panda::JSValueRef::Undefined(vm);
1054 }
1055 
ResetEnableToolBarAdaptation(ArkUIRuntimeCallInfo * runtimeCallInfo)1056 ArkUINativeModuleValue NavigationBridge::ResetEnableToolBarAdaptation(ArkUIRuntimeCallInfo* runtimeCallInfo)
1057 {
1058     EcmaVM* vm = runtimeCallInfo->GetVM();
1059     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1060     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
1061     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1062     GetArkUINodeModifiers()->getNavigationModifier()->resetEnableToolBarAdaptation(nativeNode);
1063     return panda::JSValueRef::Undefined(vm);
1064 }
1065 
SetSystemBarStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1066 ArkUINativeModuleValue NavigationBridge::SetSystemBarStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1067 {
1068     EcmaVM* vm = runtimeCallInfo->GetVM();
1069     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1070     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1071     Local<JSValueRef> styleArg = runtimeCallInfo->GetCallArgRef(NUM_1);
1072     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1073     auto nodeModifiers = GetArkUINodeModifiers();
1074     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1075     if (styleArg->IsNull() || styleArg->IsUndefined()) {
1076         nodeModifiers->getNavigationModifier()->resetSystemBarStyle(nativeNode);
1077     } else {
1078         std::string value;
1079         ArkTSUtils::ParseJsString(vm, styleArg, value);
1080         auto color = Color::FromString(value);
1081         nodeModifiers->getNavigationModifier()->setSystemBarStyle(nativeNode, color.GetValue());
1082     }
1083     return panda::JSValueRef::Undefined(vm);
1084 }
1085 
ResetSystemBarStyle(ArkUIRuntimeCallInfo * runtimeCallInfo)1086 ArkUINativeModuleValue NavigationBridge::ResetSystemBarStyle(ArkUIRuntimeCallInfo* runtimeCallInfo)
1087 {
1088     EcmaVM* vm = runtimeCallInfo->GetVM();
1089     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1090     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(NUM_0);
1091     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
1092     auto nodeModifiers = GetArkUINodeModifiers();
1093     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
1094     nodeModifiers->getNavigationModifier()->resetSystemBarStyle(nativeNode);
1095     return panda::JSValueRef::Undefined(vm);
1096 }
1097 } // namespace OHOS::Ace::NG
1098