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