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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_CUSTOM_NODE_BASE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_CUSTOM_NODE_BASE_H 18 19 #include <functional> 20 #include <list> 21 #include <string> 22 23 #include "base/memory/ace_type.h" 24 #include "base/utils/macros.h" 25 #include "core/components_ng/base/frame_node.h" 26 #include "core/components_ng/base/view_stack_processor.h" 27 #include "core/components_ng/pattern/custom/custom_node_pattern.h" 28 #include "core/pipeline/base/element_register.h" 29 30 namespace OHOS::Ace::NG { 31 32 class ACE_EXPORT CustomNodeBase : public virtual AceType { 33 DECLARE_ACE_TYPE(CustomNodeBase, AceType); 34 35 public: 36 CustomNodeBase() = default; 37 ~CustomNodeBase() override; 38 FireOnAppear()39 void FireOnAppear() 40 { 41 if (appearFunc_) { 42 appearFunc_(); 43 } 44 executeFireOnAppear_ = true; 45 } 46 FireOnDisappear()47 void FireOnDisappear() 48 { 49 if (destroyFunc_) { 50 destroyFunc_(); 51 } 52 } 53 SetRenderFunction(const RenderFunction & renderFunction)54 virtual void SetRenderFunction(const RenderFunction& renderFunction) {} 55 SetAppearFunction(std::function<void ()> && appearFunc)56 void SetAppearFunction(std::function<void()>&& appearFunc) 57 { 58 appearFunc_ = std::move(appearFunc); 59 } 60 SetUpdateFunction(std::function<void ()> && updateFunc)61 void SetUpdateFunction(std::function<void()>&& updateFunc) 62 { 63 updateFunc_ = std::move(updateFunc); 64 } 65 SetDestroyFunction(std::function<void ()> && destroyFunc)66 void SetDestroyFunction(std::function<void()>&& destroyFunc) 67 { 68 destroyFunc_ = std::move(destroyFunc); 69 } 70 SetReloadFunction(std::function<void (bool)> && reloadFunc)71 void SetReloadFunction(std::function<void(bool)>&& reloadFunc) 72 { 73 reloadFunc_ = std::move(reloadFunc); 74 } 75 FireReloadFunction(bool deep)76 void FireReloadFunction(bool deep) 77 { 78 if (reloadFunc_) { 79 reloadFunc_(deep); 80 } 81 } 82 83 virtual void SetCompleteReloadFunc(RenderFunction&& func) = 0; 84 SetPageTransitionFunction(std::function<void ()> && pageTransitionFunc)85 void SetPageTransitionFunction(std::function<void()>&& pageTransitionFunc) 86 { 87 pageTransitionFunc_ = std::move(pageTransitionFunc); 88 } 89 CallPageTransitionFunction()90 void CallPageTransitionFunction() const 91 { 92 if (pageTransitionFunc_) { 93 pageTransitionFunc_(); 94 } 95 } 96 SetForceUpdateNodeFunc(std::function<void (int32_t)> && forceNodeUpdateFunc)97 void SetForceUpdateNodeFunc(std::function<void(int32_t)>&& forceNodeUpdateFunc) 98 { 99 forceNodeUpdateFunc_ = std::move(forceNodeUpdateFunc); 100 } 101 FireNodeUpdateFunc(ElementIdType id)102 void FireNodeUpdateFunc(ElementIdType id) 103 { 104 if (forceNodeUpdateFunc_) { 105 forceNodeUpdateFunc_(id); 106 } else { 107 LOGE("fail to find node update func to execute %{public}d node update", id); 108 } 109 } 110 111 void FireRecycleSelf(); 112 SetRecycleFunction(std::function<void (RefPtr<CustomNodeBase>)> && recycleCustomNode)113 void SetRecycleFunction(std::function<void(RefPtr<CustomNodeBase>)>&& recycleCustomNode) 114 { 115 recycleCustomNodeFunc_ = std::move(recycleCustomNode); 116 } 117 SetRecycleRenderFunc(std::function<void ()> && func)118 void SetRecycleRenderFunc(std::function<void()>&& func) 119 { 120 recycleRenderFunc_ = std::move(func); 121 } 122 FireRecycleRenderFunc()123 void FireRecycleRenderFunc() 124 { 125 if (recycleRenderFunc_) { 126 ACE_SCOPED_TRACE("CustomNode:BuildRecycle %s", GetJSViewName().c_str()); 127 { 128 ScopedViewStackProcessor scopedViewStackProcessor; 129 recycleRenderFunc_(); 130 } 131 for (const auto& weak : recyclePatterns_) { 132 auto pattern = weak.Upgrade(); 133 if (pattern) { 134 pattern->OnReuse(); 135 } 136 } 137 recyclePatterns_.clear(); 138 recycleRenderFunc_ = nullptr; 139 } 140 } 141 HasRecycleRenderFunc()142 bool HasRecycleRenderFunc() 143 { 144 return recycleRenderFunc_ != nullptr; 145 } 146 ResetRecycle()147 void ResetRecycle() 148 { 149 recycleRenderFunc_ = nullptr; 150 } 151 SetSetActiveFunc(std::function<void (bool)> && func)152 void SetSetActiveFunc(std::function<void(bool)>&& func) 153 { 154 setActiveFunc_ = std::move(func); 155 } 156 157 void SetOnDumpInfoFunc(std::function<void(const std::vector<std::string>&)>&& func); 158 FireSetActiveFunc(bool active)159 void FireSetActiveFunc(bool active) 160 { 161 if (setActiveFunc_) { 162 setActiveFunc_(active); 163 } 164 } 165 FireOnDumpInfoFunc(const std::vector<std::string> & params)166 void FireOnDumpInfoFunc(const std::vector<std::string>& params) 167 { 168 if (onDumpInfoFunc_) { 169 onDumpInfoFunc_(params); 170 } 171 } 172 Reset()173 void Reset() 174 { 175 updateFunc_ = nullptr; 176 appearFunc_ = nullptr; 177 destroyFunc_ = nullptr; 178 } 179 180 // called by view in js thread 181 void MarkNeedUpdate(); 182 183 // called by pipeline in js thread of update. 184 void Update(); 185 SetJSViewName(std::string && name)186 void SetJSViewName(std::string&& name) 187 { 188 jsViewName_ = name; 189 } 190 GetJSViewName()191 std::string& GetJSViewName() 192 { 193 return jsViewName_; 194 } 195 SetExtraInfo(const ExtraInfo extraInfo)196 void SetExtraInfo(const ExtraInfo extraInfo) 197 { 198 extraInfo_ = std::move(extraInfo); 199 } 200 GetExtraInfo()201 const ExtraInfo& GetExtraInfo() const 202 { 203 return extraInfo_; 204 } 205 HasExtraInfo()206 bool HasExtraInfo() { 207 if (!extraInfo_.page.empty()) { 208 return true; 209 } 210 return false; 211 } 212 213 protected: 214 std::string jsViewName_; 215 ExtraInfo extraInfo_; 216 217 private: 218 std::function<void()> updateFunc_; 219 std::function<void()> appearFunc_; 220 std::function<void()> destroyFunc_; 221 std::function<void()> pageTransitionFunc_; 222 std::function<void(bool)> reloadFunc_; 223 std::function<void()> completeReloadFunc_; 224 std::function<void(int32_t)> forceNodeUpdateFunc_; 225 std::function<void(RefPtr<CustomNodeBase>)> recycleCustomNodeFunc_; 226 std::function<void()> recycleRenderFunc_; 227 std::function<void(bool)> setActiveFunc_; 228 std::function<void(const std::vector<std::string>&)> onDumpInfoFunc_; 229 bool needRebuild_ = false; 230 bool executeFireOnAppear_ = false; 231 std::list<WeakPtr<Pattern>> recyclePatterns_; 232 }; 233 } // namespace OHOS::Ace::NG 234 235 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_CUSTOM_NODE_BASE_H 236