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