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/jsi/nativeModule/arkts_native_navigation_utils.h"
18 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
19 #include "bridge/declarative_frontend/jsview/js_utils.h"
20 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
21 #include "core/components_ng/pattern/navigation/navigation_model_ng.h"
22 #include "frameworks/bridge/declarative_frontend/engine/js_types.h"
23 namespace OHOS::Ace::NG {} // namespace OHOS::Ace::NG
24 namespace OHOS::Ace::NG {
25 constexpr int NUM_0 = 0;
26 constexpr int NUM_1 = 1;
27 constexpr int NUM_2 = 2;
28 
SetHideToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)29 ArkUINativeModuleValue NavigationBridge::SetHideToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
30 {
31     EcmaVM* vm = runtimeCallInfo->GetVM();
32     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
33     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
34     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
35     const int32_t argsNum = 2; // 2: parameter index
36     Local<JSValueRef> animatedArg = runtimeCallInfo->GetCallArgRef(argsNum);
37     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
38     bool hide = false;
39     bool animated = false;
40     if (!hideArg->IsNull() && !hideArg->IsUndefined() && hideArg->IsBoolean()) {
41         hide = hideArg->ToBoolean(vm)->Value();
42     }
43     if (!animatedArg->IsNull() && !animatedArg->IsUndefined() && animatedArg->IsBoolean()) {
44         animated = animatedArg->ToBoolean(vm)->Value();
45     }
46     GetArkUINodeModifiers()->getNavigationModifier()->setHideToolBar(nativeNode, hide, animated);
47     return panda::JSValueRef::Undefined(vm);
48 }
49 
ResetHideToolBar(ArkUIRuntimeCallInfo * runtimeCallInfo)50 ArkUINativeModuleValue NavigationBridge::ResetHideToolBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
51 {
52     EcmaVM* vm = runtimeCallInfo->GetVM();
53     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
54     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
55     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
56     GetArkUINodeModifiers()->getNavigationModifier()->resetHideToolBar(nativeNode);
57     return panda::JSValueRef::Undefined(vm);
58 }
59 
SetTitleMode(ArkUIRuntimeCallInfo * runtimeCallInfo)60 ArkUINativeModuleValue NavigationBridge::SetTitleMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
61 {
62     EcmaVM* vm = runtimeCallInfo->GetVM();
63     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
64     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
65     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
66     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
67     int32_t value;
68     if (valueArg->IsNull() || valueArg->IsUndefined() || !ArkTSUtils::ParseJsInteger(vm, valueArg, value)) {
69         GetArkUINodeModifiers()->getNavigationModifier()->resetTitleMode(nativeNode);
70     } else {
71         GetArkUINodeModifiers()->getNavigationModifier()->setTitleMode(nativeNode, value);
72     }
73     return panda::JSValueRef::Undefined(vm);
74 }
75 
ResetTitleMode(ArkUIRuntimeCallInfo * runtimeCallInfo)76 ArkUINativeModuleValue NavigationBridge::ResetTitleMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
77 {
78     EcmaVM* vm = runtimeCallInfo->GetVM();
79     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
80     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
81     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
82     GetArkUINodeModifiers()->getNavigationModifier()->resetTitleMode(nativeNode);
83     return panda::JSValueRef::Undefined(vm);
84 }
85 
SetHideBackButton(ArkUIRuntimeCallInfo * runtimeCallInfo)86 ArkUINativeModuleValue NavigationBridge::SetHideBackButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
87 {
88     EcmaVM* vm = runtimeCallInfo->GetVM();
89     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
90     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
91     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
92     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
93     if (hideArg->IsBoolean()) {
94         bool hide = hideArg->ToBoolean(vm)->Value();
95         GetArkUINodeModifiers()->getNavigationModifier()->setHideBackButton(nativeNode, hide);
96     } else {
97         GetArkUINodeModifiers()->getNavigationModifier()->resetHideBackButton(nativeNode);
98     }
99     return panda::JSValueRef::Undefined(vm);
100 }
101 
ResetHideBackButton(ArkUIRuntimeCallInfo * runtimeCallInfo)102 ArkUINativeModuleValue NavigationBridge::ResetHideBackButton(ArkUIRuntimeCallInfo* runtimeCallInfo)
103 {
104     EcmaVM* vm = runtimeCallInfo->GetVM();
105     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
106     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
107     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
108     GetArkUINodeModifiers()->getNavigationModifier()->resetHideBackButton(nativeNode);
109     return panda::JSValueRef::Undefined(vm);
110 }
111 
SetSubtitle(ArkUIRuntimeCallInfo * runtimeCallInfo)112 ArkUINativeModuleValue NavigationBridge::SetSubtitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
113 {
114     EcmaVM* vm = runtimeCallInfo->GetVM();
115     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
116     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
117     Local<JSValueRef> subtitleArg = runtimeCallInfo->GetCallArgRef(1);
118     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
119     if (subtitleArg->IsString(vm)) {
120         std::string subtitle = subtitleArg->ToString(vm)->ToString(vm);
121         GetArkUINodeModifiers()->getNavigationModifier()->setSubtitle(nativeNode, subtitle.c_str());
122     } else {
123         GetArkUINodeModifiers()->getNavigationModifier()->resetSubtitle(nativeNode);
124     }
125     return panda::JSValueRef::Undefined(vm);
126 }
127 
ResetSubtitle(ArkUIRuntimeCallInfo * runtimeCallInfo)128 ArkUINativeModuleValue NavigationBridge::ResetSubtitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
129 {
130     EcmaVM* vm = runtimeCallInfo->GetVM();
131     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
132     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
133     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
134     GetArkUINodeModifiers()->getNavigationModifier()->resetSubtitle(nativeNode);
135     return panda::JSValueRef::Undefined(vm);
136 }
137 
SetHideNavBar(ArkUIRuntimeCallInfo * runtimeCallInfo)138 ArkUINativeModuleValue NavigationBridge::SetHideNavBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
139 {
140     EcmaVM* vm = runtimeCallInfo->GetVM();
141     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
142     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
143     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
144     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
145     if (hideArg->IsBoolean()) {
146         bool hide = hideArg->ToBoolean(vm)->Value();
147         GetArkUINodeModifiers()->getNavigationModifier()->setHideNavBar(nativeNode, hide);
148     } else {
149         GetArkUINodeModifiers()->getNavigationModifier()->resetHideNavBar(nativeNode);
150     }
151     return panda::JSValueRef::Undefined(vm);
152 }
153 
ResetHideNavBar(ArkUIRuntimeCallInfo * runtimeCallInfo)154 ArkUINativeModuleValue NavigationBridge::ResetHideNavBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
155 {
156     EcmaVM* vm = runtimeCallInfo->GetVM();
157     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
158     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
159     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
160     GetArkUINodeModifiers()->getNavigationModifier()->resetHideNavBar(nativeNode);
161     return panda::JSValueRef::Undefined(vm);
162 }
163 
SetUsrNavigationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)164 ArkUINativeModuleValue NavigationBridge::SetUsrNavigationMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
165 {
166     EcmaVM* vm = runtimeCallInfo->GetVM();
167     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
168     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
169     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
170     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
171     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
172         GetArkUINodeModifiers()->getNavigationModifier()->resetUsrNavigationMode(nativeNode);
173         return panda::JSValueRef::Undefined(vm);
174     }
175     uint32_t value = valueArg->Uint32Value(vm);
176     GetArkUINodeModifiers()->getNavigationModifier()->setUsrNavigationMode(nativeNode, value);
177     return panda::JSValueRef::Undefined(vm);
178 }
179 
ResetUsrNavigationMode(ArkUIRuntimeCallInfo * runtimeCallInfo)180 ArkUINativeModuleValue NavigationBridge::ResetUsrNavigationMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
181 {
182     EcmaVM* vm = runtimeCallInfo->GetVM();
183     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
184     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
185     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
186     GetArkUINodeModifiers()->getNavigationModifier()->resetUsrNavigationMode(nativeNode);
187     return panda::JSValueRef::Undefined(vm);
188 }
189 
SetHideTitleBar(ArkUIRuntimeCallInfo * runtimeCallInfo)190 ArkUINativeModuleValue NavigationBridge::SetHideTitleBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
191 {
192     EcmaVM* vm = runtimeCallInfo->GetVM();
193     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
194     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
195     Local<JSValueRef> hideArg = runtimeCallInfo->GetCallArgRef(1);
196     const int32_t argsNum = 2; // 2: parameter index
197     Local<JSValueRef> animatedArg = runtimeCallInfo->GetCallArgRef(argsNum);
198     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
199     bool hide = false;
200     bool animated = false;
201     if (!hideArg->IsNull() && !hideArg->IsUndefined() && hideArg->IsBoolean()) {
202         hide = hideArg->ToBoolean(vm)->Value();
203     }
204     if (!animatedArg->IsNull() && !animatedArg->IsUndefined() && animatedArg->IsBoolean()) {
205         animated = animatedArg->ToBoolean(vm)->Value();
206     }
207     GetArkUINodeModifiers()->getNavigationModifier()->setNavHideTitleBar(nativeNode, hide, animated);
208     return panda::JSValueRef::Undefined(vm);
209 }
210 
ResetHideTitleBar(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue NavigationBridge::ResetHideTitleBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213     EcmaVM* vm = runtimeCallInfo->GetVM();
214     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
216     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
217     GetArkUINodeModifiers()->getNavigationModifier()->resetNavHideTitleBar(nativeNode);
218     return panda::JSValueRef::Undefined(vm);
219 }
220 
SetNavBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue NavigationBridge::SetNavBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
222 {
223     EcmaVM* vm = runtimeCallInfo->GetVM();
224     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
225     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
226     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
227     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
228     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
229         GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarPosition(nativeNode);
230         return panda::JSValueRef::Undefined(vm);
231     }
232     int32_t value = valueArg->Int32Value(vm);
233     GetArkUINodeModifiers()->getNavigationModifier()->setNavBarPosition(nativeNode, value);
234     return panda::JSValueRef::Undefined(vm);
235 }
236 
ResetNavBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)237 ArkUINativeModuleValue NavigationBridge::ResetNavBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
238 {
239     EcmaVM* vm = runtimeCallInfo->GetVM();
240     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
241     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
242     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
243     GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarPosition(nativeNode);
244     return panda::JSValueRef::Undefined(vm);
245 }
246 
SetNavBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)247 ArkUINativeModuleValue NavigationBridge::SetNavBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
248 {
249     EcmaVM* vm = runtimeCallInfo->GetVM();
250     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
251     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
252     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
253     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
254 
255     CalcDimension width;
256     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width)) {
257         GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarWidth(nativeNode);
258     } else {
259         GetArkUINodeModifiers()->getNavigationModifier()->setNavBarWidth(
260             nativeNode, width.Value(), static_cast<int>(width.Unit()));
261     }
262     return panda::JSValueRef::Undefined(vm);
263 }
264 
ResetNavBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)265 ArkUINativeModuleValue NavigationBridge::ResetNavBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
266 {
267     EcmaVM* vm = runtimeCallInfo->GetVM();
268     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
269     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
270     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
271     GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarWidth(nativeNode);
272     return panda::JSValueRef::Undefined(vm);
273 }
274 
SetNavBarWidthRange(ArkUIRuntimeCallInfo * runtimeCallInfo)275 ArkUINativeModuleValue NavigationBridge::SetNavBarWidthRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
276 {
277     EcmaVM* vm = runtimeCallInfo->GetVM();
278     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
279     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
280     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
281     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
282     if (jsValue->IsNull() || jsValue->IsUndefined() || !jsValue->IsArray(vm)) {
283         GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
284         GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
285         return panda::JSValueRef::Undefined(vm);
286     }
287     auto rangeArray = panda::Local<panda::ArrayRef>(jsValue);
288     auto minNavBarWidth = panda::ArrayRef::GetValueAt(vm, rangeArray, 0);
289     CalcDimension minWidth;
290     if (minNavBarWidth->IsNull() || minNavBarWidth->IsUndefined() ||
291         !ArkTSUtils::ParseJsDimensionVp(vm, minNavBarWidth, minWidth)) {
292         GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
293     } else {
294         GetArkUINodeModifiers()->getNavigationModifier()->setMinNavBarWidth(
295             nativeNode, minWidth.Value(), static_cast<int>(minWidth.Unit()));
296     }
297     auto maxNavBarWidth = panda::ArrayRef::GetValueAt(vm, rangeArray, 1);
298     CalcDimension maxWidth;
299     if (maxNavBarWidth->IsNull() || maxNavBarWidth->IsUndefined() ||
300         !ArkTSUtils::ParseJsDimensionVp(vm, maxNavBarWidth, maxWidth)) {
301         GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
302     } else {
303         GetArkUINodeModifiers()->getNavigationModifier()->setMaxNavBarWidth(
304             nativeNode, maxWidth.Value(), static_cast<int>(maxWidth.Unit()));
305     }
306     return panda::JSValueRef::Undefined(vm);
307 }
308 
ResetNavBarWidthRange(ArkUIRuntimeCallInfo * runtimeCallInfo)309 ArkUINativeModuleValue NavigationBridge::ResetNavBarWidthRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
310 {
311     EcmaVM* vm = runtimeCallInfo->GetVM();
312     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
313     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
314     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
315     GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
316     GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
317     return panda::JSValueRef::Undefined(vm);
318 }
319 
SetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)320 ArkUINativeModuleValue NavigationBridge::SetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
321 {
322     EcmaVM* vm = runtimeCallInfo->GetVM();
323     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
324     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
325     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
326     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
327 
328     CalcDimension width;
329     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width)) {
330         GetArkUINodeModifiers()->getNavigationModifier()->resetMinContentWidth(nativeNode);
331     } else {
332         GetArkUINodeModifiers()->getNavigationModifier()->setMinContentWidth(
333             nativeNode, width.Value(), static_cast<int>(width.Unit()));
334     }
335     return panda::JSValueRef::Undefined(vm);
336 }
337 
ResetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)338 ArkUINativeModuleValue NavigationBridge::ResetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
339 {
340     EcmaVM* vm = runtimeCallInfo->GetVM();
341     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
342     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
343     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
344     GetArkUINodeModifiers()->getNavigationModifier()->resetMinContentWidth(nativeNode);
345     return panda::JSValueRef::Undefined(vm);
346 }
347 
SetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)348 ArkUINativeModuleValue NavigationBridge::SetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
349 {
350     EcmaVM* vm = runtimeCallInfo->GetVM();
351     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
352     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
353     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
354     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
355 
356     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
357     std::string src;
358     auto noPixMap = Framework::JSViewAbstract::ParseJsMedia(info[1], src);
359     auto isValidImage = false;
360     RefPtr<PixelMap> pixMap = nullptr;
361 #if defined(PIXEL_MAP_SUPPORTED)
362     if (!noPixMap) {
363         pixMap = CreatePixelMapFromNapiValue(info[1]);
364     }
365 #endif
366     if (noPixMap || pixMap != nullptr) {
367         isValidImage = true;
368     }
369     std::string bundleName;
370     std::string moduleName;
371     Framework::JSViewAbstract::GetJsMediaBundleInfo(info[1], bundleName, moduleName);
372     NG::ImageOption imageOption;
373     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
374     auto isSymbol = info[1]->IsObject() && src.empty() && pixMap == nullptr;
375     if (isSymbol) {
376         Framework::JSViewAbstract::SetSymbolOptionApply(info, iconSymbol, info[1]);
377     }
378     imageOption.noPixMap = noPixMap;
379     imageOption.isValidImage = isValidImage;
380     NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, src, imageOption, pixMap);
381     return panda::JSValueRef::Undefined(vm);
382 }
383 
ResetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)384 ArkUINativeModuleValue NavigationBridge::ResetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
385 {
386     EcmaVM* vm = runtimeCallInfo->GetVM();
387     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
388     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
389     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
390     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
391     bool noPixMap = false;
392     NG::ImageOption imageOption;
393     imageOption.noPixMap = noPixMap;
394     imageOption.isValidImage = false;
395     RefPtr<PixelMap> pixMap = nullptr;
396     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
397     std::string src;
398     NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, src, imageOption, pixMap);
399     return panda::JSValueRef::Undefined(vm);
400 }
401 
SetEnableDragBar(ArkUIRuntimeCallInfo * runtimeCallInfo)402 ArkUINativeModuleValue NavigationBridge::SetEnableDragBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
403 {
404     EcmaVM* vm = runtimeCallInfo->GetVM();
405     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
406     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
407     Local<JSValueRef> enableDragBarArg = runtimeCallInfo->GetCallArgRef(1);
408     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
409     if (enableDragBarArg->IsNull() || enableDragBarArg->IsUndefined() || !enableDragBarArg->IsBoolean()) {
410         GetArkUINodeModifiers()->getNavigationModifier()->resetEnableDragBar(nativeNode);
411     } else {
412         bool enableDragBar = enableDragBarArg->ToBoolean(vm)->Value();
413         GetArkUINodeModifiers()->getNavigationModifier()->setEnableDragBar(nativeNode, enableDragBar);
414     }
415     return panda::JSValueRef::Undefined(vm);
416 }
417 
ResetEnableDragBar(ArkUIRuntimeCallInfo * runtimeCallInfo)418 ArkUINativeModuleValue NavigationBridge::ResetEnableDragBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
419 {
420     EcmaVM* vm = runtimeCallInfo->GetVM();
421     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
422     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
423     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
424     GetArkUINodeModifiers()->getNavigationModifier()->resetEnableDragBar(nativeNode);
425     return panda::JSValueRef::Undefined(vm);
426 }
427 
SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)428 ArkUINativeModuleValue NavigationBridge::SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo *runtimeCallInfo)
429 {
430     EcmaVM* vm = runtimeCallInfo->GetVM();
431     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
432     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
433     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
434     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
435     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
436     std::string typeCppStr;
437     std::string edgesCppStr;
438     if (secondArg->IsString(vm)) {
439         typeCppStr = secondArg->ToString(vm)->ToString(vm);
440     } else {
441         //type system
442         typeCppStr = "0";
443     }
444 
445     if (thirdArg->IsString(vm)) {
446         edgesCppStr = thirdArg->ToString(vm)->ToString(vm);
447     } else {
448         //edge top and bottom
449         edgesCppStr = "0|1";
450     }
451     const char* typeStr = typeCppStr.c_str();
452     const char* edgesStr = edgesCppStr.c_str();
453     GetArkUINodeModifiers()->getNavigationModifier()->setNavIgnoreLayoutSafeArea(nativeNode, typeStr, edgesStr);
454     return panda::JSValueRef::Undefined(vm);
455 }
456 
ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)457 ArkUINativeModuleValue NavigationBridge::ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo* runtimeCallInfo)
458 {
459     EcmaVM* vm = runtimeCallInfo->GetVM();
460     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
461     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
462     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
463     GetArkUINodeModifiers()->getNavigationModifier()->resetNavIgnoreLayoutSafeArea(nativeNode);
464     return panda::JSValueRef::Undefined(vm);
465 }
466 
SetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)467 ArkUINativeModuleValue NavigationBridge::SetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
468 {
469     EcmaVM* vm = runtimeCallInfo->GetVM();
470     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
471     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
472     Local<JSValueRef> titleArg = runtimeCallInfo->GetCallArgRef(1);
473     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(2);
474     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
475     std::string title;
476     std::string subtitle;
477     bool hasMain = false;
478     bool hasSub = false;
479     if (ArkTSUtils::ParseJsString(vm, titleArg, title)) {
480         // Resource and string type.
481         subtitle = "";
482         hasMain = true;
483         hasSub = false;
484     } else if (titleArg->IsObject(vm)) {
485         // NavigationCommonTitle
486         auto obj = titleArg->ToObject(vm);
487         auto main = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "main"));
488         auto sub = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "sub"));
489         hasMain = ArkTSUtils::ParseJsString(vm, main, title);
490         hasSub = ArkTSUtils::ParseJsString(vm, sub, subtitle);
491         // NavigationCustomTitle or CustomBuilder is not supported
492     } else {
493         GetArkUINodeModifiers()->getNavigationModifier()->resetNavTitle(nativeNode);
494         return panda::JSValueRef::Undefined(vm);
495     }
496 
497     ArkUINavigationTitlebarOptions options;
498     if (optionsArg->IsObject(vm)) {
499         NativeNavigationUtils::ParseTitleOptions(vm, optionsArg, options);
500     }
501     ArkUINavigationTitleInfo titleInfo = { hasSub, hasMain, subtitle.c_str(), title.c_str() };
502     GetArkUINodeModifiers()->getNavigationModifier()->setNavTitle(nativeNode, titleInfo, options);
503     return panda::JSValueRef::Undefined(vm);
504 }
505 
ResetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)506 ArkUINativeModuleValue NavigationBridge::ResetTitle(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()->resetNavTitle(nativeNode);
513     return panda::JSValueRef::Undefined(vm);
514 }
515 
SetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)516 ArkUINativeModuleValue NavigationBridge::SetMenus(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> menusArg = runtimeCallInfo->GetCallArgRef(1);
522     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
523     std::vector<ArkUIBarItem> menuItems;
524     if (menusArg->IsArray(vm)) {
525         NativeNavigationUtils::ParseBarItems(vm, menusArg, menuItems);
526         GetArkUINodeModifiers()->getNavigationModifier()->setNavMenus(nativeNode, menuItems.data(), menuItems.size());
527         // get action and symbolModifier single
528         auto actionSendFunc = GetArkUINodeModifiers()->getNavigationModifier()->setNavMenuItemAction;
529         auto symbolSendFunc = GetArkUINodeModifiers()->getNavigationModifier()->setNavMenuItemSymbol;
530         NativeNavigationUtils::ParseAndSendFunctionParam(runtimeCallInfo, menusArg, actionSendFunc, symbolSendFunc);
531     } else if (menusArg->IsUndefined()) {
532         menuItems = {};
533         GetArkUINodeModifiers()->getNavigationModifier()->setNavMenus(nativeNode, menuItems.data(), menuItems.size());
534     } else if (menusArg->IsObject(vm)) {
535         GetArkUINodeModifiers()->getNavigationModifier()->resetNavMenus(nativeNode);
536     }
537     return panda::JSValueRef::Undefined(vm);
538 }
539 
ResetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)540 ArkUINativeModuleValue NavigationBridge::ResetMenus(ArkUIRuntimeCallInfo* runtimeCallInfo)
541 {
542     EcmaVM* vm = runtimeCallInfo->GetVM();
543     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
544     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
545     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
546     GetArkUINodeModifiers()->getNavigationModifier()->resetNavMenus(nativeNode);
547     return panda::JSValueRef::Undefined(vm);
548 }
549 
SetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)550 ArkUINativeModuleValue NavigationBridge::SetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
551 {
552     EcmaVM* vm = runtimeCallInfo->GetVM();
553     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
554     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
555     Local<JSValueRef> recoverableArg = runtimeCallInfo->GetCallArgRef(1);
556     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
557     if (recoverableArg->IsNull() || recoverableArg->IsUndefined() || !recoverableArg->IsBoolean()) {
558         GetArkUINodeModifiers()->getNavigationModifier()->resetRecoverable(nativeNode);
559     } else {
560         bool recoverable = recoverableArg->ToBoolean(vm)->Value();
561         GetArkUINodeModifiers()->getNavigationModifier()->setRecoverable(nativeNode, recoverable);
562     }
563     return panda::JSValueRef::Undefined(vm);
564 }
565 
ResetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)566 ArkUINativeModuleValue NavigationBridge::ResetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
567 {
568     EcmaVM* vm = runtimeCallInfo->GetVM();
569     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
570     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
571     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
572     GetArkUINodeModifiers()->getNavigationModifier()->resetRecoverable(nativeNode);
573     return panda::JSValueRef::Undefined(vm);
574 }
575 } // namespace OHOS::Ace::NG
576