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