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