• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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