1 /* 2 * Copyright (c) 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_BRIDGE_CJ_FRONTEND_CJ_PAGE_ROUTER_ABSTRACT_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CJ_FRONTEND_CJ_PAGE_ROUTER_ABSTRACT_H 18 19 #include "base/memory/ace_type.h" 20 #include "bridge/common/manifest/manifest_parser.h" 21 22 namespace OHOS::Ace { 23 24 class CJFrontendAbstract; 25 26 extern "C" ACE_EXPORT void* OHOSAceFrameworkGetCJFrontendLoader(); 27 28 class CJPageRouterAbstract : public AceType { 29 DECLARE_ACE_TYPE(CJPageRouterAbstract, AceType) 30 public: 31 enum class RouterMode { 32 STANDARD = 0, 33 SINGLE, 34 }; 35 36 enum class RouterAction { 37 DEFAULT = 0, 38 PUSH, 39 REPLACE, 40 BACK, 41 CLEAR, 42 }; 43 44 struct RouterPageInfo { 45 std::string url; 46 RouterMode routerMode = RouterMode::STANDARD; 47 std::string path; 48 }; 49 50 struct RouterTask { 51 RouterAction action = RouterAction::PUSH; 52 RouterPageInfo routerPageInfo; 53 std::string params; 54 }; 55 56 virtual void OnShowCurrent() = 0; 57 virtual void OnHideCurrent() = 0; 58 virtual std::string GetParams() const = 0; 59 virtual int32_t GetStackSize() const = 0; 60 virtual void GetState(int32_t& index, std::string& name, std::string& path) = 0; 61 virtual std::string GetCurrentPageUrl() = 0; 62 virtual void EnableAlertBeforeBackPage(const std::string& message, std::function<void(int32_t)> callback) = 0; 63 virtual bool AllowPopLastPage() = 0; GetCurrentPageNode()64 virtual RefPtr<NG::FrameNode> GetCurrentPageNode() { return nullptr; } 65 virtual bool PopWithExitCheck(); 66 void RunPage(const std::string& url, const std::string& params); 67 void Push(const RouterPageInfo& target, const std::string& params, RouterMode = RouterMode::STANDARD); 68 bool Pop(); 69 void Replace(const RouterPageInfo& target, const std::string& params, RouterMode = RouterMode::STANDARD); 70 void BackWithTarget(const RouterPageInfo& target, const std::string& params); 71 void Clear(); 72 virtual void FlushReload() = 0; SetManifestParser(const RefPtr<Framework::ManifestParser> & manifestParser)73 void SetManifestParser(const RefPtr<Framework::ManifestParser>& manifestParser) 74 { 75 manifestParser_ = manifestParser; 76 } 77 GetNativeViews()78 std::list<int64_t> GetNativeViews() 79 { 80 return viewStack_; 81 } 82 AddView(int64_t viewId)83 void AddView(int64_t viewId) 84 { 85 viewStack_.emplace_back(viewId); 86 } 87 88 protected: CJPageRouterAbstract(WeakPtr<CJFrontendAbstract> frontend)89 explicit CJPageRouterAbstract(WeakPtr<CJFrontendAbstract> frontend): frontend_(std::move(frontend)) {} 90 virtual void StartPush(const RouterPageInfo& target, const std::string& params, 91 RouterMode mode = RouterMode::STANDARD) = 0; 92 virtual bool StartPop() = 0; 93 virtual void StartReplace(const RouterPageInfo& target, const std::string& params, 94 RouterMode mode = RouterMode::STANDARD) = 0; 95 virtual void BackCheckAlert(const RouterPageInfo& target, const std::string& params) = 0; 96 virtual void StartClean() = 0; 97 98 // page operations 99 virtual void LoadPage(int32_t pageId, const RouterPageInfo& target, const std::string& params, 100 bool isRestore = false, bool needHideLast = true, bool needTransition = true) = 0; 101 virtual void PopPage(const std::string& params, bool needShowNext, bool needTransition) = 0; 102 virtual void PopPageToIndex(int32_t index, const std::string& params, bool needShowNext, bool needTransition) = 0; 103 104 protected: 105 class ProcessGuard { 106 public: ProcessGuard(CJPageRouterAbstract * router)107 explicit ProcessGuard(CJPageRouterAbstract* router) : router_(router) 108 { 109 router_->inRouterOpt_ = true; 110 } ~ProcessGuard()111 ~ProcessGuard() 112 { 113 router_->inRouterOpt_ = false; 114 router_ = nullptr; 115 } 116 117 private: 118 CJPageRouterAbstract* router_ = nullptr; 119 }; 120 121 int32_t GenerateNextPageId(); 122 123 WeakPtr<CJFrontendAbstract> frontend_; 124 RefPtr<Framework::ManifestParser> manifestParser_; 125 bool inRouterOpt_ = false; 126 RouterPageInfo ngBackUri_ = { "" }; 127 std::string backParam_; 128 std::list<int64_t> viewStack_; 129 130 private: 131 int32_t nextPageId_ = 0; 132 133 ACE_DISALLOW_COPY_AND_MOVE(CJPageRouterAbstract); 134 }; 135 136 } 137 138 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CJ_FRONTEND_CJ_PAGE_ROUTER_ABSTRACT_H 139