1 /*
2 * Copyright (c) 2024 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_folder_stack_bridge.h"
16
17 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
18 #include "core/components_ng/pattern/folder_stack/folder_stack_event_info.h"
19
20 namespace OHOS::Ace::NG {
21
SetEnableAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)22 ArkUINativeModuleValue FolderStackBridge::SetEnableAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
23 {
24 EcmaVM* vm = runtimeCallInfo->GetVM();
25 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
26 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
27 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
28 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
29 bool isEnableAnimation = true;
30 if (secondArg->IsBoolean()) {
31 isEnableAnimation = secondArg->ToBoolean(vm)->Value();
32 }
33 GetArkUINodeModifiers()->getFolderStackModifier()->setEnableAnimation(nativeNode,
34 static_cast<int32_t>(isEnableAnimation));
35 return panda::JSValueRef::Undefined(vm);
36 }
37
ResetEnableAnimation(ArkUIRuntimeCallInfo * runtimeCallInfo)38 ArkUINativeModuleValue FolderStackBridge::ResetEnableAnimation(ArkUIRuntimeCallInfo* runtimeCallInfo)
39 {
40 EcmaVM* vm = runtimeCallInfo->GetVM();
41 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
42 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
43 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
44 GetArkUINodeModifiers()->getFolderStackModifier()->resetEnableAnimation(nativeNode);
45 return panda::JSValueRef::Undefined(vm);
46 }
47
SetAutoHalfFold(ArkUIRuntimeCallInfo * runtimeCallInfo)48 ArkUINativeModuleValue FolderStackBridge::SetAutoHalfFold(ArkUIRuntimeCallInfo* runtimeCallInfo)
49 {
50 EcmaVM* vm = runtimeCallInfo->GetVM();
51 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
52 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
53 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
54 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
55 bool isAutoHalfFold = true;
56 if (secondArg->IsBoolean()) {
57 isAutoHalfFold = secondArg->ToBoolean(vm)->Value();
58 }
59 GetArkUINodeModifiers()->getFolderStackModifier()->setAutoHalfFold(nativeNode,
60 static_cast<int32_t>(isAutoHalfFold));
61 return panda::JSValueRef::Undefined(vm);
62 }
63
ResetAutoHalfFold(ArkUIRuntimeCallInfo * runtimeCallInfo)64 ArkUINativeModuleValue FolderStackBridge::ResetAutoHalfFold(ArkUIRuntimeCallInfo* runtimeCallInfo)
65 {
66 EcmaVM* vm = runtimeCallInfo->GetVM();
67 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
68 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
69 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
70 GetArkUINodeModifiers()->getFolderStackModifier()->resetAutoHalfFold(nativeNode);
71 return panda::JSValueRef::Undefined(vm);
72 }
73
SetOnFolderStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)74 ArkUINativeModuleValue FolderStackBridge::SetOnFolderStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
75 {
76 EcmaVM* vm = runtimeCallInfo->GetVM();
77 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
78 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
79 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
80 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
81 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
82 GetArkUINodeModifiers()->getFolderStackModifier()->resetOnFolderStateChange(nativeNode);
83 return panda::JSValueRef::Undefined(vm);
84 }
85 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
86 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
87 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
88 std::function<void(FolderEventInfo&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
89 FolderEventInfo& value) {
90 panda::LocalScope pandaScope(vm);
91 panda::TryCatch trycatch(vm);
92 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
93 const char* keys[] = { "foldStatus" };
94 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(value.GetFolderState())) };
95 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
96 eventObject->SetNativePointerFieldCount(vm, 1);
97 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
98 panda::Local<panda::JSValueRef> params[1] = { eventObject };
99 func->Call(vm, func.ToLocal(), params, 1);
100 };
101 GetArkUINodeModifiers()->getFolderStackModifier()->setOnFolderStateChange(
102 nativeNode, reinterpret_cast<void*>(&callback));
103 return panda::JSValueRef::Undefined(vm);
104 }
105
ResetOnFolderStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)106 ArkUINativeModuleValue FolderStackBridge::ResetOnFolderStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
107 {
108 EcmaVM* vm = runtimeCallInfo->GetVM();
109 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
110 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
111 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
112 GetArkUINodeModifiers()->getFolderStackModifier()->resetOnFolderStateChange(nativeNode);
113 return panda::JSValueRef::Undefined(vm);
114 }
115
SetOnHoverStatusChange(ArkUIRuntimeCallInfo * runtimeCallInfo)116 ArkUINativeModuleValue FolderStackBridge::SetOnHoverStatusChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
117 {
118 EcmaVM* vm = runtimeCallInfo->GetVM();
119 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
120 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
121 Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
122 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
123 if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
124 GetArkUINodeModifiers()->getFolderStackModifier()->resetOnHoverStatusChange(nativeNode);
125 return panda::JSValueRef::Undefined(vm);
126 }
127 auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
128 CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
129 panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
130 std::function<void(FolderEventInfo&)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
131 FolderEventInfo& value) {
132 panda::LocalScope pandaScope(vm);
133 panda::TryCatch trycatch(vm);
134 PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
135 const char* keys[] = { "foldStatus", "isHoverMode", "appRotation", "windowStatusType" };
136 Local<JSValueRef> values[] = { panda::NumberRef::New(vm, static_cast<int32_t>(value.GetFolderState())),
137 panda::BooleanRef::New(vm, value.IsHoverMode()),
138 panda::NumberRef::New(vm, static_cast<int32_t>(value.GetRotation())),
139 panda::NumberRef::New(vm, static_cast<int32_t>(value.GetWindowMode())) };
140 auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
141 eventObject->SetNativePointerFieldCount(vm, 1);
142 eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&value));
143 panda::Local<panda::JSValueRef> params[1] = { eventObject };
144 func->Call(vm, func.ToLocal(), params, 1);
145 };
146 GetArkUINodeModifiers()->getFolderStackModifier()->setOnHoverStatusChange(
147 nativeNode, reinterpret_cast<void*>(&callback));
148 return panda::JSValueRef::Undefined(vm);
149 }
150
ResetOnHoverStatusChange(ArkUIRuntimeCallInfo * runtimeCallInfo)151 ArkUINativeModuleValue FolderStackBridge::ResetOnHoverStatusChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
152 {
153 EcmaVM* vm = runtimeCallInfo->GetVM();
154 CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
155 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
156 auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
157 GetArkUINodeModifiers()->getFolderStackModifier()->resetOnHoverStatusChange(nativeNode);
158 return panda::JSValueRef::Undefined(vm);
159 }
160 } // namespace OHOS::Ace::NG
161