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_STAGE_PAGE_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_STAGE_PAGE_PATTERN_H 18 19 #include <functional> 20 21 #include "base/memory/referenced.h" 22 #include "base/utils/noncopyable.h" 23 #include "core/animation/animator_info.h" 24 #include "core/animation/page_transition_common.h" 25 #include "core/components_ng/pattern/stage/content_root_pattern.h" 26 #include "core/components_ng/pattern/stage/page_event_hub.h" 27 #include "core/components_ng/pattern/stage/page_info.h" 28 #include "core/components_ng/pattern/stage/page_transition_effect.h" 29 #include "core/pipeline_ng/pipeline_context.h" 30 31 namespace OHOS::Ace::NG { 32 33 using SharedTransitionMap = std::unordered_map<ShareId, WeakPtr<FrameNode>>; 34 using JSAnimatorMap = std::unordered_map<std::string, RefPtr<Framework::AnimatorInfo>>; 35 36 using DynamicPageSizeCallback = std::function<void(SizeF size)>; 37 38 enum class RouterPageState { 39 ABOUT_TO_APPEAR = 0, 40 ABOUT_TO_DISAPPEAR = 1, 41 ON_PAGE_SHOW = 2, 42 ON_PAGE_HIDE = 3, 43 ON_BACK_PRESS = 4, 44 }; 45 46 // PagePattern is the base class for page root render node. 47 class ACE_EXPORT PagePattern : public ContentRootPattern { 48 DECLARE_ACE_TYPE(PagePattern, ContentRootPattern); 49 50 public: PagePattern(const RefPtr<PageInfo> & pageInfo)51 explicit PagePattern(const RefPtr<PageInfo>& pageInfo) : pageInfo_(pageInfo) {} 52 ~PagePattern() override = default; 53 IsMeasureBoundary()54 bool IsMeasureBoundary() const override 55 { 56 return true; 57 } 58 IsAtomicNode()59 bool IsAtomicNode() const override 60 { 61 return false; 62 } 63 GetPageInfo()64 const RefPtr<PageInfo>& GetPageInfo() const 65 { 66 return pageInfo_; 67 } 68 GetPageUrl()69 std::string GetPageUrl() const 70 { 71 return pageInfo_ ? pageInfo_->GetPageUrl() : ""; 72 } 73 74 void OnShow(); 75 76 void OnHide(); 77 78 bool OnBackPressed(); 79 GetPageState()80 RouterPageState GetPageState() const 81 { 82 return state_; 83 } 84 SetOnPageShow(std::function<void ()> && onPageShow)85 void SetOnPageShow(std::function<void()>&& onPageShow) 86 { 87 onPageShow_ = std::move(onPageShow); 88 } 89 SetOnPageHide(std::function<void ()> && onPageHide)90 void SetOnPageHide(std::function<void()>&& onPageHide) 91 { 92 onPageHide_ = std::move(onPageHide); 93 } 94 SetOnBackPressed(std::function<bool ()> && OnBackPressed)95 void SetOnBackPressed(std::function<bool()>&& OnBackPressed) 96 { 97 onBackPressed_ = std::move(OnBackPressed); 98 } 99 SetPageTransitionFunc(std::function<void ()> && pageTransitionFunc)100 void SetPageTransitionFunc(std::function<void()>&& pageTransitionFunc) 101 { 102 pageTransitionFunc_ = std::move(pageTransitionFunc); 103 } 104 105 // find pageTransition effect according to transition type 106 RefPtr<PageTransitionEffect> FindPageTransitionEffect(PageTransitionType type); 107 108 void ClearPageTransitionEffect(); 109 110 RefPtr<PageTransitionEffect> GetTopTransition() const; 111 112 void AddPageTransition(const RefPtr<PageTransitionEffect>& effect); 113 CreateEventHub()114 RefPtr<EventHub> CreateEventHub() override 115 { 116 return MakeRefPtr<PageEventHub>(); 117 } 118 119 bool TriggerPageTransition(PageTransitionType type, const std::function<void()>& onFinish); 120 GetFocusPattern()121 FocusPattern GetFocusPattern() const override 122 { 123 return { FocusType::SCOPE, true }; 124 } 125 GetSharedTransitionMap()126 const SharedTransitionMap& GetSharedTransitionMap() const 127 { 128 return sharedTransitionMap_; 129 } 130 131 void AddJsAnimator(const std::string& animatorId, const RefPtr<Framework::AnimatorInfo>& animatorInfo); 132 RefPtr<Framework::AnimatorInfo> GetJsAnimator(const std::string& animatorId); 133 134 void BuildSharedTransitionMap(); 135 136 void ReloadPage(); 137 138 void SetFirstBuildCallback(std::function<void()>&& buildCallback); 139 SetPageInTransition(bool pageTransition)140 void SetPageInTransition(bool pageTransition) 141 { 142 isPageInTransition_ = pageTransition; 143 } 144 145 // Mark current page node invisible in render tree. 146 void ProcessHideState(); 147 // Mark current page node visible in render tree. 148 void ProcessShowState(); 149 150 void ProcessAutoSave(); 151 152 void StopPageTransition(); 153 MarkRenderDone()154 void MarkRenderDone() 155 { 156 isRenderDone_ = true; 157 } 158 SetAutoFillPasswordTriggered(bool value)159 void SetAutoFillPasswordTriggered(bool value) 160 { 161 autoFillPasswordTriggered_ = value; 162 } 163 IsAutoFillPasswordTriggered()164 bool IsAutoFillPasswordTriggered() const 165 { 166 return autoFillPasswordTriggered_; 167 } 168 SetAutoFillNewPasswordTriggered(bool value)169 void SetAutoFillNewPasswordTriggered(bool value) 170 { 171 autoFillNewPasswordTriggered_ = value; 172 } 173 IsAutoFillNewPasswordTriggered()174 bool IsAutoFillNewPasswordTriggered() const 175 { 176 return autoFillNewPasswordTriggered_; 177 } 178 SetDynamicPageSizeCallback(DynamicPageSizeCallback && dynamicPageSizeCallback)179 void SetDynamicPageSizeCallback(DynamicPageSizeCallback&& dynamicPageSizeCallback) 180 { 181 dynamicPageSizeCallback_ = std::move(dynamicPageSizeCallback); 182 } 183 184 private: 185 void OnAttachToFrameNode() override; 186 void BeforeCreateLayoutWrapper() override; 187 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& wrapper, const DirtySwapConfig& config) override; 188 void FirePageTransitionFinish(); 189 190 void OnAttachToMainTree() override; 191 void OnDetachFromMainTree() override; 192 193 bool AvoidKeyboard() const override; AvoidTop()194 bool AvoidTop() const override 195 { 196 return true; 197 } AvoidBottom()198 bool AvoidBottom() const override 199 { 200 return true; 201 } 202 203 RefPtr<PageInfo> pageInfo_; 204 205 std::function<void()> onPageShow_; 206 std::function<void()> onPageHide_; 207 std::function<bool()> onBackPressed_; 208 std::function<void()> pageTransitionFunc_; 209 std::function<void()> firstBuildCallback_; 210 DynamicPageSizeCallback dynamicPageSizeCallback_; 211 std::shared_ptr<std::function<void()>> pageTransitionFinish_; 212 std::list<RefPtr<PageTransitionEffect>> pageTransitionEffects_; 213 214 bool isOnShow_ = false; 215 bool isFirstLoad_ = true; 216 bool isPageInTransition_ = false; 217 bool isRenderDone_ = false; 218 bool autoFillPasswordTriggered_ = false; 219 bool autoFillNewPasswordTriggered_ = false; 220 221 SharedTransitionMap sharedTransitionMap_; 222 JSAnimatorMap jsAnimatorMap_; 223 RouterPageState state_ = RouterPageState::ABOUT_TO_APPEAR; 224 225 ACE_DISALLOW_COPY_AND_MOVE(PagePattern); 226 }; 227 } // namespace OHOS::Ace::NG 228 229 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_STAGE_PAGE_PATTERN_H 230