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