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