• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023-2024 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 #include "core/components_ng/pattern/ui_extension/ui_extension_model_ng.h"
17 
18 #include "interfaces/inner_api/ace/modal_ui_extension_config.h"
19 #include "want.h"
20 
21 #include "core/components/common/layout/constants.h"
22 #include "core/components_ng/base/view_stack_processor.h"
23 #include "core/components_ng/pattern/ui_extension/isolated_pattern.h"
24 #include "core/components_ng/pattern/ui_extension/session_wrapper.h"
25 #include "core/components_ng/pattern/ui_extension/security_ui_extension_pattern.h"
26 #include "core/components_ng/pattern/ui_extension/ui_extension_hub.h"
27 #include "core/components_ng/pattern/ui_extension/ui_extension_pattern.h"
28 #include "core/components_v2/inspector/inspector_constants.h"
29 #include "core/pipeline_ng/pipeline_context.h"
30 
31 namespace OHOS::Ace::NG {
Create(const std::string & bundleName,const std::string & abilityName,const std::map<std::string,std::string> & params,std::function<void (int32_t)> && onRelease,std::function<void (int32_t,const std::string &,const std::string &)> && onError)32 RefPtr<FrameNode> UIExtensionModelNG::Create(const std::string& bundleName, const std::string& abilityName,
33     const std::map<std::string, std::string>& params, std::function<void(int32_t)>&& onRelease,
34     std::function<void(int32_t, const std::string&, const std::string&)>&& onError)
35 {
36     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
37     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::UI_EXTENSION_COMPONENT_ETS_TAG, nodeId);
38     auto wantWrap = WantWrap::CreateWantWrap(bundleName, abilityName);
39     wantWrap->SetWantParam(params);
40     auto frameNode = FrameNode::GetOrCreateFrameNode(
41         V2::UI_EXTENSION_COMPONENT_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<UIExtensionPattern>(); });
42     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
43     CHECK_NULL_RETURN(pattern, frameNode);
44     pattern->UpdateWant(wantWrap);
45     pattern->SetOnReleaseCallback(std::move(onRelease));
46     pattern->SetOnErrorCallback(std::move(onError));
47     return frameNode;
48 }
49 
Create(const AAFwk::Want & want,const ModalUIExtensionCallbacks & callbacks,const InnerModalUIExtensionConfig & config)50 RefPtr<FrameNode> UIExtensionModelNG::Create(
51     const AAFwk::Want& want, const ModalUIExtensionCallbacks& callbacks, const InnerModalUIExtensionConfig& config)
52 {
53     bool isAsyncModalBinding = config.isAsyncModalBinding;
54     bool isModal = config.isModal;
55     auto nodeId = ElementRegister::GetInstance()->MakeUniqueId();
56     auto frameNode = FrameNode::GetOrCreateFrameNode(V2::UI_EXTENSION_COMPONENT_ETS_TAG, nodeId,
57         [isAsyncModalBinding, isModal]() {
58             return AceType::MakeRefPtr<UIExtensionPattern>(false, isModal, isAsyncModalBinding);
59         });
60     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
61     CHECK_NULL_RETURN(pattern, frameNode);
62     pattern->SetDensityDpi(config.isDensityFollowHost);
63     pattern->UpdateWant(want);
64     auto pipeline = PipelineContext::GetCurrentContext();
65     CHECK_NULL_RETURN(pipeline, frameNode);
66     pipeline->AddWindowStateChangedCallback(nodeId);
67     pattern->SetOnReleaseCallback(std::move(callbacks.onRelease));
68     pattern->SetOnErrorCallback(std::move(callbacks.onError));
69     pattern->SetOnResultCallback(std::move(callbacks.onResult));
70     pattern->SetOnReceiveCallback(std::move(callbacks.onReceive));
71     pattern->SetModalOnRemoteReadyCallback(std::move(callbacks.onRemoteReady));
72     pattern->SetModalOnDestroy(std::move(callbacks.onDestroy));
73     auto dragDropManager = pipeline->GetDragDropManager();
74     CHECK_NULL_RETURN(dragDropManager, frameNode);
75     dragDropManager->AddDragFrameNode(nodeId, AceType::WeakClaim(AceType::RawPtr(frameNode)));
76     return frameNode;
77 }
78 
Create(const RefPtr<OHOS::Ace::WantWrap> & wantWrap,const RefPtr<FrameNode> & placeholderNode,bool transferringCaller,bool densityDpi)79 void UIExtensionModelNG::Create(const RefPtr<OHOS::Ace::WantWrap>& wantWrap, const RefPtr<FrameNode>& placeholderNode,
80     bool transferringCaller, bool densityDpi)
81 {
82     auto* stack = ViewStackProcessor::GetInstance();
83     auto nodeId = stack->ClaimNodeId();
84     auto frameNode = FrameNode::GetOrCreateFrameNode(V2::UI_EXTENSION_COMPONENT_ETS_TAG, nodeId,
85         [transferringCaller]() { return AceType::MakeRefPtr<UIExtensionPattern>(transferringCaller); });
86     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
87     CHECK_NULL_VOID(pattern);
88     pattern->SetNeedCheckWindowSceneId(true);
89     pattern->SetPlaceholderNode(placeholderNode);
90     pattern->UpdateWant(wantWrap);
91     pattern->SetDensityDpi(densityDpi);
92     stack->Push(frameNode);
93     auto pipeline = PipelineContext::GetCurrentContext();
94     CHECK_NULL_VOID(pipeline);
95     pipeline->AddWindowStateChangedCallback(nodeId);
96     auto dragDropManager = pipeline->GetDragDropManager();
97     CHECK_NULL_VOID(dragDropManager);
98     dragDropManager->AddDragFrameNode(nodeId, AceType::WeakClaim(AceType::RawPtr(frameNode)));
99 }
100 
101 // for EmbeddedComponent
Create(const RefPtr<OHOS::Ace::WantWrap> & wantWrap,SessionType sessionType)102 void UIExtensionModelNG::Create(const RefPtr<OHOS::Ace::WantWrap>& wantWrap, SessionType sessionType)
103 {
104     auto* stack = ViewStackProcessor::GetInstance();
105     auto nodeId = stack->ClaimNodeId();
106     auto frameNode = FrameNode::GetOrCreateFrameNode(V2::EMBEDDED_COMPONENT_ETS_TAG, nodeId,
107         [sessionType]() { return AceType::MakeRefPtr<UIExtensionPattern>(false, false, false, sessionType); });
108     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
109     CHECK_NULL_VOID(pattern);
110     pattern->SetNeedCheckWindowSceneId(true);
111     pattern->SetWantWrap(wantWrap);
112     if (frameNode->GetNodeStatus() == NodeStatus::NORMAL_NODE) {
113         pattern->UpdateWant(wantWrap);
114     }
115     stack->Push(frameNode);
116     auto pipeline = PipelineContext::GetCurrentContext();
117     CHECK_NULL_VOID(pipeline);
118     pipeline->AddWindowStateChangedCallback(nodeId);
119     auto dragDropManager = pipeline->GetDragDropManager();
120     CHECK_NULL_VOID(dragDropManager);
121     dragDropManager->AddDragFrameNode(nodeId, AceType::WeakClaim(AceType::RawPtr(frameNode)));
122 }
123 
124 // for DynamicComponent
Create()125 void UIExtensionModelNG::Create()
126 {
127     auto* stack = ViewStackProcessor::GetInstance();
128     auto nodeId = stack->ClaimNodeId();
129     auto frameNode = FrameNode::GetOrCreateFrameNode(
130         V2::ISOLATED_COMPONENT_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<IsolatedPattern>(); });
131     auto pattern = frameNode->GetPattern<IsolatedPattern>();
132     CHECK_NULL_VOID(pattern);
133     stack->Push(frameNode);
134     auto pipeline = PipelineContext::GetCurrentContext();
135     CHECK_NULL_VOID(pipeline);
136     pipeline->AddWindowStateChangedCallback(nodeId);
137 }
138 
Create(const UIExtensionConfig & config)139 void UIExtensionModelNG::Create(const UIExtensionConfig& config)
140 {
141     switch (config.sessionType) {
142         case SessionType::SECURITY_UI_EXTENSION_ABILITY:
143             CreateSecurityUIExtension(config);
144             break;
145         default:
146             LOGW("The type uiextension is not supported");
147     }
148 }
149 
CreateSecurityUIExtension(const UIExtensionConfig & config)150 void UIExtensionModelNG::CreateSecurityUIExtension(const UIExtensionConfig& config)
151 {
152     TAG_LOGI(AceLogTag::ACE_SECURITYUIEXTENSION, "CreateSecurityUIExtension");
153     auto* stack = ViewStackProcessor::GetInstance();
154     auto nodeId = stack->ClaimNodeId();
155     auto frameNode = FrameNode::GetOrCreateFrameNode(V2::UI_EXTENSION_COMPONENT_ETS_TAG, nodeId,
156         []() { return AceType::MakeRefPtr<SecurityUIExtensionPattern>(); });
157     auto pattern = frameNode->GetPattern<SecurityUIExtensionPattern>();
158     CHECK_NULL_VOID(pattern);
159     pattern->Initialize(config);
160     pattern->SetPlaceholderNode(config.placeholderNode);
161     pattern->UpdateWant(config.wantWrap);
162     pattern->SetDensityDpi(config.densityDpi);
163     stack->Push(frameNode);
164     auto pipeline = PipelineContext::GetCurrentContext();
165     CHECK_NULL_VOID(pipeline);
166     pipeline->AddWindowStateChangedCallback(nodeId);
167     auto dragDropManager = pipeline->GetDragDropManager();
168     CHECK_NULL_VOID(dragDropManager);
169     dragDropManager->AddDragFrameNode(nodeId, AceType::WeakClaim(AceType::RawPtr(frameNode)));
170 }
171 
InitializeDynamicComponent(const RefPtr<FrameNode> & frameNode,const std::string & hapPath,const std::string & abcPath,const std::string & entryPoint,void * runtime)172 void UIExtensionModelNG::InitializeDynamicComponent(const RefPtr<FrameNode>& frameNode, const std::string& hapPath,
173     const std::string& abcPath, const std::string& entryPoint, void* runtime)
174 {
175     auto pattern = frameNode->GetPattern<IsolatedPattern>();
176     CHECK_NULL_VOID(pattern);
177     pattern->InitializeDynamicComponent(hapPath, abcPath, entryPoint, runtime);
178 }
179 
InitializeIsolatedComponent(const RefPtr<NG::FrameNode> & frameNode,const RefPtr<OHOS::Ace::WantWrap> & wantWrap,void * runtime)180 void UIExtensionModelNG::InitializeIsolatedComponent(
181     const RefPtr<NG::FrameNode>& frameNode, const RefPtr<OHOS::Ace::WantWrap>& wantWrap, void* runtime)
182 {
183     auto pattern = frameNode->GetPattern<IsolatedPattern>();
184     CHECK_NULL_VOID(pattern);
185     pattern->InitializeIsolatedComponent(wantWrap, runtime);
186 }
187 
SetAdaptiveWidth(bool state)188 void UIExtensionModelNG::SetAdaptiveWidth(bool state)
189 {
190     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
191     CHECK_NULL_VOID(frameNode);
192     auto pattern = frameNode->GetPattern<IsolatedPattern>();
193     CHECK_NULL_VOID(pattern);
194     pattern->SetAdaptiveWidth(state);
195 }
196 
SetAdaptiveHeight(bool state)197 void UIExtensionModelNG::SetAdaptiveHeight(bool state)
198 {
199     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
200     CHECK_NULL_VOID(frameNode);
201     auto pattern = frameNode->GetPattern<IsolatedPattern>();
202     CHECK_NULL_VOID(pattern);
203     pattern->SetAdaptiveHeight(state);
204 }
205 
SetOnRemoteReady(std::function<void (const RefPtr<UIExtensionProxy> &)> && onRemoteReady)206 void UIExtensionModelNG::SetOnRemoteReady(std::function<void(const RefPtr<UIExtensionProxy>&)>&& onRemoteReady)
207 {
208     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
209     CHECK_NULL_VOID(frameNode);
210     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
211     CHECK_NULL_VOID(pattern);
212     pattern->SetOnRemoteReadyCallback(std::move(onRemoteReady));
213 }
214 
SetSecurityOnRemoteReady(std::function<void (const RefPtr<NG::SecurityUIExtensionProxy> &)> && onRemoteReady)215 void UIExtensionModelNG::SetSecurityOnRemoteReady(
216     std::function<void(const RefPtr<NG::SecurityUIExtensionProxy>&)>&& onRemoteReady)
217 {
218     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
219     CHECK_NULL_VOID(frameNode);
220     auto eventHub = frameNode->GetEventHub<UIExtensionHub>();
221     CHECK_NULL_VOID(eventHub);
222     eventHub->SetOnRemoteReadyCallback(std::move(onRemoteReady));
223     return;
224 }
225 
SetOnRelease(std::function<void (int32_t)> && onRelease)226 void UIExtensionModelNG::SetOnRelease(std::function<void(int32_t)>&& onRelease)
227 {
228     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
229     CHECK_NULL_VOID(frameNode);
230     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
231     CHECK_NULL_VOID(pattern);
232     pattern->SetOnReleaseCallback(std::move(onRelease));
233 }
234 
SetOnResult(std::function<void (int32_t,const AAFwk::Want &)> && onResult)235 void UIExtensionModelNG::SetOnResult(std::function<void(int32_t, const AAFwk::Want&)>&& onResult)
236 {
237     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
238     CHECK_NULL_VOID(frameNode);
239     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
240     pattern->SetOnResultCallback(std::move(onResult));
241 }
242 
SetOnTerminated(std::function<void (int32_t,const RefPtr<WantWrap> &)> && onTerminated,NG::SessionType sessionType)243 void UIExtensionModelNG::SetOnTerminated(
244     std::function<void(int32_t, const RefPtr<WantWrap>&)>&& onTerminated, NG::SessionType sessionType)
245 {
246     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
247     CHECK_NULL_VOID(frameNode);
248     if (sessionType == SessionType::SECURITY_UI_EXTENSION_ABILITY) {
249         auto eventHub = frameNode->GetEventHub<UIExtensionHub>();
250         CHECK_NULL_VOID(eventHub);
251         eventHub->SetOnTerminatedCallback(std::move(onTerminated));
252         return;
253     }
254 
255     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
256     pattern->SetOnTerminatedCallback(std::move(onTerminated));
257 }
258 
SetOnReceive(std::function<void (const AAFwk::WantParams &)> && onReceive,NG::SessionType sessionType)259 void UIExtensionModelNG::SetOnReceive(
260     std::function<void(const AAFwk::WantParams&)>&& onReceive, NG::SessionType sessionType)
261 {
262     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
263     CHECK_NULL_VOID(frameNode);
264     if (sessionType == SessionType::SECURITY_UI_EXTENSION_ABILITY) {
265         auto eventHub = frameNode->GetEventHub<UIExtensionHub>();
266         CHECK_NULL_VOID(eventHub);
267         eventHub->SetOnReceiveCallback(std::move(onReceive));
268         return;
269     }
270 
271     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
272     pattern->SetOnReceiveCallback(std::move(onReceive));
273 }
274 
SetOnError(std::function<void (int32_t code,const std::string & name,const std::string & message)> && onError,NG::SessionType sessionType)275 void UIExtensionModelNG::SetOnError(
276     std::function<void(int32_t code, const std::string& name, const std::string& message)>&& onError,
277     NG::SessionType sessionType)
278 {
279     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
280     CHECK_NULL_VOID(frameNode);
281     if (sessionType == SessionType::SECURITY_UI_EXTENSION_ABILITY) {
282         auto pattern = frameNode->GetPattern<SecurityUIExtensionPattern>();
283         CHECK_NULL_VOID(pattern);
284         pattern->SetOnErrorCallback(std::move(onError));
285         return;
286     }
287 
288     auto pattern = frameNode->GetPattern<UIExtensionPattern>();
289     CHECK_NULL_VOID(pattern);
290     pattern->SetOnErrorCallback(std::move(onError));
291 }
292 
SetPlatformOnError(std::function<void (int32_t code,const std::string & name,const std::string & message)> && onError)293 void UIExtensionModelNG::SetPlatformOnError(
294     std::function<void(int32_t code, const std::string& name, const std::string& message)>&& onError)
295 {
296     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
297     CHECK_NULL_VOID(frameNode);
298     auto pattern = frameNode->GetPattern<IsolatedPattern>();
299     CHECK_NULL_VOID(pattern);
300     pattern->SetOnErrorCallback(std::move(onError));
301 }
302 } // namespace OHOS::Ace::NG
303