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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_MOVING_PHOTO_MOVING_PHOTO_PATTERN_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_MOVING_PHOTO_MOVING_PHOTO_PATTERN_H 18 19 #include "movingphoto_layout_algorithm.h" 20 #include "movingphoto_layout_property.h" 21 #include "movingphoto_event_hub.h" 22 #include "movingphoto_controller.h" 23 #include "movingphoto_utils.h" 24 25 #include "base/memory/referenced.h" 26 #include "core/common/container.h" 27 #include "core/components_ng/event/event_hub.h" 28 #include "core/components_ng/event/long_press_event.h" 29 #include "core/components_ng/event/touch_event.h" 30 #include "core/components_ng/pattern/pattern.h" 31 #include "core/components_ng/render/media_player.h" 32 #include "core/components_ng/render/render_surface.h" 33 #include "core/components/video/video_utils.h" 34 #include "core/components/image/image_event.h" 35 36 namespace OHOS::Ace::NG { 37 class MovingPhotoPattern : public Pattern { 38 DECLARE_ACE_TYPE(MovingPhotoPattern, Pattern); 39 40 public: 41 MovingPhotoPattern() = delete; 42 explicit MovingPhotoPattern(const RefPtr<MovingPhotoController>& controller); 43 ~MovingPhotoPattern() override; 44 CreateEventHub()45 RefPtr<EventHub> CreateEventHub() override 46 { 47 return MakeRefPtr<MovingPhotoEventHub>(); 48 } 49 CreateLayoutProperty()50 RefPtr<LayoutProperty> CreateLayoutProperty() override 51 { 52 return MakeRefPtr<MovingPhotoLayoutProperty>(); 53 } 54 CreateLayoutAlgorithm()55 RefPtr<LayoutAlgorithm> CreateLayoutAlgorithm() override 56 { 57 return MakeRefPtr<MovingPhotoLayoutAlgorithm>(); 58 } 59 UpdateMuted(bool isMuted)60 void UpdateMuted(bool isMuted) 61 { 62 isMuted_ = isMuted; 63 } 64 GetMuted()65 bool GetMuted() 66 { 67 return isMuted_; 68 } 69 GetPrepared()70 bool GetPrepared() 71 { 72 return isPrepared_; 73 } 74 GetPlayByController()75 bool GetPlayByController() 76 { 77 return isPlayByController_; 78 } 79 80 void OnVisibleChange(bool isVisible) override; 81 82 void OnAreaChangedInner() override; 83 84 void AutoPlayPeriod(int64_t startTime, int64_t endTime); 85 86 void AutoPlay(bool isAutoPlay); 87 88 void RepeatPlay(bool isRepeatPlay); 89 GetFocusPattern()90 FocusPattern GetFocusPattern() const override 91 { 92 return { FocusType::NODE, false }; 93 } 94 UpdateCurrentDateModified(int64_t currentDateModified)95 void UpdateCurrentDateModified(int64_t currentDateModified) 96 { 97 currentDateModified_ = currentDateModified; 98 } 99 SetMovingPhotoFormat(MovingPhotoFormat format)100 void SetMovingPhotoFormat(MovingPhotoFormat format) 101 { 102 movingPhotoFormat_ = format; 103 } 104 SetDynamicRangeMode(DynamicRangeMode rangeMode)105 void SetDynamicRangeMode(DynamicRangeMode rangeMode) 106 { 107 dynamicRangeMode_ = rangeMode; 108 } 109 GetCurrentDateModified()110 int64_t GetCurrentDateModified() 111 { 112 return currentDateModified_; 113 } 114 115 protected: 116 int32_t instanceId_; 117 118 RefPtr<MediaPlayer> mediaPlayer_ = MediaPlayer::Create(); 119 RefPtr<RenderSurface> renderSurface_ = RenderSurface::Create(); 120 RefPtr<RenderContext> renderContextForMediaPlayer_ = RenderContext::Create(); 121 122 private: 123 void OnModifyDone() override; 124 void OnAttachToFrameNode() override; 125 void OnDetachFromFrameNode(FrameNode* frameNode) override; 126 void OnDetachFromMainTree() override; 127 void OnRebuildFrame() override; 128 bool OnDirtyLayoutWrapperSwap(const RefPtr<LayoutWrapper>& dirty, const DirtySwapConfig& config) override; 129 void OnWindowHide() override; 130 void OnWindowShow() override; 131 132 void RegisterVisibleAreaChange(); 133 void VisibleAreaCallback(bool visible); 134 135 void InitEvent(); 136 void HandleLongPress(GestureEvent& info); 137 void HandleTouchEvent(TouchEventInfo& info); 138 139 void UpdateImageNode(); 140 void UpdateVideoNode(); 141 void UpdatePlayMode(); 142 void MovingPhotoFormatConvert(MovingPhotoFormat format); 143 void DynamicRangeModeConvert(DynamicRangeMode rangeMode); 144 SizeF CalculateFitContain(const SizeF& rawSize, const SizeF& layoutSize); 145 SizeF CalculateFitFill(const SizeF& layoutSize); 146 SizeF CalculateFitCover(const SizeF& rawSize, const SizeF& layoutSize); 147 SizeF CalculateFitNone(const SizeF& rawSize); 148 SizeF CalculateFitScaleDown(const SizeF& rawSize, const SizeF& layoutSize); 149 SizeF CalculateFitAuto(const SizeF& rawSize, const SizeF& layoutSize); 150 SizeF MeasureContentLayout(const SizeF& layoutSize, const RefPtr<MovingPhotoLayoutProperty>& layoutProperty); 151 SizeF GetRawImageSize(); 152 153 void PrepareMediaPlayer(); 154 void ResetMediaPlayer(); 155 void PrepareSurface(); 156 void RegisterMediaPlayerEvent(); 157 void PrintMediaPlayerStatus(PlaybackStatus status); 158 void RegisterImageEvent(); 159 void HandleImageCompleteEvent(const LoadImageSuccessEvent& info); 160 void MediaResetToPlay(); 161 162 void FireMediaPlayerImageComplete(); 163 void OnMediaPlayerStatusChanged(PlaybackStatus status); 164 void OnMediaPlayerInitialized(); 165 void OnMediaPlayerPrepared(); 166 void OnMediaPlayerStoped(); 167 void OnMediaPlayerCompletion(); OnPlayPositionChanged(uint32_t pos)168 void OnPlayPositionChanged(uint32_t pos) {}; 169 void FireMediaPlayerStart(); 170 void FireMediaPlayerStop(); 171 void FireMediaPlayerPause(); 172 void FireMediaPlayerFinish(); 173 void FireMediaPlayerError(); 174 void OnResolutionChange(); 175 void OnStartRenderFrame(); 176 void OnStartedStatusCallback(); 177 178 void Start(); 179 void Pause(); 180 void Stop(); 181 void Seek(int32_t position); 182 183 void VisiblePlayback(); 184 void SelectPlaybackMode(PlaybackMode mode); 185 void StartPlayback(); 186 void StartAnimation(); 187 void RsContextUpdateTransformScale(const RefPtr<RenderContext>& imageRsContext, 188 const RefPtr<RenderContext>& videoRsContext, PlaybackMode playbackMode); 189 void StopPlayback(); 190 void PausePlayback(); 191 void StopAnimation(); 192 void StopAnimationCallback(); 193 void StartAutoPlay(); 194 void StartRepeatPlay(); 195 void SetAutoPlayPeriod(int64_t startTime, int64_t endTime); 196 197 void UpdateMediaPlayerSpeed(); 198 void UpdateMediaPlayerMuted(); 199 200 void HideImageNode(); 201 202 RefPtr<LongPressEvent> longPressEvent_; 203 RefPtr<TouchEventImpl> touchEvent_; 204 RefPtr<MovingPhotoController> controller_; 205 206 int32_t fd_ = -1; 207 int64_t autoPlayPeriodStartTime_ = -1; 208 int64_t autoPlayPeriodEndTime_ = -1; 209 std::string uri_ = ""; 210 bool startAnimationFlag_ = false; 211 bool isPrepared_ = false; 212 bool isMuted_ = false; 213 bool isPlayByController_ = false; 214 bool isFastKeyUp_ = false; 215 bool hasVisibleChangeRegistered_ = false; 216 bool isFirstRepeatPlay_ = true; 217 bool isSetAutoPlayPeriod_ = false; 218 bool isVisible_ = false; 219 bool isChangePlayMode_ = false; 220 bool needUpdateImageNode_ = false; 221 PlaybackStatus currentPlayStatus_ = PlaybackStatus::NONE; 222 PlaybackMode autoAndRepeatLevel_ = PlaybackMode::NONE; 223 PlaybackMode historyAutoAndRepeatLevel_ = PlaybackMode::NONE; 224 int64_t currentDateModified_ = -2; 225 MovingPhotoFormat movingPhotoFormat_ = MovingPhotoFormat::UNKNOWN; 226 PixelFormat imageFormat_ = PixelFormat::UNKNOWN; 227 DynamicRangeMode dynamicRangeMode_ = DynamicRangeMode::HIGH; 228 229 Rect lastBoundsRect_; 230 231 ACE_DISALLOW_COPY_AND_MOVE(MovingPhotoPattern); 232 }; 233 } // namespace OHOS::Ace::NG 234 235 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_MOVING_PHOTO_MOVING_PHOTO_PATTERN_H 236