• 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 "movingphoto_model_ng.h"
17 #include "movingphoto_node.h"
18 
19 #include "core/components_ng/base/view_stack_processor.h"
20 #include "core/components_ng/pattern/image/image_pattern.h"
21 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
22 #include "core/pipeline/pipeline_base.h"
23 
24 namespace OHOS::Ace::NG {
25 
26 namespace {
27 }
28 
Create(const RefPtr<MovingPhotoController> & controller)29 void MovingPhotoModelNG::Create(const RefPtr<MovingPhotoController>& controller)
30 {
31     auto* stack = ViewStackProcessor::GetInstance();
32     auto nodeId = stack->ClaimNodeId();
33     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::MOVING_PHOTO_ETS_TAG, nodeId);
34     auto movingPhotoNode = MovingPhotoNode::GetOrCreateMovingPhotoNode(
35         V2::MOVING_PHOTO_ETS_TAG, nodeId, [controller]() {
36             return AceType::MakeRefPtr<MovingPhotoPattern>(controller);
37         });
38     CHECK_NULL_VOID(movingPhotoNode);
39     stack->Push(movingPhotoNode);
40 
41     bool hasImageNode = movingPhotoNode->HasImageNode();
42     if (!hasImageNode) {
43         auto imageId = movingPhotoNode->GetImageId();
44         auto imageNode = FrameNode::GetOrCreateFrameNode(
45             V2::IMAGE_ETS_TAG, imageId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
46         CHECK_NULL_VOID(imageNode);
47         movingPhotoNode->AddChild(imageNode);
48     }
49 
50     bool hasColumnNode = movingPhotoNode->HasColumnNode();
51     if (!hasColumnNode) {
52         auto columnId = movingPhotoNode->GetColumnId();
53         auto columnNode = FrameNode::GetOrCreateFrameNode(
54             V2::COLUMN_ETS_TAG, columnId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
55         CHECK_NULL_VOID(columnNode);
56         movingPhotoNode->AddChild(columnNode);
57         bool hasVideoNode = movingPhotoNode->HasVideoNode();
58         if (!hasVideoNode) {
59             auto videoId = movingPhotoNode->GetVideoId();
60             auto videoNode = FrameNode::GetOrCreateFrameNode(
61                 V2::COLUMN_ETS_TAG, videoId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
62             CHECK_NULL_VOID(videoNode);
63             columnNode->AddChild(videoNode);
64         }
65     }
66 }
67 
SetImageSrc(const std::string & value)68 void MovingPhotoModelNG::SetImageSrc(const std::string& value)
69 {
70     TAG_LOGI(AceLogTag::ACE_MOVING_PHOTO, "MovingPhoto SetImageSrc.");
71     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
72     CHECK_NULL_VOID(frameNode);
73     auto layoutProperty = AceType::DynamicCast<MovingPhotoLayoutProperty>(frameNode->GetLayoutProperty());
74     CHECK_NULL_VOID(layoutProperty);
75     auto pipeline = PipelineBase::GetCurrentContext();
76     CHECK_NULL_VOID(pipeline);
77     auto dataProvider = AceType::DynamicCast<DataProviderManagerStandard>(pipeline->GetDataProviderManager());
78     CHECK_NULL_VOID(dataProvider);
79     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
80     CHECK_NULL_VOID(movingPhotoPattern);
81     if (layoutProperty->HasMovingPhotoUri()) {
82         auto movingPhotoUri = layoutProperty->GetMovingPhotoUri().value();
83         if (movingPhotoUri == value) {
84             TAG_LOGW(AceLogTag::ACE_MOVING_PHOTO, "src not changed.");
85             return;
86         }
87     }
88     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, MovingPhotoUri, value);
89 
90     std::string imageSrc = dataProvider->GetMovingPhotoImageUri(value);
91     ImageSourceInfo src;
92     src.SetSrc(imageSrc);
93     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, ImageSourceInfo, src);
94 
95     int32_t fd = dataProvider->ReadMovingPhotoVideo(value);
96     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, VideoSource, fd);
97     SetXmagePosition();
98 }
99 
SetHdrBrightness(float hdrBrightness)100 void MovingPhotoModelNG::SetHdrBrightness(float hdrBrightness)
101 {
102     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
103     CHECK_NULL_VOID(frameNode);
104     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
105     movingPhotoPattern->SetHdrBrightness(hdrBrightness);
106 }
107 
SetEnableCameraPostprocessing(bool isEnabled)108 void MovingPhotoModelNG::SetEnableCameraPostprocessing(bool isEnabled)
109 {
110     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
111     CHECK_NULL_VOID(frameNode);
112     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
113     movingPhotoPattern->SetEnableCameraPostprocessing(isEnabled);
114 }
115 
SetMuted(bool value)116 void MovingPhotoModelNG::SetMuted(bool value)
117 {
118     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
119     CHECK_NULL_VOID(frameNode);
120     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
121     movingPhotoPattern->UpdateMuted(value);
122 }
123 
SetObjectFit(ImageFit objectFit)124 void MovingPhotoModelNG::SetObjectFit(ImageFit objectFit)
125 {
126     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, ObjectFit, objectFit);
127 }
128 
SetOnComplete(MovingPhotoEventFunc && onComplete)129 void MovingPhotoModelNG::SetOnComplete(MovingPhotoEventFunc&& onComplete)
130 {
131     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
132     CHECK_NULL_VOID(frameNode);
133     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
134     CHECK_NULL_VOID(eventHub);
135     eventHub->SetOnComplete(std::move(onComplete));
136 }
137 
SetOnStart(MovingPhotoEventFunc && onStart)138 void MovingPhotoModelNG::SetOnStart(MovingPhotoEventFunc&& onStart)
139 {
140     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
141     CHECK_NULL_VOID(frameNode);
142     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
143     CHECK_NULL_VOID(eventHub);
144     eventHub->SetOnStart(std::move(onStart));
145 }
146 
SetOnStop(MovingPhotoEventFunc && onStop)147 void MovingPhotoModelNG::SetOnStop(MovingPhotoEventFunc&& onStop)
148 {
149     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
150     CHECK_NULL_VOID(frameNode);
151     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
152     CHECK_NULL_VOID(eventHub);
153     eventHub->SetOnStop(std::move(onStop));
154 }
155 
SetOnPause(MovingPhotoEventFunc && onPause)156 void MovingPhotoModelNG::SetOnPause(MovingPhotoEventFunc&& onPause)
157 {
158     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
159     CHECK_NULL_VOID(frameNode);
160     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
161     CHECK_NULL_VOID(eventHub);
162     eventHub->SetOnPause(std::move(onPause));
163 }
164 
SetOnFinish(MovingPhotoEventFunc && onFinish)165 void MovingPhotoModelNG::SetOnFinish(MovingPhotoEventFunc&& onFinish)
166 {
167     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
168     CHECK_NULL_VOID(frameNode);
169     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
170     CHECK_NULL_VOID(eventHub);
171     eventHub->SetOnFinish(std::move(onFinish));
172 }
173 
SetOnError(MovingPhotoEventFunc && onError)174 void MovingPhotoModelNG::SetOnError(MovingPhotoEventFunc&& onError)
175 {
176     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
177     CHECK_NULL_VOID(frameNode);
178     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
179     CHECK_NULL_VOID(eventHub);
180     eventHub->SetOnError(std::move(onError));
181 }
182 
SetOnPrepared(MovingPhotoEventFunc && onPrepared)183 void MovingPhotoModelNG::SetOnPrepared(MovingPhotoEventFunc&& onPrepared)
184 {
185     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
186     CHECK_NULL_VOID(frameNode);
187     auto eventHub = frameNode->GetOrCreateEventHub<MovingPhotoEventHub>();
188     CHECK_NULL_VOID(eventHub);
189     eventHub->SetOnPrepared(std::move(onPrepared));
190 }
191 
AutoPlayPeriod(int64_t startTime,int64_t endTime)192 void MovingPhotoModelNG::AutoPlayPeriod(int64_t startTime, int64_t endTime)
193 {
194     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
195     CHECK_NULL_VOID(frameNode);
196     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
197     CHECK_NULL_VOID(movingPhotoPattern);
198     movingPhotoPattern->AutoPlayPeriod(startTime, endTime);
199 }
200 
AutoPlay(bool isAutoPlay)201 void MovingPhotoModelNG::AutoPlay(bool isAutoPlay)
202 {
203     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
204     CHECK_NULL_VOID(frameNode);
205     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
206     CHECK_NULL_VOID(movingPhotoPattern);
207     movingPhotoPattern->AutoPlay(isAutoPlay);
208 }
209 
RepeatPlay(bool isRepeatPlay)210 void MovingPhotoModelNG::RepeatPlay(bool isRepeatPlay)
211 {
212     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
213     CHECK_NULL_VOID(frameNode);
214     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
215     CHECK_NULL_VOID(movingPhotoPattern);
216     movingPhotoPattern->RepeatPlay(isRepeatPlay);
217 }
218 
EnableAnalyzer(bool enabled)219 void MovingPhotoModelNG::EnableAnalyzer(bool enabled)
220 {
221     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
222     CHECK_NULL_VOID(frameNode);
223     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
224     CHECK_NULL_VOID(movingPhotoPattern);
225     movingPhotoPattern->EnableAnalyzer(enabled);
226 }
227 
SetImageAIOptions(void * options)228 void MovingPhotoModelNG::SetImageAIOptions(void* options)
229 {
230     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
231     CHECK_NULL_VOID(frameNode);
232     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
233     CHECK_NULL_VOID(movingPhotoPattern);
234     movingPhotoPattern->SetImageAIOptions(options);
235 }
236 
SetMovingPhotoFormat(MovingPhotoFormat format)237 void MovingPhotoModelNG::SetMovingPhotoFormat(MovingPhotoFormat format)
238 {
239     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
240     CHECK_NULL_VOID(frameNode);
241     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
242     CHECK_NULL_VOID(movingPhotoPattern);
243     movingPhotoPattern->SetMovingPhotoFormat(format);
244 }
245 
SetWaterMask(bool enabled)246 void MovingPhotoModelNG::SetWaterMask(bool enabled)
247 {
248     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
249     CHECK_NULL_VOID(frameNode);
250     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
251     CHECK_NULL_VOID(movingPhotoPattern);
252     movingPhotoPattern->SetWaterMask(enabled);
253 }
254 
SetDynamicRangeMode(DynamicRangeMode rangeMode)255 void MovingPhotoModelNG::SetDynamicRangeMode(DynamicRangeMode rangeMode)
256 {
257     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
258     CHECK_NULL_VOID(frameNode);
259     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
260     CHECK_NULL_VOID(movingPhotoPattern);
261     movingPhotoPattern->SetDynamicRangeMode(rangeMode);
262 }
263 
SetXmagePosition()264 void MovingPhotoModelNG::SetXmagePosition()
265 {
266     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
267     CHECK_NULL_VOID(frameNode);
268     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
269     CHECK_NULL_VOID(movingPhotoPattern);
270     movingPhotoPattern->SetXmagePosition();
271 }
272 } // namespace OHOS::Ace::NG