• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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