1 /*
2 * Copyright (c) 2022 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
16 #include "core/components_ng/pattern/custom/custom_node_base.h"
17
18 #include "core/pipeline_ng/pipeline_context.h"
19
20 namespace OHOS::Ace::NG {
21
~CustomNodeBase()22 CustomNodeBase::~CustomNodeBase()
23 {
24 RecycleManager::Erase(recycleInfo_.elemtId);
25 // appearFunc_ & destroyFunc_ should be executed in pairs
26 if (!executeFireOnAppear_ && appearFunc_) {
27 appearFunc_();
28 if (didBuildFunc_) {
29 didBuildFunc_();
30 }
31 }
32 if (destroyFunc_) {
33 ACE_SCOPED_TRACE("CustomNodeBase:Destroy [%s]", GetJSViewName().c_str());
34 destroyFunc_();
35 }
36 }
37
FireOnAppear()38 void CustomNodeBase::FireOnAppear()
39 {
40 if (appearFunc_) {
41 appearFunc_();
42 }
43 executeFireOnAppear_ = true;
44 }
45
FireOnDisappear()46 void CustomNodeBase::FireOnDisappear()
47 {
48 if (destroyFunc_) {
49 destroyFunc_();
50 }
51 }
52
FireDidBuild()53 void CustomNodeBase::FireDidBuild()
54 {
55 if (didBuildFunc_) {
56 didBuildFunc_();
57 }
58 }
59
SetAppearFunction(std::function<void ()> && appearFunc)60 void CustomNodeBase::SetAppearFunction(std::function<void()>&& appearFunc)
61 {
62 appearFunc_ = std::move(appearFunc);
63 }
64
SetDidBuildFunction(std::function<void ()> && didBuildFunc)65 void CustomNodeBase::SetDidBuildFunction(std::function<void()>&& didBuildFunc)
66 {
67 didBuildFunc_ = std::move(didBuildFunc);
68 }
69
SetUpdateFunction(std::function<void ()> && updateFunc)70 void CustomNodeBase::SetUpdateFunction(std::function<void()>&& updateFunc)
71 {
72 updateFunc_ = std::move(updateFunc);
73 }
74
SetDestroyFunction(std::function<void ()> && destroyFunc)75 void CustomNodeBase::SetDestroyFunction(std::function<void()>&& destroyFunc)
76 {
77 destroyFunc_ = std::move(destroyFunc);
78 }
79
SetReloadFunction(std::function<void (bool)> && reloadFunc)80 void CustomNodeBase::SetReloadFunction(std::function<void(bool)>&& reloadFunc)
81 {
82 reloadFunc_ = std::move(reloadFunc);
83 }
84
FireReloadFunction(bool deep)85 void CustomNodeBase::FireReloadFunction(bool deep)
86 {
87 if (reloadFunc_) {
88 reloadFunc_(deep);
89 }
90 }
91
Update()92 void CustomNodeBase::Update()
93 {
94 needRebuild_ = false;
95 if (updateFunc_) {
96 updateFunc_();
97 }
98 }
99
SetPageTransitionFunction(std::function<void ()> && pageTransitionFunc)100 void CustomNodeBase::SetPageTransitionFunction(std::function<void()>&& pageTransitionFunc)
101 {
102 pageTransitionFunc_ = std::move(pageTransitionFunc);
103 }
104
CallPageTransitionFunction() const105 void CustomNodeBase::CallPageTransitionFunction() const
106 {
107 if (pageTransitionFunc_) {
108 pageTransitionFunc_();
109 }
110 }
111
SetForceUpdateNodeFunc(std::function<void (int32_t)> && forceNodeUpdateFunc)112 void CustomNodeBase::SetForceUpdateNodeFunc(std::function<void(int32_t)>&& forceNodeUpdateFunc)
113 {
114 forceNodeUpdateFunc_ = std::move(forceNodeUpdateFunc);
115 }
116
FireNodeUpdateFunc(ElementIdType id)117 void CustomNodeBase::FireNodeUpdateFunc(ElementIdType id)
118 {
119 if (forceNodeUpdateFunc_) {
120 forceNodeUpdateFunc_(id);
121 } else {
122 LOGE("fail to find node update func to execute %{public}d node update", id);
123 }
124 }
125
SetHasNodeUpdateFunc(std::function<bool (int32_t)> && hasNodeUpdateFunc)126 void CustomNodeBase::SetHasNodeUpdateFunc(std::function<bool(int32_t)>&& hasNodeUpdateFunc)
127 {
128 hasNodeUpdateFunc_ = std::move(hasNodeUpdateFunc);
129 }
130
FireHasNodeUpdateFunc(ElementIdType id)131 bool CustomNodeBase::FireHasNodeUpdateFunc(ElementIdType id)
132 {
133 return hasNodeUpdateFunc_ && hasNodeUpdateFunc_(id);
134 }
135
SetRecycleFunction(std::function<void (RefPtr<CustomNodeBase>)> && recycleCustomNode)136 void CustomNodeBase::SetRecycleFunction(std::function<void(RefPtr<CustomNodeBase>)>&& recycleCustomNode)
137 {
138 recycleCustomNodeFunc_ = std::move(recycleCustomNode);
139 }
140
SetRecycleRenderFunc(std::function<void ()> && func)141 void CustomNodeBase::SetRecycleRenderFunc(std::function<void()>&& func)
142 {
143 recycleRenderFunc_ = std::move(func);
144 }
145
HasRecycleRenderFunc()146 bool CustomNodeBase::HasRecycleRenderFunc()
147 {
148 return recycleRenderFunc_ != nullptr;
149 }
150
ResetRecycle()151 void CustomNodeBase::ResetRecycle()
152 {
153 recycleRenderFunc_ = nullptr;
154 }
155
SetSetActiveFunc(std::function<void (bool,bool)> && func)156 void CustomNodeBase::SetSetActiveFunc(std::function<void(bool, bool)>&& func)
157 {
158 setActiveFunc_ = std::move(func);
159 }
160
FireSetActiveFunc(bool active,bool isReuse)161 void CustomNodeBase::FireSetActiveFunc(bool active, bool isReuse)
162 {
163 if (setActiveFunc_) {
164 setActiveFunc_(active, isReuse);
165 }
166 }
167
FireOnDumpInfoFunc(const std::vector<std::string> & params)168 void CustomNodeBase::FireOnDumpInfoFunc(const std::vector<std::string>& params)
169 {
170 if (onDumpInfoFunc_) {
171 onDumpInfoFunc_(params);
172 }
173 }
174
Reset()175 void CustomNodeBase::Reset()
176 {
177 updateFunc_ = nullptr;
178 appearFunc_ = nullptr;
179 destroyFunc_ = nullptr;
180 didBuildFunc_ = nullptr;
181 setActiveFunc_ = nullptr;
182 }
183
SetJSViewName(std::string && name)184 void CustomNodeBase::SetJSViewName(std::string&& name)
185 {
186 jsViewName_ = name;
187 }
188
GetJSViewName()189 std::string& CustomNodeBase::GetJSViewName()
190 {
191 return jsViewName_;
192 }
193
SetExtraInfo(const ExtraInfo extraInfo)194 void CustomNodeBase::SetExtraInfo(const ExtraInfo extraInfo)
195 {
196 extraInfo_ = std::move(extraInfo);
197 }
198
GetIsV2()199 bool CustomNodeBase::GetIsV2()
200 {
201 return isV2_;
202 }
203
SetIsV2(bool isV2)204 void CustomNodeBase::SetIsV2(bool isV2)
205 {
206 isV2_ = isV2;
207 }
208
GetExtraInfo() const209 const ExtraInfo& CustomNodeBase::GetExtraInfo() const
210 {
211 return extraInfo_;
212 }
213
HasExtraInfo()214 bool CustomNodeBase::HasExtraInfo()
215 {
216 if (!extraInfo_.page.empty()) {
217 return true;
218 }
219 return false;
220 }
221
SetThisFunc(std::function<void * ()> && getThisFunc)222 void CustomNodeBase::SetThisFunc(std::function<void*()>&& getThisFunc)
223 {
224 getThisFunc_ = std::move(getThisFunc);
225 }
226
FireThisFunc()227 void* CustomNodeBase::FireThisFunc()
228 {
229 if (getThisFunc_) {
230 return getThisFunc_();
231 }
232 return nullptr;
233 }
234
FireOnDumpInspectorFunc()235 std::string CustomNodeBase::FireOnDumpInspectorFunc()
236 {
237 if (onDumpInspectorFunc_) {
238 return onDumpInspectorFunc_();
239 }
240 return "";
241 }
242
CheckFireOnAppear()243 bool CustomNodeBase::CheckFireOnAppear()
244 {
245 return executeFireOnAppear_;
246 }
247
MarkNeedUpdate()248 void CustomNodeBase::MarkNeedUpdate()
249 {
250 auto context = PipelineContext::GetCurrentContext();
251 if (!context) {
252 TAG_LOGW(AceLogTag::ACE_STATE_MGMT, "context no longer exist when [%{public}s] call markNeedUpdate",
253 GetJSViewName().c_str());
254 return;
255 }
256 if (needRebuild_) {
257 TAG_LOGW(AceLogTag::ACE_STATE_MGMT, "[%{public}s] call markNeedUpdate in rebuild", GetJSViewName().c_str());
258 return;
259 }
260 needRebuild_ = true;
261 context->AddDirtyCustomNode(AceType::DynamicCast<UINode>(Claim(this)));
262 }
263
FireRecycleSelf()264 void CustomNodeBase::FireRecycleSelf()
265 {
266 auto uiNode = AceType::DynamicCast<UINode>(Claim(this));
267 uiNode->OnRecycle();
268 if (recycleCustomNodeFunc_) {
269 recycleInfo_.Recycle(uiNode->GetId());
270 RecycleManager::Push(uiNode->GetId(), AceType::WeakClaim(this));
271 recycleCustomNodeFunc_(AceType::Claim<CustomNodeBase>(this));
272 }
273 }
274
FireRecycleRenderFunc()275 void CustomNodeBase::FireRecycleRenderFunc()
276 {
277 if (recycleRenderFunc_) {
278 ACE_SCOPED_TRACE("CustomNode:BuildRecycle %s", GetJSViewName().c_str());
279 auto node = AceType::DynamicCast<UINode>(Claim(this));
280 recycleInfo_.Reuse();
281 RecycleManager::Pop(node->GetId());
282 {
283 ScopedViewStackProcessor scopedViewStackProcessor;
284 recycleRenderFunc_();
285 }
286 node->OnReuse();
287 node->SetJSViewActive(true, false, true);
288 recycleRenderFunc_ = nullptr;
289 }
290 }
291
SetOnDumpInfoFunc(std::function<void (const std::vector<std::string> &)> && func)292 void CustomNodeBase::SetOnDumpInfoFunc(std::function<void(const std::vector<std::string>&)>&& func)
293 {
294 onDumpInfoFunc_ = func;
295 }
296
SetOnDumpInspectorFunc(std::function<std::string ()> && func)297 void CustomNodeBase::SetOnDumpInspectorFunc(std::function<std::string()>&& func)
298 {
299 onDumpInspectorFunc_ = func;
300 }
301
SetOnRecycleFunc(std::function<void ()> && func)302 void CustomNodeBase::SetOnRecycleFunc(std::function<void()>&& func)
303 {
304 onRecycleFunc_ = func;
305 }
306
SetOnReuseFunc(std::function<void (void *)> && func)307 void CustomNodeBase::SetOnReuseFunc(std::function<void(void*)>&& func)
308 {
309 onReuseFunc_ = func;
310 }
311
FireOnRecycleFunc()312 void CustomNodeBase::FireOnRecycleFunc()
313 {
314 if (onRecycleFunc_) {
315 onRecycleFunc_();
316 }
317 }
318
FireOnReuseFunc(void * params)319 void CustomNodeBase::FireOnReuseFunc(void* params)
320 {
321 if (onReuseFunc_) {
322 onReuseFunc_(params);
323 }
324 }
325 } // namespace OHOS::Ace::NG
326