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