• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_PATTERNS_NAVROUTER_NAVDESTINATION_GROUP_NODE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVROUTER_NAVDESTINATION_GROUP_NODE_H
18 
19 #include <cstdint>
20 #include <list>
21 
22 #include "core/components_ng/base/frame_node.h"
23 #include "core/components_ng/base/group_node.h"
24 #include "core/components_ng/pattern/navigation/navdestination_node_base.h"
25 #include "core/components_ng/pattern/navigation/navigation_declaration.h"
26 #include "core/components_ng/property/property.h"
27 #include "core/pipeline/base/element_register.h"
28 
29 namespace OHOS::Ace::NG {
30 
31 class CustomNodeBase;
32 class NavigationTransitionProxy;
33 
34 using NavDestinationBackButtonEvent = std::function<bool(GestureEvent&)>;
35 
36 class ACE_EXPORT NavDestinationGroupNode : public NavDestinationNodeBase {
37     DECLARE_ACE_TYPE(NavDestinationGroupNode, NavDestinationNodeBase);
38 public:
NavDestinationGroupNode(const std::string & tag,int32_t nodeId,const RefPtr<Pattern> & pattern)39     NavDestinationGroupNode(const std::string& tag, int32_t nodeId, const RefPtr<Pattern>& pattern)
40         : NavDestinationNodeBase(tag, nodeId, pattern)
41     {
42         isNewToolbar_ = true;
43     }
44     ~NavDestinationGroupNode() override;
45     void AddChildToGroup(const RefPtr<UINode>& child, int32_t slot = DEFAULT_NODE_SLOT) override;
46     void DeleteChildFromGroup(int32_t slot = DEFAULT_NODE_SLOT) override;
47     static RefPtr<NavDestinationGroupNode> GetOrCreateGroupNode(
48         const std::string& tag, int32_t nodeId, const std::function<RefPtr<Pattern>(void)>& patternCreator);
49     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const override;
50 
SetNavDestinationBackButtonEvent(const NavDestinationBackButtonEvent & backButtonEvent)51     void SetNavDestinationBackButtonEvent(const NavDestinationBackButtonEvent& backButtonEvent)
52     {
53         backButtonEvent_ = backButtonEvent;
54     }
55 
GetNavDestinationBackButtonEvent()56     NavDestinationBackButtonEvent GetNavDestinationBackButtonEvent() const
57     {
58         return backButtonEvent_;
59     }
60 
61     void OnAttachToMainTree(bool recursive) override;
62 
63     void OnOffscreenProcess(bool recursive) override;
64 
65     void ProcessShallowBuilder();
66 
SetIsOnAnimation(bool isOnAnimation)67     void SetIsOnAnimation(bool isOnAnimation)
68     {
69         isOnAnimation_ = isOnAnimation;
70     }
71 
IsOnAnimation()72     bool IsOnAnimation() const
73     {
74         return isOnAnimation_;
75     }
76 
77     RefPtr<CustomNodeBase> GetNavDestinationCustomNode();
78 
SetNavDestinationCustomNode(WeakPtr<CustomNodeBase> customNode)79     void SetNavDestinationCustomNode(WeakPtr<CustomNodeBase> customNode)
80     {
81         customNode_ = customNode;
82     }
83 
84     void SetNavDestinationMode(NavDestinationMode mode);
85 
86     NavDestinationMode GetNavDestinationMode() const;
87 
88     void SetIndex(int32_t index, bool updatePrimary = true);
89 
GetIndex()90     int32_t GetIndex() const
91     {
92         return index_;
93     }
94 
SetIsCacheNode(bool cache)95     void SetIsCacheNode(bool cache)
96     {
97         isCacheNode_ = cache;
98     }
99 
IsCacheNode()100     bool IsCacheNode() const
101     {
102         return isCacheNode_;
103     }
104 
SetIsAnimated(const bool isAnimated)105     void SetIsAnimated(const bool isAnimated)
106     {
107         isAnimated_ = isAnimated;
108     }
109 
GetIsAnimated()110     bool GetIsAnimated() const
111     {
112         return isAnimated_;
113     }
114 
115     void SetCanReused(bool canReused);
116 
117     bool GetCanReused() const;
118 
SetInCurrentStack(bool inStack)119     void SetInCurrentStack(bool inStack)
120     {
121         inCurrentStack_ = inStack;
122     }
123 
GetInCurrentStack()124     bool GetInCurrentStack() const
125     {
126         return inCurrentStack_;
127     }
128 
SetNavDestinationPathInfo(const std::string & moduleName,const std::string & pagePath)129     void SetNavDestinationPathInfo(const std::string& moduleName, const std::string& pagePath)
130     {
131         navDestinationPathInfo_ = pagePath;
132         navDestinationModuleName_ = moduleName;
133     }
134 
GetNavDestinationPathInfo()135     const std::string& GetNavDestinationPathInfo() const
136     {
137         return navDestinationPathInfo_;
138     }
139 
GetNavDestinationModuleName()140     const std::string& GetNavDestinationModuleName() const
141     {
142         return navDestinationModuleName_;
143     }
144 
145     int32_t GetNavigationNodeId() const;
146 
SetNeedRemoveInPush(bool need)147     void SetNeedRemoveInPush(bool need)
148     {
149         needRemoveInPush_ = need;
150     }
151 
NeedRemoveInPush()152     bool NeedRemoveInPush() const
153     {
154         return needRemoveInPush_;
155     }
156 
SetSystemTransitionType(NavigationSystemTransitionType type)157     void SetSystemTransitionType(NavigationSystemTransitionType type)
158     {
159         systemTransitionType_ = type;
160         if (navDestinationTransitionDelegate_) {
161             TAG_LOGI(AceLogTag::ACE_NAVIGATION,
162                 "reset customTransition delegate of navDestination cause by setting systemTransition");
163             navDestinationTransitionDelegate_ = nullptr;
164         }
165     }
166 
GetSystemTransitionType()167     NavigationSystemTransitionType GetSystemTransitionType() const
168     {
169         return systemTransitionType_;
170     }
171 
172     std::shared_ptr<AnimationUtils::Animation> BackButtonAnimation(bool isTransitionIn);
173     std::shared_ptr<AnimationUtils::Animation> TitleOpacityAnimation(bool isTransitionOut);
174 
175     void SystemTransitionPushStart(bool transitionIn) override;
176     void SystemTransitionPushEnd(bool transitionIn) override;
177     void SystemTransitionPushFinish(bool transitionIn, int32_t animationId) override;
178 
179     void SystemTransitionPopStart(bool transitionIn) override;
180     void SystemTransitionPopEnd(bool transitionIn) override;
181     bool SystemTransitionPopFinish(int32_t animationId = -1, bool isNeedCleanContent = true) override;
182 
183     void InitSoftTransitionPush(bool transitionIn);
184     void StartSoftTransitionPush(bool transitionIn);
185     void InitSoftTransitionPop(bool isTransitionIn);
186     void StartSoftTransitionPop(bool transitionIn);
187     bool CheckTransitionPop(const int32_t animationId);
188     void InitDialogTransition(bool isZeroY);
189     bool IsNodeInvisible(const RefPtr<FrameNode>& node) override;
190 
SetRecoverable(bool recoverable)191     void SetRecoverable(bool recoverable)
192     {
193         recoverable_ = recoverable;
194     }
195 
SetFromNavrouterAndNoRouteInfo(bool fromNavrouterAndNoRouteInfo)196     void SetFromNavrouterAndNoRouteInfo(bool fromNavrouterAndNoRouteInfo)
197     {
198         fromNavrouterAndNoRouteInfo_ = fromNavrouterAndNoRouteInfo;
199     }
200 
CanRecovery()201     bool CanRecovery() const
202     {
203         return recoverable_ && !fromNavrouterAndNoRouteInfo_;
204     }
205 
SetNeedAppearFromRecovery(bool needAppear)206     void SetNeedAppearFromRecovery(bool needAppear)
207     {
208         needAppearFromRecovery_ = needAppear;
209     }
210 
NeedAppearFromRecovery()211     bool NeedAppearFromRecovery() const
212     {
213         return needAppearFromRecovery_;
214     }
215 
216     void UpdateTextNodeListAsRenderGroup(bool isPopPage, const RefPtr<NavigationTransitionProxy>& proxy);
217     void ReleaseTextNodeList();
218     void CollectTextNodeAsRenderGroup(bool isPopPage);
219 
220     void CleanContent(bool cleanDirectly = false, bool allowTransition = false);
221     bool IsNeedContentTransition();
222     bool TransitionContentInValid();
223     bool IsNeedTitleTransition();
224 
225     std::string ToDumpString();
226 
SetNeedForceMeasure(bool need)227     void SetNeedForceMeasure(bool need)
228     {
229         needForceMeasure_ = need;
230     }
NeedForceMeasure()231     bool NeedForceMeasure() const
232     {
233         return needForceMeasure_;
234     }
235 
SetNavDestinationTransitionDelegate(NavDestinationTransitionDelegate && delegate)236     void SetNavDestinationTransitionDelegate(NavDestinationTransitionDelegate&& delegate)
237     {
238         navDestinationTransitionDelegate_ = std::move(delegate);
239     }
240 
241     int32_t DoTransition(NavigationOperation operation, bool isEnter);
242     bool HasStandardBefore() const;
243 
UpdateUserSetOpacity(float opacity)244     void UpdateUserSetOpacity(float opacity)
245     {
246         userSetOpacity_ = opacity;
247     }
248 
249     RefPtr<UINode> GetNavigationNode() override;
250 
SetIsShowInPrimaryPartition(bool show)251     void SetIsShowInPrimaryPartition(bool show)
252     {
253         isShowInPrimaryPartition_ = show;
254     }
IsShowInPrimaryPartition()255     bool IsShowInPrimaryPartition() const
256     {
257         return isShowInPrimaryPartition_;
258     }
259     RefPtr<NavDestinationGroupNode> GetOrCreateProxyNode();
SetPrimaryNode(const WeakPtr<NavDestinationGroupNode> & node)260     void SetPrimaryNode(const WeakPtr<NavDestinationGroupNode>& node)
261     {
262         primaryNode_ = node;
263     }
GetPrimaryNode()264     RefPtr<NavDestinationGroupNode> GetPrimaryNode() const
265     {
266         return primaryNode_.Upgrade();
267     }
268 
SetTitleAnimationElapsedTime(int32_t elapsedTime)269     void SetTitleAnimationElapsedTime(int32_t elapsedTime)
270     {
271         titleAnimationElapsedTime_ = elapsedTime;
272     }
273 
GetTitleAnimationElapsedTime()274     int32_t GetTitleAnimationElapsedTime() const
275     {
276         return titleAnimationElapsedTime_;
277     }
278 
IsTitleConsumedElapsedTime()279     bool IsTitleConsumedElapsedTime() const
280     {
281         return isTitleConsumedElapsedTime_;
282     }
283 
MarkTitleConsumedElapsedTime()284     void MarkTitleConsumedElapsedTime()
285     {
286         isTitleConsumedElapsedTime_ = true;
287     }
288 
289 private:
290     int32_t DoCustomTransition(NavigationOperation operation, bool isEnter);
291     int32_t DoSystemTransition(NavigationOperation operation, bool isEnter);
292     int32_t DoSystemFadeTransition(bool isEnter);
293     int32_t DoSystemSlideTransition(NavigationOperation operation, bool isEnter);
294     int32_t DoSystemExplodeTransition(NavigationOperation operation, bool isEnter);
295     int32_t DoSystemEnterExplodeTransition(NavigationOperation operation);
296     int32_t DoSystemExitExplodeTransition(NavigationOperation operation);
297     void DoMaskAnimation(const AnimationOption& option, Color begin, Color end);
298     void StartCustomTransitionAnimation(NavDestinationTransition& transition,
299         bool isEnter, bool& hasResetProperties, int32_t longestAnimationDuration);
300     int32_t MakeUniqueAnimationId();
301     void ResetCustomTransitionAnimationProperties();
302 
303     std::optional<AnimationOption> GetTransitionAnimationOption(NavigationOperation operation, bool isEnter) const;
304     std::function<void()> BuildTransitionFinishCallback(
305         bool isSystemTransition = true, std::function<void()>&& extraOption = nullptr);
306     std::function<void()> BuildEmptyFinishCallback();
307 
308     WeakPtr<CustomNodeBase> customNode_; // nearest parent customNode
309     NavDestinationBackButtonEvent backButtonEvent_;
310     bool isOnAnimation_ = false;
311     int32_t index_ = -1;
312     NavDestinationMode mode_ = NavDestinationMode::STANDARD;
313     bool isCacheNode_ = false;
314     bool isAnimated_ = true;
315     bool canReused_ = true;
316     bool inCurrentStack_ = true;
317     bool recoverable_ = true;
318     bool fromNavrouterAndNoRouteInfo_ = false;
319     bool needAppearFromRecovery_ = false;
320     std::string navDestinationPathInfo_;
321     std::string navDestinationModuleName_;
322     bool needRemoveInPush_ = false;
323     std::list<WeakPtr<UINode>> textNodeList_;
324     NavigationSystemTransitionType systemTransitionType_ = NavigationSystemTransitionType::DEFAULT;
325     bool needForceMeasure_ = false;
326     float userSetOpacity_ = 1.0f;
327 
328     NavDestinationTransitionDelegate navDestinationTransitionDelegate_;
329     bool isTitleConsumedElapsedTime_ = false;
330     int32_t titleAnimationElapsedTime_ = 0;
331 
332     bool isShowInPrimaryPartition_ = false;
333     RefPtr<NavDestinationGroupNode> proxyNode_;
334     WeakPtr<NavDestinationGroupNode> primaryNode_;
335 };
336 
337 } // namespace OHOS::Ace::NG
338 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_NAVROUTER_NAVDESTINATION_GROUP_NODE_H
339