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