• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 struct TransitionUnitInfo {
39     const RefPtr<FrameNode>& transitionNode;
40     bool isUseCustomTransition = false;
41     int32_t animationId = -1;
42 
TransitionUnitInfoTransitionUnitInfo43     TransitionUnitInfo(const RefPtr<FrameNode>& node, bool isUseCustomTransition, int32_t animationId)
44         : transitionNode(node), isUseCustomTransition(isUseCustomTransition), animationId(animationId)
45     {}
46 };
47 
48 class ACE_FORCE_EXPORT NavigationGroupNode : public GroupNode {
49     DECLARE_ACE_TYPE(NavigationGroupNode, GroupNode);
50 public:
NavigationGroupNode(const std::string & tag,int32_t nodeId,const RefPtr<Pattern> & pattern)51     NavigationGroupNode(const std::string& tag, int32_t nodeId, const RefPtr<Pattern>& pattern)
52         : GroupNode(tag, nodeId, pattern)
53     {}
54 
55     ~NavigationGroupNode() override;
56 
57     using AnimationFinishCallback = std::function<void()>;
58 
59     void AddChildToGroup(const RefPtr<UINode>& child, int32_t slot = DEFAULT_NODE_SLOT) override;
60 
61     // remain child needs to keep to use pop animation
62     void UpdateNavDestinationNodeWithoutMarkDirty(const RefPtr<UINode>& remainChild, bool modeChange = false);
63     static RefPtr<NavigationGroupNode> GetOrCreateGroupNode(
64         const std::string& tag, int32_t nodeId, const std::function<RefPtr<Pattern>(void)>& patternCreator);
65 
IsAtomicNode()66     bool IsAtomicNode() const override
67     {
68         return false;
69     }
70 
SetPrimaryContentNode(const RefPtr<UINode> & content)71     void SetPrimaryContentNode(const RefPtr<UINode>& content)
72     {
73         primaryContentNode_ = content;
74     }
GetPrimaryContentNode()75     const RefPtr<UINode>& GetPrimaryContentNode() const
76     {
77         return primaryContentNode_;
78     }
SetForceSplitPlaceHolderNode(const RefPtr<UINode> & node)79     void SetForceSplitPlaceHolderNode(const RefPtr<UINode>& node)
80     {
81         forceSplitPlaceHolderNode_ = node;
82     }
GetForceSplitPlaceHolderNode()83     const RefPtr<UINode>& GetForceSplitPlaceHolderNode() const
84     {
85         return forceSplitPlaceHolderNode_;
86     }
87 
SetNavBarNode(const RefPtr<UINode> & navBarNode)88     void SetNavBarNode(const RefPtr<UINode>& navBarNode)
89     {
90         navBarNode_ = navBarNode;
91     }
92 
GetNavBarNode()93     const RefPtr<UINode>& GetNavBarNode() const
94     {
95         return navBarNode_;
96     }
GetHomeDestinationNode()97     const RefPtr<UINode>& GetHomeDestinationNode() const
98     {
99         return customHomeDestination_;
100     }
101     const RefPtr<UINode>& GetNavBarOrHomeDestinationNode() const;
102     bool IsNavBarOrHomeDestination(const RefPtr<UINode>& node) const;
103 
GetUseHomeDestination()104     const std::optional<bool> GetUseHomeDestination() const
105     {
106         return useHomeDestination_;
107     }
SetUseHomeDestinatoin(bool use)108     void SetUseHomeDestinatoin(bool use)
109     {
110         useHomeDestination_ = use;
111     }
112 
113     void CreateHomeDestinationIfNeeded();
114 
115     void SetSplitPlaceholder(const RefPtr<NG::UINode>& splitPlaceholder);
116 
SetPlaceholderContentNode(const RefPtr<NG::UINode> & placeholderContentNode)117     void SetPlaceholderContentNode(const RefPtr<NG::UINode>& placeholderContentNode)
118     {
119         placeholderContentNode_ = placeholderContentNode;
120     }
121 
GetPlaceholderContentNode()122     RefPtr<UINode> GetPlaceholderContentNode() const
123     {
124         return placeholderContentNode_;
125     }
126 
ResetSplitPlaceholder()127     void ResetSplitPlaceholder()
128     {
129         if (placeholderContentNode_) {
130             RemoveChild(placeholderContentNode_);
131         }
132         placeholderContentNode_ = nullptr;
133         splitPlaceholder_ = nullptr;
134     }
135 
SetContentNode(const RefPtr<UINode> & contentNode)136     void SetContentNode(const RefPtr<UINode>& contentNode)
137     {
138         contentNode_ = contentNode;
139     }
140 
GetContentNode()141     const RefPtr<UINode>& GetContentNode() const
142     {
143         return contentNode_;
144     }
145 
SetDividerNode(const RefPtr<UINode> & dividerNode)146     void SetDividerNode(const RefPtr<UINode>& dividerNode)
147     {
148         dividerNode_ = dividerNode;
149     }
150 
GetDividerNode()151     const RefPtr<UINode>& GetDividerNode() const
152     {
153         return dividerNode_;
154     }
155 
GetCurId()156     const std::string& GetCurId() const
157     {
158         return curId_;
159     }
160 
GetIsModeChange()161     bool GetIsModeChange() const
162     {
163         return isModeChange_;
164     }
165 
SetIsModeChange(bool isModeChange)166     void SetIsModeChange(bool isModeChange)
167     {
168         isModeChange_ = isModeChange;
169     }
170 
GetNeedSetInvisible()171     bool GetNeedSetInvisible() const
172     {
173         return needSetInvisible_;
174     }
175 
SetNeedSetInvisible(bool needSetInvisible)176     void SetNeedSetInvisible(bool needSetInvisible)
177     {
178         needSetInvisible_ = needSetInvisible;
179     }
180 
IsOnModeSwitchAnimation()181     bool IsOnModeSwitchAnimation()
182     {
183         return isOnModeSwitchAnimation_;
184     }
185 
SetDoingModeSwitchAnimationFlag(bool isOnAnimation)186     void SetDoingModeSwitchAnimationFlag(bool isOnAnimation)
187     {
188         isOnModeSwitchAnimation_ = isOnAnimation;
189     }
190 
GetPushAnimations()191     std::list<std::shared_ptr<AnimationUtils::Animation>>& GetPushAnimations()
192     {
193         return pushAnimations_;
194     }
195 
GetPopAnimations()196     std::list<std::shared_ptr<AnimationUtils::Animation>>& GetPopAnimations()
197     {
198         return popAnimations_;
199     }
200 
CleanPushAnimations()201     void CleanPushAnimations()
202     {
203         pushAnimations_.clear();
204     }
205 
CleanPopAnimations()206     void CleanPopAnimations()
207     {
208         popAnimations_.clear();
209     }
210 
211     bool CheckCanHandleBack(bool& isEntry);
212 
213     void CheckIsNeedForceExitWindow(bool result);
214 
215     void OnInspectorIdUpdate(const std::string& id) override;
216 
217     bool HandleBack(const RefPtr<FrameNode>& node, bool isLastChild, bool isOverride);
218 
219     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
220     static RefPtr<UINode> GetNavDestinationNode(RefPtr<UINode> uiNode);
221     void SetBackButtonEvent(const RefPtr<NavDestinationGroupNode>& navDestination);
222 
223     void ConfigureNavigationWithAnimation(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode);
224     void ResetTransitionAnimationNodeState(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode);
225     RefPtr<NavigationManager> FetchNavigationManager();
226     void TransitionWithPop(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
227         bool isNavBarOrHomeDestination = false);
228     void TransitionWithPush(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
229         bool isNavBarOrHomeDestination = false);
230     virtual void CreateAnimationWithPop(const TransitionUnitInfo& preInfo, const TransitionUnitInfo& curInfo,
231         const AnimationFinishCallback finishCallback, bool isNavBarOrHomeDestination = false);
232     virtual void CreateAnimationWithPush(const TransitionUnitInfo& preInfo, const TransitionUnitInfo& curInfo,
233         const AnimationFinishCallback finishCallback, bool isNavBarOrHomeDestination = false);
234     void CreateSoftAnimationWithPush(const TransitionUnitInfo& preInfo, const TransitionUnitInfo& curInfo,
235         const AnimationFinishCallback finishCallback, bool isNavBar = false);
236     void CreateSoftAnimationWithPop(const TransitionUnitInfo& preInfo, const TransitionUnitInfo& curInfo,
237         const AnimationFinishCallback finishCallback, bool isNavBar = false);
238     virtual void ResetSystemAnimationProperties(const RefPtr<FrameNode>& navDestinationNode);
239 
240     std::shared_ptr<AnimationUtils::Animation> BackButtonAnimation(
241         const RefPtr<FrameNode>& backButtonNode, bool isTransitionIn);
242     std::shared_ptr<AnimationUtils::Animation> MaskAnimation(const RefPtr<FrameNode>& curNode, bool isTransitionIn);
243     std::shared_ptr<AnimationUtils::Animation> TitleOpacityAnimation(
244         const RefPtr<FrameNode>& node, bool isTransitionOut);
245     void TransitionWithReplace(
246         const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode, bool isNavBarOrHomeDestination);
247     void DealNavigationExit(const RefPtr<FrameNode>& preNode, bool isNavBarOrHomeDestination, bool isAnimated = true);
248     void NotifyPageHide();
249     void UpdateLastStandardIndex();
250 
GetPreLastStandardIndex()251     int32_t GetPreLastStandardIndex() const
252     {
253         return preLastStandardIndex_;
254     }
255 
256     void PreNodeFinishCallback(const RefPtr<FrameNode>& preNode);
257     void CreateAnimationWithDialogPop(const AnimationFinishCallback callback,
258     const std::vector<WeakPtr<FrameNode>> prevNavList, const std::vector<WeakPtr<FrameNode>> curNavList);
259     void CreateAnimationWithDialogPush(const AnimationFinishCallback callback,
260     const std::vector<WeakPtr<FrameNode>> prevNavList, const std::vector<WeakPtr<FrameNode>> curNavList);
261     void TransitionWithDialogPush(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
262         bool isNavBar = false);
263     void TransitionWithDialogPop(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
264         bool isNavBar = false);
265     void StartDialogtransition(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
266         bool isTransitionIn);
267 
268     void InitPopPreList(const RefPtr<FrameNode>& preNode, std::vector<WeakPtr<FrameNode>>& preNavList,
269         const std::vector<WeakPtr<FrameNode>>& curNavList);
270     void InitPopCurList(const RefPtr<FrameNode>& curNode, std::vector<WeakPtr<FrameNode>>& curNavList,
271         bool isNavbarNeedAnimation);
272     void InitPushPreList(const RefPtr<FrameNode>& preNode, std::vector<WeakPtr<FrameNode>>& prevNavList,
273         const std::vector<WeakPtr<FrameNode>>& curNavList, bool isNavbarNeedAnimation);
274     void InitPushCurList(const RefPtr<FrameNode>& curNode, std::vector<WeakPtr<FrameNode>>& curNavList);
275 
276     std::vector<WeakPtr<NavDestinationGroupNode>> FindNodesPoped(const RefPtr<FrameNode>& preNode,
277         const RefPtr<FrameNode>& curNode);
278     void DialogTransitionPopAnimation(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
279         AnimationOption option);
280     void DialogTransitionPushAnimation(const RefPtr<FrameNode>& preNode, const RefPtr<FrameNode>& curNode,
281         AnimationOption option);
282 
GetLastStandardIndex()283     int32_t GetLastStandardIndex() const
284     {
285         return lastStandardIndex_;
286     }
287 
288     AnimationOption CreateAnimationOption(const RefPtr<Curve>& curve, FillMode mode,
289         int32_t duration, const NavigationGroupNode::AnimationFinishCallback& callback);
290 
291     NavigationMode GetNavigationMode();
292 
SetIsOnAnimation(bool isOnAnimation)293     void SetIsOnAnimation(bool isOnAnimation)
294     {
295         isOnAnimation_ = isOnAnimation;
296     }
297     RefPtr<FrameNode> GetTopDestination();
298     void OnDetachFromMainTree(bool recursive, PipelineContext* context = nullptr) override;
299     void OnAttachToMainTree(bool recursive) override;
300 
301     void FireHideNodeChange(NavDestinationLifecycle lifecycle);
302 
ReduceModeSwitchAnimationCnt()303     void ReduceModeSwitchAnimationCnt()
304     {
305         --modeSwitchAnimationCnt_;
306     }
307 
IncreaseModeSwitchAnimationCnt()308     void IncreaseModeSwitchAnimationCnt()
309     {
310         ++modeSwitchAnimationCnt_;
311     }
312 
GetModeSwitchAnimationCnt()313     int32_t GetModeSwitchAnimationCnt()
314     {
315         return modeSwitchAnimationCnt_;
316     }
317 
318     float CheckLanguageDirection();
319 
320     void RemoveDialogDestination(bool isReplace = false, bool isTriggerByInteractiveCancel = false);
321     void AddDestinationNode(const RefPtr<UINode>& parent);
GetParentDestinationNode()322     WeakPtr<NavDestinationGroupNode> GetParentDestinationNode() const
323     {
324         return parentDestinationNode_;
325     }
SetNavigationPathInfo(const std::string & moduleName,const std::string & pagePath)326     void SetNavigationPathInfo(const std::string& moduleName, const std::string& pagePath)
327     {
328         navigationPathInfo_ = pagePath;
329         navigationModuleName_ = moduleName;
330     }
331 
GetNavigationPathInfo()332     const std::string& GetNavigationPathInfo() const
333     {
334         return navigationPathInfo_;
335     }
336 
CleanHideNodes()337     void CleanHideNodes()
338     {
339         hideNodes_.clear();
340     }
341 
GetHideNodes()342     std::vector<std::pair<RefPtr<NavDestinationGroupNode>, bool>> GetHideNodes() const
343     {
344         return hideNodes_;
345     }
346 
SetRecoverable(bool recoverable)347     void SetRecoverable(bool recoverable)
348     {
349         recoverable_ = recoverable;
350     }
351 
CanRecovery()352     bool CanRecovery() const
353     {
354         return recoverable_ && !curId_.empty();
355     }
356 
SetDragBarNode(const RefPtr<UINode> & dragNode)357     void SetDragBarNode(const RefPtr<UINode>& dragNode)
358     {
359         dragBarNode_ = dragNode;
360     }
361 
GetDragBarNode()362     const RefPtr<UINode>& GetDragBarNode() const
363     {
364         return dragBarNode_;
365     }
366 
MakeUniqueAnimationId()367     int32_t MakeUniqueAnimationId()
368     {
369         return ++animationId_;
370     }
371 
GetAnimationId()372     int32_t GetAnimationId() const
373     {
374         return animationId_;
375     }
376 
377     bool CheckAnimationIdValid(const RefPtr<FrameNode>& curNode, const int32_t animationId);
378 
379     std::string ToDumpString();
380 
381 protected:
382     std::list<std::shared_ptr<AnimationUtils::Animation>> pushAnimations_;
383     std::list<std::shared_ptr<AnimationUtils::Animation>> popAnimations_;
384 private:
385     bool UpdateNavDestinationVisibility(const RefPtr<NavDestinationGroupNode>& navDestination,
386         const RefPtr<UINode>& remainChild, int32_t index, size_t destinationSize,
387         const RefPtr<UINode>& preLastStandardNode);
388     bool ReorderNavDestination(
389         const std::vector<std::pair<std::string, RefPtr<UINode>>>& navDestinationNodes,
390         RefPtr<FrameNode>& navigationContentNode, int32_t& slot, bool& hasChanged);
391     void RemoveRedundantNavDestination(RefPtr<FrameNode>& navigationContentNode,
392         const RefPtr<UINode>& remainChild, int32_t slot, bool& hasChanged,
393         const RefPtr<NavDestinationGroupNode>& preLastStandardNode);
394     void ReorderAnimatingDestination(RefPtr<FrameNode>& navigationContentNode, RefPtr<UINode>& maxAnimatingDestination,
395         RefPtr<UINode>& remainDestination, RefPtr<UINode>& curTopDestination);
396     bool FindNavigationParent(const std::string& parentName);
397     void DealRemoveDestination(const RefPtr<NavDestinationGroupNode>& destination);
398     RefPtr<FrameNode> TransitionAnimationIsValid(
399         const RefPtr<FrameNode>& node, bool isNavBarOrHomeDestination, bool isUseNavDestCustomTransition);
400     bool CheckNeedUpdateParentNode(const RefPtr<UINode>& node);
401     void RemoveJsChildImmediately(const RefPtr<FrameNode>& preNode, bool preUseCustomTransition,
402         int32_t preAnimationId);
CheckEnableCustomNodeDel()403     bool CheckEnableCustomNodeDel() const {
404         return false;
405     }
406 
407     void StartSoftOpacityAnimationPush(const RefPtr<FrameNode>& curNode);
408     void StartSoftOpacityAnimationPop(const RefPtr<FrameNode>& preNode);
409     void SoftTransitionAnimationPush(const RefPtr<FrameNode>& preNode,
410         const RefPtr<FrameNode>& curNode, bool isNavBar, bool preUseCustomTransition, bool curUseCustomTransition,
411         const NavigationGroupNode::AnimationFinishCallback& callback);
412     void SoftTransitionAnimationPop(const RefPtr<FrameNode>& preNode,
413         const RefPtr<FrameNode>& curNode, bool isNavBar, bool preUseCustomTransition, bool curUseCustomTransition,
414         const NavigationGroupNode::AnimationFinishCallback& callback);
415     bool HandleBackForHomeDestination();
416 
417     std::optional<bool> useHomeDestination_;
418     RefPtr<UINode> customHomeNode_;
419     RefPtr<UINode> customHomeDestination_;
420     RefPtr<UINode> navBarNode_;
421     RefPtr<UINode> contentNode_;
422     RefPtr<UINode> dividerNode_;
423     RefPtr<UINode> dragBarNode_;
424     RefPtr<UINode> splitPlaceholder_;
425     RefPtr<UINode> placeholderContentNode_;
426     WeakPtr<NavDestinationGroupNode> parentDestinationNode_;
427     // dialog hideNodes, if is true, nodes need remove
428     std::vector<std::pair<RefPtr<NavDestinationGroupNode>, bool>> hideNodes_;
429     std::vector<RefPtr<NavDestinationGroupNode>> showNodes_;
430     int32_t lastStandardIndex_ = -1;
431     std::atomic_int32_t animationId_ = 0;
432     std::atomic_int32_t modeSwitchAnimationCnt_ = 0;
433     bool isOnAnimation_ { false };
434     bool isModeChange_ { false };
435     bool needSetInvisible_ { false };
436     bool isOnModeSwitchAnimation_ { false };
437     bool recoverable_ { false };
438     std::string curId_;
439     std::string navigationPathInfo_;
440     std::string navigationModuleName_;
441     int32_t preLastStandardIndex_ = -1;
442 
443     //-------for force split------- begin------
444     std::vector<RefPtr<NavDestinationGroupNode>> primaryNodesToBeRemoved_;
445     RefPtr<UINode> primaryContentNode_;
446     RefPtr<UINode> forceSplitPlaceHolderNode_;
447     //-------for force split------- end  ------
448 };
449 } // namespace OHOS::Ace::NG
450 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVIGATION_GROUP_NODE_H
451