1 /* 2 * Copyright (c) 2025 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_NODE_RENDER_STATUS_MONITOR_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_NODE_RENDER_STATUS_MONITOR_H 18 19 #include <functional> 20 #include <list> 21 #include <memory> 22 #include <unordered_map> 23 24 #include "base/memory/ace_type.h" 25 26 namespace OHOS::Ace::NG { 27 constexpr int32_t MONITOR_INVALID_ID = -1; 28 class FrameNode; 29 enum class NodeRenderState { 30 ABOUT_TO_RENDER_IN = 0, 31 ABOUT_TO_RENDER_OUT = 1, 32 }; 33 34 enum class RenderMonitorReason { 35 RENDER_CHANGE = 0, 36 NODE_RELEASE = 1, 37 }; 38 enum class MonitorSourceType { 39 OBSERVER = 1, 40 }; 41 42 struct MonitorRegisterResult { 43 int32_t id = MONITOR_INVALID_ID; 44 NodeRenderState state = NodeRenderState::ABOUT_TO_RENDER_OUT; 45 }; 46 47 class ACE_FORCE_EXPORT NodeRenderStatusMonitor final : public AceType { 48 public: 49 NodeRenderStatusMonitor() = default; 50 ~NodeRenderStatusMonitor() override = default; 51 52 using NodeRenderStatusHandleFunc = std::function<void(FrameNode*, NodeRenderState, RenderMonitorReason)>; 53 54 MonitorRegisterResult RegisterNodeRenderStatusListener( 55 FrameNode* frameNode, NodeRenderStatusHandleFunc&& func, MonitorSourceType type); 56 void UnRegisterNodeRenderStatusListener(FrameNode* frameNode, int32_t id = MONITOR_INVALID_ID); 57 void WalkThroughAncestorForStateListener(); 58 bool IsRegisterNodeRenderStateChangeCallbackExceedLimit(); 59 NodeRenderState GetNodeCurrentRenderState(FrameNode* frameNode); 60 void NotifyFrameNodeRelease(FrameNode* frameNode); 61 62 private: 63 static int32_t GenerateId(); 64 65 struct NodeRenderStatusListener { 66 MonitorSourceType sourceType; 67 int32_t id; 68 NodeRenderStatusHandleFunc func; NodeRenderStatusListenerNodeRenderStatusListener69 NodeRenderStatusListener(MonitorSourceType sourceType, int32_t id, NodeRenderStatusHandleFunc func) 70 : sourceType(sourceType), id(id), func(std::move(func)) {}; 71 }; 72 73 struct NodeRenderStatusSourceListener { 74 NodeRenderState nodeRenderState; 75 std::list<std::shared_ptr<NodeRenderStatusListener>> nodeRenderStatusListeners; NodeRenderStatusSourceListenerNodeRenderStatusSourceListener76 NodeRenderStatusSourceListener(NodeRenderState nodeRenderState, 77 std::list<std::shared_ptr<NodeRenderStatusListener>> nodeRenderStatusListeners) 78 : nodeRenderState(nodeRenderState), nodeRenderStatusListeners(std::move(nodeRenderStatusListeners)) {}; 79 }; 80 bool IsNodeRenderOut(FrameNode* frameNode); 81 std::unordered_map<FrameNode*, std::shared_ptr<NodeRenderStatusSourceListener>> nodeRenderStatusListeners_; 82 }; 83 } // namespace OHOS::Ace::NG 84 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_BASE_NODE_RENDER_STATUS_MONITOR_H