1 /* 2 * Copyright (c) 2021-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_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H 18 19 #include <memory> 20 21 #include "base/memory/ace_type.h" 22 #include "core/common/ace_page.h" 23 #include "core/common/frontend.h" 24 #include "frameworks/bridge/card_frontend/card_frontend_delegate.h" 25 #include "frameworks/bridge/card_frontend/js_card_parser.h" 26 #include "frameworks/bridge/common/accessibility/accessibility_node_manager.h" 27 #include "frameworks/bridge/common/manifest/manifest_parser.h" 28 #include "frameworks/bridge/common/utils/page_id_pool.h" 29 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h" 30 31 namespace OHOS::Ace { 32 class ACE_EXPORT CardFrontend : public Frontend { 33 DECLARE_ACE_TYPE(CardFrontend, Frontend); 34 35 public: 36 using OnFormVisibleCallback = std::function<void()>; 37 38 CardFrontend() = default; 39 ~CardFrontend() override; 40 SetLoadCardCallBack(WeakPtr<PipelineBase> outSidePipelineContext)41 virtual void SetLoadCardCallBack(WeakPtr<PipelineBase> outSidePipelineContext) {} 42 virtual void UpdateData(const std::string& dataList); 43 virtual void OnPageLoaded(const RefPtr<Framework::JsAcePage>& page); 44 virtual void HandleSurfaceChanged(int32_t width, int32_t height); 45 virtual void UpdatePageData(const std::string& dataList); 46 virtual void OnMediaFeatureUpdate(); 47 std::string GetFormSrcPath(const std::string& uri, const std::string& suffix) const; 48 49 bool Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor) override; 50 51 void Destroy() override; 52 53 void AttachPipelineContext(const RefPtr<PipelineBase>& context) override; 54 void SetAssetManager(const RefPtr<AssetManager>& assetManager) override; 55 56 UIContentErrorCode RunPage(const std::string& url, const std::string& params) override; ReplacePage(const std::string & url,const std::string & params)57 void ReplacePage(const std::string& url, const std::string& params) override {} PushPage(const std::string & url,const std::string & params)58 void PushPage(const std::string& url, const std::string& params) override {} AddPage(const RefPtr<AcePage> & page)59 void AddPage(const RefPtr<AcePage>& page) override {} 60 RefPtr<AcePage> GetPage(int32_t pageId) const override; TriggerGarbageCollection()61 void TriggerGarbageCollection() override {} 62 SendCallbackMessage(const std::string & callbackId,const std::string & data)63 void SendCallbackMessage(const std::string& callbackId, const std::string& data) const override {} 64 // platform channel. SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher> & dispatcher)65 void SetJsMessageDispatcher(const RefPtr<JsMessageDispatcher>& dispatcher) const override {} TransferComponentResponseData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data)66 void TransferComponentResponseData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override {} TransferJsResponseData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data)67 void TransferJsResponseData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override {} TransferJsEventData(int32_t callbackId,int32_t code,std::vector<uint8_t> && data)68 void TransferJsEventData(int32_t callbackId, int32_t code, std::vector<uint8_t>&& data) const override {} TransferJsPluginGetError(int32_t callbackId,int32_t errorCode,std::string && errorMessage)69 void TransferJsPluginGetError(int32_t callbackId, int32_t errorCode, std::string&& errorMessage) const override {} 70 LoadPluginJsCode(std::string && jsCode)71 void LoadPluginJsCode(std::string&& jsCode) const override {} LoadPluginJsByteCode(std::vector<uint8_t> && jsCode,std::vector<int32_t> && jsCodeLen)72 void LoadPluginJsByteCode(std::vector<uint8_t>&& jsCode, std::vector<int32_t>&& jsCodeLen) const override {} 73 74 // application lifecycle. UpdateState(Frontend::State state)75 void UpdateState(Frontend::State state) override {} 76 77 // page lifecycle. OnBackPressed()78 bool OnBackPressed() override 79 { 80 return false; 81 } 82 OnSaveAbilityState(std::string & data)83 void OnSaveAbilityState(std::string& data) override {} 84 OnRestoreAbilityState(const std::string & data)85 void OnRestoreAbilityState(const std::string& data) override {} 86 OnShow()87 void OnShow() override 88 { 89 foregroundFrontend_ = true; 90 } OnHide()91 void OnHide() override 92 { 93 foregroundFrontend_ = false; 94 } 95 OnActive()96 void OnActive() override {} OnInactive()97 void OnInactive() override {} OnStartContinuation()98 bool OnStartContinuation() override 99 { 100 return false; 101 } OnCompleteContinuation(int32_t code)102 void OnCompleteContinuation(int32_t code) override {} OnMemoryLevel(const int32_t level)103 void OnMemoryLevel(const int32_t level) override {} OnSaveData(std::string & data)104 void OnSaveData(std::string& data) override {} OnRestoreData(const std::string & data)105 bool OnRestoreData(const std::string& data) override 106 { 107 return false; 108 } OnRemoteTerminated()109 void OnRemoteTerminated() override {} OnNewRequest(const std::string & data)110 void OnNewRequest(const std::string& data) override {} OnNewWant(const std::string & data)111 void OnNewWant(const std::string& data) override {} CallRouterBack()112 void CallRouterBack() override {} 113 void OnSurfaceChanged(int32_t width, int32_t height) override; OnLayoutCompleted(const std::string & componentId)114 void OnLayoutCompleted(const std::string& componentId) override {} OnDrawCompleted(const std::string & componentId)115 void OnDrawCompleted(const std::string& componentId) override {} DumpFrontend()116 void DumpFrontend() const override {} GetPagePath()117 std::string GetPagePath() const override 118 { 119 return ""; 120 } 121 WindowConfig& GetWindowConfig() override; 122 void SetColorMode(ColorMode colorMode) override; 123 void RebuildAllPages() override; 124 GetEventHandler()125 RefPtr<AceEventHandler> GetEventHandler() override 126 { 127 return eventHandler_; 128 } 129 130 // judge frontend is foreground frontend. IsForeground()131 bool IsForeground() override 132 { 133 return foregroundFrontend_; 134 } 135 GetAccessibilityManager()136 RefPtr<AccessibilityManager> GetAccessibilityManager() const override 137 { 138 if (!delegate_) { 139 return nullptr; 140 } 141 return delegate_->GetJsAccessibilityManager(); 142 } 143 SetDensity(double density)144 void SetDensity(double density) 145 { 146 density_ = density; 147 } 148 ResetPageLoadState()149 void ResetPageLoadState() 150 { 151 pageLoaded_ = false; 152 } 153 SetCardHapPath(const std::string & path)154 void SetCardHapPath(const std::string& path) 155 { 156 cardHapPath_ = path; 157 } 158 GetFormSrc()159 std::string GetFormSrc() const 160 { 161 return formSrc_; 162 } 163 SetFormSrc(std::string formSrc)164 void SetFormSrc(std::string formSrc) 165 { 166 formSrc_ = formSrc; 167 } 168 GetCardWindowConfig()169 WindowConfig& GetCardWindowConfig() 170 { 171 return cardWindowConfig_; 172 } 173 SetCardWindowConfig(WindowConfig cardWindowConfig)174 void SetCardWindowConfig(WindowConfig cardWindowConfig) 175 { 176 cardWindowConfig_ = cardWindowConfig; 177 } 178 SetRunningCardId(int64_t cardId)179 void SetRunningCardId(int64_t cardId) 180 { 181 cardId_ = cardId; 182 } 183 AddFormVisiableCallback(const OnFormVisibleCallback & callback)184 void AddFormVisiableCallback(const OnFormVisibleCallback& callback) 185 { 186 if (callback) { 187 onFormVisibleCallback_ = callback; 188 } 189 } 190 FireFormVisiableCallback()191 void FireFormVisiableCallback() const 192 { 193 if (onFormVisibleCallback_) { 194 onFormVisibleCallback_(); 195 } 196 } 197 198 protected: 199 void ParseManifest() const; 200 201 ColorMode colorMode_ = ColorMode::LIGHT; 202 bool foregroundFrontend_ = false; 203 bool pageLoaded_ = false; 204 double density_ = 1.0; 205 std::string cardHapPath_; 206 207 Framework::PipelineContextHolder holder_; 208 RefPtr<AssetManager> assetManager_; 209 RefPtr<Framework::ManifestParser> manifestParser_; 210 OnFormVisibleCallback onFormVisibleCallback_; 211 212 mutable std::once_flag onceFlag_; 213 RefPtr<AceEventHandler> eventHandler_; 214 Framework::PageIdPool pageIdPool_; 215 std::string formSrc_; 216 WindowConfig cardWindowConfig_; 217 uint64_t cardId_ = 0; // cardId != formId, cardId is the nodeId of component. 218 219 private: 220 RefPtr<Framework::CardFrontendDelegate> delegate_; 221 void LoadPage(const std::string& urlPath, const std::string& params); 222 void ParsePage(const RefPtr<PipelineBase>& context, const std::string& pageContent, const std::string& params, 223 const RefPtr<Framework::JsAcePage>& page); 224 225 RefPtr<Framework::JsCardParser> parseJsCard_; 226 }; 227 228 class CardEventHandler : public AceEventHandler { 229 public: CardEventHandler(const RefPtr<Framework::CardFrontendDelegate> & delegate)230 explicit CardEventHandler(const RefPtr<Framework::CardFrontendDelegate>& delegate) : delegate_(delegate) 231 { 232 ACE_DCHECK(delegate_); 233 } 234 235 ~CardEventHandler() override = default; 236 HandleAsyncEvent(const EventMarker & eventMarker)237 void HandleAsyncEvent(const EventMarker& eventMarker) override 238 { 239 delegate_->FireCardEvent(eventMarker); 240 } 241 HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)242 void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override {} 243 HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)244 void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override 245 { 246 delegate_->FireCardEvent(eventMarker); 247 } 248 HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)249 void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override {} 250 HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)251 void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override 252 { 253 delegate_->FireCardEvent(eventMarker, param); 254 } 255 HandleSyncEvent(const EventMarker & eventMarker,bool & result)256 void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override {} 257 HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)258 void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override {} 259 HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)260 void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override {} 261 HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)262 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override {} 263 HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)264 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, 265 const bool isDestroy) override 266 {} 267 268 private: 269 RefPtr<Framework::CardFrontendDelegate> delegate_; 270 }; 271 } // namespace OHOS::Ace 272 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H 273