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