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