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/components_ng/pattern/recycle_view/recycle_manager.h" 29 #include "core/pipeline/base/element_register.h" 30 31 namespace OHOS::Ace::NG { 32 class ACE_FORCE_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 FireDidBuild()54 void FireDidBuild() 55 { 56 if (didBuildFunc_) { 57 didBuildFunc_(); 58 } 59 } 60 SetRenderFunction(const RenderFunction & renderFunction)61 virtual void SetRenderFunction(const RenderFunction& renderFunction) {} 62 SetAppearFunction(std::function<void ()> && appearFunc)63 void SetAppearFunction(std::function<void()>&& appearFunc) 64 { 65 appearFunc_ = std::move(appearFunc); 66 } 67 SetDidBuildFunction(std::function<void ()> && didBuildFunc)68 void SetDidBuildFunction(std::function<void()>&& didBuildFunc) 69 { 70 didBuildFunc_ = std::move(didBuildFunc); 71 } 72 SetUpdateFunction(std::function<void ()> && updateFunc)73 void SetUpdateFunction(std::function<void()>&& updateFunc) 74 { 75 updateFunc_ = std::move(updateFunc); 76 } 77 SetDestroyFunction(std::function<void ()> && destroyFunc)78 void SetDestroyFunction(std::function<void()>&& destroyFunc) 79 { 80 destroyFunc_ = std::move(destroyFunc); 81 } 82 SetReloadFunction(std::function<void (bool)> && reloadFunc)83 void SetReloadFunction(std::function<void(bool)>&& reloadFunc) 84 { 85 reloadFunc_ = std::move(reloadFunc); 86 } 87 FireReloadFunction(bool deep)88 void FireReloadFunction(bool deep) 89 { 90 if (reloadFunc_) { 91 reloadFunc_(deep); 92 } 93 } 94 95 virtual void SetCompleteReloadFunc(RenderFunction&& func) = 0; 96 SetPageTransitionFunction(std::function<void ()> && pageTransitionFunc)97 void SetPageTransitionFunction(std::function<void()>&& pageTransitionFunc) 98 { 99 pageTransitionFunc_ = std::move(pageTransitionFunc); 100 } 101 CallPageTransitionFunction()102 void CallPageTransitionFunction() const 103 { 104 if (pageTransitionFunc_) { 105 pageTransitionFunc_(); 106 } 107 } 108 SetForceUpdateNodeFunc(std::function<void (int32_t)> && forceNodeUpdateFunc)109 void SetForceUpdateNodeFunc(std::function<void(int32_t)>&& forceNodeUpdateFunc) 110 { 111 forceNodeUpdateFunc_ = std::move(forceNodeUpdateFunc); 112 } 113 FireNodeUpdateFunc(ElementIdType id)114 void FireNodeUpdateFunc(ElementIdType id) 115 { 116 if (forceNodeUpdateFunc_) { 117 forceNodeUpdateFunc_(id); 118 } else { 119 LOGE("fail to find node update func to execute %{public}d node update", id); 120 } 121 } 122 SetHasNodeUpdateFunc(std::function<bool (int32_t)> && hasNodeUpdateFunc)123 void SetHasNodeUpdateFunc(std::function<bool(int32_t)>&& hasNodeUpdateFunc) 124 { 125 hasNodeUpdateFunc_ = std::move(hasNodeUpdateFunc); 126 } 127 FireHasNodeUpdateFunc(ElementIdType id)128 bool FireHasNodeUpdateFunc(ElementIdType id) 129 { 130 return hasNodeUpdateFunc_ && hasNodeUpdateFunc_(id); 131 } 132 133 void FireRecycleSelf(); 134 SetRecycleFunction(std::function<void (RefPtr<CustomNodeBase>)> && recycleCustomNode)135 void SetRecycleFunction(std::function<void(RefPtr<CustomNodeBase>)>&& recycleCustomNode) 136 { 137 recycleCustomNodeFunc_ = std::move(recycleCustomNode); 138 } 139 SetRecycleRenderFunc(std::function<void ()> && func)140 void SetRecycleRenderFunc(std::function<void()>&& func) 141 { 142 recycleRenderFunc_ = std::move(func); 143 } 144 145 void FireRecycleRenderFunc(); 146 HasRecycleRenderFunc()147 bool HasRecycleRenderFunc() 148 { 149 return recycleRenderFunc_ != nullptr; 150 } 151 ResetRecycle()152 void ResetRecycle() 153 { 154 recycleRenderFunc_ = nullptr; 155 } 156 SetSetActiveFunc(std::function<void (bool)> && func)157 void SetSetActiveFunc(std::function<void(bool)>&& func) 158 { 159 setActiveFunc_ = std::move(func); 160 } 161 162 void SetOnDumpInfoFunc(std::function<void(const std::vector<std::string>&)>&& func); 163 FireSetActiveFunc(bool active)164 void FireSetActiveFunc(bool active) 165 { 166 if (setActiveFunc_) { 167 setActiveFunc_(active); 168 } 169 } 170 FireOnDumpInfoFunc(const std::vector<std::string> & params)171 void FireOnDumpInfoFunc(const std::vector<std::string>& params) 172 { 173 if (onDumpInfoFunc_) { 174 onDumpInfoFunc_(params); 175 } 176 } 177 Reset()178 void Reset() 179 { 180 updateFunc_ = nullptr; 181 appearFunc_ = nullptr; 182 destroyFunc_ = nullptr; 183 didBuildFunc_ = nullptr; 184 } 185 186 // called by view in js thread 187 void MarkNeedUpdate(); 188 189 // called by pipeline in js thread of update. 190 void Update(); 191 SetJSViewName(std::string && name)192 void SetJSViewName(std::string&& name) 193 { 194 jsViewName_ = name; 195 } 196 GetJSViewName()197 std::string& GetJSViewName() 198 { 199 return jsViewName_; 200 } 201 SetExtraInfo(const ExtraInfo extraInfo)202 void SetExtraInfo(const ExtraInfo extraInfo) 203 { 204 extraInfo_ = std::move(extraInfo); 205 } 206 GetIsV2()207 bool GetIsV2() 208 { 209 return isV2_; 210 } 211 SetIsV2(bool isV2)212 void SetIsV2(bool isV2) 213 { 214 isV2_ = isV2; 215 } 216 GetExtraInfo()217 const ExtraInfo& GetExtraInfo() const 218 { 219 return extraInfo_; 220 } 221 HasExtraInfo()222 bool HasExtraInfo() { 223 if (!extraInfo_.page.empty()) { 224 return true; 225 } 226 return false; 227 } 228 SetThisFunc(std::function<void * ()> && getThisFunc)229 void SetThisFunc(std::function<void*()>&& getThisFunc) 230 { 231 getThisFunc_ = std::move(getThisFunc); 232 } 233 FireThisFunc()234 void* FireThisFunc() 235 { 236 if (getThisFunc_) { 237 return getThisFunc_(); 238 } 239 return nullptr; 240 } 241 242 void SetOnDumpInspectorFunc(std::function<std::string()>&& func); 243 FireOnDumpInspectorFunc()244 std::string FireOnDumpInspectorFunc() 245 { 246 if (onDumpInspectorFunc_) { 247 return onDumpInspectorFunc_(); 248 } 249 return ""; 250 } 251 CheckFireOnAppear()252 bool CheckFireOnAppear() 253 { 254 return executeFireOnAppear_; 255 } 256 257 protected: 258 std::string jsViewName_; 259 ExtraInfo extraInfo_; 260 bool isV2_ = false; 261 262 private: 263 std::function<void()> updateFunc_; 264 std::function<void()> appearFunc_; 265 std::function<void()> didBuildFunc_; 266 std::function<void()> destroyFunc_; 267 std::function<void()> pageTransitionFunc_; 268 std::function<void(bool)> reloadFunc_; 269 std::function<void()> completeReloadFunc_; 270 std::function<void(int32_t)> forceNodeUpdateFunc_; 271 std::function<bool(int32_t)> hasNodeUpdateFunc_; 272 std::function<void(RefPtr<CustomNodeBase>)> recycleCustomNodeFunc_; 273 std::function<void()> recycleRenderFunc_; 274 std::function<void(bool)> setActiveFunc_; 275 std::function<void(const std::vector<std::string>&)> onDumpInfoFunc_; 276 std::function<std::string()> onDumpInspectorFunc_; 277 std::function<void*()> getThisFunc_; 278 bool needRebuild_ = false; 279 bool executeFireOnAppear_ = false; 280 RecycleNodeInfo recycleInfo_; 281 }; 282 } // namespace OHOS::Ace::NG 283 284 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_CUSTOM_NODE_BASE_H 285