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/pattern/image/image_pattern.h"
20 #include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h"
21 
22 namespace OHOS::Ace::NG {
23 
24 namespace {
25     constexpr int32_t ERROR_CODE = -1;
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     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
61     CHECK_NULL_VOID(frameNode);
62     auto layoutProperty = AceType::DynamicCast<MovingPhotoLayoutProperty>(frameNode->GetLayoutProperty());
63     CHECK_NULL_VOID(layoutProperty);
64     auto pipeline = PipelineBase::GetCurrentContext();
65     CHECK_NULL_VOID(pipeline);
66     auto dataProvider = AceType::DynamicCast<DataProviderManagerStandard>(pipeline->GetDataProviderManager());
67     CHECK_NULL_VOID(dataProvider);
68     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
69     CHECK_NULL_VOID(movingPhotoPattern);
70     bool updateVideo = true;
71     if (layoutProperty->HasMovingPhotoUri()) {
72         auto movingPhotoUri = layoutProperty->GetMovingPhotoUri().value();
73         int64_t dateModified = dataProvider->GetMovingPhotoDateModified(value);
74         if (dateModified == ERROR_CODE) {
75             TAG_LOGW(AceLogTag::ACE_MOVING_PHOTO, "MovingPhotoDateModified return -1.");
76         }
77         int64_t currentDateModified = movingPhotoPattern->GetCurrentDateModified();
78         if (movingPhotoUri == value && dateModified == currentDateModified) {
79             TAG_LOGW(AceLogTag::ACE_MOVING_PHOTO, "src not changed.");
80             return;
81         }
82         updateVideo = false;
83         movingPhotoPattern->UpdateCurrentDateModified(dateModified);
84     }
85     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, MovingPhotoUri, value);
86 
87     std::string imageSrc = dataProvider->GetMovingPhotoImageUri(value);
88     imageSrc += "?date_modified=" + std::to_string(movingPhotoPattern->GetCurrentDateModified());
89     ImageSourceInfo src;
90     src.SetSrc(imageSrc);
91     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, ImageSourceInfo, src);
92 
93     if (!updateVideo) {
94         return;
95     }
96     int32_t fd = dataProvider->ReadMovingPhotoVideo(value);
97     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, VideoSource, fd);
98 }
99 
SetMuted(bool value)100 void MovingPhotoModelNG::SetMuted(bool value)
101 {
102     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
103     CHECK_NULL_VOID(frameNode);
104     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
105     movingPhotoPattern->UpdateMuted(value);
106 }
107 
SetObjectFit(ImageFit objectFit)108 void MovingPhotoModelNG::SetObjectFit(ImageFit objectFit)
109 {
110     ACE_UPDATE_LAYOUT_PROPERTY(MovingPhotoLayoutProperty, ObjectFit, objectFit);
111 }
112 
SetOnComplete(MovingPhotoEventFunc&& onComplete)113 void MovingPhotoModelNG::SetOnComplete(MovingPhotoEventFunc&& onComplete)
114 {
115     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
116     CHECK_NULL_VOID(frameNode);
117     auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
118     CHECK_NULL_VOID(eventHub);
119     eventHub->SetOnComplete(std::move(onComplete));
120 }
121 
SetOnStart(MovingPhotoEventFunc&& onStart)122 void MovingPhotoModelNG::SetOnStart(MovingPhotoEventFunc&& onStart)
123 {
124     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
125     CHECK_NULL_VOID(frameNode);
126     auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
127     CHECK_NULL_VOID(eventHub);
128     eventHub->SetOnStart(std::move(onStart));
129 }
130 
SetOnStop(MovingPhotoEventFunc&& onStop)131 void MovingPhotoModelNG::SetOnStop(MovingPhotoEventFunc&& onStop)
132 {
133     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
134     CHECK_NULL_VOID(frameNode);
135     auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
136     CHECK_NULL_VOID(eventHub);
137     eventHub->SetOnStop(std::move(onStop));
138 }
139 
SetOnPause(MovingPhotoEventFunc&& onPause)140 void MovingPhotoModelNG::SetOnPause(MovingPhotoEventFunc&& onPause)
141 {
142     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
143     CHECK_NULL_VOID(frameNode);
144     auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
145     CHECK_NULL_VOID(eventHub);
146     eventHub->SetOnPause(std::move(onPause));
147 }
148 
SetOnFinish(MovingPhotoEventFunc&& onFinish)149 void MovingPhotoModelNG::SetOnFinish(MovingPhotoEventFunc&& onFinish)
150 {
151     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
152     CHECK_NULL_VOID(frameNode);
153     auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
154     CHECK_NULL_VOID(eventHub);
155     eventHub->SetOnFinish(std::move(onFinish));
156 }
157 
SetOnError(MovingPhotoEventFunc&& onError)158 void MovingPhotoModelNG::SetOnError(MovingPhotoEventFunc&& onError)
159 {
160     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
161     CHECK_NULL_VOID(frameNode);
162     auto eventHub = frameNode->GetEventHub<MovingPhotoEventHub>();
163     CHECK_NULL_VOID(eventHub);
164     eventHub->SetOnError(std::move(onError));
165 }
166 
AutoPlayPeriod(int64_t startTime, int64_t endTime)167 void MovingPhotoModelNG::AutoPlayPeriod(int64_t startTime, int64_t endTime)
168 {
169     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
170     CHECK_NULL_VOID(frameNode);
171     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
172     CHECK_NULL_VOID(movingPhotoPattern);
173     movingPhotoPattern->AutoPlayPeriod(startTime, endTime);
174 }
175 
AutoPlay(bool isAutoPlay)176 void MovingPhotoModelNG::AutoPlay(bool isAutoPlay)
177 {
178     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
179     CHECK_NULL_VOID(frameNode);
180     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
181     CHECK_NULL_VOID(movingPhotoPattern);
182     movingPhotoPattern->AutoPlay(isAutoPlay);
183 }
184 
RepeatPlay(bool isRepeatPlay)185 void MovingPhotoModelNG::RepeatPlay(bool isRepeatPlay)
186 {
187     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
188     CHECK_NULL_VOID(frameNode);
189     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
190     CHECK_NULL_VOID(movingPhotoPattern);
191     movingPhotoPattern->RepeatPlay(isRepeatPlay);
192 }
193 
EnableAnalyzer(bool enabled)194 void MovingPhotoModelNG::EnableAnalyzer(bool enabled)
195 {
196     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
197     CHECK_NULL_VOID(frameNode);
198     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
199     CHECK_NULL_VOID(movingPhotoPattern);
200     movingPhotoPattern->EnableAnalyzer(enabled);
201 }
202 
SetImageAIOptions(void* options)203 void MovingPhotoModelNG::SetImageAIOptions(void* options)
204 {
205     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
206     CHECK_NULL_VOID(frameNode);
207     auto movingPhotoPattern = AceType::DynamicCast<MovingPhotoPattern>(frameNode->GetPattern());
208     CHECK_NULL_VOID(movingPhotoPattern);
209     movingPhotoPattern->SetImageAIOptions(options);
210 }
211 } // namespace OHOS::Ace::NG