• 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/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 
SetEnableModeChangeAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)221 ArkUINativeModuleValue NavigationBridge::SetEnableModeChangeAnimation(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> enableArg = runtimeCallInfo->GetCallArgRef(1);
227     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
228     if (enableArg->IsBoolean()) {
229         bool isEnable = enableArg->ToBoolean(vm)->Value();
230         GetArkUINodeModifiers()->getNavigationModifier()->setEnableModeChangeAnimation(nativeNode, isEnable);
231         return panda::JSValueRef::Undefined(vm);
232     }
233     GetArkUINodeModifiers()->getNavigationModifier()->setEnableModeChangeAnimation(nativeNode, true);
234     return panda::JSValueRef::Undefined(vm);
235 }
236 
ResetEnableModeChangeAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)237 ArkUINativeModuleValue NavigationBridge::ResetEnableModeChangeAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
238 {
239     EcmaVM* vm = runtimeCallInfo->GetVM();
240     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
241     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
242     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
243     GetArkUINodeModifiers()->getNavigationModifier()->resetEnableModeChangeAnimation(nativeNode);
244     return panda::JSValueRef::Undefined(vm);
245 }
246 
SetNavBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)247 ArkUINativeModuleValue NavigationBridge::SetNavBarPosition(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     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1);
253     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
254     if (valueArg->IsUndefined() || !valueArg->IsNumber()) {
255         GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarPosition(nativeNode);
256         return panda::JSValueRef::Undefined(vm);
257     }
258     int32_t value = valueArg->Int32Value(vm);
259     GetArkUINodeModifiers()->getNavigationModifier()->setNavBarPosition(nativeNode, value);
260     return panda::JSValueRef::Undefined(vm);
261 }
262 
ResetNavBarPosition(ArkUIRuntimeCallInfo * runtimeCallInfo)263 ArkUINativeModuleValue NavigationBridge::ResetNavBarPosition(ArkUIRuntimeCallInfo* runtimeCallInfo)
264 {
265     EcmaVM* vm = runtimeCallInfo->GetVM();
266     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
267     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
268     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
269     GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarPosition(nativeNode);
270     return panda::JSValueRef::Undefined(vm);
271 }
272 
SetNavBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)273 ArkUINativeModuleValue NavigationBridge::SetNavBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
274 {
275     EcmaVM* vm = runtimeCallInfo->GetVM();
276     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
277     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
278     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
279     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
280 
281     CalcDimension width;
282     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width)) {
283         GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarWidth(nativeNode);
284     } else {
285         GetArkUINodeModifiers()->getNavigationModifier()->setNavBarWidth(
286             nativeNode, width.Value(), static_cast<int>(width.Unit()));
287     }
288     return panda::JSValueRef::Undefined(vm);
289 }
290 
ResetNavBarWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)291 ArkUINativeModuleValue NavigationBridge::ResetNavBarWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
292 {
293     EcmaVM* vm = runtimeCallInfo->GetVM();
294     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
295     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
296     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
297     GetArkUINodeModifiers()->getNavigationModifier()->resetNavBarWidth(nativeNode);
298     return panda::JSValueRef::Undefined(vm);
299 }
300 
SetNavBarWidthRange(ArkUIRuntimeCallInfo * runtimeCallInfo)301 ArkUINativeModuleValue NavigationBridge::SetNavBarWidthRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
302 {
303     EcmaVM* vm = runtimeCallInfo->GetVM();
304     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
305     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
306     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
307     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
308     if (jsValue->IsNull() || jsValue->IsUndefined() || !jsValue->IsArray(vm)) {
309         GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
310         GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
311         return panda::JSValueRef::Undefined(vm);
312     }
313     auto rangeArray = panda::Local<panda::ArrayRef>(jsValue);
314     auto minNavBarWidth = panda::ArrayRef::GetValueAt(vm, rangeArray, 0);
315     CalcDimension minWidth;
316     if (minNavBarWidth->IsNull() || minNavBarWidth->IsUndefined() ||
317         !ArkTSUtils::ParseJsDimensionVp(vm, minNavBarWidth, minWidth)) {
318         GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
319     } else {
320         GetArkUINodeModifiers()->getNavigationModifier()->setMinNavBarWidth(
321             nativeNode, minWidth.Value(), static_cast<int>(minWidth.Unit()));
322     }
323     auto maxNavBarWidth = panda::ArrayRef::GetValueAt(vm, rangeArray, 1);
324     CalcDimension maxWidth;
325     if (maxNavBarWidth->IsNull() || maxNavBarWidth->IsUndefined() ||
326         !ArkTSUtils::ParseJsDimensionVp(vm, maxNavBarWidth, maxWidth)) {
327         GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
328     } else {
329         GetArkUINodeModifiers()->getNavigationModifier()->setMaxNavBarWidth(
330             nativeNode, maxWidth.Value(), static_cast<int>(maxWidth.Unit()));
331     }
332     return panda::JSValueRef::Undefined(vm);
333 }
334 
ResetNavBarWidthRange(ArkUIRuntimeCallInfo * runtimeCallInfo)335 ArkUINativeModuleValue NavigationBridge::ResetNavBarWidthRange(ArkUIRuntimeCallInfo* runtimeCallInfo)
336 {
337     EcmaVM* vm = runtimeCallInfo->GetVM();
338     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
339     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
340     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
341     GetArkUINodeModifiers()->getNavigationModifier()->resetMinNavBarWidth(nativeNode);
342     GetArkUINodeModifiers()->getNavigationModifier()->resetMaxNavBarWidth(nativeNode);
343     return panda::JSValueRef::Undefined(vm);
344 }
345 
SetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)346 ArkUINativeModuleValue NavigationBridge::SetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
347 {
348     EcmaVM* vm = runtimeCallInfo->GetVM();
349     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
350     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
351     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
352     Local<JSValueRef> jsValue = runtimeCallInfo->GetCallArgRef(1);
353 
354     CalcDimension width;
355     if (jsValue->IsNull() || jsValue->IsUndefined() || !ArkTSUtils::ParseJsDimensionVpNG(vm, jsValue, width)) {
356         GetArkUINodeModifiers()->getNavigationModifier()->resetMinContentWidth(nativeNode);
357     } else {
358         GetArkUINodeModifiers()->getNavigationModifier()->setMinContentWidth(
359             nativeNode, width.Value(), static_cast<int>(width.Unit()));
360     }
361     return panda::JSValueRef::Undefined(vm);
362 }
363 
ResetMinContentWidth(ArkUIRuntimeCallInfo * runtimeCallInfo)364 ArkUINativeModuleValue NavigationBridge::ResetMinContentWidth(ArkUIRuntimeCallInfo* runtimeCallInfo)
365 {
366     EcmaVM* vm = runtimeCallInfo->GetVM();
367     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
368     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
369     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
370     GetArkUINodeModifiers()->getNavigationModifier()->resetMinContentWidth(nativeNode);
371     return panda::JSValueRef::Undefined(vm);
372 }
373 
SetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)374 ArkUINativeModuleValue NavigationBridge::SetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
375 {
376     EcmaVM* vm = runtimeCallInfo->GetVM();
377     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
378     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
379     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
380     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
381 
382     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
383     std::string src;
384     auto noPixMap = Framework::JSViewAbstract::ParseJsMedia(info[1], src);
385     auto isValidImage = false;
386     RefPtr<PixelMap> pixMap = nullptr;
387 #if defined(PIXEL_MAP_SUPPORTED)
388     if (!noPixMap) {
389         pixMap = CreatePixelMapFromNapiValue(info[1]);
390     }
391 #endif
392     if (noPixMap || pixMap != nullptr) {
393         isValidImage = true;
394     }
395     std::string bundleName;
396     std::string moduleName;
397     Framework::JSViewAbstract::GetJsMediaBundleInfo(info[1], bundleName, moduleName);
398     NG::ImageOption imageOption;
399     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
400     auto isSymbol = info[1]->IsObject() && src.empty() && pixMap == nullptr;
401     if (isSymbol) {
402         Framework::JSViewAbstract::SetSymbolOptionApply(info, iconSymbol, info[1]);
403     }
404     imageOption.noPixMap = noPixMap;
405     imageOption.isValidImage = isValidImage;
406     NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, src, imageOption, pixMap);
407     return panda::JSValueRef::Undefined(vm);
408 }
409 
ResetBackButtonIcon(ArkUIRuntimeCallInfo * runtimeCallInfo)410 ArkUINativeModuleValue NavigationBridge::ResetBackButtonIcon(ArkUIRuntimeCallInfo* runtimeCallInfo)
411 {
412     EcmaVM* vm = runtimeCallInfo->GetVM();
413     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
414     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
415     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
416     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
417     bool noPixMap = false;
418     NG::ImageOption imageOption;
419     imageOption.noPixMap = noPixMap;
420     imageOption.isValidImage = false;
421     RefPtr<PixelMap> pixMap = nullptr;
422     std::function<void(WeakPtr<NG::FrameNode>)> iconSymbol = nullptr;
423     std::string src;
424     NavigationModelNG::SetBackButtonIcon(frameNode, iconSymbol, src, imageOption, pixMap);
425     return panda::JSValueRef::Undefined(vm);
426 }
427 
SetEnableDragBar(ArkUIRuntimeCallInfo * runtimeCallInfo)428 ArkUINativeModuleValue NavigationBridge::SetEnableDragBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
429 {
430     EcmaVM* vm = runtimeCallInfo->GetVM();
431     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
432     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
433     Local<JSValueRef> enableDragBarArg = runtimeCallInfo->GetCallArgRef(1);
434     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
435     if (enableDragBarArg->IsNull() || enableDragBarArg->IsUndefined() || !enableDragBarArg->IsBoolean()) {
436         GetArkUINodeModifiers()->getNavigationModifier()->resetEnableDragBar(nativeNode);
437     } else {
438         bool enableDragBar = enableDragBarArg->ToBoolean(vm)->Value();
439         GetArkUINodeModifiers()->getNavigationModifier()->setEnableDragBar(nativeNode, enableDragBar);
440     }
441     return panda::JSValueRef::Undefined(vm);
442 }
443 
ResetEnableDragBar(ArkUIRuntimeCallInfo * runtimeCallInfo)444 ArkUINativeModuleValue NavigationBridge::ResetEnableDragBar(ArkUIRuntimeCallInfo* runtimeCallInfo)
445 {
446     EcmaVM* vm = runtimeCallInfo->GetVM();
447     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
448     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
449     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
450     GetArkUINodeModifiers()->getNavigationModifier()->resetEnableDragBar(nativeNode);
451     return panda::JSValueRef::Undefined(vm);
452 }
453 
SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)454 ArkUINativeModuleValue NavigationBridge::SetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo *runtimeCallInfo)
455 {
456     EcmaVM* vm = runtimeCallInfo->GetVM();
457     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
458     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
459     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(NUM_1);
460     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(NUM_2);
461     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
462     std::string typeCppStr;
463     std::string edgesCppStr;
464     if (secondArg->IsString(vm)) {
465         typeCppStr = secondArg->ToString(vm)->ToString(vm);
466     } else {
467         //type system
468         typeCppStr = "0";
469     }
470 
471     if (thirdArg->IsString(vm)) {
472         edgesCppStr = thirdArg->ToString(vm)->ToString(vm);
473     } else {
474         //edge top and bottom
475         edgesCppStr = "0|1";
476     }
477     const char* typeStr = typeCppStr.c_str();
478     const char* edgesStr = edgesCppStr.c_str();
479     GetArkUINodeModifiers()->getNavigationModifier()->setNavIgnoreLayoutSafeArea(nativeNode, typeStr, edgesStr);
480     return panda::JSValueRef::Undefined(vm);
481 }
482 
ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo * runtimeCallInfo)483 ArkUINativeModuleValue NavigationBridge::ResetIgnoreLayoutSafeArea(ArkUIRuntimeCallInfo* runtimeCallInfo)
484 {
485     EcmaVM* vm = runtimeCallInfo->GetVM();
486     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
487     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(NUM_0);
488     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
489     GetArkUINodeModifiers()->getNavigationModifier()->resetNavIgnoreLayoutSafeArea(nativeNode);
490     return panda::JSValueRef::Undefined(vm);
491 }
492 
SetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)493 ArkUINativeModuleValue NavigationBridge::SetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
494 {
495     EcmaVM* vm = runtimeCallInfo->GetVM();
496     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
497     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
498     Local<JSValueRef> titleArg = runtimeCallInfo->GetCallArgRef(1);
499     Local<JSValueRef> optionsArg = runtimeCallInfo->GetCallArgRef(2);
500     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
501     std::string title;
502     std::string subtitle;
503     bool hasMain = false;
504     bool hasSub = false;
505     if (ArkTSUtils::ParseJsString(vm, titleArg, title)) {
506         // Resource and string type.
507         subtitle = "";
508         hasMain = true;
509         hasSub = false;
510     } else if (titleArg->IsObject(vm)) {
511         // NavigationCommonTitle
512         auto obj = titleArg->ToObject(vm);
513         auto main = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "main"));
514         auto sub = obj->Get(vm, panda::StringRef::NewFromUtf8(vm, "sub"));
515         hasMain = ArkTSUtils::ParseJsString(vm, main, title);
516         hasSub = ArkTSUtils::ParseJsString(vm, sub, subtitle);
517         // NavigationCustomTitle or CustomBuilder is not supported
518     } else {
519         GetArkUINodeModifiers()->getNavigationModifier()->resetNavTitle(nativeNode);
520         return panda::JSValueRef::Undefined(vm);
521     }
522 
523     ArkUINavigationTitlebarOptions options;
524     if (optionsArg->IsObject(vm)) {
525         NativeNavigationUtils::ParseTitleOptions(vm, optionsArg, options);
526     }
527     ArkUINavigationTitleInfo titleInfo = { hasSub, hasMain, subtitle.c_str(), title.c_str() };
528     GetArkUINodeModifiers()->getNavigationModifier()->setNavTitle(nativeNode, titleInfo, options);
529     return panda::JSValueRef::Undefined(vm);
530 }
531 
ResetTitle(ArkUIRuntimeCallInfo * runtimeCallInfo)532 ArkUINativeModuleValue NavigationBridge::ResetTitle(ArkUIRuntimeCallInfo* runtimeCallInfo)
533 {
534     EcmaVM* vm = runtimeCallInfo->GetVM();
535     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
536     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
537     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
538     GetArkUINodeModifiers()->getNavigationModifier()->resetNavTitle(nativeNode);
539     return panda::JSValueRef::Undefined(vm);
540 }
541 
SetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)542 ArkUINativeModuleValue NavigationBridge::SetMenus(ArkUIRuntimeCallInfo* runtimeCallInfo)
543 {
544     EcmaVM* vm = runtimeCallInfo->GetVM();
545     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
547     Local<JSValueRef> menusArg = runtimeCallInfo->GetCallArgRef(1);
548     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
549     std::vector<ArkUIBarItem> menuItems;
550     if (menusArg->IsArray(vm)) {
551         NativeNavigationUtils::ParseBarItems(vm, menusArg, menuItems);
552         GetArkUINodeModifiers()->getNavigationModifier()->setNavMenus(nativeNode, menuItems.data(), menuItems.size());
553         // get action and symbolModifier single
554         auto actionSendFunc = GetArkUINodeModifiers()->getNavigationModifier()->setNavMenuItemAction;
555         auto symbolSendFunc = GetArkUINodeModifiers()->getNavigationModifier()->setNavMenuItemSymbol;
556         NativeNavigationUtils::ParseAndSendFunctionParam(runtimeCallInfo, menusArg, actionSendFunc, symbolSendFunc);
557     } else if (menusArg->IsUndefined()) {
558         menuItems = {};
559         GetArkUINodeModifiers()->getNavigationModifier()->setNavMenus(nativeNode, menuItems.data(), menuItems.size());
560     } else if (menusArg->IsObject(vm)) {
561         GetArkUINodeModifiers()->getNavigationModifier()->resetNavMenus(nativeNode);
562     }
563     return panda::JSValueRef::Undefined(vm);
564 }
565 
ResetMenus(ArkUIRuntimeCallInfo * runtimeCallInfo)566 ArkUINativeModuleValue NavigationBridge::ResetMenus(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()->resetNavMenus(nativeNode);
573     return panda::JSValueRef::Undefined(vm);
574 }
575 
SetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)576 ArkUINativeModuleValue NavigationBridge::SetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
577 {
578     EcmaVM* vm = runtimeCallInfo->GetVM();
579     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
580     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0);
581     Local<JSValueRef> recoverableArg = runtimeCallInfo->GetCallArgRef(1);
582     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
583     if (recoverableArg->IsNull() || recoverableArg->IsUndefined() || !recoverableArg->IsBoolean()) {
584         GetArkUINodeModifiers()->getNavigationModifier()->resetRecoverable(nativeNode);
585     } else {
586         bool recoverable = recoverableArg->ToBoolean(vm)->Value();
587         GetArkUINodeModifiers()->getNavigationModifier()->setRecoverable(nativeNode, recoverable);
588     }
589     return panda::JSValueRef::Undefined(vm);
590 }
591 
ResetRecoverable(ArkUIRuntimeCallInfo * runtimeCallInfo)592 ArkUINativeModuleValue NavigationBridge::ResetRecoverable(ArkUIRuntimeCallInfo* runtimeCallInfo)
593 {
594     EcmaVM* vm = runtimeCallInfo->GetVM();
595     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
596     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
597     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
598     GetArkUINodeModifiers()->getNavigationModifier()->resetRecoverable(nativeNode);
599     return panda::JSValueRef::Undefined(vm);
600 }
601 } // namespace OHOS::Ace::NG
602