1 /* 2 * Copyright (c) 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_DECLARATIVE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_DECLARATIVE_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.h" 25 #include "frameworks/bridge/card_frontend/card_frontend_delegate_declarative.h" 26 #include "frameworks/bridge/card_frontend/js_card_parser.h" 27 #include "frameworks/bridge/common/accessibility/accessibility_node_manager.h" 28 #include "frameworks/bridge/common/manifest/manifest_parser.h" 29 #include "frameworks/bridge/common/utils/page_id_pool.h" 30 #include "frameworks/bridge/declarative_frontend/declarative_frontend.h" 31 #include "frameworks/bridge/declarative_frontend/ng/page_router_manager.h" 32 #include "frameworks/bridge/declarative_frontend/ng/declarative_frontend_ng.h" 33 #include "frameworks/bridge/js_frontend/frontend_delegate_impl.h" 34 35 namespace OHOS::Ace { 36 37 class ACE_EXPORT CardFrontendDeclarative : public CardFrontend { 38 DECLARE_ACE_TYPE(CardFrontendDeclarative, CardFrontend); 39 40 public: 41 CardFrontendDeclarative() = default; 42 ~CardFrontendDeclarative() override; 43 44 // Card 45 void OnPageLoaded(const RefPtr<Framework::JsAcePage>& page) override; 46 void HandleSurfaceChanged(int32_t width, int32_t height) override; 47 void UpdatePageData(const std::string& dataList) override; 48 void OnMediaFeatureUpdate() override; 49 50 // Frontend 51 bool Initialize(FrontendType type, const RefPtr<TaskExecutor>& taskExecutor) override; 52 void Destroy() override; 53 void AttachPipelineContext(const RefPtr<PipelineBase>& context) override; 54 void SetAssetManager(const RefPtr<AssetManager>& assetManager) override; OnShow()55 void OnShow() override 56 { 57 foregroundFrontend_ = true; 58 if (delegate_) { 59 delegate_->OnPageShow(); 60 } 61 } OnHide()62 void OnHide() override 63 { 64 foregroundFrontend_ = false; 65 if (delegate_) { 66 delegate_->OnPageHide(); 67 } 68 } 69 70 void RunPage(int32_t pageId, const std::string& url, const std::string& params) override; 71 72 void OnSurfaceChanged(int32_t width, int32_t height) override; 73 void UpdateData(const std::string& dataList) override; 74 void SetColorMode(ColorMode colorMode) override; 75 void RebuildAllPages() override; 76 77 // eTSCard only 78 RefPtr<NG::PageRouterManager> GetPageRouterManager() const; 79 SetLoadCardCallBack(WeakPtr<PipelineBase> outSidePipelineContext)80 void SetLoadCardCallBack(WeakPtr<PipelineBase> outSidePipelineContext) override 81 { 82 const auto& loadCallback = [outSidePipelineContext](const std::string& url, int64_t cardId) -> bool { 83 auto context = outSidePipelineContext.Upgrade(); 84 if (!context) { 85 LOGE("Load card callback failed, host pipeline nullptr"); 86 return false; 87 } 88 89 auto outSidefrontend = AceType::DynamicCast<DeclarativeFrontend>(context->GetFrontend()); 90 if (!outSidefrontend) { 91 LOGE("Load card callback failed, host frontend nullptr"); 92 return false; 93 } 94 95 // Use the same js engine with host pipeline 96 auto jsEngine = outSidefrontend->GetJsEngine(); 97 if (!jsEngine) { 98 return false; 99 } 100 101 return jsEngine->LoadCard(url, cardId); 102 }; 103 delegate_->SetLoadCardCallBack(loadCallback); 104 } 105 GetDelegate()106 RefPtr<Framework::CardFrontendDelegateDeclarative> GetDelegate() 107 { 108 return delegate_; 109 } 110 111 private: 112 void InitializeDelegate(const RefPtr<TaskExecutor>& taskExecutor); 113 RefPtr<Framework::CardFrontendDelegateDeclarative> delegate_; 114 }; 115 116 class CardEventHandlerDeclarative : public AceEventHandler { 117 public: CardEventHandlerDeclarative(const RefPtr<Framework::CardFrontendDelegateDeclarative> & delegate)118 explicit CardEventHandlerDeclarative(const RefPtr<Framework::CardFrontendDelegateDeclarative>& delegate) : delegate_(delegate) 119 { 120 ACE_DCHECK(delegate_); 121 } 122 123 ~CardEventHandlerDeclarative() override = default; 124 HandleAsyncEvent(const EventMarker & eventMarker)125 void HandleAsyncEvent(const EventMarker& eventMarker) override 126 { 127 LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId, 128 eventMarker.GetData().eventId.c_str()); 129 delegate_->FireCardEvent(eventMarker); 130 } 131 HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)132 void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override 133 { 134 LOGW("card event handler does not support this event type!"); 135 } 136 HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)137 void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override 138 { 139 LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId, 140 eventMarker.GetData().eventId.c_str()); 141 delegate_->FireCardEvent(eventMarker); 142 } 143 HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)144 void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override 145 { 146 LOGW("card event handler does not support this event type!"); 147 } 148 HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)149 void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override 150 { 151 LOGI("HandleAsyncEvent cardId: %{public}d, eventId: %{public}s", eventMarker.GetData().pageId, 152 eventMarker.GetData().eventId.c_str()); 153 delegate_->FireCardEvent(eventMarker, param); 154 } 155 HandleSyncEvent(const EventMarker & eventMarker,bool & result)156 void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override 157 { 158 LOGW("card event handler does not support this event type!"); 159 } 160 HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)161 void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override 162 { 163 LOGW("card event handler does not support this event type!"); 164 } 165 HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)166 void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override 167 { 168 LOGW("card event handler does not support this event type!"); 169 } 170 HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)171 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override 172 { 173 LOGW("card event handler does not support this event type!"); 174 } 175 HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)176 void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId, 177 const bool isDestroy) override 178 { 179 LOGW("card event handler does not support this event type!"); 180 } 181 182 private: 183 RefPtr<Framework::CardFrontendDelegateDeclarative> delegate_; 184 }; 185 } // namespace OHOS::Ace 186 187 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_DECLARATIVE_H 188