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 "core/interfaces/native/node/node_refresh_modifier.h"
16
17 #include "core/components_ng/pattern/refresh/refresh_model_ng.h"
18 #include "core/interfaces/native/node/node_refresh_modifier.h"
19
20 namespace OHOS::Ace::NG {
21 namespace {
22 const float ERROR_FLOAT_CODE = -1.0f;
23
SetRefreshing(ArkUINodeHandle node,ArkUI_Bool value)24 void SetRefreshing(ArkUINodeHandle node, ArkUI_Bool value)
25 {
26 auto* frameNode = reinterpret_cast<FrameNode*>(node);
27 CHECK_NULL_VOID(frameNode);
28 RefreshModelNG::SetRefreshing(frameNode, static_cast<bool>(value));
29 }
30
GetRefreshing(ArkUINodeHandle node)31 ArkUI_Bool GetRefreshing(ArkUINodeHandle node)
32 {
33 auto* frameNode = reinterpret_cast<FrameNode*>(node);
34 CHECK_NULL_RETURN(frameNode, false);
35 return static_cast<ArkUI_Bool>(RefreshModelNG::GetRefreshing(frameNode));
36 }
37
SetRefreshOffset(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)38 void SetRefreshOffset(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
39 {
40 auto* frameNode = reinterpret_cast<FrameNode*>(node);
41 CHECK_NULL_VOID(frameNode);
42 RefreshModelNG::SetRefreshOffset(frameNode, Dimension(value, static_cast<OHOS::Ace::DimensionUnit>(unit)));
43 }
44
ResetRefreshOffset(ArkUINodeHandle node)45 void ResetRefreshOffset(ArkUINodeHandle node)
46 {
47 auto* frameNode = reinterpret_cast<FrameNode*>(node);
48 CHECK_NULL_VOID(frameNode);
49 RefreshModelNG::SetRefreshOffset(frameNode, Dimension(0.0f, DimensionUnit::VP));
50 }
51
SetPullToRefresh(ArkUINodeHandle node,ArkUI_Bool value)52 void SetPullToRefresh(ArkUINodeHandle node, ArkUI_Bool value)
53 {
54 auto* frameNode = reinterpret_cast<FrameNode*>(node);
55 CHECK_NULL_VOID(frameNode);
56 RefreshModelNG::SetPullToRefresh(frameNode, value);
57 }
58
ResetPullToRefresh(ArkUINodeHandle node)59 void ResetPullToRefresh(ArkUINodeHandle node)
60 {
61 auto* frameNode = reinterpret_cast<FrameNode*>(node);
62 CHECK_NULL_VOID(frameNode);
63 RefreshModelNG::SetPullToRefresh(frameNode, true);
64 }
65
SetRefreshContent(ArkUINodeHandle node,ArkUINodeHandle content)66 void SetRefreshContent(ArkUINodeHandle node, ArkUINodeHandle content)
67 {
68 auto* frameNode = reinterpret_cast<FrameNode*>(node);
69 CHECK_NULL_VOID(frameNode);
70 auto contentNode = reinterpret_cast<FrameNode*>(content);
71 CHECK_NULL_VOID(contentNode);
72 RefreshModelNG::SetCustomBuilder(frameNode, contentNode);
73 }
74
SetPullDownRatio(ArkUINodeHandle node,ArkUI_Float32 ratio)75 void SetPullDownRatio(ArkUINodeHandle node, ArkUI_Float32 ratio)
76 {
77 auto* frameNode = reinterpret_cast<FrameNode*>(node);
78 CHECK_NULL_VOID(frameNode);
79 float value = 0.0;
80 if (LessNotEqual(ratio, 0.0)) {
81 value = 0.0;
82 } else if (GreatNotEqual(ratio, 1.0)) {
83 value = 1.0;
84 }
85 value = ratio ;
86 std::optional<float> ratioValue = value;
87 RefreshModelNG::SetPullDownRatio(frameNode, ratioValue);
88 }
89
ResetPullDownRatio(ArkUINodeHandle node)90 void ResetPullDownRatio(ArkUINodeHandle node)
91 {
92 auto* frameNode = reinterpret_cast<FrameNode*>(node);
93 CHECK_NULL_VOID(frameNode);
94 std::optional<float> ratioValue = std::nullopt;
95 RefreshModelNG::SetPullDownRatio(frameNode, ratioValue);
96 }
97
GetPullDownRatio(ArkUINodeHandle node)98 ArkUI_Float32 GetPullDownRatio(ArkUINodeHandle node)
99 {
100 auto* frameNode = reinterpret_cast<FrameNode*>(node);
101 CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
102 return RefreshModelNG::GetPullDownRatio(frameNode);
103 }
104
GetRefreshOffset(ArkUINodeHandle node,ArkUI_Int32 unit)105 ArkUI_Float32 GetRefreshOffset(ArkUINodeHandle node, ArkUI_Int32 unit)
106 {
107 auto* frameNode = reinterpret_cast<FrameNode*>(node);
108 CHECK_NULL_RETURN(frameNode, ERROR_FLOAT_CODE);
109 return RefreshModelNG::GetRefreshOffset(frameNode).GetNativeValue(static_cast<DimensionUnit>(unit));
110 }
111
GetPullToRefresh(ArkUINodeHandle node)112 ArkUI_Bool GetPullToRefresh(ArkUINodeHandle node)
113 {
114 auto* frameNode = reinterpret_cast<FrameNode*>(node);
115 CHECK_NULL_RETURN(frameNode, false);
116 return static_cast<ArkUI_Bool>(RefreshModelNG::GetPullToRefresh(frameNode));
117 }
118 } // namespace
119 namespace NodeModifier {
120
GetRefreshModifier()121 const ArkUIRefreshModifier* GetRefreshModifier()
122 {
123 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
124 static const ArkUIRefreshModifier modifier = {
125 .setRefreshing = SetRefreshing,
126 .getRefreshing = GetRefreshing,
127 .setRefreshOffset = SetRefreshOffset,
128 .resetRefreshOffset = ResetRefreshOffset,
129 .setPullToRefresh = SetPullToRefresh,
130 .resetPullToRefresh = ResetPullToRefresh,
131 .setRefreshContent = SetRefreshContent,
132 .setPullDownRatio = SetPullDownRatio,
133 .resetPullDownRatio = ResetPullDownRatio,
134 .getPullDownRatio = GetPullDownRatio,
135 .getRefreshOffset = GetRefreshOffset,
136 .getPullToRefresh = GetPullToRefresh,
137 };
138 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
139 return &modifier;
140 }
141
GetCJUIRefreshModifier()142 const CJUIRefreshModifier* GetCJUIRefreshModifier()
143 {
144 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
145 static const CJUIRefreshModifier modifier = {
146 .setRefreshing = SetRefreshing,
147 .getRefreshing = GetRefreshing,
148 .setRefreshContent = SetRefreshContent,
149 .setRefreshOffset = SetRefreshOffset,
150 .resetRefreshOffset = ResetRefreshOffset,
151 .setPullToRefresh = SetPullToRefresh,
152 .resetPullToRefresh = ResetPullToRefresh,
153 .setPullDownRatio = SetPullDownRatio,
154 .resetPullDownRatio = ResetPullDownRatio,
155 .getPullDownRatio = GetPullDownRatio,
156 .getRefreshOffset = GetRefreshOffset,
157 .getPullToRefresh = GetPullToRefresh,
158 };
159 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
160 return &modifier;
161 }
162
SetRefreshOnStateChange(ArkUINodeHandle node,void * extraParam)163 void SetRefreshOnStateChange(ArkUINodeHandle node, void* extraParam)
164 {
165 auto* frameNode = reinterpret_cast<FrameNode*>(node);
166 CHECK_NULL_VOID(frameNode);
167 auto onEvent = [node, extraParam](const int32_t value) {
168 ArkUINodeEvent event;
169 event.kind = COMPONENT_ASYNC_EVENT;
170 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
171 event.componentAsyncEvent.subKind = ON_REFRESH_STATE_CHANGE;
172 event.componentAsyncEvent.data[0].i32 = value;
173 SendArkUISyncEvent(&event);
174 };
175 RefreshModelNG::SetOnStateChange(frameNode, std::move(onEvent));
176 }
177
SetOnRefreshing(ArkUINodeHandle node,void * extraParam)178 void SetOnRefreshing(ArkUINodeHandle node, void* extraParam)
179 {
180 auto* frameNode = reinterpret_cast<FrameNode*>(node);
181 CHECK_NULL_VOID(frameNode);
182 auto onEvent = [node, extraParam]() {
183 ArkUINodeEvent event;
184 event.kind = COMPONENT_ASYNC_EVENT;
185 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
186 event.componentAsyncEvent.subKind = ON_REFRESH_REFRESHING;
187 SendArkUISyncEvent(&event);
188 };
189 RefreshModelNG::SetOnRefreshing(frameNode, std::move(onEvent));
190 }
191
SetRefreshOnOffsetChange(ArkUINodeHandle node,void * extraParam)192 void SetRefreshOnOffsetChange(ArkUINodeHandle node, void* extraParam)
193 {
194 auto* frameNode = reinterpret_cast<FrameNode*>(node);
195 CHECK_NULL_VOID(frameNode);
196 auto onEvent = [node, extraParam](const float value) {
197 ArkUINodeEvent event;
198 event.kind = COMPONENT_ASYNC_EVENT;
199 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
200 event.componentAsyncEvent.subKind = ON_REFRESH_ON_OFFSET_CHANGE;
201 event.componentAsyncEvent.data[0].f32 = value;
202 SendArkUISyncEvent(&event);
203 };
204 RefreshModelNG::SetOnOffsetChange(frameNode, std::move(onEvent));
205 }
206
SetRefreshChangeEvent(ArkUINodeHandle node,void * extraParam)207 void SetRefreshChangeEvent(ArkUINodeHandle node, void* extraParam)
208 {
209 auto* frameNode = reinterpret_cast<FrameNode*>(node);
210 CHECK_NULL_VOID(frameNode);
211 auto onEvent = [node, extraParam](const std::string& value) {
212 ArkUINodeEvent event;
213 event.kind = COMPONENT_ASYNC_EVENT;
214 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
215 event.componentAsyncEvent.subKind = ON_REFRESH_CHANGE_EVENT;
216 bool newValue = value == "true";
217 event.componentAsyncEvent.data[0].u32 = newValue;
218 SendArkUISyncEvent(&event);
219 };
220 RefreshModelNG::SetChangeEvent(frameNode, std::move(onEvent));
221 }
222
ResetRefreshOnStateChange(ArkUINodeHandle node)223 void ResetRefreshOnStateChange(ArkUINodeHandle node)
224 {
225 auto* frameNode = reinterpret_cast<FrameNode*>(node);
226 CHECK_NULL_VOID(frameNode);
227 RefreshModelNG::SetOnStateChange(frameNode, nullptr);
228 }
ResetOnRefreshing(ArkUINodeHandle node)229 void ResetOnRefreshing(ArkUINodeHandle node)
230 {
231 auto* frameNode = reinterpret_cast<FrameNode*>(node);
232 CHECK_NULL_VOID(frameNode);
233 RefreshModelNG::SetOnRefreshing(frameNode, nullptr);
234 }
ResetRefreshOnOffsetChange(ArkUINodeHandle node)235 void ResetRefreshOnOffsetChange(ArkUINodeHandle node)
236 {
237 auto* frameNode = reinterpret_cast<FrameNode*>(node);
238 CHECK_NULL_VOID(frameNode);
239 RefreshModelNG::SetOnOffsetChange(frameNode, nullptr);
240 }
ResetRefreshChangeEvent(ArkUINodeHandle node)241 void ResetRefreshChangeEvent(ArkUINodeHandle node)
242 {
243 auto* frameNode = reinterpret_cast<FrameNode*>(node);
244 CHECK_NULL_VOID(frameNode);
245 RefreshModelNG::SetChangeEvent(frameNode, nullptr);
246 }
247 } // namespace NodeModifier
248 } // namespace OHOS::Ace::NG
249