1 /*
2  * Copyright (c) 2022-2023 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/xcomponent/xcomponent_model_ng.h"
17 #include <optional>
18 
19 #include "core/components_ng/base/view_stack_processor.h"
20 #include "core/components_ng/pattern/xcomponent/xcomponent_event_hub.h"
21 #include "core/components_ng/pattern/xcomponent/xcomponent_layout_property.h"
22 #include "core/components_ng/pattern/xcomponent/xcomponent_pattern.h"
23 #include "core/components_v2/inspector/inspector_constants.h"
24 
25 namespace OHOS::Ace::NG {
26 const uint32_t DEFAULT_SURFACE_SIZE = 0;
Create(const std::optional<std::string> & id,XComponentType type,const std::optional<std::string> & libraryname,const std::shared_ptr<InnerXComponentController> & xcomponentController)27 void XComponentModelNG::Create(const std::optional<std::string>& id, XComponentType type,
28     const std::optional<std::string>& libraryname,
29     const std::shared_ptr<InnerXComponentController>& xcomponentController)
30 {
31     auto* stack = ViewStackProcessor::GetInstance();
32     auto nodeId = stack->ClaimNodeId();
33     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::XCOMPONENT_ETS_TAG, nodeId);
34     auto frameNode = FrameNode::GetOrCreateFrameNode(
35         V2::XCOMPONENT_ETS_TAG, nodeId, [id, type, libraryname, xcomponentController]() {
36             return AceType::MakeRefPtr<XComponentPattern>(id, type, libraryname, xcomponentController);
37         });
38     stack->Push(frameNode);
39     ACE_UPDATE_LAYOUT_PROPERTY(XComponentLayoutProperty, XComponentType, type);
40 }
41 
Create(int32_t nodeId,float width,float height,const std::string & id,XComponentType type,const std::string & libraryname,const std::shared_ptr<InnerXComponentController> & xcomponentController)42 RefPtr<AceType> XComponentModelNG::Create(int32_t nodeId, float width, float height, const std::string& id,
43     XComponentType type, const std::string& libraryname,
44     const std::shared_ptr<InnerXComponentController>& xcomponentController)
45 {
46     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::XCOMPONENT_ETS_TAG, nodeId);
47     auto calcWidth = CalcLength(width, DimensionUnit::VP);
48     auto calcHeight = CalcLength(height, DimensionUnit::VP);
49     auto frameNode = FrameNode::GetOrCreateFrameNode(
50         V2::XCOMPONENT_ETS_TAG, nodeId, [id, type, libraryname, xcomponentController, calcWidth, calcHeight]() {
51             return AceType::MakeRefPtr<XComponentPattern>(id, type, libraryname, xcomponentController,
52                 calcWidth.GetDimension().ConvertToPx(), calcHeight.GetDimension().ConvertToPx());
53         });
54 
55     CHECK_NULL_RETURN(frameNode, nullptr);
56     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
57     if (layoutProperty) {
58         layoutProperty->UpdateXComponentType(type);
59         layoutProperty->UpdateUserDefinedIdealSize(CalcSize(calcWidth, calcHeight));
60     }
61     return frameNode;
62 }
63 
InitXComponent(FrameNode * frameNode)64 void XComponentModelNG::InitXComponent(FrameNode* frameNode)
65 {
66     CHECK_NULL_VOID(frameNode);
67     auto node = AceType::Claim(frameNode);
68     auto type = GetTypeImpl(node);
69     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
70         return;
71     }
72     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
73     CHECK_NULL_VOID(xcPattern);
74     xcPattern->InitXComponent();
75 }
76 
GetLibraryName()77 std::optional<std::string> XComponentModelNG::GetLibraryName()
78 {
79     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
80     CHECK_NULL_RETURN(frameNode, std::nullopt);
81     auto type = GetTypeImpl(frameNode);
82     if (type == XComponentType::COMPONENT) {
83         return std::nullopt;
84     }
85     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
86     CHECK_NULL_RETURN(xcPattern, std::nullopt);
87     return xcPattern->GetLibraryName();
88 }
89 
SetSoPath(const std::string & soPath)90 void XComponentModelNG::SetSoPath(const std::string& soPath)
91 {
92     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
93     CHECK_NULL_VOID(frameNode);
94     auto type = GetTypeImpl(frameNode);
95     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
96         return;
97     }
98     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
99     CHECK_NULL_VOID(xcPattern);
100     xcPattern->SetSoPath(soPath);
101 }
102 
GetTypeImpl(const RefPtr<FrameNode> & frameNode)103 XComponentType XComponentModelNG::GetTypeImpl(const RefPtr<FrameNode>& frameNode)
104 {
105     CHECK_NULL_RETURN(frameNode, XComponentType::UNKNOWN);
106     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
107     CHECK_NULL_RETURN(layoutProperty, XComponentType::UNKNOWN);
108     return layoutProperty->GetXComponentTypeValue();
109 }
110 
GetType()111 XComponentType XComponentModelNG::GetType()
112 {
113     return GetTypeImpl(AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode()));
114 }
115 
SetOnLoad(LoadEvent && onLoad)116 void XComponentModelNG::SetOnLoad(LoadEvent&& onLoad)
117 {
118     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
119     CHECK_NULL_VOID(frameNode);
120     auto type = GetTypeImpl(frameNode);
121     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
122         return;
123     }
124     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
125     CHECK_NULL_VOID(eventHub);
126     eventHub->SetOnLoad(std::move(onLoad));
127 }
128 
SetOnLoad(FrameNode * frameNode,LoadEvent && onLoad)129 void XComponentModelNG::SetOnLoad(FrameNode* frameNode, LoadEvent&& onLoad)
130 {
131     CHECK_NULL_VOID(frameNode);
132     auto node = AceType::Claim(frameNode);
133     auto type = GetTypeImpl(node);
134     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
135         return;
136     }
137     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
138     CHECK_NULL_VOID(xcPattern);
139     if (xcPattern->NeedTriggerLoadEventImmediately()) {
140         if (onLoad) {
141             onLoad(xcPattern->GetId());
142         }
143         return;
144     }
145     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
146     CHECK_NULL_VOID(eventHub);
147     eventHub->SetOnLoad(std::move(onLoad));
148 }
149 
SetOnDestroy(DestroyEvent && onDestroy)150 void XComponentModelNG::SetOnDestroy(DestroyEvent&& onDestroy)
151 {
152     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
153     CHECK_NULL_VOID(frameNode);
154     auto type = GetTypeImpl(frameNode);
155     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
156         return;
157     }
158     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
159     CHECK_NULL_VOID(eventHub);
160     eventHub->SetOnDestroy(std::move(onDestroy));
161 }
162 
SetOnDestroy(FrameNode * frameNode,DestroyEvent && onDestroy)163 void XComponentModelNG::SetOnDestroy(FrameNode* frameNode, DestroyEvent&& onDestroy)
164 {
165     CHECK_NULL_VOID(frameNode);
166     auto node = AceType::Claim(frameNode);
167     auto type = GetTypeImpl(node);
168     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
169         return;
170     }
171     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
172     CHECK_NULL_VOID(eventHub);
173     eventHub->SetOnDestroy(std::move(onDestroy));
174 }
175 
RegisterOnCreate(const RefPtr<AceType> & node,LoadEvent && onLoad)176 void XComponentModelNG::RegisterOnCreate(const RefPtr<AceType>& node, LoadEvent&& onLoad)
177 {
178     auto frameNode = AceType::DynamicCast<NG::FrameNode>(node);
179     CHECK_NULL_VOID(frameNode);
180     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
181     if (!layoutProperty || layoutProperty->GetXComponentTypeValue() == XComponentType::COMPONENT) {
182         return;
183     }
184     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
185     CHECK_NULL_VOID(eventHub);
186     eventHub->SetOnLoad(std::move(onLoad));
187 }
188 
RegisterOnDestroy(const RefPtr<AceType> & node,DestroyEvent && onDestroy)189 void XComponentModelNG::RegisterOnDestroy(const RefPtr<AceType>& node, DestroyEvent&& onDestroy)
190 {
191     auto frameNode = AceType::DynamicCast<NG::FrameNode>(node);
192     CHECK_NULL_VOID(frameNode);
193     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
194     if (!layoutProperty || layoutProperty->GetXComponentTypeValue() == XComponentType::COMPONENT) {
195         return;
196     }
197     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
198     CHECK_NULL_VOID(eventHub);
199     eventHub->SetOnDestroy(std::move(onDestroy));
200 }
201 
IsTexture()202 bool XComponentModelNG::IsTexture()
203 {
204     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
205     CHECK_NULL_RETURN(frameNode, false);
206     return GetTypeImpl(frameNode) == XComponentType::TEXTURE;
207 }
208 
SetDetachCallback(DetachCallback && onDetach)209 void XComponentModelNG::SetDetachCallback(DetachCallback&& onDetach)
210 {
211     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
212     CHECK_NULL_VOID(frameNode);
213     auto type = GetTypeImpl(frameNode);
214     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
215         return;
216     }
217     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
218     CHECK_NULL_VOID(eventHub);
219     eventHub->SetDetachEvent(std::move(onDetach));
220 }
221 
SetControllerOnCreated(SurfaceCreatedEvent && onCreated)222 void XComponentModelNG::SetControllerOnCreated(SurfaceCreatedEvent&& onCreated)
223 {
224     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
225     CHECK_NULL_VOID(frameNode);
226     auto type = GetTypeImpl(frameNode);
227     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
228         return;
229     }
230     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
231     CHECK_NULL_VOID(eventHub);
232     eventHub->SetControllerCreatedEvent(std::move(onCreated));
233 }
234 
SetControllerOnChanged(SurfaceChangedEvent && onChanged)235 void XComponentModelNG::SetControllerOnChanged(SurfaceChangedEvent&& onChanged)
236 {
237     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
238     CHECK_NULL_VOID(frameNode);
239     auto type = GetTypeImpl(frameNode);
240     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
241         return;
242     }
243     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
244     CHECK_NULL_VOID(eventHub);
245     eventHub->SetControllerChangedEvent(std::move(onChanged));
246 }
247 
SetControllerOnDestroyed(SurfaceDestroyedEvent && onDestroyed)248 void XComponentModelNG::SetControllerOnDestroyed(SurfaceDestroyedEvent&& onDestroyed)
249 {
250     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
251     CHECK_NULL_VOID(frameNode);
252     auto type = GetTypeImpl(frameNode);
253     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
254         return;
255     }
256     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
257     CHECK_NULL_VOID(eventHub);
258     eventHub->SetControllerDestroyedEvent(std::move(onDestroyed));
259 }
260 
SetRenderFit(RenderFit renderFit)261 void XComponentModelNG::SetRenderFit(RenderFit renderFit)
262 {
263     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
264     CHECK_NULL_VOID(frameNode);
265     auto type = GetTypeImpl(frameNode);
266     if (type != XComponentType::SURFACE) {
267         return;
268     }
269     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
270     CHECK_NULL_VOID(xcPattern);
271     xcPattern->SetRenderFit(renderFit);
272 }
273 
EnableSecure(bool isSecure)274 void XComponentModelNG::EnableSecure(bool isSecure)
275 {
276     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
277     CHECK_NULL_VOID(frameNode);
278     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
279     CHECK_NULL_VOID(xcPattern);
280     xcPattern->EnableSecure(isSecure);
281 }
282 
IsTexture(FrameNode * frameNode)283 bool XComponentModelNG::IsTexture(FrameNode *frameNode)
284 {
285     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
286     CHECK_NULL_RETURN(layoutProperty, false);
287     return layoutProperty->GetXComponentTypeValue() == XComponentType::TEXTURE;
288 }
289 
GetType(FrameNode * frameNode)290 XComponentType XComponentModelNG::GetType(FrameNode* frameNode)
291 {
292     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
293     CHECK_NULL_RETURN(layoutProperty, XComponentType::SURFACE);
294     return layoutProperty->GetXComponentTypeValue(XComponentType::SURFACE);
295 }
296 
CreateFrameNode(int32_t nodeId,const std::string & id,XComponentType type,const std::optional<std::string> & libraryname)297 RefPtr<FrameNode> XComponentModelNG::CreateFrameNode(int32_t nodeId, const std::string& id, XComponentType type,
298     const std::optional<std::string>& libraryname)
299 {
300     std::shared_ptr<InnerXComponentController> controller = nullptr;
301     auto frameNode = FrameNode::CreateFrameNode(
302         V2::XCOMPONENT_ETS_TAG, nodeId, AceType::MakeRefPtr<XComponentPattern>(id, type, libraryname, controller));
303     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
304     if (layoutProperty) {
305         layoutProperty->UpdateXComponentType(type);
306     }
307     return frameNode;
308 }
309 
CreateTypeNode(int32_t nodeId,ArkUI_XComponent_Params * params)310 RefPtr<FrameNode> XComponentModelNG::CreateTypeNode(int32_t nodeId, ArkUI_XComponent_Params* params)
311 {
312     auto id = params->id;
313     auto type = params->type;
314     auto libraryName = params->libraryName;
315     auto controller = params->controller;
316 
317     auto frameNode = FrameNode::CreateFrameNode(V2::XCOMPONENT_ETS_TAG, nodeId,
318         AceType::MakeRefPtr<XComponentPattern>(id, type, libraryName, controller, 0.0, 0.0, true));
319     auto layoutProperty = frameNode->GetLayoutProperty<XComponentLayoutProperty>();
320     if (layoutProperty) {
321         layoutProperty->UpdateXComponentType(type);
322     }
323     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
324     CHECK_NULL_RETURN(xcPattern, nullptr);
325     xcPattern->SetImageAIOptions(params->aiOptions);
326     return frameNode;
327 }
328 
SetXComponentId(FrameNode * frameNode,const std::string & id)329 void XComponentModelNG::SetXComponentId(FrameNode* frameNode, const std::string& id)
330 {
331     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
332     CHECK_NULL_VOID(xcPattern);
333     xcPattern->SetId(id);
334 }
335 
SetXComponentType(FrameNode * frameNode,XComponentType type)336 void XComponentModelNG::SetXComponentType(FrameNode* frameNode, XComponentType type)
337 {
338     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
339     CHECK_NULL_VOID(xcPattern);
340     xcPattern->SetType(type);
341     ACE_UPDATE_NODE_LAYOUT_PROPERTY(XComponentLayoutProperty, XComponentType, type, frameNode);
342 }
343 
SetXComponentSurfaceSize(FrameNode * frameNode,uint32_t width,uint32_t height)344 void XComponentModelNG::SetXComponentSurfaceSize(FrameNode* frameNode, uint32_t width, uint32_t height)
345 {
346     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
347     CHECK_NULL_VOID(xcPattern);
348     xcPattern->ConfigSurface(width, height);
349 }
350 
GetXComponentId(FrameNode * frameNode)351 std::string XComponentModelNG::GetXComponentId(FrameNode* frameNode)
352 {
353     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
354     CHECK_NULL_RETURN(xcPattern, "");
355     return xcPattern->GetId();
356 }
357 
GetXComponentType(FrameNode * frameNode)358 XComponentType XComponentModelNG::GetXComponentType(FrameNode* frameNode)
359 {
360     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
361     CHECK_NULL_RETURN(xcPattern, XComponentType::SURFACE);
362     return xcPattern->GetType();
363 }
364 
GetXComponentSurfaceWidth(FrameNode * frameNode)365 uint32_t XComponentModelNG::GetXComponentSurfaceWidth(FrameNode* frameNode)
366 {
367     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
368     CHECK_NULL_RETURN(xcPattern, DEFAULT_SURFACE_SIZE);
369     auto drawSize = xcPattern->GetDrawSize();
370     return drawSize.Width();
371 }
372 
GetXComponentSurfaceHeight(FrameNode * frameNode)373 uint32_t XComponentModelNG::GetXComponentSurfaceHeight(FrameNode* frameNode)
374 {
375     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
376     CHECK_NULL_RETURN(xcPattern, DEFAULT_SURFACE_SIZE);
377     auto drawSize = xcPattern->GetDrawSize();
378     return drawSize.Height();
379 }
380 
EnableAnalyzer(bool enable)381 void XComponentModelNG::EnableAnalyzer(bool enable)
382 {
383     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
384     CHECK_NULL_VOID(frameNode);
385     auto type = GetTypeImpl(frameNode);
386     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
387         return;
388     }
389     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
390     CHECK_NULL_VOID(xcPattern);
391     xcPattern->EnableAnalyzer(enable);
392 }
393 
EnableAnalyzer(FrameNode * frameNode,bool enable)394 void XComponentModelNG::EnableAnalyzer(FrameNode* frameNode, bool enable)
395 {
396     CHECK_NULL_VOID(frameNode);
397     auto node = AceType::Claim(frameNode);
398     auto type = GetTypeImpl(node);
399     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
400         return;
401     }
402     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
403     CHECK_NULL_VOID(xcPattern);
404     xcPattern->EnableAnalyzer(enable);
405 }
406 
SetImageAIOptions(void * options)407 void XComponentModelNG::SetImageAIOptions(void* options)
408 {
409     auto frameNode = AceType::Claim(ViewStackProcessor::GetInstance()->GetMainFrameNode());
410     CHECK_NULL_VOID(frameNode);
411     auto type = GetTypeImpl(frameNode);
412     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
413         return;
414     }
415     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
416     CHECK_NULL_VOID(xcPattern);
417     xcPattern->SetImageAIOptions(options);
418 }
419 
SetXComponentLibraryname(FrameNode * frameNode,const std::string & libraryname)420 void XComponentModelNG::SetXComponentLibraryname(FrameNode* frameNode, const std::string& libraryname)
421 {
422     CHECK_NULL_VOID(frameNode);
423     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
424     CHECK_NULL_VOID(xcPattern);
425     xcPattern->SetLibraryName(libraryname);
426 }
427 
SetControllerOnCreated(FrameNode * frameNode,SurfaceCreatedEvent && onCreated)428 void XComponentModelNG::SetControllerOnCreated(FrameNode* frameNode, SurfaceCreatedEvent&& onCreated)
429 {
430     CHECK_NULL_VOID(frameNode);
431     auto node = AceType::Claim(frameNode);
432     auto type = GetTypeImpl(node);
433     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
434         return;
435     }
436     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
437     CHECK_NULL_VOID(eventHub);
438     eventHub->SetControllerCreatedEvent(std::move(onCreated));
439 }
440 
SetControllerOnChanged(FrameNode * frameNode,SurfaceChangedEvent && onChanged)441 void XComponentModelNG::SetControllerOnChanged(FrameNode* frameNode, SurfaceChangedEvent&& onChanged)
442 {
443     CHECK_NULL_VOID(frameNode);
444     auto node = AceType::Claim(frameNode);
445     auto type = GetTypeImpl(node);
446     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
447         return;
448     }
449     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
450     CHECK_NULL_VOID(eventHub);
451     eventHub->SetControllerChangedEvent(std::move(onChanged));
452 }
453 
SetControllerOnDestroyed(FrameNode * frameNode,SurfaceDestroyedEvent && onDestroyed)454 void XComponentModelNG::SetControllerOnDestroyed(FrameNode* frameNode, SurfaceDestroyedEvent&& onDestroyed)
455 {
456     CHECK_NULL_VOID(frameNode);
457     auto node = AceType::Claim(frameNode);
458     auto type = GetTypeImpl(node);
459     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
460         return;
461     }
462     auto eventHub = frameNode->GetEventHub<XComponentEventHub>();
463     CHECK_NULL_VOID(eventHub);
464     eventHub->SetControllerDestroyedEvent(std::move(onDestroyed));
465 }
466 
SetDetachCallback(FrameNode * frameNode,DetachCallback && onDetach)467 void XComponentModelNG::SetDetachCallback(FrameNode* frameNode, DetachCallback&& onDetach)
468 {
469     CHECK_NULL_VOID(frameNode);
470     auto node = AceType::Claim(frameNode);
471     auto type = GetTypeImpl(node);
472     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
473         return;
474     }
475     auto eventHub = node->GetEventHub<XComponentEventHub>();
476     CHECK_NULL_VOID(eventHub);
477     eventHub->SetDetachEvent(std::move(onDetach));
478 }
479 
SetImageAIOptions(FrameNode * frameNode,void * options)480 void XComponentModelNG::SetImageAIOptions(FrameNode* frameNode, void* options)
481 {
482     CHECK_NULL_VOID(frameNode);
483     auto node = AceType::Claim(frameNode);
484     auto type = GetTypeImpl(node);
485     if (type == XComponentType::COMPONENT || type == XComponentType::NODE) {
486         return;
487     }
488     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
489     CHECK_NULL_VOID(xcPattern);
490     xcPattern->SetImageAIOptions(options);
491 }
492 
EnableSecure(FrameNode * frameNode,bool enable)493 void XComponentModelNG::EnableSecure(FrameNode* frameNode, bool enable)
494 {
495     CHECK_NULL_VOID(frameNode);
496     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
497     CHECK_NULL_VOID(xcPattern);
498     xcPattern->EnableSecure(enable);
499 }
500 
SetRenderFit(FrameNode * frameNode,RenderFit renderFit)501 void XComponentModelNG::SetRenderFit(FrameNode* frameNode, RenderFit renderFit)
502 {
503     CHECK_NULL_VOID(frameNode);
504     auto xcPattern = AceType::DynamicCast<XComponentPattern>(frameNode->GetPattern());
505     CHECK_NULL_VOID(xcPattern);
506     xcPattern->SetRenderFit(renderFit);
507 }
508 } // namespace OHOS::Ace::NG
509