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/declarative_frontend_ng.h"
32 #include "frameworks/bridge/declarative_frontend/ng/page_router_manager.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     UIContentErrorCode RunPage(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](
83                                        const std::string& url, int64_t cardId, const std::string& entryPoint) -> bool {
84             auto context = outSidePipelineContext.Upgrade();
85             if (!context) {
86                 return false;
87             }
88 #ifdef NG_BUILD
89             auto outSidefrontend = AceType::DynamicCast<DeclarativeFrontendNG>(context->GetFrontend());
90 #else
91             auto outSidefrontend = AceType::DynamicCast<DeclarativeFrontend>(context->GetFrontend());
92 #endif
93             if (!outSidefrontend) {
94                 return false;
95             }
96 
97             // Use the same js engine with host pipeline
98             auto jsEngine = outSidefrontend->GetJsEngine();
99             if (!jsEngine) {
100                 return false;
101             }
102 
103             return jsEngine->LoadCard(url, cardId, entryPoint);
104         };
105         delegate_->SetLoadCardCallBack(loadCallback);
106     }
107 
GetDelegate()108     RefPtr<Framework::CardFrontendDelegateDeclarative> GetDelegate()
109     {
110         return delegate_;
111     }
112 
113 private:
114     void InitializeDelegate(const RefPtr<TaskExecutor>& taskExecutor);
115     RefPtr<Framework::CardFrontendDelegateDeclarative> delegate_;
116 };
117 
118 class CardEventHandlerDeclarative : public AceEventHandler {
119 public:
CardEventHandlerDeclarative(const RefPtr<Framework::CardFrontendDelegateDeclarative> & delegate)120     explicit CardEventHandlerDeclarative(const RefPtr<Framework::CardFrontendDelegateDeclarative>& delegate)
121         : delegate_(delegate)
122     {
123         ACE_DCHECK(delegate_);
124     }
125 
126     ~CardEventHandlerDeclarative() override = default;
127 
HandleAsyncEvent(const EventMarker & eventMarker)128     void HandleAsyncEvent(const EventMarker& eventMarker) override
129     {
130         delegate_->FireCardEvent(eventMarker);
131     }
132 
HandleAsyncEvent(const EventMarker & eventMarker,int32_t param)133     void HandleAsyncEvent(const EventMarker& eventMarker, int32_t param) override {}
134 
HandleAsyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info)135     void HandleAsyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info) override
136     {
137         delegate_->FireCardEvent(eventMarker);
138     }
139 
HandleAsyncEvent(const EventMarker & eventMarker,const KeyEvent & info)140     void HandleAsyncEvent(const EventMarker& eventMarker, const KeyEvent& info) override {}
141 
HandleAsyncEvent(const EventMarker & eventMarker,const std::string & param)142     void HandleAsyncEvent(const EventMarker& eventMarker, const std::string& param) override
143     {
144         delegate_->FireCardEvent(eventMarker, param);
145     }
146 
HandleSyncEvent(const EventMarker & eventMarker,bool & result)147     void HandleSyncEvent(const EventMarker& eventMarker, bool& result) override {}
148 
HandleSyncEvent(const EventMarker & eventMarker,const BaseEventInfo & info,bool & result)149     void HandleSyncEvent(const EventMarker& eventMarker, const BaseEventInfo& info, bool& result) override {}
150 
HandleSyncEvent(const EventMarker & eventMarker,const KeyEvent & info,bool & result)151     void HandleSyncEvent(const EventMarker& eventMarker, const KeyEvent& info, bool& result) override {}
152 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & param,std::string & result)153     void HandleSyncEvent(const EventMarker& eventMarker, const std::string& param, std::string& result) override {}
154 
HandleSyncEvent(const EventMarker & eventMarker,const std::string & componentId,const int32_t nodeId,const bool isDestroy)155     void HandleSyncEvent(const EventMarker& eventMarker, const std::string& componentId, const int32_t nodeId,
156         const bool isDestroy) override
157     {}
158 
159 private:
160     RefPtr<Framework::CardFrontendDelegateDeclarative> delegate_;
161 };
162 } // namespace OHOS::Ace
163 
164 #endif // FOUNDATION_ACE_FRAMEWORKS_BRIDGE_CARD_FRONTEND_CARD_FRONTEND_DECLARATIVE_H
165