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