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 void RunPage(int32_t pageId, 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 LOGE("GetAccessibilityManager delegate is null"); 140 return nullptr; 141 } 142 return delegate_->GetJsAccessibilityManager(); 143 } 144 SetDensity(double density)145 void SetDensity(double density) 146 { 147 density_ = density; 148 } 149 ResetPageLoadState()150 void ResetPageLoadState() 151 { 152 pageLoaded_ = false; 153 } 154 SetCardHapPath(const std::string & path)155 void SetCardHapPath(const std::string& path) 156 { 157 cardHapPath_ = path; 158 } 159 GetFormSrc()160 std::string GetFormSrc() const 161 { 162 return formSrc_; 163 } 164 SetFormSrc(std::string formSrc)165 void SetFormSrc(std::string formSrc) 166 { 167 formSrc_ = formSrc; 168 } 169 GetCardWindowConfig()170 WindowConfig& GetCardWindowConfig() 171 { 172 return cardWindowConfig_; 173 } 174 SetCardWindowConfig(WindowConfig cardWindowConfig)175 void SetCardWindowConfig(WindowConfig cardWindowConfig) 176 { 177 cardWindowConfig_ = cardWindowConfig; 178 } 179 SetRunningCardId(int64_t cardId)180 void SetRunningCardId(int64_t cardId) 181 { 182 cardId_ = cardId; 183 } 184 AddFormVisiableCallback(const OnFormVisibleCallback & callback)185 void AddFormVisiableCallback(const OnFormVisibleCallback& callback) 186 { 187 if (callback) { 188 onFormVisibleCallback_ = callback; 189 } 190 } 191 FireFormVisiableCallback()192 void FireFormVisiableCallback() const 193 { 194 if (onFormVisibleCallback_) { 195 onFormVisibleCallback_(); 196 } 197 } 198 199 protected: 200 void ParseManifest() const; 201 202 ColorMode colorMode_ = ColorMode::LIGHT; 203 bool foregroundFrontend_ = false; 204 bool pageLoaded_ = false; 205 double density_ = 1.0; 206 std::string cardHapPath_; 207 208 Framework::PipelineContextHolder holder_; 209 RefPtr<AssetManager> assetManager_; 210 RefPtr<Framework::ManifestParser> manifestParser_; 211 OnFormVisibleCallback onFormVisibleCallback_; 212 213 mutable std::once_flag onceFlag_; 214 RefPtr<AceEventHandler> eventHandler_; 215 Framework::PageIdPool pageIdPool_; 216 std::string formSrc_; 217 WindowConfig cardWindowConfig_; 218 uint64_t cardId_ = 0; // cardId != formId, cardId is the nodeId of component. 219 220 private: 221 RefPtr<Framework::CardFrontendDelegate> delegate_; 222 void LoadPage(const std::string& urlPath, const std::string& params); 223 void ParsePage(const RefPtr<PipelineBase>& context, const std::string& pageContent, const std::string& params, 224 const RefPtr<Framework::JsAcePage>& page); 225 226 RefPtr<Framework::JsCardParser> parseJsCard_; 227 }; 228 229 class CardEventHandler : public AceEventHandler { 230 public: CardEventHandler(const RefPtr<Framework::CardFrontendDelegate> & delegate)231 explicit CardEventHandler(const RefPtr<Framework::CardFrontendDelegate>& delegate) : delegate_(delegate) 232 { 233 ACE_DCHECK(delegate_); 234 } 235 236 ~CardEventHandler() override = default; 237 HandleAsyncEvent(const EventMarker & eventMarker)238 void HandleAsyncEvent(const EventMarker& eventMarker) override 239 { 240 LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId, 241 eventMarker.GetData().eventId.c_str()); 242 delegate_->FireCardEvent(eventMarker); 243 } 244 HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)245 void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override 246 { 247 LOGW("card event handler does not support this event type!"); 248 } 249 HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)250 void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override 251 { 252 LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId, 253 eventMarker.GetData().eventId.c_str()); 254 delegate_->FireCardEvent(eventMarker); 255 } 256 HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)257 void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override 258 { 259 LOGW("card event handler does not support this event type!"); 260 } 261 HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)262 void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override 263 { 264 LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId, 265 eventMarker.GetData().eventId.c_str()); 266 delegate_->FireCardEvent(eventMarker, param); 267 } 268 HandleSyncEvent(const EventMarker & eventMarker,bool & result)269 void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override 270 { 271 LOGW("card event handler does not support this event type!"); 272 } 273 HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)274 void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override 275 { 276 LOGW("card event handler does not support this event type!"); 277 } 278 HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)279 void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override 280 { 281 LOGW("card event handler does not support this event type!"); 282 } 283 HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)284 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override 285 { 286 LOGW("card event handler does not support this event type!"); 287 } 288 HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)289 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, 290 const bool isDestroy) override 291 { 292 LOGW("card event handler does not support this event type!"); 293 } 294 295 private: 296 RefPtr<Framework::CardFrontendDelegate> delegate_; 297 }; 298 } // namespace OHOS::Ace 299 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_H 300