1  /*
2   * Copyright (c) 2022-2024 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_PATTERNS_NAVIGATION_GROUP_NODE_H
17  #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_GROUP_NODE_H
18  
19  #include <atomic>
20  #include <cstdint>
21  #include <list>
22  
23  #include "base/memory/referenced.h"
24  #include "core/animation/page_transition_common.h"
25  #include "core/components_ng/base/frame_node.h"
26  #include "core/components_ng/base/group_node.h"
27  #include "core/components_ng/pattern/navigation/bar_item_node.h"
28  #include "core/components_ng/pattern/navigation/navigation_declaration.h"
29  #include "core/components_ng/pattern/navigation/navigation_stack.h"
30  #include "core/components_ng/pattern/navigation/title_bar_node.h"
31  #include "core/components_ng/pattern/navrouter/navdestination_group_node.h"
32  #include "core/components_ng/pattern/navrouter/navrouter_pattern.h"
33  #include "core/components_ng/property/property.h"
34  
35  namespace OHOS::Ace::NG {
36  class InspectorFilter;
37  
38  class ACE_EXPORT NavigationGroupNode : public GroupNode {
DECLARE_ACE_TYPE(NavigationGroupNode,GroupNode)39      DECLARE_ACE_TYPE(NavigationGroupNode, GroupNode)
40  public:
41      NavigationGroupNode(const std::string& tag, int32_t nodeId, const RefPtr<Pattern>& pattern)
42          : GroupNode(tag, nodeId, pattern)
43      {}
44  
45      ~NavigationGroupNode() override;
46  
47      using AnimationFinishCallback = std::function<void()>;
48  
49      void AddChildToGroup(const RefPtr<UINode>& child, int32_t slot = DEFAULT_NODE_SLOT) override;
50  
51      // remain child needs to keep to use pop animation
52      void UpdateNavDestinationNodeWithoutMarkDirty(const RefPtr<UINode>& remainChild, bool modeChange = false);
53      static RefPtr<NavigationGroupNode> GetOrCreateGroupNode(
54          const std::string& tag, int32_t nodeId, const std::function<RefPtr<Pattern>(void)>& patternCreator);
55  
IsAtomicNode()56      bool IsAtomicNode() const override
57      {
58          return false;
59      }
60  
SetNavBarNode(const RefPtr<UINode> & navBarNode)61      void SetNavBarNode(const RefPtr<UINode>& navBarNode)
62      {
63          navBarNode_ = navBarNode;
64      }
65  
GetNavBarNode()66      const RefPtr<UINode>& GetNavBarNode() const
67      {
68          return navBarNode_;
69      }
70  
SetContentNode(const RefPtr<UINode> & contentNode)71      void SetContentNode(const RefPtr<UINode>& contentNode)
72      {
73          contentNode_ = contentNode;
74      }
75  
GetContentNode()76      const RefPtr<UINode>& GetContentNode() const
77      {
78          return contentNode_;
79      }
80  
SetDividerNode(const RefPtr<UINode> & dividerNode)81      void SetDividerNode(const RefPtr<UINode>& dividerNode)
82      {
83          dividerNode_ = dividerNode;
84      }
85  
GetDividerNode()86      const RefPtr<UINode>& GetDividerNode() const
87      {
88          return dividerNode_;
89      }
90  
GetCurId()91      const std::string& GetCurId() const
92      {
93          return curId_;
94      }
95  
GetIsModeChange()96      bool GetIsModeChange() const
97      {
98          return isModeChange_;
99      }
100  
SetIsModeChange(bool isModeChange)101      void SetIsModeChange(bool isModeChange)
102      {
103          isModeChange_ = isModeChange;
104      }
105  
GetNeedSetInvisible()106      bool GetNeedSetInvisible() const
107      {
108          return needSetInvisible_;
109      }
110  
SetNeedSetInvisible(bool needSetInvisible)111      void SetNeedSetInvisible(bool needSetInvisible)
112      {
113          needSetInvisible_ = needSetInvisible;
114      }
115  
IsOnModeSwitchAnimation()116      bool IsOnModeSwitchAnimation()
117      {
118          return isOnModeSwitchAnimation_;
119      }
120  
SetDoingModeSwitchAnimationFlag(bool isOnAnimation)121      void SetDoingModeSwitchAnimationFlag(bool isOnAnimation)
122      {
123          isOnModeSwitchAnimation_ = isOnAnimation;
124      }
125  
GetPushAnimations()126      std::list<std::shared_ptr<AnimationUtils::Animation>>& GetPushAnimations()
127      {
128          return pushAnimations_;
129      }
130  
GetPopAnimations()131      std::list<std::shared_ptr<AnimationUtils::Animation>>& GetPopAnimations()
132      {
133          return popAnimations_;
134      }
135  
CleanPushAnimations()136      void CleanPushAnimations()
137      {
138          pushAnimations_.clear();
139      }
140  
CleanPopAnimations()141      void CleanPopAnimations()
142      {
143          popAnimations_.clear();
144      }
145  
146      bool CheckCanHandleBack(bool& isEntry);
147  
148      void OnInspectorIdUpdate(const std::string& id) override;
149  
150      bool HandleBack(const RefPtr<FrameNode>& node, bool isLastChild, bool isOverride);
151  
152      void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
153      static RefPtr<UINode> GetNavDestinationNode(RefPtr<UINode> uiNode);
154      void SetBackButtonEvent(const RefPtr<NavDestinationGroupNode>& navDestination);
155  
156      void TransitionWithPop(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode, bool isNavBar = false);
157      void TransitionWithPush(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode, bool isNavBar = false);
158      virtual void CreateAnimationWithPop(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
159          const AnimationFinishCallback finishCallback, bool isNavBar = false);
160      virtual void CreateAnimationWithPush(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
161          const AnimationFinishCallback finishCallback, bool isNavBar = false);
162  
163      std::shared_ptr<AnimationUtils::Animation> BackButtonAnimation(
164          const RefPtr<FrameNode>& backButtonNode, bool isTransitionIn);
165      std::shared_ptr<AnimationUtils::Animation> MaskAnimation(const RefPtr<FrameNode>& curNode, bool isTransitionIn);
166      std::shared_ptr<AnimationUtils::Animation> TitleOpacityAnimation(
167          const RefPtr<FrameNode>& node, bool isTransitionOut);
168      void TransitionWithReplace(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode, bool isNavBar);
169      void DealNavigationExit(const RefPtr<FrameNode>& preNode, bool isNavBar, bool isAnimated = true);
170      void NotifyPageHide();
171      void UpdateLastStandardIndex();
172  
GetPreLastStandardIndex()173      int32_t GetPreLastStandardIndex() const
174      {
175          return preLastStandardIndex_;
176      }
177  
178      void PreNodeFinishCallback(const RefPtr<FrameNode>& preNode);
179      void CreateAnimationWithDialogPop(const AnimationFinishCallback callback,
180      const std::vector<WeakPtr<FrameNode>> prevNavList, const std::vector<WeakPtr<FrameNode>> curNavList);
181      void CreateAnimationWithDialogPush(const AnimationFinishCallback callback,
182      const std::vector<WeakPtr<FrameNode>> prevNavList, const std::vector<WeakPtr<FrameNode>> curNavList);
183      void TransitionWithDialogPush(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
184          bool isNavBar = false);
185      void TransitionWithDialogPop(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
186          bool isNavBar = false);
187      void StartDialogtransition(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
188          bool isTransitionIn);
189  
190      void InitPopPreList(const RefPtr<FrameNode>& preNode, std::vector<WeakPtr<FrameNode>>& preNavList);
191      void InitPopCurList(const RefPtr<FrameNode>& curNode, std::vector<WeakPtr<FrameNode>>& curNavList,
192          bool isNavbarNeedAnimation);
193      void InitPushPreList(const RefPtr<FrameNode>& preNode, std::vector<WeakPtr<FrameNode>>& prevNavList,
194          bool isNavbarNeedAnimation);
195      void InitPushCurList(const RefPtr<FrameNode>& curNode, std::vector<WeakPtr<FrameNode>>& curNavList);
196  
197      std::vector<WeakPtr<NavDestinationGroupNode>> FindNodesPoped(const RefPtr<FrameNode>& preNode,
198          const RefPtr<FrameNode>& curNode);
199      void DialogTransitionPopAnimation(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
200          AnimationOption option);
201      void DialogTransitionPushAnimation(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
202          AnimationOption option);
203      void InitDialogTransition(const RefPtr<NavDestinationGroupNode>& node, bool isZeroY);
204  
GetLastStandardIndex()205      int32_t GetLastStandardIndex() const
206      {
207          return lastStandardIndex_;
208      }
209      AnimationOption CreateAnimationOption(const RefPtr<Curve>& curve, FillMode mode,
210          int32_t duration, const AnimationFinishCallback& callback);
211      NavigationMode GetNavigationMode();
212  
SetIsOnAnimation(bool isOnAnimation)213      void SetIsOnAnimation(bool isOnAnimation)
214      {
215          isOnAnimation_ = isOnAnimation;
216      }
217      RefPtr<FrameNode> GetTopDestination();
218      void OnDetachFromMainTree(bool recursive, PipelineContext* context = nullptr) override;
219      void OnAttachToMainTree(bool recursive) override;
220  
221      void FireHideNodeChange(NavDestinationLifecycle lifecycle);
222  
ReduceModeSwitchAnimationCnt()223      void ReduceModeSwitchAnimationCnt()
224      {
225          --modeSwitchAnimationCnt_;
226      }
227  
IncreaseModeSwitchAnimationCnt()228      void IncreaseModeSwitchAnimationCnt()
229      {
230          ++modeSwitchAnimationCnt_;
231      }
232  
GetModeSwitchAnimationCnt()233      int32_t GetModeSwitchAnimationCnt()
234      {
235          return modeSwitchAnimationCnt_;
236      }
237  
238      float CheckLanguageDirection();
239  
240      void RemoveDialogDestination(bool isReplace = false);
241      void AddDestinationNode(const RefPtr<UINode>& parent);
GetParentDestinationNode()242      WeakPtr<NavDestinationGroupNode> GetParentDestinationNode() const
243      {
244          return parentDestinationNode_;
245      }
SetNavigationPathInfo(const std::string & moduleName,const std::string & pagePath)246      void SetNavigationPathInfo(const std::string& moduleName, const std::string& pagePath)
247      {
248          navigationPathInfo_ = pagePath;
249          navigationModuleName_ = moduleName;
250      }
251  
GetNavigationPathInfo()252      const std::string& GetNavigationPathInfo() const
253      {
254          return navigationPathInfo_;
255      }
256  
SetDragBarNode(const RefPtr<UINode> & dragNode)257      void SetDragBarNode(const RefPtr<UINode>& dragNode)
258      {
259          dragBarNode_ = dragNode;
260      }
261  
GetDragBarNode()262      const RefPtr<UINode>& GetDragBarNode() const
263      {
264          return dragBarNode_;
265      }
266  
CleanHideNodes()267      void CleanHideNodes()
268      {
269          hideNodes_.clear();
270      }
271  
GetHideNodes()272      std::vector<std::pair<RefPtr<NavDestinationGroupNode>, bool>> GetHideNodes() const
273      {
274          return hideNodes_;
275      }
276  
SetRecoverable(bool recoverable)277      void SetRecoverable(bool recoverable)
278      {
279          recoverable_ = recoverable;
280      }
281  
CanRecovery()282      bool CanRecovery() const
283      {
284          return recoverable_ && !curId_.empty();
285      }
286  
287  protected:
288      std::list<std::shared_ptr<AnimationUtils::Animation>> pushAnimations_;
289      std::list<std::shared_ptr<AnimationUtils::Animation>> popAnimations_;
290  private:
291      bool UpdateNavDestinationVisibility(const RefPtr<NavDestinationGroupNode>& navDestination,
292          const RefPtr<UINode>& remainChild, int32_t index, size_t destinationSize,
293          const RefPtr<UINode>& preLastStandardNode);
294      bool ReorderNavDestination(
295          const std::vector<std::pair<std::string, RefPtr<UINode>>>& navDestinationNodes,
296          RefPtr<FrameNode>& navigationContentNode, int32_t& slot, bool& hasChanged);
297      void RemoveRedundantNavDestination(RefPtr<FrameNode>& navigationContentNode,
298          const RefPtr<UINode>& remainChild, int32_t slot, bool& hasChanged,
299          const RefPtr<NavDestinationGroupNode>& preLastStandardNode);
300      void ReorderAnimatingDestination(RefPtr<FrameNode>& navigationContentNode, RefPtr<UINode>& maxAnimatingDestination,
301          RefPtr<UINode>& remainDestination, RefPtr<UINode>& curTopDestination);
302      bool FindNavigationParent(const std::string& parentName);
303      void DealRemoveDestination(const RefPtr<NavDestinationGroupNode>& destination);
304      RefPtr<FrameNode> TransitionAnimationIsValid(const RefPtr<FrameNode>& node, bool isNavBar);
305  
306      RefPtr<UINode> navBarNode_;
307      RefPtr<UINode> contentNode_;
308      RefPtr<UINode> dividerNode_;
309      RefPtr<UINode> dragBarNode_;
310      WeakPtr<NavDestinationGroupNode> parentDestinationNode_;
311      // dialog hideNodes, if is true, nodes need remove
312      std::vector<std::pair<RefPtr<NavDestinationGroupNode>, bool>> hideNodes_;
313      std::vector<RefPtr<NavDestinationGroupNode>> showNodes_;
314      int32_t lastStandardIndex_ = -1;
315      std::atomic_int32_t modeSwitchAnimationCnt_ = 0;
316      bool isOnAnimation_ { false };
317      bool isModeChange_ { false };
318      bool needSetInvisible_ { false };
319      bool isOnModeSwitchAnimation_ { false };
320      bool recoverable_ { false };
321      std::string curId_;
322      std::string navigationPathInfo_;
323      std::string navigationModuleName_;
324      int32_t preLastStandardIndex_ = -1;
325  };
326  } // namespace OHOS::Ace::NG
327  #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_GROUP_NODE_H
328