• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     pageTransitionFunc_ = nullptr;
183     reloadFunc_ = nullptr;
184     completeReloadFunc_ = nullptr;
185     forceNodeUpdateFunc_ = nullptr;
186     hasNodeUpdateFunc_ = nullptr;
187     recycleCustomNodeFunc_ = nullptr;
188     recycleRenderFunc_ = nullptr;
189     onDumpInfoFunc_ = nullptr;
190     onDumpInspectorFunc_ = nullptr;
191     getThisFunc_ = nullptr;
192     onRecycleFunc_ = nullptr;
193     onReuseFunc_ = nullptr;
194 }
195 
SetJSViewName(std::string && name)196 void CustomNodeBase::SetJSViewName(std::string&& name)
197 {
198     jsViewName_ = name;
199 }
200 
GetJSViewName()201 std::string& CustomNodeBase::GetJSViewName()
202 {
203     return jsViewName_;
204 }
205 
SetExtraInfo(const ExtraInfo extraInfo)206 void CustomNodeBase::SetExtraInfo(const ExtraInfo extraInfo)
207 {
208     extraInfo_ = std::move(extraInfo);
209 }
210 
GetIsV2()211 bool CustomNodeBase::GetIsV2()
212 {
213     return isV2_;
214 }
215 
SetIsV2(bool isV2)216 void CustomNodeBase::SetIsV2(bool isV2)
217 {
218     isV2_ = isV2;
219 }
220 
GetExtraInfo() const221 const ExtraInfo& CustomNodeBase::GetExtraInfo() const
222 {
223     return extraInfo_;
224 }
225 
HasExtraInfo()226 bool CustomNodeBase::HasExtraInfo()
227 {
228     if (!extraInfo_.page.empty()) {
229         return true;
230     }
231     return false;
232 }
233 
SetThisFunc(std::function<void * ()> && getThisFunc)234 void CustomNodeBase::SetThisFunc(std::function<void*()>&& getThisFunc)
235 {
236     getThisFunc_ = std::move(getThisFunc);
237 }
238 
FireThisFunc()239 void* CustomNodeBase::FireThisFunc()
240 {
241     if (getThisFunc_) {
242         return getThisFunc_();
243     }
244     return nullptr;
245 }
246 
FireClearAllRecycleFunc()247 void CustomNodeBase::FireClearAllRecycleFunc()
248 {
249     if (clearAllRecycleFunc_) {
250         ACE_SCOPED_TRACE("CustomNode:FireClearAllRecycleFunc %s", GetJSViewName().c_str());
251         RecycleManager::ClearAll();
252         clearAllRecycleFunc_();
253     }
254 }
255 
FireOnDumpInspectorFunc()256 std::string CustomNodeBase::FireOnDumpInspectorFunc()
257 {
258     if (onDumpInspectorFunc_) {
259         return onDumpInspectorFunc_();
260     }
261     return "";
262 }
263 
CheckFireOnAppear()264 bool CustomNodeBase::CheckFireOnAppear()
265 {
266     return executeFireOnAppear_;
267 }
268 
MarkNeedUpdate()269 void CustomNodeBase::MarkNeedUpdate()
270 {
271     auto context = PipelineContext::GetCurrentContext();
272     if (!context) {
273         TAG_LOGW(AceLogTag::ACE_STATE_MGMT, "context no longer exist when [%{public}s] call markNeedUpdate",
274             GetJSViewName().c_str());
275         return;
276     }
277     if (needRebuild_) {
278         TAG_LOGW(AceLogTag::ACE_STATE_MGMT, "[%{public}s] call markNeedUpdate in rebuild", GetJSViewName().c_str());
279         return;
280     }
281     needRebuild_ = true;
282     context->AddDirtyCustomNode(AceType::DynamicCast<UINode>(Claim(this)));
283 }
284 
FireRecycleSelf()285 void CustomNodeBase::FireRecycleSelf()
286 {
287     auto uiNode = AceType::DynamicCast<UINode>(Claim(this));
288     uiNode->OnRecycle();
289     if (recycleCustomNodeFunc_) {
290         recycleInfo_.Recycle(uiNode->GetId());
291         RecycleManager::Push(uiNode->GetId(), AceType::WeakClaim(this));
292         recycleCustomNodeFunc_(AceType::Claim<CustomNodeBase>(this));
293     }
294 }
295 
FireRecycleRenderFunc()296 void CustomNodeBase::FireRecycleRenderFunc()
297 {
298     if (recycleRenderFunc_) {
299         auto node = AceType::DynamicCast<UINode>(Claim(this));
300         recycleInfo_.Reuse();
301         RecycleManager::Pop(node->GetId());
302         {
303             ScopedViewStackProcessor scopedViewStackProcessor;
304             recycleRenderFunc_();
305         }
306         node->OnReuse();
307         node->SetJSViewActive(true, false, true);
308         recycleRenderFunc_ = nullptr;
309     }
310 }
311 
SetOnDumpInfoFunc(std::function<void (const std::vector<std::string> &)> && func)312 void CustomNodeBase::SetOnDumpInfoFunc(std::function<void(const std::vector<std::string>&)>&& func)
313 {
314     onDumpInfoFunc_ = func;
315 }
316 
SetOnDumpInspectorFunc(std::function<std::string ()> && func)317 void CustomNodeBase::SetOnDumpInspectorFunc(std::function<std::string()>&& func)
318 {
319     onDumpInspectorFunc_ = func;
320 }
321 
SetClearAllRecycleFunc(std::function<void ()> && func)322 void CustomNodeBase::SetClearAllRecycleFunc(std::function<void()>&& func)
323 {
324     clearAllRecycleFunc_ = func;
325 }
326 
SetReuseId(const std::string & reuseId)327 void CustomNodeBase::SetReuseId(const std::string& reuseId)
328 {
329     reuseId_ = reuseId;
330 }
331 
GetReuseId() const332 const std::string& CustomNodeBase::GetReuseId() const
333 {
334     return reuseId_;
335 }
336 
SetOnRecycleFunc(std::function<void ()> && func)337 void CustomNodeBase::SetOnRecycleFunc(std::function<void()>&& func)
338 {
339     onRecycleFunc_ = func;
340 }
341 
SetOnReuseFunc(std::function<void (void *)> && func)342 void CustomNodeBase::SetOnReuseFunc(std::function<void(void*)>&& func)
343 {
344     onReuseFunc_ = func;
345 }
346 
FireOnRecycleFunc()347 void CustomNodeBase::FireOnRecycleFunc()
348 {
349     if (onRecycleFunc_) {
350         onRecycleFunc_();
351     }
352 }
353 
FireOnReuseFunc(void * params)354 void CustomNodeBase::FireOnReuseFunc(void* params)
355 {
356     if (onReuseFunc_) {
357         onReuseFunc_(params);
358     }
359 }
360 } // namespace OHOS::Ace::NG
361