• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 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/common/ai/image_analyzer_manager.h"
17 
18 #include "core/common/ai/image_analyzer_adapter.h"
19 #include "core/common/ai/image_analyzer_mgr.h"
20 #include "core/components_ng/base/view_stack_processor.h"
21 #include "core/components_ng/pattern/image/image_pattern.h"
22 #include "core/components_ng/pattern/video/video_layout_property.h"
23 
24 namespace OHOS::Ace {
25 
ImageAnalyzerManager(const RefPtr<NG::FrameNode> & frameNode,ImageAnalyzerHolder holder)26 ImageAnalyzerManager::ImageAnalyzerManager(const RefPtr<NG::FrameNode>& frameNode, ImageAnalyzerHolder holder)
27     : frameNode_(frameNode), holder_(holder)
28 {
29     imageAnalyzerAdapter_ = std::shared_ptr<ImageAnalyzerAdapter>(CreateImageAnalyzerAdapter());
30 }
31 
CreateAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap> & pixelMap,const NG::OffsetF & offset)32 void ImageAnalyzerManager::CreateAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap>& pixelMap,
33     const NG::OffsetF& offset)
34 {
35     CHECK_NULL_VOID(imageAnalyzerAdapter_);
36     void* pixelmapNapiVal = nullptr;
37     if (pixelMap) {
38         pixelmapNapiVal = imageAnalyzerAdapter_->ConvertPixmapNapi(pixelMap);
39     }
40 
41     analyzerUIConfig_.holder = holder_;
42     if (holder_ != ImageAnalyzerHolder::IMAGE && holder_ != ImageAnalyzerHolder::WEB) {
43         analyzerUIConfig_.contentWidth = pixelMap->GetWidth();
44         analyzerUIConfig_.contentHeight = pixelMap->GetHeight();
45     }
46 
47     if (holder_ == ImageAnalyzerHolder::VIDEO_CUSTOM) {
48         analyzerUIConfig_.pixelMapWidth = pixelMap->GetWidth();
49         analyzerUIConfig_.pixelMapHeight = pixelMap->GetHeight();
50         analyzerUIConfig_.overlayOffset = offset;
51     }
52 
53     RefPtr<NG::UINode> customNode;
54     {
55         NG::ScopedViewStackProcessor builderViewStackProcessor;
56         auto analyzerConfig = imageAnalyzerAdapter_->GetImageAnalyzerConfig();
57         ImageAnalyzerMgr::GetInstance().BuildNodeFunc(
58             pixelmapNapiVal, analyzerConfig, &analyzerUIConfig_, &overlayData_);
59         customNode = NG::ViewStackProcessor::GetInstance()->Finish();
60     }
61     auto overlayNode = AceType::DynamicCast<NG::FrameNode>(customNode);
62     CHECK_NULL_VOID(overlayNode);
63     auto node = frameNode_.Upgrade();
64     CHECK_NULL_VOID(node);
65     node->SetOverlayNode(overlayNode);
66     overlayNode->SetParent(AceType::WeakClaim(AceType::RawPtr(node)));
67     overlayNode->SetActive(true);
68     UpdateAnalyzerOverlayLayout();
69 
70     auto renderContext = overlayNode->GetRenderContext();
71     CHECK_NULL_VOID(renderContext);
72     renderContext->UpdateZIndex(INT32_MAX);
73     auto focusHub = overlayNode->GetOrCreateFocusHub();
74     CHECK_NULL_VOID(focusHub);
75     focusHub->SetFocusable(false);
76     overlayNode->MarkDirtyNode(NG::PROPERTY_UPDATE_MEASURE_SELF);
77 
78     isAnalyzerOverlayBuild_ = true;
79     CHECK_NULL_VOID(analyzerUIConfig_.onAnalyzed);
80     (analyzerUIConfig_.onAnalyzed.value())(ImageAnalyzerState::FINISHED);
81     analyzerUIConfig_.onAnalyzed = std::nullopt;
82 }
83 
CreateMovingPhotoAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap> & pixelMap,MovingPhotoAnalyzerInfo info)84 void ImageAnalyzerManager::CreateMovingPhotoAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap>& pixelMap,
85     MovingPhotoAnalyzerInfo info)
86 {
87     CHECK_NULL_VOID(imageAnalyzerAdapter_);
88     void* pixelmapNapiVal = nullptr;
89 
90     CHECK_NULL_VOID(pixelMap);
91     pixelmapNapiVal = imageAnalyzerAdapter_->ConvertPixmapNapi(pixelMap);
92     analyzerUIConfig_.holder = holder_;
93     analyzerUIConfig_.contentWidth = info.contentWidth;
94     analyzerUIConfig_.contentHeight = info.contentHeight;
95     analyzerUIConfig_.pixelMapWidth = pixelMap->GetWidth();
96     analyzerUIConfig_.pixelMapHeight = pixelMap->GetHeight();
97 
98     RefPtr<NG::UINode> customNode;
99     {
100         NG::ScopedViewStackProcessor builderViewStackProcessor;
101         auto analyzerConfig = imageAnalyzerAdapter_->GetImageAnalyzerConfig();
102         ImageAnalyzerMgr::GetInstance().BuildNodeFunc(info.uri, pixelmapNapiVal,
103             info.frameTimestamp, analyzerConfig, &analyzerUIConfig_, &overlayData_);
104         customNode = NG::ViewStackProcessor::GetInstance()->Finish();
105     }
106     auto overlayNode = AceType::DynamicCast<NG::FrameNode>(customNode);
107     CHECK_NULL_VOID(overlayNode);
108     auto node = frameNode_.Upgrade();
109     CHECK_NULL_VOID(node);
110     node->SetOverlayNode(overlayNode);
111     overlayNode->SetParent(AceType::WeakClaim(AceType::RawPtr(node)));
112     overlayNode->SetActive(true);
113     UpdateAnalyzerOverlayLayout();
114 
115     auto renderContext = overlayNode->GetRenderContext();
116     CHECK_NULL_VOID(renderContext);
117     renderContext->UpdateZIndex(INT32_MAX);
118     overlayNode->MarkDirtyNode(NG::PROPERTY_UPDATE_MEASURE_SELF);
119 
120     isAnalyzerOverlayBuild_ = true;
121     CHECK_NULL_VOID(analyzerUIConfig_.onAnalyzed);
122     (analyzerUIConfig_.onAnalyzed.value())(ImageAnalyzerState::FINISHED);
123     analyzerUIConfig_.onAnalyzed = std::nullopt;
124 }
125 
UpdateAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap> & pixelMap,const NG::OffsetF & offset)126 void ImageAnalyzerManager::UpdateAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap>& pixelMap,
127     const NG::OffsetF& offset)
128 {
129     if (!isAnalyzerOverlayBuild_) {
130         return;
131     }
132 
133     auto node = frameNode_.Upgrade();
134     CHECK_NULL_VOID(node);
135     if (holder_ == ImageAnalyzerHolder::IMAGE) {
136         auto imagePattern = AceType::DynamicCast<NG::ImagePattern>(node->GetPattern());
137         CHECK_NULL_VOID(imagePattern);
138         if (!imagePattern->hasSceneChanged()) {
139             return;
140         }
141     }
142 
143     CHECK_NULL_VOID(pixelMap);
144     if (holder_ == ImageAnalyzerHolder::VIDEO_CUSTOM) {
145         analyzerUIConfig_.pixelMapWidth = pixelMap->GetWidth();
146         analyzerUIConfig_.pixelMapHeight = pixelMap->GetHeight();
147         analyzerUIConfig_.overlayOffset = offset;
148     }
149 
150     if (holder_ != ImageAnalyzerHolder::IMAGE) {
151         analyzerUIConfig_.contentWidth = pixelMap->GetWidth();
152         analyzerUIConfig_.contentHeight = pixelMap->GetHeight();
153     }
154 
155     CHECK_NULL_VOID(imageAnalyzerAdapter_);
156     auto pixelmapNapiVal = imageAnalyzerAdapter_->ConvertPixmapNapi(pixelMap);
157     auto overlayNode = node->GetOverlayNode();
158     CHECK_NULL_VOID(overlayNode);
159     auto analyzerConfig = imageAnalyzerAdapter_->GetImageAnalyzerConfig();
160     ImageAnalyzerMgr::GetInstance().UpdateImage(&overlayData_, pixelmapNapiVal, analyzerConfig, &analyzerUIConfig_);
161     overlayNode->MarkDirtyNode(NG::PROPERTY_UPDATE_MEASURE_SELF);
162 }
163 
UpdateMovingPhotoAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap> & pixelMap,MovingPhotoAnalyzerInfo info)164 void ImageAnalyzerManager::UpdateMovingPhotoAnalyzerOverlay(const RefPtr<OHOS::Ace::PixelMap>& pixelMap,
165     MovingPhotoAnalyzerInfo info)
166 {
167     if (!isAnalyzerOverlayBuild_) {
168         return;
169     }
170 
171     auto node = frameNode_.Upgrade();
172     CHECK_NULL_VOID(node);
173     if (holder_ == ImageAnalyzerHolder::IMAGE) {
174         auto imagePattern = AceType::DynamicCast<NG::ImagePattern>(node->GetPattern());
175         CHECK_NULL_VOID(imagePattern);
176         if (!imagePattern->hasSceneChanged()) {
177             return;
178         }
179     }
180 
181     CHECK_NULL_VOID(pixelMap);
182     analyzerUIConfig_.holder = holder_;
183     analyzerUIConfig_.contentWidth = info.contentWidth;
184     analyzerUIConfig_.contentHeight = info.contentHeight;
185     analyzerUIConfig_.pixelMapWidth = pixelMap->GetWidth();
186     analyzerUIConfig_.pixelMapHeight = pixelMap->GetHeight();
187 
188     CHECK_NULL_VOID(imageAnalyzerAdapter_);
189     auto pixelmapNapiVal = imageAnalyzerAdapter_->ConvertPixmapNapi(pixelMap);
190     auto overlayNode = node->GetOverlayNode();
191     CHECK_NULL_VOID(overlayNode);
192     auto analyzerConfig = imageAnalyzerAdapter_->GetImageAnalyzerConfig();
193     ImageAnalyzerMgr::GetInstance().UpdateImage(&overlayData_, info.uri, pixelmapNapiVal,
194         info.frameTimestamp, analyzerConfig, &analyzerUIConfig_);
195     overlayNode->MarkDirtyNode(NG::PROPERTY_UPDATE_MEASURE_SELF);
196 }
197 
DestroyAnalyzerOverlay()198 void ImageAnalyzerManager::DestroyAnalyzerOverlay()
199 {
200     ReleaseImageAnalyzer();
201 
202     if (!isAnalyzerOverlayBuild_) {
203         return;
204     }
205     auto node = frameNode_.Upgrade();
206     CHECK_NULL_VOID(node);
207     auto overlayNode = node->GetOverlayNode();
208     CHECK_NULL_VOID(overlayNode);
209     node->SetOverlayNode(RefPtr<NG::FrameNode>());
210 
211     isAnalyzerOverlayBuild_ = false;
212     CHECK_NULL_VOID(analyzerUIConfig_.onAnalyzed);
213     (analyzerUIConfig_.onAnalyzed.value())(ImageAnalyzerState::STOPPED);
214     analyzerUIConfig_.onAnalyzed = std::nullopt;
215 
216     napi_value nullValue = nullptr;
217     CHECK_NULL_VOID(imageAnalyzerAdapter_);
218     imageAnalyzerAdapter_->SetImageAnalyzerConfig(nullValue);
219 }
220 
IsSupportImageAnalyzerFeature()221 bool ImageAnalyzerManager::IsSupportImageAnalyzerFeature()
222 {
223     auto node = frameNode_.Upgrade();
224     CHECK_NULL_RETURN(node, false);
225     auto eventHub = node->GetOrCreateEventHub<NG::EventHub>();
226     CHECK_NULL_RETURN(eventHub, false);
227     if (!eventHub->IsEnabled()) {
228         return false;
229     }
230 
231     bool hasObscured = false;
232     if (node->GetRenderContext()->GetObscured().has_value()) {
233         auto obscuredReasons = node->GetRenderContext()->GetObscured().value();
234         hasObscured = std::any_of(obscuredReasons.begin(), obscuredReasons.end(),
235             [](const auto& reason) { return reason == ObscuredReasons::PLACEHOLDER; });
236         if (hasObscured) {
237             return false;
238         }
239     }
240 
241     if (holder_ == ImageAnalyzerHolder::IMAGE) {
242         auto imageRenderProperty = node->GetPaintProperty<NG::ImageRenderProperty>();
243         CHECK_NULL_RETURN(imageRenderProperty, false);
244         ImageRepeat repeat = imageRenderProperty->GetImageRepeat().value_or(ImageRepeat::NO_REPEAT);
245         if (repeat != ImageRepeat::NO_REPEAT) {
246             return false;
247         }
248     }
249 
250     return ImageAnalyzerMgr::GetInstance().IsImageAnalyzerSupported();
251 }
252 
IsOverlayCreated()253 bool ImageAnalyzerManager::IsOverlayCreated()
254 {
255     return isAnalyzerOverlayBuild_;
256 }
257 
UpdateAnalyzerOverlayLayout()258 void ImageAnalyzerManager::UpdateAnalyzerOverlayLayout()
259 {
260     auto node = frameNode_.Upgrade();
261     CHECK_NULL_VOID(node);
262     auto layoutProperty = node->GetLayoutProperty();
263     CHECK_NULL_VOID(layoutProperty);
264     auto padding = layoutProperty->CreatePaddingAndBorder();
265     auto overlayNode = node->GetOverlayNode();
266     CHECK_NULL_VOID(overlayNode);
267     auto overlayLayoutProperty = overlayNode->GetLayoutProperty();
268     CHECK_NULL_VOID(overlayLayoutProperty);
269     overlayLayoutProperty->UpdateMeasureType(NG::MeasureType::MATCH_PARENT);
270     overlayLayoutProperty->UpdateAlignment(Alignment::TOP_LEFT);
271     if (NeedUpdateOverlayOffset()) {
272         overlayLayoutProperty->SetOverlayOffset(Dimension(padding.Offset().GetX()),
273                                                 Dimension(padding.Offset().GetY()));
274         if (holder_ == ImageAnalyzerHolder::IMAGE) {
275             auto renderContext = overlayNode->GetRenderContext();
276             CHECK_NULL_VOID(renderContext);
277             renderContext->SetRenderFrameOffset({ -padding.Offset().GetX(), -padding.Offset().GetY() });
278         }
279     }
280 }
281 
UpdateAnalyzerUIConfig(const RefPtr<NG::GeometryNode> & geometryNode,const PixelMapInfo & info)282 void ImageAnalyzerManager::UpdateAnalyzerUIConfig(const RefPtr<NG::GeometryNode>& geometryNode,
283     const PixelMapInfo& info)
284 {
285     CHECK_NULL_VOID(geometryNode);
286     auto node = frameNode_.Upgrade();
287     CHECK_NULL_VOID(node);
288     bool isUIConfigUpdate = false;
289 
290     auto layoutProps = node->GetLayoutProperty();
291     CHECK_NULL_VOID(layoutProps);
292     if (holder_ == ImageAnalyzerHolder::IMAGE) {
293         auto props = DynamicCast<NG::ImageLayoutProperty>(layoutProps);
294         CHECK_NULL_VOID(props);
295         if (analyzerUIConfig_.imageFit != props->GetImageFit().value_or(ImageFit::COVER)) {
296             analyzerUIConfig_.imageFit = props->GetImageFit().value_or(ImageFit::COVER);
297             isUIConfigUpdate = true;
298         }
299     }
300 
301     if (holder_ == ImageAnalyzerHolder::VIDEO_CUSTOM) {
302         isUIConfigUpdate = UpdateVideoConfig(info);
303     } else {
304         auto padding = layoutProps->CreatePaddingAndBorder();
305         float paddingWidth = 0.0f;
306         float paddingHeight = 0.0f;
307         if (holder_ == ImageAnalyzerHolder::IMAGE || holder_ == ImageAnalyzerHolder::XCOMPONENT) {
308             paddingWidth = padding.left.value_or(0) + padding.right.value_or(0);
309             paddingHeight = padding.top.value_or(0) + padding.bottom.value_or(0);
310         }
311         NG::SizeF frameSize = geometryNode->GetFrameSize();
312         bool shouldUpdateSize = analyzerUIConfig_.contentWidth != frameSize.Width() - paddingWidth ||
313                                 analyzerUIConfig_.contentHeight != frameSize.Height() - paddingHeight;
314         if (shouldUpdateSize) {
315             analyzerUIConfig_.contentWidth = frameSize.Width() - paddingWidth;
316             analyzerUIConfig_.contentHeight = frameSize.Height()- paddingHeight;
317             isUIConfigUpdate = true;
318         }
319     }
320 
321     auto renderContext = node->GetRenderContext();
322     CHECK_NULL_VOID(renderContext);
323     auto transformMat = renderContext->GetTransformMatrixValue(Matrix4::CreateIdentity());
324     if (!(analyzerUIConfig_.transformMat == transformMat)) {
325         analyzerUIConfig_.transformMat = transformMat;
326         isUIConfigUpdate = true;
327     }
328 
329     if (isUIConfigUpdate) {
330         ImageAnalyzerMgr::GetInstance().UpdateInnerConfig(&overlayData_, &analyzerUIConfig_);
331     }
332 }
333 
UpdateVideoConfig(const PixelMapInfo & info)334 bool ImageAnalyzerManager::UpdateVideoConfig(const PixelMapInfo& info)
335 {
336     bool shouldUpdateFit = false;
337     auto node = frameNode_.Upgrade();
338     CHECK_NULL_RETURN(node, false);
339     auto layoutProps = node->GetLayoutProperty();
340     CHECK_NULL_RETURN(layoutProps, false);
341     auto videoProps = DynamicCast<NG::VideoLayoutProperty>(layoutProps);
342     if (analyzerUIConfig_.imageFit != videoProps->GetObjectFitValue(ImageFit::COVER)) {
343         analyzerUIConfig_.imageFit = videoProps->GetObjectFitValue(ImageFit::COVER);
344         shouldUpdateFit = true;
345     }
346 
347     bool shouldUpdateSize = analyzerUIConfig_.contentWidth != info.width ||
348                             analyzerUIConfig_.contentHeight != info.height ||
349                             analyzerUIConfig_.overlayOffset != info.overlayOffset;
350     if (shouldUpdateSize) {
351         analyzerUIConfig_.UpdateFromInfo(info);
352     }
353     return shouldUpdateFit || shouldUpdateSize;
354 }
355 
SetImageAnalyzerConfig(void * config)356 void ImageAnalyzerManager::SetImageAnalyzerConfig(void* config)
357 {
358     CHECK_NULL_VOID(imageAnalyzerAdapter_);
359     bool hasConfig = imageAnalyzerAdapter_->HasImageAnalyzerConfig();
360     if (hasConfig) {
361         return;
362     }
363     imageAnalyzerAdapter_->SetImageAnalyzerConfig(config);
364     auto analyzerConfig = imageAnalyzerAdapter_->GetImageAnalyzerConfig();
365     if (isAnalyzerOverlayBuild_) {
366         ImageAnalyzerMgr::GetInstance().UpdateConfig(&overlayData_, analyzerConfig);
367     }
368 }
369 
SetImageAIOptions(void * options)370 void ImageAnalyzerManager::SetImageAIOptions(void* options)
371 {
372     CHECK_NULL_VOID(imageAnalyzerAdapter_);
373     imageAnalyzerAdapter_->SetImageAnalyzerConfig(options, true);
374     auto analyzerConfig = imageAnalyzerAdapter_->GetImageAnalyzerConfig();
375     if (isAnalyzerOverlayBuild_) {
376         ImageAnalyzerMgr::GetInstance().UpdateConfig(&overlayData_, analyzerConfig);
377     }
378 }
379 
SetImageAnalyzerCallback(OnAnalyzedCallback & callback)380 void ImageAnalyzerManager::SetImageAnalyzerCallback(OnAnalyzedCallback& callback)
381 {
382     analyzerUIConfig_.onAnalyzed = callback;
383 }
384 
ReleaseImageAnalyzer()385 void ImageAnalyzerManager::ReleaseImageAnalyzer()
386 {
387     if (isAnalyzerOverlayBuild_) {
388         ImageAnalyzerMgr::GetInstance().Release(&overlayData_);
389     }
390 }
391 
UpdatePressOverlay(const RefPtr<OHOS::Ace::PixelMap> & pixelMap,int offsetX,int offsetY,int rectWidth,int rectHeight,int pointX,int pointY,OnTextSelectedCallback callback)392 void ImageAnalyzerManager::UpdatePressOverlay(const RefPtr<OHOS::Ace::PixelMap>& pixelMap, int offsetX, int offsetY,
393     int rectWidth, int rectHeight, int pointX, int pointY, OnTextSelectedCallback callback)
394 {
395     analyzerUIConfig_.overlayOffset.SetX(offsetX);
396     analyzerUIConfig_.overlayOffset.SetY(offsetY);
397     if (rectWidth > 0 && rectHeight > 0) {
398         analyzerUIConfig_.touchInfo.touchPoint.x = 1.0 * pointX / rectWidth * pixelMap->GetWidth();
399         analyzerUIConfig_.touchInfo.touchPoint.y = 1.0 * pointY / rectHeight * pixelMap->GetHeight();
400     }
401     analyzerUIConfig_.touchInfo.touchType = TouchType::DOWN;
402     analyzerUIConfig_.selectedStatus = Status::SELECTED;
403     analyzerUIConfig_.menuStatus = Status::MENU_SHOW;
404     if (!analyzerUIConfig_.onTextSelected) {
405         analyzerUIConfig_.onTextSelected = std::move(callback);
406     }
407     if (pixelMap && imageAnalyzerAdapter_) {
408         analyzerUIConfig_.contentWidth = rectWidth;
409         analyzerUIConfig_.contentHeight = rectHeight;
410         analyzerUIConfig_.pixelMapWidth = pixelMap->GetWidth();
411         analyzerUIConfig_.pixelMapHeight = pixelMap->GetHeight();
412         analyzerUIConfig_.pixelmapNapiVal = imageAnalyzerAdapter_->ConvertPixmapNapi(pixelMap);
413     }
414     ImageAnalyzerMgr::GetInstance().UpdatePressOverlay(&overlayData_, &analyzerUIConfig_);
415     analyzerUIConfig_.pixelmapNapiVal = nullptr;
416 }
417 
UpdateOverlayTouchInfo(int touchPointX,int touchPointY,TouchType touchType)418 void ImageAnalyzerManager::UpdateOverlayTouchInfo(int touchPointX, int touchPointY, TouchType touchType)
419 {
420     analyzerUIConfig_.touchInfo.touchPoint.x = touchPointX - analyzerUIConfig_.overlayOffset.GetX();
421     analyzerUIConfig_.touchInfo.touchPoint.y = touchPointY - analyzerUIConfig_.overlayOffset.GetY();
422     analyzerUIConfig_.touchInfo.touchType = touchType;
423     ImageAnalyzerMgr::GetInstance().UpdatePressOverlay(&overlayData_, &analyzerUIConfig_);
424 }
425 
UpdateOverlayStatus(bool status,int offsetX,int offsetY,int rectWidth,int rectHeight)426 void ImageAnalyzerManager::UpdateOverlayStatus(bool status, int offsetX, int offsetY, int rectWidth, int rectHeight)
427 {
428     if (status) {
429         analyzerUIConfig_.overlayOffset.SetX(offsetX);
430         analyzerUIConfig_.overlayOffset.SetY(offsetY);
431         analyzerUIConfig_.contentWidth = rectWidth;
432         analyzerUIConfig_.contentHeight = rectHeight;
433         analyzerUIConfig_.selectedStatus = Status::SELECTED;
434         analyzerUIConfig_.menuStatus = Status::MENU_SHOW;
435     } else {
436         analyzerUIConfig_.selectedStatus = Status::UNSELECTED;
437         analyzerUIConfig_.menuStatus = Status::MENU_HIDE;
438     }
439     ImageAnalyzerMgr::GetInstance().UpdateOverlayStatus(&overlayData_, &analyzerUIConfig_);
440 }
441 
UpdateAIButtonConfig(AIButtonConfig config)442 void ImageAnalyzerManager::UpdateAIButtonConfig(AIButtonConfig config)
443 {
444     CHECK_NULL_VOID(isAnalyzerOverlayBuild_);
445     ImageAnalyzerMgr::GetInstance().UpdateAIButtonConfig(&overlayData_, &config);
446 }
447 
UpdateKeyEvent(KeyEvent keyEvent)448 void ImageAnalyzerManager::UpdateKeyEvent(KeyEvent keyEvent)
449 {
450     CHECK_NULL_VOID(isAnalyzerOverlayBuild_);
451     ImageAnalyzerMgr::GetInstance().UpdateKeyEvent(&overlayData_, keyEvent.rawKeyEvent.get());
452 }
453 
UpdateOverlayActiveStatus(bool status)454 void ImageAnalyzerManager::UpdateOverlayActiveStatus(bool status)
455 {
456     CHECK_NULL_VOID(isAnalyzerOverlayBuild_);
457     ImageAnalyzerMgr::GetInstance().UpdateOverlayActiveStatus(&overlayData_, status);
458 }
459 
NeedUpdateOverlayOffset()460 bool ImageAnalyzerManager::NeedUpdateOverlayOffset()
461 {
462     return holder_ == ImageAnalyzerHolder::IMAGE ||
463            holder_ == ImageAnalyzerHolder::VIDEO_CUSTOM ||
464            holder_ == ImageAnalyzerHolder::XCOMPONENT;
465 }
466 
SetNotifySelectedCallback(OnNotifySelectedStatusCallback && callback)467 void ImageAnalyzerManager::SetNotifySelectedCallback(
468     OnNotifySelectedStatusCallback&& callback)
469 {
470     analyzerUIConfig_.onNotifySelectedStatus = std::move(callback);
471 }
472 
SetOnCanPlayCallback(OnCanPlayCallback && onCanPlay)473 void ImageAnalyzerManager::SetOnCanPlayCallback(
474     OnCanPlayCallback&& onCanPlay)
475 {
476     analyzerUIConfig_.onCanPlay = std::move(onCanPlay);
477 }
478 } // namespace OHOS::Ace