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 {} OnDrawChildrenCompleted(const std::string & componentId)116 void OnDrawChildrenCompleted(const std::string& componentId) override {} IsDrawChildrenCallbackFuncExist(const std::string & componentId)117 bool IsDrawChildrenCallbackFuncExist(const std::string& componentId) override { 118 return false; 119 } DumpFrontend()120 void DumpFrontend() const override {} GetPagePath()121 std::string GetPagePath() const override 122 { 123 return ""; 124 } 125 WindowConfig& GetWindowConfig() override; 126 void SetColorMode(ColorMode colorMode) override; 127 void RebuildAllPages() override; 128 GetEventHandler()129 RefPtr<AceEventHandler> GetEventHandler() override 130 { 131 return eventHandler_; 132 } 133 134 // judge frontend is foreground frontend. IsForeground()135 bool IsForeground() override 136 { 137 return foregroundFrontend_; 138 } 139 GetAccessibilityManager()140 RefPtr<AccessibilityManager> GetAccessibilityManager() const override 141 { 142 if (!delegate_) { 143 return nullptr; 144 } 145 return delegate_->GetJsAccessibilityManager(); 146 } 147 SetDensity(double density)148 void SetDensity(double density) 149 { 150 density_ = density; 151 } 152 ResetPageLoadState()153 void ResetPageLoadState() 154 { 155 pageLoaded_ = false; 156 } 157 SetCardHapPath(const std::string & path)158 void SetCardHapPath(const std::string& path) 159 { 160 cardHapPath_ = path; 161 } 162 GetFormSrc()163 std::string GetFormSrc() const 164 { 165 return formSrc_; 166 } 167 SetFormSrc(std::string formSrc)168 void SetFormSrc(std::string formSrc) 169 { 170 formSrc_ = formSrc; 171 } 172 GetCardWindowConfig()173 WindowConfig& GetCardWindowConfig() 174 { 175 return cardWindowConfig_; 176 } 177 SetCardWindowConfig(WindowConfig cardWindowConfig)178 void SetCardWindowConfig(WindowConfig cardWindowConfig) 179 { 180 cardWindowConfig_ = cardWindowConfig; 181 } 182 SetRunningCardId(int64_t cardId)183 void SetRunningCardId(int64_t cardId) 184 { 185 cardId_ = cardId; 186 } 187 AddFormVisiableCallback(const OnFormVisibleCallback & callback)188 void AddFormVisiableCallback(const OnFormVisibleCallback& callback) 189 { 190 if (callback) { 191 onFormVisibleCallback_ = callback; 192 } 193 } 194 FireFormVisiableCallback()195 void FireFormVisiableCallback() const 196 { 197 if (onFormVisibleCallback_) { 198 onFormVisibleCallback_(); 199 } 200 } 201 202 protected: 203 void ParseManifest() const; 204 205 ColorMode colorMode_ = ColorMode::LIGHT; 206 bool foregroundFrontend_ = false; 207 bool pageLoaded_ = false; 208 double density_ = 1.0; 209 std::string cardHapPath_; 210 211 Framework::PipelineContextHolder holder_; 212 RefPtr<AssetManager> assetManager_; 213 RefPtr<Framework::ManifestParser> manifestParser_; 214 OnFormVisibleCallback onFormVisibleCallback_; 215 216 mutable std::once_flag onceFlag_; 217 RefPtr<AceEventHandler> eventHandler_; 218 Framework::PageIdPool pageIdPool_; 219 std::string formSrc_; 220 WindowConfig cardWindowConfig_; 221 uint64_t cardId_ = 0; // cardId != formId, cardId is the nodeId of component. 222 223 private: 224 RefPtr<Framework::CardFrontendDelegate> delegate_; 225 void LoadPage(const std::string& urlPath, const std::string& params); 226 void ParsePage(const RefPtr<PipelineBase>& context, const std::string& pageContent, const std::string& params, 227 const RefPtr<Framework::JsAcePage>& page); 228 229 RefPtr<Framework::JsCardParser> parseJsCard_; 230 }; 231 232 class CardEventHandler : public AceEventHandler { 233 public: CardEventHandler(const RefPtr<Framework::CardFrontendDelegate> & delegate)234 explicit CardEventHandler(const RefPtr<Framework::CardFrontendDelegate>& delegate) : delegate_(delegate) 235 { 236 ACE_DCHECK(delegate_); 237 } 238 239 ~CardEventHandler() override = default; 240 HandleAsyncEvent(const EventMarker & eventMarker)241 void HandleAsyncEvent(const EventMarker& eventMarker) override 242 { 243 delegate_->FireCardEvent(eventMarker); 244 } 245 HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)246 void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override {} 247 HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)248 void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override 249 { 250 delegate_->FireCardEvent(eventMarker); 251 } 252 HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)253 void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override {} 254 HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)255 void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override 256 { 257 delegate_->FireCardEvent(eventMarker, param); 258 } 259 HandleSyncEvent(const EventMarker & eventMarker,bool & result)260 void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override {} 261 HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)262 void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override {} 263 HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)264 void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override {} 265 HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)266 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override {} 267 HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)268 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, 269 const bool isDestroy) override 270 {} 271 272 private: 273 RefPtr<Framework::CardFrontendDelegate> delegate_; 274 }; 275 } // namespace OHOS::Ace 276 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H 277