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
23 namespace OHOS::Ace::NG {
24
25 namespace {
26 }
27
Create(const RefPtr<MovingPhotoController> & controller)28 void MovingPhotoModelNG::Create(const RefPtr<MovingPhotoController>& controller)
29 {
30 auto* stack = ViewStackProcessor::GetInstance();
31 auto nodeId = stack->ClaimNodeId();
32 ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::MOVING_PHOTO_ETS_TAG, nodeId);
33 auto movingPhotoNode = MovingPhotoNode::GetOrCreateMovingPhotoNode(
34 V2::MOVING_PHOTO_ETS_TAG, nodeId, [controller]() {
35 return AceType::MakeRefPtr<MovingPhotoPattern>(controller);
36 });
37 CHECK_NULL_VOID(movingPhotoNode);
38 stack->Push(movingPhotoNode);
39
40 bool hasVideoNode = movingPhotoNode->HasVideoNode();
41 if (!hasVideoNode) {
42 auto videoId = movingPhotoNode->GetVideoId();
43 auto videoNode = FrameNode::GetOrCreateFrameNode(
44 V2::COLUMN_ETS_TAG, videoId, []() { return AceType::MakeRefPtr<LinearLayoutPattern>(true); });
45 CHECK_NULL_VOID(videoNode);
46 movingPhotoNode->AddChild(videoNode);
47 }
48 bool hasImageNode = movingPhotoNode->HasImageNode();
49 if (!hasImageNode) {
50 auto imageId = movingPhotoNode->GetImageId();
51 auto imageNode = FrameNode::GetOrCreateFrameNode(
52 V2::IMAGE_ETS_TAG, imageId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
53 CHECK_NULL_VOID(imageNode);
54 movingPhotoNode->AddChild(imageNode);
55 }
56 }
57
SetImageSrc(const std::string & value)58 void MovingPhotoModelNG::SetImageSrc(const std::string& value)
59 {
60 TAG_LOGI(AceLogTag::ACE_MOVING_PHOTO, "MovingPhoto SetImageSrc.");
61 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
62 CHECK_NULL_VOID(frameNode);
63 auto layoutProperty = AceType::DynamicCast<MovingPhotoLayoutProperty>(frameNode->GetLayoutProperty());
64 CHECK_NULL_VOID(layoutProperty);
65 auto pipeline = PipelineBase::GetCurrentContext();
66 CHECK_NULL_VOID(pipeline);
67 auto dataProvider = AceType::DynamicCast<DataProviderManagerStandard>(pipeline->GetDataProviderManager());
68 CHECK_NULL_VOID(dataProvider);
69 auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
70 CHECK_NULL_VOID(movingPhotoPattern);
71 if (layoutProperty->HasMovingPhotoUri()) {
72 auto movingPhotoUri = layoutProperty->GetMovingPhotoUri().value();
73 if (movingPhotoUri == value) {
74 TAG_LOGW(AceLogTag::ACE_MOVING_PHOTO, "src not changed.");
75 return;
76 }
77 }
78 ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, MovingPhotoUri, value);
79
80 std::string imageSrc = dataProvider->GetMovingPhotoImageUri(value);
81 ImageSourceInfo src;
82 src.SetSrc(imageSrc);
83 ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, ImageSourceInfo, src);
84
85 int32_t fd = dataProvider->ReadMovingPhotoVideo(value);
86 ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, VideoSource, fd);
87 }
88
SetMuted(bool value)89 void MovingPhotoModelNG::SetMuted(bool value)
90 {
91 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
92 CHECK_NULL_VOID(frameNode);
93 auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
94 movingPhotoPattern->UpdateMuted(value);
95 }
96
SetObjectFit(ImageFit objectFit)97 void MovingPhotoModelNG::SetObjectFit(ImageFit objectFit)
98 {
99 ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, ObjectFit, objectFit);
100 }
101
SetOnComplete(MovingPhotoEventFunc && onComplete)102 void MovingPhotoModelNG::SetOnComplete(MovingPhotoEventFunc&& onComplete)
103 {
104 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
105 CHECK_NULL_VOID(frameNode);
106 auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
107 CHECK_NULL_VOID(eventHub);
108 eventHub->SetOnComplete(std::move(onComplete));
109 }
110
SetOnStart(MovingPhotoEventFunc && onStart)111 void MovingPhotoModelNG::SetOnStart(MovingPhotoEventFunc&& onStart)
112 {
113 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
114 CHECK_NULL_VOID(frameNode);
115 auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
116 CHECK_NULL_VOID(eventHub);
117 eventHub->SetOnStart(std::move(onStart));
118 }
119
SetOnStop(MovingPhotoEventFunc && onStop)120 void MovingPhotoModelNG::SetOnStop(MovingPhotoEventFunc&& onStop)
121 {
122 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
123 CHECK_NULL_VOID(frameNode);
124 auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
125 CHECK_NULL_VOID(eventHub);
126 eventHub->SetOnStop(std::move(onStop));
127 }
128
SetOnPause(MovingPhotoEventFunc && onPause)129 void MovingPhotoModelNG::SetOnPause(MovingPhotoEventFunc&& onPause)
130 {
131 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
132 CHECK_NULL_VOID(frameNode);
133 auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
134 CHECK_NULL_VOID(eventHub);
135 eventHub->SetOnPause(std::move(onPause));
136 }
137
SetOnFinish(MovingPhotoEventFunc && onFinish)138 void MovingPhotoModelNG::SetOnFinish(MovingPhotoEventFunc&& onFinish)
139 {
140 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
141 CHECK_NULL_VOID(frameNode);
142 auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
143 CHECK_NULL_VOID(eventHub);
144 eventHub->SetOnFinish(std::move(onFinish));
145 }
146
SetOnError(MovingPhotoEventFunc && onError)147 void MovingPhotoModelNG::SetOnError(MovingPhotoEventFunc&& onError)
148 {
149 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
150 CHECK_NULL_VOID(frameNode);
151 auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
152 CHECK_NULL_VOID(eventHub);
153 eventHub->SetOnError(std::move(onError));
154 }
155
AutoPlayPeriod(int64_t startTime,int64_t endTime)156 void MovingPhotoModelNG::AutoPlayPeriod(int64_t startTime, int64_t endTime)
157 {
158 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
159 CHECK_NULL_VOID(frameNode);
160 auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
161 CHECK_NULL_VOID(movingPhotoPattern);
162 movingPhotoPattern->AutoPlayPeriod(startTime, endTime);
163 }
164
AutoPlay(bool isAutoPlay)165 void MovingPhotoModelNG::AutoPlay(bool isAutoPlay)
166 {
167 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
168 CHECK_NULL_VOID(frameNode);
169 auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
170 CHECK_NULL_VOID(movingPhotoPattern);
171 movingPhotoPattern->AutoPlay(isAutoPlay);
172 }
173
RepeatPlay(bool isRepeatPlay)174 void MovingPhotoModelNG::RepeatPlay(bool isRepeatPlay)
175 {
176 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
177 CHECK_NULL_VOID(frameNode);
178 auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
179 CHECK_NULL_VOID(movingPhotoPattern);
180 movingPhotoPattern->RepeatPlay(isRepeatPlay);
181 }
182
EnableAnalyzer(bool enabled)183 void MovingPhotoModelNG::EnableAnalyzer(bool enabled)
184 {
185 auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
186 CHECK_NULL_VOID(frameNode);
187 auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
188 CHECK_NULL_VOID(movingPhotoPattern);
189 movingPhotoPattern->EnableAnalyzer(enabled);
190 }
191
SetImageAIOptions(void * options)192 void MovingPhotoModelNG::SetImageAIOptions(void* options)
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->SetImageAIOptions(options);
199 }
200
SetMovingPhotoFormat(MovingPhotoFormat format)201 void MovingPhotoModelNG::SetMovingPhotoFormat(MovingPhotoFormat format)
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->SetMovingPhotoFormat(format);
208 }
209
SetDynamicRangeMode(DynamicRangeMode rangeMode)210 void MovingPhotoModelNG::SetDynamicRangeMode(DynamicRangeMode rangeMode)
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->SetDynamicRangeMode(rangeMode);
217 }
218 } // namespace OHOS::Ace::NG