• 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_refresh_bridge.h"
16 
17 #include "frameworks/bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
18 
19 namespace OHOS::Ace::NG {
20 constexpr int32_t CALL_ARG_0 = 0;
21 constexpr int32_t CALL_ARG_1 = 1;
22 constexpr int32_t NUM_0 = 0;
23 constexpr int32_t NUM_1 = 1;
SetRefreshOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)24 ArkUINativeModuleValue RefreshBridege::SetRefreshOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
25 {
26     EcmaVM* vm = runtimeCallInfo->GetVM();
27     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
28     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
29     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
30     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
31     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
32     CalcDimension value(0.0f);
33     if (valueArg->IsNull() || valueArg->IsUndefined() || !ArkTSUtils::ParseJsDimensionVp(vm, valueArg, value)) {
34         GetArkUINodeModifiers()->getRefreshModifier()->resetRefreshOffset(nativeNode);
35     } else {
36         GetArkUINodeModifiers()->getRefreshModifier()->setRefreshOffset(
37             nativeNode, value.Value(), static_cast<int>(value.Unit()));
38     }
39 
40     return panda::JSValueRef::Undefined(vm);
41 }
ResetRefreshOffset(ArkUIRuntimeCallInfo * runtimeCallInfo)42 ArkUINativeModuleValue RefreshBridege::ResetRefreshOffset(ArkUIRuntimeCallInfo* runtimeCallInfo)
43 {
44     EcmaVM* vm = runtimeCallInfo->GetVM();
45     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
46     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
47     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
48     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
49     GetArkUINodeModifiers()->getRefreshModifier()->resetRefreshOffset(nativeNode);
50     return panda::JSValueRef::Undefined(vm);
51 }
SetPullToRefresh(ArkUIRuntimeCallInfo * runtimeCallInfo)52 ArkUINativeModuleValue RefreshBridege::SetPullToRefresh(ArkUIRuntimeCallInfo* runtimeCallInfo)
53 {
54     EcmaVM* vm = runtimeCallInfo->GetVM();
55     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
56     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
57     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
58     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
59     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
60     if (valueArg->IsBoolean()) {
61         bool value = valueArg->ToBoolean(vm)->Value();
62         GetArkUINodeModifiers()->getRefreshModifier()->setPullToRefresh(nativeNode, value);
63     } else {
64         GetArkUINodeModifiers()->getRefreshModifier()->resetPullToRefresh(nativeNode);
65     }
66     return panda::JSValueRef::Undefined(vm);
67 }
ResetPullToRefresh(ArkUIRuntimeCallInfo * runtimeCallInfo)68 ArkUINativeModuleValue RefreshBridege::ResetPullToRefresh(ArkUIRuntimeCallInfo* runtimeCallInfo)
69 {
70     EcmaVM* vm = runtimeCallInfo->GetVM();
71     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
72     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
73     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
74     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
75     GetArkUINodeModifiers()->getRefreshModifier()->resetPullToRefresh(nativeNode);
76     return panda::JSValueRef::Undefined(vm);
77 }
SetPullDownRatio(ArkUIRuntimeCallInfo * runtimeCallInfo)78 ArkUINativeModuleValue RefreshBridege::SetPullDownRatio(ArkUIRuntimeCallInfo* runtimeCallInfo)
79 {
80     EcmaVM* vm = runtimeCallInfo->GetVM();
81     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
82     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
83     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
84     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
85     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
86     if (valueArg->IsNumber()) {
87         float value = std::clamp(static_cast<float>(valueArg->ToNumber(vm)->Value()), 0.f, 1.f);
88         GetArkUINodeModifiers()->getRefreshModifier()->setPullDownRatio(nativeNode, value);
89     } else {
90         GetArkUINodeModifiers()->getRefreshModifier()->resetPullDownRatio(nativeNode);
91     }
92 
93     return panda::JSValueRef::Undefined(vm);
94 }
ResetPullDownRatio(ArkUIRuntimeCallInfo * runtimeCallInfo)95 ArkUINativeModuleValue RefreshBridege::ResetPullDownRatio(ArkUIRuntimeCallInfo* runtimeCallInfo)
96 {
97     EcmaVM* vm = runtimeCallInfo->GetVM();
98     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
99     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
100     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
101     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
102     GetArkUINodeModifiers()->getRefreshModifier()->resetPullDownRatio(nativeNode);
103     return panda::JSValueRef::Undefined(vm);
104 }
SetOnStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue RefreshBridege::SetOnStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
106 {
107     EcmaVM* vm = runtimeCallInfo->GetVM();
108     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
109     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
110     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
111     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
112     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
113         GetArkUINodeModifiers()->getRefreshModifier()->resetRefreshOnStateChangeCallback(nativeNode);
114         return panda::JSValueRef::Undefined(vm);
115     }
116     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
117     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
118     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
119 
120     std::function<void(RefreshStatus)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
121                                                       RefreshStatus stateChange) {
122         panda::LocalScope pandaScope(vm);
123         panda::TryCatch trycatch(vm);
124         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
125         panda::Local<panda::JSValueRef> params[NUM_1] = { panda::NumberRef::New(vm, static_cast<int>(stateChange)) };
126         func->Call(vm, func.ToLocal(), params, NUM_1);
127     };
128     GetArkUINodeModifiers()->getRefreshModifier()->setRefreshOnStateChangeCallback(
129         nativeNode, reinterpret_cast<void*>(&callback));
130     return panda::JSValueRef::Undefined(vm);
131 }
ResetOnStateChange(ArkUIRuntimeCallInfo * runtimeCallInfo)132 ArkUINativeModuleValue RefreshBridege::ResetOnStateChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
133 {
134     EcmaVM* vm = runtimeCallInfo->GetVM();
135     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
136     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
137     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
138     GetArkUINodeModifiers()->getRefreshModifier()->resetRefreshOnStateChangeCallback(nativeNode);
139     return panda::JSValueRef::Undefined(vm);
140 }
SetOnRefreshing(ArkUIRuntimeCallInfo * runtimeCallInfo)141 ArkUINativeModuleValue RefreshBridege::SetOnRefreshing(ArkUIRuntimeCallInfo* runtimeCallInfo)
142 {
143     EcmaVM* vm = runtimeCallInfo->GetVM();
144     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
145     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
146     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
147     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
148     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
149         GetArkUINodeModifiers()->getRefreshModifier()->resetOnRefreshingCallback(nativeNode);
150         return panda::JSValueRef::Undefined(vm);
151     }
152     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
153     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
154     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
155 
156     std::function<void()> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
157         panda::LocalScope pandaScope(vm);
158         panda::TryCatch trycatch(vm);
159         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
160         func->Call(vm, func.ToLocal(), nullptr, NUM_0);
161     };
162     GetArkUINodeModifiers()->getRefreshModifier()->setOnRefreshingCallback(
163         nativeNode, reinterpret_cast<void*>(&callback));
164     return panda::JSValueRef::Undefined(vm);
165 }
ResetOnRefreshing(ArkUIRuntimeCallInfo * runtimeCallInfo)166 ArkUINativeModuleValue RefreshBridege::ResetOnRefreshing(ArkUIRuntimeCallInfo* runtimeCallInfo)
167 {
168     EcmaVM* vm = runtimeCallInfo->GetVM();
169     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
170     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
171     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
172     GetArkUINodeModifiers()->getRefreshModifier()->resetOnRefreshingCallback(nativeNode);
173     return panda::JSValueRef::Undefined(vm);
174 }
SetOnOffsetChange(ArkUIRuntimeCallInfo * runtimeCallInfo)175 ArkUINativeModuleValue RefreshBridege::SetOnOffsetChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
176 {
177     EcmaVM* vm = runtimeCallInfo->GetVM();
178     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
179     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
180     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
181     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
182     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
183         GetArkUINodeModifiers()->getRefreshModifier()->resetRefreshOnOffsetChangeCallback(nativeNode);
184         return panda::JSValueRef::Undefined(vm);
185     }
186     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
187     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
188     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
189 
190     std::function<void(const float)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)](
191                                                     const float offsetChange) {
192         panda::LocalScope pandaScope(vm);
193         panda::TryCatch trycatch(vm);
194         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
195         panda::Local<panda::JSValueRef> params[NUM_1] = { panda::NumberRef::New(vm, offsetChange) };
196         func->Call(vm, func.ToLocal(), params, NUM_1);
197     };
198     GetArkUINodeModifiers()->getRefreshModifier()->setRefreshOnOffsetChangeCallback(
199         nativeNode, reinterpret_cast<void*>(&callback));
200     return panda::JSValueRef::Undefined(vm);
201 }
ResetOnOffsetChange(ArkUIRuntimeCallInfo * runtimeCallInfo)202 ArkUINativeModuleValue RefreshBridege::ResetOnOffsetChange(ArkUIRuntimeCallInfo* runtimeCallInfo)
203 {
204     EcmaVM* vm = runtimeCallInfo->GetVM();
205     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
206     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
207     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
208     GetArkUINodeModifiers()->getRefreshModifier()->resetRefreshOnOffsetChangeCallback(nativeNode);
209     return panda::JSValueRef::Undefined(vm);
210 }
SetMaxPullDownDistance(ArkUIRuntimeCallInfo * runtimeCallInfo)211 ArkUINativeModuleValue RefreshBridege::SetMaxPullDownDistance(ArkUIRuntimeCallInfo* runtimeCallInfo)
212 {
213     EcmaVM* vm = runtimeCallInfo->GetVM();
214     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
215     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
216     Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_1);
217     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
218     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
219     auto nodeModifiers = GetArkUINodeModifiers();
220     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
221     auto refreshModifier = nodeModifiers->getRefreshModifier();
222     CHECK_NULL_RETURN(refreshModifier, panda::JSValueRef::Undefined(vm));
223     if (valueArg->IsNumber()) {
224         float value = static_cast<float>(valueArg->ToNumber(vm)->Value());
225         value = std::max(value, 0.0f);
226         refreshModifier->setMaxPullDownDistance(nativeNode, value);
227     } else {
228         refreshModifier->resetMaxPullDownDistance(nativeNode);
229     }
230     return panda::JSValueRef::Undefined(vm);
231 }
ResetMaxPullDownDistance(ArkUIRuntimeCallInfo * runtimeCallInfo)232 ArkUINativeModuleValue RefreshBridege::ResetMaxPullDownDistance(ArkUIRuntimeCallInfo* runtimeCallInfo)
233 {
234     EcmaVM* vm = runtimeCallInfo->GetVM();
235     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
236     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(CALL_ARG_0);
237     CHECK_NULL_RETURN(nodeArg->IsNativePointer(vm), panda::JSValueRef::Undefined(vm));
238     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
239 
240     auto nodeModifiers = GetArkUINodeModifiers();
241     CHECK_NULL_RETURN(nodeModifiers, panda::JSValueRef::Undefined(vm));
242     auto refreshModifier = nodeModifiers->getRefreshModifier();
243     CHECK_NULL_RETURN(refreshModifier, panda::JSValueRef::Undefined(vm));
244     refreshModifier->resetMaxPullDownDistance(nativeNode);
245     return panda::JSValueRef::Undefined(vm);
246 }
247 } // namespace OHOS::Ace::NG
248