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/common/autofill/auto_fill_trigger_state_holder.h" 26 #include "core/components_ng/pattern/stage/content_root_pattern.h" 27 #include "core/components_ng/pattern/stage/page_event_hub.h" 28 #include "core/components_ng/pattern/stage/page_info.h" 29 #include "core/components_ng/pattern/stage/page_transition_effect.h" 30 #include "core/pipeline_ng/pipeline_context.h" 31 32 namespace OHOS::Ace::NG { 33 34 using SharedTransitionMap = std::unordered_map<ShareId, WeakPtr<FrameNode>>; 35 using JSAnimatorMap = std::unordered_map<std::string, RefPtr<Framework::AnimatorInfo>>; 36 37 using DynamicPageSizeCallback = std::function<void(const SizeF& size)>; 38 /** 39 * When the page triggers 'onHide' or 'onShow', the callback is called, 40 * and the input parameter is 'true' for onHide and false for onShow. 41 */ 42 using PageVisibilityChangeCallback = std::function<void(bool)>; 43 44 45 enum class RouterPageState { 46 ABOUT_TO_APPEAR = 0, 47 ABOUT_TO_DISAPPEAR = 1, 48 ON_PAGE_SHOW = 2, 49 ON_PAGE_HIDE = 3, 50 ON_BACK_PRESS = 4, 51 }; 52 53 // PagePattern is the base class for page root render node. 54 class ACE_FORCE_EXPORT PagePattern : public ContentRootPattern, public FocusView, public AutoFillTriggerStateHolder { 55 DECLARE_ACE_TYPE(PagePattern, ContentRootPattern, FocusView, AutoFillTriggerStateHolder); 56 57 public: PagePattern(const RefPtr<PageInfo> & pageInfo)58 explicit PagePattern(const RefPtr<PageInfo>& pageInfo) : pageInfo_(pageInfo) {} 59 ~PagePattern() override = default; 60 IsMeasureBoundary()61 bool IsMeasureBoundary() const override 62 { 63 return true; 64 } 65 IsAtomicNode()66 bool IsAtomicNode() const override 67 { 68 return false; 69 } 70 GetPageInfo()71 const RefPtr<PageInfo>& GetPageInfo() const 72 { 73 return pageInfo_; 74 } 75 GetPageUrl()76 std::string GetPageUrl() const 77 { 78 return pageInfo_ ? pageInfo_->GetPageUrl() : ""; 79 } 80 81 virtual void OnShow(); 82 83 virtual void OnHide(); 84 85 bool OnBackPressed(); 86 GetPageState()87 RouterPageState GetPageState() const 88 { 89 return state_; 90 } 91 SetOnPageShow(std::function<void ()> && onPageShow)92 void SetOnPageShow(std::function<void()>&& onPageShow) 93 { 94 onPageShow_ = std::move(onPageShow); 95 } 96 SetOnPageHide(std::function<void ()> && onPageHide)97 void SetOnPageHide(std::function<void()>&& onPageHide) 98 { 99 onPageHide_ = std::move(onPageHide); 100 } 101 SetOnBackPressed(std::function<bool ()> && onBackPressed)102 void SetOnBackPressed(std::function<bool()>&& onBackPressed) 103 { 104 onBackPressed_ = std::move(onBackPressed); 105 } 106 SetPageTransitionFunc(std::function<void ()> && pageTransitionFunc)107 void SetPageTransitionFunc(std::function<void()>&& pageTransitionFunc) 108 { 109 pageTransitionFunc_ = std::move(pageTransitionFunc); 110 } 111 RegisterDumpInfoListener(const std::function<void (const std::vector<std::string> &)> && callback)112 void RegisterDumpInfoListener(const std::function<void(const std::vector<std::string>&)>&& callback) 113 { 114 dumpListener_ = std::move(callback); 115 } 116 FireDumpListener(const std::vector<std::string> & params)117 void FireDumpListener(const std::vector<std::string>& params) 118 { 119 CHECK_NULL_VOID(dumpListener_); 120 auto dumpListener = dumpListener_; 121 dumpListener(params); 122 } 123 124 // find pageTransition effect according to transition type 125 RefPtr<PageTransitionEffect> FindPageTransitionEffect(PageTransitionType type); 126 127 void ClearPageTransitionEffect(); 128 129 RefPtr<PageTransitionEffect> GetTopTransition() const; 130 131 void AddPageTransition(const RefPtr<PageTransitionEffect>& effect); 132 CreateEventHub()133 RefPtr<EventHub> CreateEventHub() override 134 { 135 return MakeRefPtr<PageEventHub>(); 136 } 137 138 bool TriggerPageTransition(PageTransitionType type, const std::function<void()>& onFinish); 139 GetFocusPattern()140 FocusPattern GetFocusPattern() const override 141 { 142 return { FocusType::SCOPE, true }; 143 } 144 GetRouteOfFirstScope()145 std::list<int32_t> GetRouteOfFirstScope() override 146 { 147 return { 0 }; 148 } 149 GetSharedTransitionMap()150 const SharedTransitionMap& GetSharedTransitionMap() const 151 { 152 return sharedTransitionMap_; 153 } 154 155 void AddJsAnimator(const std::string& animatorId, const RefPtr<Framework::AnimatorInfo>& animatorInfo); 156 RefPtr<Framework::AnimatorInfo> GetJsAnimator(const std::string& animatorId); 157 158 void BuildSharedTransitionMap(); 159 160 void ReloadPage(); 161 162 void SetFirstBuildCallback(std::function<void()>&& buildCallback); 163 SetPageInTransition(bool pageTransition)164 void SetPageInTransition(bool pageTransition) 165 { 166 isPageInTransition_ = pageTransition; 167 } 168 GetPageInTransition()169 bool GetPageInTransition() const 170 { 171 return isPageInTransition_; 172 } 173 174 // Mark current page node invisible in render tree. 175 void ProcessHideState(); 176 // Mark current page node visible in render tree. 177 void ProcessShowState(); 178 179 bool ProcessAutoSave(const std::function<void()>& onFinish = nullptr, 180 const std::function<void()>& onUIExtNodeBindingCompleted = nullptr); 181 182 void StopPageTransition(); 183 MarkRenderDone()184 void MarkRenderDone() 185 { 186 isRenderDone_ = true; 187 } 188 SetDynamicPageSizeCallback(DynamicPageSizeCallback && dynamicPageSizeCallback)189 void SetDynamicPageSizeCallback(DynamicPageSizeCallback&& dynamicPageSizeCallback) 190 { 191 dynamicPageSizeCallback_ = std::move(dynamicPageSizeCallback); 192 } 193 AddOnHiddenChange(int32_t id,PageVisibilityChangeCallback && onHiddenChange)194 void AddOnHiddenChange(int32_t id, PageVisibilityChangeCallback&& onHiddenChange) 195 { 196 onHiddenChange_[id] = std::move(onHiddenChange); 197 } 198 FireOnHiddenChange(bool flag)199 void FireOnHiddenChange(bool flag) 200 { 201 for (auto& onHiddenChangeInfo : onHiddenChange_) { 202 if (onHiddenChangeInfo.second) { 203 auto onHiddenChange = onHiddenChangeInfo.second; 204 onHiddenChange(flag); 205 } 206 } 207 } 208 UpdatePageParam()209 void UpdatePageParam() 210 { 211 auto host = GetHost(); 212 CHECK_NULL_VOID(host); 213 host->SetAccessibilityVisible(true); 214 host->SetJSViewActive(true); 215 } 216 RemoveOnHiddenChange(int32_t id)217 void RemoveOnHiddenChange(int32_t id) 218 { 219 auto iter = onHiddenChange_.find(id); 220 if (iter != onHiddenChange_.end()) { 221 onHiddenChange_.erase(iter); 222 } 223 } 224 CreateOverlayManager(bool isShow)225 void CreateOverlayManager(bool isShow) 226 { 227 if (!overlayManager_ && isShow) { 228 overlayManager_ = MakeRefPtr<OverlayManager>(GetHost()); 229 } 230 } 231 GetOverlayManager()232 const RefPtr<OverlayManager>& GetOverlayManager() 233 { 234 return overlayManager_; 235 } 236 DeleteOverlayManager()237 void DeleteOverlayManager() 238 { 239 overlayManager_.Reset(); 240 } 241 242 bool RemoveOverlay(); 243 void MarkDirtyOverlay(); 244 IsOnShow()245 bool IsOnShow() 246 { 247 return isOnShow_; 248 } 249 GetIsModalCovered()250 bool GetIsModalCovered() const 251 { 252 return isModalCovered_; 253 } 254 SetIsModalCovered(bool isModalCovered)255 void SetIsModalCovered(bool isModalCovered) 256 { 257 isModalCovered_ = isModalCovered; 258 } 259 SetPageVisibilityChangeCallback(PageVisibilityChangeCallback && callback)260 void SetPageVisibilityChangeCallback(PageVisibilityChangeCallback&& callback) 261 { 262 visibilityChangeCallback_ = std::move(callback); 263 } 264 265 protected: 266 void OnAttachToFrameNode() override; 267 void BeforeCreateLayoutWrapper() override; 268 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& wrapper, const DirtySwapConfig& config) override; 269 void BeforeSyncGeometryProperties(const DirtySwapConfig& config) override; 270 void FirePageTransitionFinish(); 271 272 void OnAttachToMainTree() override; 273 void OnDetachFromMainTree() override; 274 275 bool AvoidKeyboard() const override; AvoidTop()276 bool AvoidTop() const override 277 { 278 return true; 279 } AvoidBottom()280 bool AvoidBottom() const override 281 { 282 return true; 283 } 284 AvoidCutout()285 bool AvoidCutout() const override 286 { 287 return true; 288 } 289 290 void NotifyPerfMonitorPageMsg(const std::string& pageUrl, const std::string& bundleName); 291 292 RefPtr<PageInfo> pageInfo_; 293 RefPtr<OverlayManager> overlayManager_; 294 295 std::function<void()> onPageShow_; 296 std::function<void()> onPageHide_; 297 std::function<bool()> onBackPressed_; 298 std::function<void()> pageTransitionFunc_; 299 std::function<void()> firstBuildCallback_; 300 std::unordered_map<int32_t, PageVisibilityChangeCallback> onHiddenChange_; 301 DynamicPageSizeCallback dynamicPageSizeCallback_; 302 PageVisibilityChangeCallback visibilityChangeCallback_; 303 std::shared_ptr<std::function<void()>> pageTransitionFinish_; 304 std::list<RefPtr<PageTransitionEffect>> pageTransitionEffects_; 305 std::function<void(const std::vector<std::string>&)> dumpListener_; 306 307 bool isOnShow_ = false; 308 bool isFirstLoad_ = true; 309 bool isPageInTransition_ = false; 310 bool isRenderDone_ = false; 311 bool isModalCovered_ = false; 312 313 #if defined(ENABLE_SPLIT_MODE) 314 bool needFireObserver_ = true; 315 #endif 316 317 SharedTransitionMap sharedTransitionMap_; 318 JSAnimatorMap jsAnimatorMap_; 319 RouterPageState state_ = RouterPageState::ABOUT_TO_APPEAR; 320 321 ACE_DISALLOW_COPY_AND_MOVE(PagePattern); 322 }; 323 } // namespace OHOS::Ace::NG 324 325 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_STAGE_PAGE_PATTERN_H 326