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