From 83365a1ba1bf07afbfe29753b63f13e8dc9cda81 Mon Sep 17 00:00:00 2001 From: jinweiliu Date: Sun, 21 May 2023 09:25:31 +0000 Subject: [PATCH] fix video Signed-off-by: jinweiliu Change-Id: Ibb04dc5b3c94204ab50b58ac607ddfcd3b675e93 --- .../components/video/media_player_callback.h | 15 +- .../core/components_ng/pattern/BUILD.gn | 1 + .../pattern/video/video_model_ng.cpp | 29 +- .../pattern/video/video_node.cpp | 40 +++ .../components_ng/pattern/video/video_node.h | 86 ++++++ .../pattern/video/video_pattern.cpp | 270 +++++++++++------- .../pattern/video/video_pattern.h | 12 +- .../test/mock/render/mock_media_player.h | 17 +- .../components_ng/test/pattern/video/BUILD.gn | 3 +- .../video_accessibility_property_test_ng.cpp | 6 +- .../video/video_pattern_focus_test_ng.cpp | 45 +-- .../pattern/video/video_pattern_test_ng.cpp | 230 +++++---------- 12 files changed, 435 insertions(+), 319 deletions(-) create mode 100644 frameworks/core/components_ng/pattern/video/video_node.cpp create mode 100644 frameworks/core/components_ng/pattern/video/video_node.h diff --git a/frameworks/core/components/video/media_player_callback.h b/frameworks/core/components/video/media_player_callback.h index 43faa1c9f4e..c15bc4bdc5e 100644 --- a/frameworks/core/components/video/media_player_callback.h +++ b/frameworks/core/components/video/media_player_callback.h @@ -13,8 +13,8 @@ * limitations under the License. */ -#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_MEDIA_PLAYER_CALLBACK_H -#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_MEDIA_PLAYER_CALLBACK_H +#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_VIDEO_PLAYER_CALLBACK_H +#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_VIDEO_PLAYER_CALLBACK_H #include "base/log/log.h" @@ -88,29 +88,30 @@ public: void OnInfo(Media::PlayerOnInfoType type, int32_t extra, const Media::Format &InfoBody = {}) override { - LOGI("OnInfo type: %{public}d, extra: %{public}d", type, extra); + LOGD("video OnInfo type: %{public}d, extra: %{public}d", type, extra); ContainerScope scope(instanceId_); switch (type) { case OHOS::Media::INFO_TYPE_SEEKDONE: - LOGI("OnSeekDone callback"); + LOGI("video OnSeekDone callback"); if (positionUpdatedEvent_) { positionUpdatedEvent_(extra / MILLISECONDS_TO_SECONDS); } break; case OHOS::Media::INFO_TYPE_EOS: - LOGI("OnEndOfStream callback"); + LOGI("video OnEndOfStream callback"); if (endOfStreamEvent_) { endOfStreamEvent_(); } break; case OHOS::Media::INFO_TYPE_STATE_CHANGE: - LOGI("OnStateChanged callback"); + LOGI("video OnStateChanged callback"); PrintState(static_cast(extra)); if (stateChangedEvent_) { stateChangedEvent_(ConvertToPlaybackStatus(extra)); } break; case OHOS::Media::INFO_TYPE_POSITION_UPDATE: + LOGI("video INFO_TYPE_POSITION_UPDATE callback"); if (positionUpdatedEvent_) { positionUpdatedEvent_(extra / MILLISECONDS_TO_SECONDS); } @@ -185,4 +186,4 @@ private: } // namespace OHOS::Ace -#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_MEDIA_PLAYER_CALLBACK_H +#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_VIDEO_PLAYER_CALLBACK_H diff --git a/frameworks/core/components_ng/pattern/BUILD.gn b/frameworks/core/components_ng/pattern/BUILD.gn index f33144f1ad1..d3164f3725e 100644 --- a/frameworks/core/components_ng/pattern/BUILD.gn +++ b/frameworks/core/components_ng/pattern/BUILD.gn @@ -424,6 +424,7 @@ build_component_ng("pattern_ng") { "video/video_accessibility_property.cpp", "video/video_layout_algorithm.cpp", "video/video_model_ng.cpp", + "video/video_node.cpp", "video/video_pattern.cpp", "waterflow/water_flow_item_model_ng.cpp", "waterflow/water_flow_layout_algorithm.cpp", diff --git a/frameworks/core/components_ng/pattern/video/video_model_ng.cpp b/frameworks/core/components_ng/pattern/video/video_model_ng.cpp index ae312dbc657..f427493bdb6 100644 --- a/frameworks/core/components_ng/pattern/video/video_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/video/video_model_ng.cpp @@ -16,8 +16,10 @@ #include "core/components_ng/pattern/video/video_model_ng.h" #include "core/components/common/layout/constants.h" -#include "core/components_ng/base/frame_node.h" #include "core/components_ng/base/view_stack_processor.h" +#include "core/components_ng/pattern/image/image_pattern.h" +#include "core/components_ng/pattern/linear_layout/linear_layout_pattern.h" +#include "core/components_ng/pattern/video/video_node.h" #include "core/components_ng/pattern/video/video_pattern.h" #include "core/components_v2/inspector/inspector_constants.h" @@ -27,9 +29,30 @@ void VideoModelNG::Create(const RefPtr& videoController) { auto* stack = ViewStackProcessor::GetInstance(); auto nodeId = stack->ClaimNodeId(); - auto frameNode = FrameNode::GetOrCreateFrameNode( + auto videoNode = VideoNode::GetOrCreateVideoNode( V2::VIDEO_ETS_TAG, nodeId, [videoController]() { return AceType::MakeRefPtr(videoController); }); - stack->Push(frameNode); + CHECK_NULL_VOID(videoNode); + stack->Push(videoNode); + bool hasPreviewImageNode = videoNode->HasPreviewImageNode(); + bool hasControllerRowNode = videoNode->HasControllerRowNode(); + LOGI("Preview image is %{public}d, controller is %{public}d.", hasPreviewImageNode, hasControllerRowNode); + if (!hasPreviewImageNode) { + auto previewImageId = videoNode->GetPreviewImageId(); + auto previewImageNode = FrameNode::GetOrCreateFrameNode( + V2::IMAGE_ETS_TAG, previewImageId, []() { return AceType::MakeRefPtr(); }); + CHECK_NULL_VOID(previewImageNode); + videoNode->AddChild(previewImageNode); + } + if (!hasControllerRowNode) { + auto controllerRowId = videoNode->GetControllerRowId(); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto videoPattern = AceType::DynamicCast(frameNode->GetPattern()); + CHECK_NULL_VOID(videoPattern); + auto controllerRowNode = videoPattern->CreateControlBar(controllerRowId); + CHECK_NULL_VOID(controllerRowNode); + videoNode->AddChild(controllerRowNode); + } AddDragFrameNodeToManager(); } diff --git a/frameworks/core/components_ng/pattern/video/video_node.cpp b/frameworks/core/components_ng/pattern/video/video_node.cpp new file mode 100644 index 00000000000..ad405c2ca09 --- /dev/null +++ b/frameworks/core/components_ng/pattern/video/video_node.cpp @@ -0,0 +1,40 @@ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include "core/components_ng/pattern/video/video_node.h" + +namespace OHOS::Ace::NG { +RefPtr VideoNode::GetOrCreateVideoNode( + const std::string& tag, int32_t nodeId, const std::function(void)>& patternCreator) +{ + auto videoNode = ElementRegister::GetInstance()->GetSpecificItemById(nodeId); + if (videoNode) { + if (videoNode->GetTag() == tag) { + return videoNode; + } + ElementRegister::GetInstance()->RemoveItemSilently(nodeId); + auto parent = videoNode->GetParent(); + if (parent) { + parent->RemoveChild(videoNode); + } + } + + auto pattern = patternCreator ? patternCreator() : AceType::MakeRefPtr(); + videoNode = AceType::MakeRefPtr(tag, nodeId, pattern, false); + videoNode->InitializePatternAndContext(); + ElementRegister::GetInstance()->AddUINode(videoNode); + return videoNode; +} +} // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/pattern/video/video_node.h b/frameworks/core/components_ng/pattern/video/video_node.h new file mode 100644 index 00000000000..ef575743247 --- /dev/null +++ b/frameworks/core/components_ng/pattern/video/video_node.h @@ -0,0 +1,86 @@ +/* + * Copyright (c) 2023 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_NODE_H +#define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_NODE_H + +#include + +#include "core/components_ng/base/frame_node.h" +#include "core/components_ng/pattern/video/video_pattern.h" + +namespace OHOS::Ace::NG { +namespace { +constexpr int32_t PREVIEW_IMAGE_INDEX = 0; +constexpr int32_t CONTROLLER_ROW_INDEX = 1; +} // namespace + +class ACE_EXPORT VideoNode : public FrameNode { + DECLARE_ACE_TYPE(VideoNode, FrameNode); + +public: + VideoNode(const std::string& tag, int32_t nodeId, const RefPtr& pattern, bool isRoot = false) + : FrameNode(tag, nodeId, pattern, isRoot) + {} + ~VideoNode() override = default; + + bool HasControllerRowNode() const + { + return controllerRowId_.has_value(); + } + + bool HasPreviewImageNode() const + { + return previewImageId_.has_value(); + } + + int32_t GetControllerRowId() + { + if (!controllerRowId_.has_value()) { + controllerRowId_ = ElementRegister::GetInstance()->MakeUniqueId(); + } + return controllerRowId_.value(); + } + + int32_t GetPreviewImageId() + { + if (!previewImageId_.has_value()) { + previewImageId_ = ElementRegister::GetInstance()->MakeUniqueId(); + } + return previewImageId_.value(); + } + + // Get the preview image node, please check null first. + RefPtr GetPreviewImage() + { + // If the index >= size, it will return null. + return GetChildAtIndex(PREVIEW_IMAGE_INDEX); + } + + // Get the controller row node, please check null first. + RefPtr GetControllerRow() + { + // If the index >= size, it will return null. + return GetChildAtIndex(CONTROLLER_ROW_INDEX); + } + + static RefPtr GetOrCreateVideoNode( + const std::string& tag, int32_t nodeId, const std::function(void)>& patternCreator); +private: + std::optional previewImageId_; + std::optional controllerRowId_; +}; +} // namespace OHOS::Ace::NG +#endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERNS_VIDEO_VIDEO_NODE_H diff --git a/frameworks/core/components_ng/pattern/video/video_pattern.cpp b/frameworks/core/components_ng/pattern/video/video_pattern.cpp index 8f789ea2694..fc285e9ae0a 100644 --- a/frameworks/core/components_ng/pattern/video/video_pattern.cpp +++ b/frameworks/core/components_ng/pattern/video/video_pattern.cpp @@ -43,14 +43,15 @@ #include "core/components_ng/pattern/text/text_pattern.h" #include "core/components_ng/pattern/video/video_event_hub.h" #include "core/components_ng/pattern/video/video_layout_property.h" +#include "core/components_ng/pattern/video/video_node.h" #include "core/components_ng/property/property.h" #include "core/components_v2/inspector/inspector_constants.h" #include "core/pipeline_ng/pipeline_context.h" #ifdef ENABLE_DRAG_FRAMEWORK -#include "video.h" #include "unified_data.h" #include "unified_record.h" +#include "video.h" #endif namespace OHOS::Ace::NG { namespace { @@ -189,6 +190,24 @@ void VideoPattern::UpdateMediaPlayer() } } +void VideoPattern::ResetMediaPlayer() +{ + mediaPlayer_->ResetMediaPlayer(); + if (!SetSourceForMediaPlayer()) { + LOGE("Video set source for mediaPlayer failed."); + + // It need post on ui thread. + FireError(); + return; + } + + RegisterMediaPlayerEvent(); + PrepareSurface(); + if (mediaPlayer_->PrepareAsync() != 0) { + LOGE("Player prepare failed"); + } +} + void VideoPattern::PrepareMediaPlayer() { auto videoLayoutProperty = GetLayoutProperty(); @@ -207,20 +226,14 @@ void VideoPattern::PrepareMediaPlayer() } ResetStatus(); - mediaPlayer_->ResetMediaPlayer(); - if (!SetSourceForMediaPlayer()) { - LOGE("Video set source for mediaPlayer failed."); - - // It need post on ui thread. - FireError(); - return; - } - - RegisterMediaPlayerEvent(); - PrepareSurface(); - if (mediaPlayer_->PrepareAsync() != 0) { - LOGE("Player prepare failed"); - } + auto context = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(context); + auto platformTask = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::BACKGROUND); + platformTask.PostTask([weak = WeakClaim(this)] { + auto video = weak.Upgrade(); + CHECK_NULL_VOID(video); + video->ResetMediaPlayer(); + }); } bool VideoPattern::SetSourceForMediaPlayer() @@ -277,8 +290,42 @@ void VideoPattern::RegisterMediaPlayerEvent() mediaPlayer_->RegisterMediaPlayerEvent(positionUpdatedEvent, stateChangedEvent, errorEvent, resolutionChangeEvent); } +void VideoPattern::PrintPlayerStatus(PlaybackStatus status) +{ + switch (status) { + case PlaybackStatus::ERROR: + LOGI("Player current status is ERROR."); + break; + case PlaybackStatus::IDLE: + LOGI("Player current status is IDLE."); + break; + case PlaybackStatus::PREPARED: + LOGI("Player current status is PREPARED."); + break; + case PlaybackStatus::STARTED: + LOGI("Player current status is STARTED."); + break; + case PlaybackStatus::PAUSED: + LOGI("Player current status is PAUSED."); + break; + case PlaybackStatus::STOPPED: + LOGI("Player current status is STOPPED."); + break; + case PlaybackStatus::PLAYBACK_COMPLETE: + LOGI("Player current status is PLAYBACK_COMPLETE."); + break; + case PlaybackStatus::NONE: + LOGI("Player current status is NONE."); + break; + default: + LOGI("Invalid player status."); + break; + } +} + void VideoPattern::OnCurrentTimeChange(uint32_t currentPos) { + LOGD("Video current position is %{public}d", currentPos); isInitialState_ = isInitialState_ ? currentPos == 0 : false; if (currentPos == currentPos_ || isStop_) { return; @@ -303,6 +350,7 @@ void VideoPattern::OnCurrentTimeChange(uint32_t currentPos) void VideoPattern::OnPlayerStatus(PlaybackStatus status) { + PrintPlayerStatus(status); bool isPlaying = (status == PlaybackStatus::STARTED); if (isPlaying_ != isPlaying) { isPlaying_ = isPlaying; @@ -391,26 +439,23 @@ void VideoPattern::OnPrepared(double width, double height, uint32_t duration, ui OnUpdateTime(duration_, DURATION_POS); OnUpdateTime(currentPos_, CURRENT_POS); - auto needControlBar = videoLayoutProperty->GetControlsValue(true); - if (needControlBar) { - RefPtr controlBar = nullptr; - auto children = host->GetChildren(); - for (const auto& child : children) { - if (child->GetTag() == V2::ROW_ETS_TAG) { - controlBar = child; - break; - } + RefPtr controlBar = nullptr; + auto children = host->GetChildren(); + for (const auto& child : children) { + if (child->GetTag() == V2::ROW_ETS_TAG) { + controlBar = child; + break; } - CHECK_NULL_VOID(controlBar); - auto sliderNode = DynamicCast(controlBar->GetChildAtIndex(SLIDER_POS)); - auto sliderPaintProperty = sliderNode->GetPaintProperty(); - CHECK_NULL_VOID(sliderPaintProperty); - sliderPaintProperty->UpdateMin(0.0f); - sliderPaintProperty->UpdateMax(static_cast(duration_)); - sliderNode->MarkModifyDone(); - auto playBtn = DynamicCast(controlBar->GetChildAtIndex(0)); - ChangePlayButtonTag(playBtn); } + CHECK_NULL_VOID(controlBar); + auto sliderNode = DynamicCast(controlBar->GetChildAtIndex(SLIDER_POS)); + auto sliderPaintProperty = sliderNode->GetPaintProperty(); + CHECK_NULL_VOID(sliderPaintProperty); + sliderPaintProperty->UpdateMin(0.0f); + sliderPaintProperty->UpdateMax(static_cast(duration_)); + sliderNode->MarkModifyDone(); + auto playBtn = DynamicCast(controlBar->GetChildAtIndex(0)); + ChangePlayButtonTag(playBtn); if (needFireEvent) { auto json = JsonUtil::Create(true); @@ -421,6 +466,7 @@ void VideoPattern::OnPrepared(double width, double height, uint32_t duration, ui } UpdateLooping(); UpdateSpeed(); + UpdateMuted(); if (isStop_) { isStop_ = false; @@ -529,7 +575,7 @@ void VideoPattern::OnUpdateTime(uint32_t time, int pos) const auto layoutProperty = host->GetLayoutProperty(); CHECK_NULL_VOID(layoutProperty); bool needControlBar = layoutProperty->GetControlsValue(true); - if (!needControlBar) { + if (!needControlBar && pos == CURRENT_POS) { return; } @@ -544,6 +590,7 @@ void VideoPattern::OnUpdateTime(uint32_t time, int pos) const CHECK_NULL_VOID(controlBar); auto durationNode = DynamicCast(controlBar->GetChildAtIndex(pos)); + CHECK_NULL_VOID(durationNode); auto textLayoutProperty = durationNode->GetLayoutProperty(); CHECK_NULL_VOID(textLayoutProperty); std::string timeText = IntTimeToText(time); @@ -599,18 +646,13 @@ void VideoPattern::OnModifyDone() videoPattern->HiddenChange(hidden); }); } - AddPreviewNodeIfNeeded(); - // Create the control bar - AddControlBarNodeIfNeeded(); - auto context = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(context); - auto platformTask = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::BACKGROUND); - platformTask.PostTask([weak = WeakClaim(this)] { - auto video = weak.Upgrade(); - CHECK_NULL_VOID(video); - video->UpdateMediaPlayer(); - }); + // Update the control bar and preview image. + UpdatePreviewImage(); + UpdateControllerBar(); + + // Update the media player. + UpdateMediaPlayer(); if (SystemProperties::GetExtSurfaceEnabled()) { auto pipelineContext = PipelineContext::GetCurrentContext(); @@ -622,54 +664,77 @@ void VideoPattern::OnModifyDone() EnableDrag(); } -void VideoPattern::AddPreviewNodeIfNeeded() +void VideoPattern::UpdatePreviewImage() { auto layoutProperty = GetLayoutProperty(); + CHECK_NULL_VOID(layoutProperty); + auto posterSourceInfo = layoutProperty->GetPosterImageInfo().value(); + auto imageFit = layoutProperty->GetObjectFitValue(ImageFit::COVER); + auto host = GetHost(); + CHECK_NULL_VOID(host); + + auto video = AceType::DynamicCast(host); + CHECK_NULL_VOID(video); + auto image = AceType::DynamicCast(video->GetPreviewImage()); + CHECK_NULL_VOID(image); if (!isInitialState_ || !layoutProperty->HasPosterImageInfo()) { + auto posterLayoutProperty = image->GetLayoutProperty(); + posterLayoutProperty->UpdateVisibility(VisibleType::INVISIBLE); + image->MarkModifyDone(); return; } - auto host = GetHost(); - CHECK_NULL_VOID(host); - bool isExist = false; - auto children = host->GetChildren(); - auto posterSourceInfo = layoutProperty->GetPosterImageInfo().value(); - auto imageFit = layoutProperty->GetObjectFitValue(ImageFit::COVER); - - for (const auto& child : children) { - if (child->GetTag() == V2::IMAGE_ETS_TAG) { - isExist = true; - auto image = AceType::DynamicCast(child); - auto posterLayoutProperty = image->GetLayoutProperty(); - posterLayoutProperty->UpdateImageSourceInfo(posterSourceInfo); - posterLayoutProperty->UpdateImageFit(imageFit); - image->MarkModifyDone(); - break; - } + if (!posterSourceInfo.IsValid()) { + auto posterLayoutProperty = image->GetLayoutProperty(); + posterLayoutProperty->UpdateVisibility(VisibleType::INVISIBLE); + image->MarkModifyDone(); + LOGI("Src image is not valid."); + return; } - if (!isExist) { - auto posterNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, -1, AceType::MakeRefPtr()); - CHECK_NULL_VOID(posterNode); - auto posterLayoutProperty = posterNode->GetLayoutProperty(); + if (image) { + auto posterLayoutProperty = image->GetLayoutProperty(); + posterLayoutProperty->UpdateVisibility(VisibleType::VISIBLE); posterLayoutProperty->UpdateImageSourceInfo(posterSourceInfo); posterLayoutProperty->UpdateImageFit(imageFit); - host->AddChild(posterNode); - posterNode->MarkModifyDone(); + image->MarkModifyDone(); } } -void VideoPattern::AddControlBarNodeIfNeeded() +void VideoPattern::UpdateControllerBar() { auto layoutProperty = GetLayoutProperty(); + CHECK_NULL_VOID(layoutProperty); auto host = GetHost(); CHECK_NULL_VOID(host); auto children = host->GetChildren(); if (layoutProperty->GetControlsValue(true)) { - bool isExist = false; + auto video = AceType::DynamicCast(host); + CHECK_NULL_VOID(video); + auto controller = AceType::DynamicCast(video->GetControllerRow()); + + if (controller) { + auto sliderNode = DynamicCast(controller->GetChildAtIndex(SLIDER_POS)); + CHECK_NULL_VOID(sliderNode); + auto sliderPattern = sliderNode->GetPattern(); + CHECK_NULL_VOID(sliderPattern); + sliderPattern->UpdateValue(static_cast(currentPos_)); + sliderNode->MarkModifyDone(); + + auto textNode = DynamicCast(controller->GetChildAtIndex(CURRENT_POS)); + CHECK_NULL_VOID(textNode); + auto textLayoutProperty = textNode->GetLayoutProperty(); + CHECK_NULL_VOID(textLayoutProperty); + std::string label = IntTimeToText(currentPos_); + textLayoutProperty->UpdateContent(label); + textNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE_SELF); + textNode->MarkModifyDone(); + auto controllerLayoutProperty = controller->GetLayoutProperty(); + controllerLayoutProperty->UpdateVisibility(VisibleType::VISIBLE); + controller->MarkModifyDone(); + } for (const auto& child : children) { if (child->GetTag() == V2::ROW_ETS_TAG) { - isExist = true; if (isDrag_) { host->RemoveChild(child); auto controlBar = CreateControlBar(); @@ -678,22 +743,15 @@ void VideoPattern::AddControlBarNodeIfNeeded() break; } } - if (!isExist) { - auto controlBar = CreateControlBar(); - host->AddChild(controlBar); - } } else { - auto iter = children.begin(); - while (iter != children.end()) { - if ((*iter)->GetTag() == V2::ROW_ETS_TAG) { - host->RemoveChild(*iter); - host->RebuildRenderContextTree(); - auto context = PipelineContext::GetCurrentContext(); - CHECK_NULL_VOID(context); - context->RequestFrame(); - break; - } - ++iter; + auto video = AceType::DynamicCast(host); + CHECK_NULL_VOID(video); + auto controller = AceType::DynamicCast(video->GetControllerRow()); + CHECK_NULL_VOID(controller); + if (controller) { + auto controllerLayoutProperty = controller->GetLayoutProperty(); + controllerLayoutProperty->UpdateVisibility(VisibleType::INVISIBLE); + controller->MarkModifyDone(); } } } @@ -780,13 +838,14 @@ void VideoPattern::OnAreaChangedInner() } } -RefPtr VideoPattern::CreateControlBar() +RefPtr VideoPattern::CreateControlBar(int32_t nodeId) { auto pipelineContext = PipelineBase::GetCurrentContext(); CHECK_NULL_RETURN(pipelineContext, nullptr); auto videoTheme = pipelineContext->GetTheme(); CHECK_NULL_RETURN(videoTheme, nullptr); - auto controlBar = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr(false)); + auto controlBar = FrameNode::GetOrCreateFrameNode( + V2::ROW_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr(false); }); CHECK_NULL_RETURN(controlBar, nullptr); auto playButton = CreateSVG(); @@ -843,7 +902,6 @@ RefPtr VideoPattern::CreateSlider() SliderOnChangeEvent sliderOnChangeEvent = [weak = WeakClaim(this)](float value, int32_t mode) { auto videoPattern = weak.Upgrade(); CHECK_NULL_VOID(videoPattern); - videoPattern->SetCurrentTime(value); videoPattern->OnSliderChange(value, mode); }; auto sliderEventHub = sliderNode->GetEventHub(); @@ -1000,18 +1058,14 @@ void VideoPattern::Start() CHECK_NULL_VOID(context); auto host = GetHost(); CHECK_NULL_VOID(host); - const auto& children = host->GetChildren(); - auto iter = children.begin(); - while (iter != children.end()) { - if ((*iter)->GetTag() == V2::IMAGE_ETS_TAG) { - iter = host->RemoveChild(*iter); - host->RebuildRenderContextTree(); - context->RequestFrame(); - break; - } - ++iter; - } + auto video = AceType::DynamicCast(host); + CHECK_NULL_VOID(video); + auto image = AceType::DynamicCast(video->GetPreviewImage()); + CHECK_NULL_VOID(image); + auto posterLayoutProperty = image->GetLayoutProperty(); + posterLayoutProperty->UpdateVisibility(VisibleType::INVISIBLE); + image->MarkModifyDone(); auto platformTask = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::BACKGROUND); platformTask.PostTask([weak = WeakClaim(RawPtr(mediaPlayer_))] { @@ -1045,7 +1099,6 @@ void VideoPattern::Stop() } OnCurrentTimeChange(0); - OnPlayerStatus(PlaybackStatus::STOPPED); LOGD("Video Stop"); mediaPlayer_->Stop(); isStop_ = true; @@ -1135,7 +1188,7 @@ void VideoPattern::ChangeFullScreenButtonTag(bool isFullScreen, RefPtrIsMediaPlayerValid()) { return; } @@ -1148,7 +1201,7 @@ void VideoPattern::SetCurrentTime(float currentPos, OHOS::Ace::SeekMode seekMode void VideoPattern::OnSliderChange(float posTime, int32_t mode) { LOGD("posTime: %{public}lf, mode: %{public}d", posTime, mode); - SetCurrentTime(posTime); + SetCurrentTime(posTime, OHOS::Ace::SeekMode::SEEK_CLOSEST); auto eventHub = GetEventHub(); auto json = JsonUtil::Create(true); json->Put("time", static_cast(posTime)); @@ -1239,8 +1292,7 @@ void VideoPattern::EnableDrag() imageSrcBefore = layoutProperty->GetPosterImageInfo().value().GetSrc(); } #ifdef ENABLE_DRAG_FRAMEWORK - auto dragEnd = [this, videoSrcBefore]( - const RefPtr& event, const std::string& extraParams) { + auto dragEnd = [this, videoSrcBefore](const RefPtr& event, const std::string& extraParams) { auto videoLayoutProperty = this->GetLayoutProperty(); std::shared_ptr unifiedData = event->GetData(); std::string videoSrc = ""; @@ -1249,7 +1301,7 @@ void VideoPattern::EnableDrag() if (records.size() == 0) { LOGE("unifiedRecords is empty"); } - auto video = reinterpret_cast(records[0].get()); + auto video = reinterpret_cast(records[0].get()); videoSrc = video->GetUri(); } else { auto json = JsonUtil::ParseJsonString(extraParams); @@ -1272,7 +1324,7 @@ void VideoPattern::EnableDrag() }; #else auto dragEnd = [this, videoSrcBefore, imageSrcBefore]( - const RefPtr& event, const std::string& extraParams) { + const RefPtr& event, const std::string& extraParams) { if (extraParams.empty()) { LOGE("extraParams is empty"); return; @@ -1295,7 +1347,7 @@ void VideoPattern::EnableDrag() if (index != 0) { imageSrc = extraInfo.substr(0, index); } - + bool isInitialState = this->isInitialState_; if ((!isInitialState && videoSrc == videoSrcBefore) || (isInitialState && videoSrc == videoSrcBefore && imageSrc == imageSrcBefore)) { diff --git a/frameworks/core/components_ng/pattern/video/video_pattern.h b/frameworks/core/components_ng/pattern/video/video_pattern.h index 593ba7d53b6..732e4dac43f 100644 --- a/frameworks/core/components_ng/pattern/video/video_pattern.h +++ b/frameworks/core/components_ng/pattern/video/video_pattern.h @@ -115,6 +115,8 @@ public: return { FocusType::SCOPE, true }; } + RefPtr CreateControlBar(int32_t nodeId = -1); + void SetHiddenChangeEvent(HiddenChangeEvent&& hiddenChangeEvent) { hiddenChangeEvent_ = std::move(hiddenChangeEvent); @@ -137,7 +139,8 @@ public: void OnAreaChangedInner() override; void UpdateMediaPlayer(); - + void ResetMediaPlayer(); + void EnableDrag(); void SetIsStop(bool isStop) { @@ -185,10 +188,10 @@ private: void OnUpdateTime(uint32_t time, int pos) const; void OnFullScreenChange(bool isFullScreen); - void AddPreviewNodeIfNeeded(); - void AddControlBarNodeIfNeeded(); + void UpdatePreviewImage(); + void UpdateControllerBar(); void UpdateVideoProperty(); - RefPtr CreateControlBar(); + static RefPtr CreateSVG(); static RefPtr CreateText(uint32_t time); RefPtr CreateSlider(); @@ -198,6 +201,7 @@ private: void ChangeFullScreenButtonTag(bool isFullScreen, RefPtr& fullScreenBtn); void ResetStatus(); void HiddenChange(bool hidden); + void PrintPlayerStatus(PlaybackStatus status); // Fire error manually, eg. src is not existed. It must run on ui. void FireError(); diff --git a/frameworks/core/components_ng/test/mock/render/mock_media_player.h b/frameworks/core/components_ng/test/mock/render/mock_media_player.h index 0dfe4e3b022..bc375c48c0d 100644 --- a/frameworks/core/components_ng/test/mock/render/mock_media_player.h +++ b/frameworks/core/components_ng/test/mock/render/mock_media_player.h @@ -23,10 +23,25 @@ #include "core/components_ng/render/media_player.h" namespace OHOS::Ace::NG { +namespace { +constexpr int32_t DEFAULT_WIDTH = 100; +constexpr int32_t DEFAULT_HEIGHT = 100; +} // namespace + class MockMediaPlayer : public MediaPlayer { DECLARE_ACE_TYPE(MockMediaPlayer, MediaPlayer) public: ~MockMediaPlayer() override = default; + + int32_t GetVideoWidth() override + { + return DEFAULT_WIDTH; + } + + int32_t GetVideoHeight() override + { + return DEFAULT_HEIGHT; + } MOCK_METHOD0(IsMediaPlayerValid, bool()); MOCK_METHOD1(SetSource, bool(const std::string&)); @@ -37,8 +52,6 @@ public: MOCK_METHOD0(Prepare, int32_t()); MOCK_METHOD0(Stop, int32_t()); MOCK_METHOD2(Seek, int32_t(int32_t, SeekMode)); - MOCK_METHOD0(GetVideoWidth, int32_t()); - MOCK_METHOD0(GetVideoHeight, int32_t()); }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MOCK_MEDIA_PLAYER_H diff --git a/frameworks/core/components_ng/test/pattern/video/BUILD.gn b/frameworks/core/components_ng/test/pattern/video/BUILD.gn index 5e15fc9c82b..694f2673117 100644 --- a/frameworks/core/components_ng/test/pattern/video/BUILD.gn +++ b/frameworks/core/components_ng/test/pattern/video/BUILD.gn @@ -70,7 +70,6 @@ ohos_unittest("video_pattern_test_ng") { "$ace_root/frameworks/core/components_ng/base/geometry_node.cpp", "$ace_root/frameworks/core/components_ng/base/ui_node.cpp", "$ace_root/frameworks/core/components_ng/base/view_abstract.cpp", - "$ace_root/frameworks/core/components_ng/base/view_stack_processor.cpp", # components_ng_event "$ace_root/frameworks/core/components_ng/event/click_event.cpp", @@ -164,6 +163,7 @@ ohos_unittest("video_pattern_test_ng") { "$ace_root/frameworks/core/common/test/mock/mock_ace_application_info.cpp", "$ace_root/frameworks/core/components_ng/test/mock/animation/mock_geometry_transition.cpp", "$ace_root/frameworks/core/components_ng/test/mock/base/mock_localization.cpp", + "$ace_root/frameworks/core/components_ng/test/mock/base/mock_view_stack_processor.cpp", "$ace_root/frameworks/core/components_ng/test/mock/image_provider/mock_image_loading_context.cpp", "$ace_root/frameworks/core/components_ng/test/mock/image_provider/mock_image_painter.cpp", "$ace_root/frameworks/core/components_ng/test/mock/image_provider/mock_image_source_info.cpp", @@ -189,6 +189,7 @@ ohos_unittest("video_pattern_test_ng") { "$ace_root/frameworks/core/components_ng/pattern/video/video_accessibility_property.cpp", "$ace_root/frameworks/core/components_ng/pattern/video/video_layout_algorithm.cpp", "$ace_root/frameworks/core/components_ng/pattern/video/video_model_ng.cpp", + "$ace_root/frameworks/core/components_ng/pattern/video/video_node.cpp", "$ace_root/frameworks/core/components_ng/pattern/video/video_pattern.cpp", "video_accessibility_property_test_ng.cpp", "video_pattern_focus_test_ng.cpp", diff --git a/frameworks/core/components_ng/test/pattern/video/video_accessibility_property_test_ng.cpp b/frameworks/core/components_ng/test/pattern/video/video_accessibility_property_test_ng.cpp index aa39f9000c6..45f6cb39563 100644 --- a/frameworks/core/components_ng/test/pattern/video/video_accessibility_property_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/video/video_accessibility_property_test_ng.cpp @@ -70,8 +70,7 @@ RefPtr VideoAccessibilityPropertyTestNg::CreateVideoNode() CHECK_NULL_RETURN(pattern, nullptr); EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) .WillRepeatedly(Return(false)); - - RefPtr element = ViewStackProcessor::GetInstance()->Finish(); + RefPtr element = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_RETURN(element, nullptr); return AceType::DynamicCast(element); } @@ -119,7 +118,6 @@ HWTEST_F(VideoAccessibilityPropertyTestNg, VideoAccessibilityPropertyTest002, Te EXPECT_EQ(accessibilityValue.min, 0); EXPECT_EQ(accessibilityValue.max, 0); EXPECT_EQ(accessibilityValue.current, 0); - auto pattern = frameNode->GetPattern(); ASSERT_NE(pattern, nullptr); EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) @@ -137,4 +135,4 @@ HWTEST_F(VideoAccessibilityPropertyTestNg, VideoAccessibilityPropertyTest002, Te accessibilityValue = videoAccessibilitProperty->GetAccessibilityValue(); EXPECT_EQ(accessibilityValue.current, 0); } -} // namespace OHOS::Ace::NG \ No newline at end of file +} // namespace OHOS::Ace::NG diff --git a/frameworks/core/components_ng/test/pattern/video/video_pattern_focus_test_ng.cpp b/frameworks/core/components_ng/test/pattern/video/video_pattern_focus_test_ng.cpp index 2bfda85aeb0..4d747cb6226 100644 --- a/frameworks/core/components_ng/test/pattern/video/video_pattern_focus_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/video/video_pattern_focus_test_ng.cpp @@ -92,18 +92,15 @@ void VideoPatternFocusTestNg::TearDownTestSuite() RefPtr VideoPatternFocusTestNg::CreateVideoNode(TestProperty& testProperty) { - if (testProperty.videoController.has_value()) { - VideoModelNG().Create(testProperty.videoController.value()); - } else { - auto videoController = AceType::MakeRefPtr(); - VideoModelNG().Create(videoController); - } + auto videoController = AceType::MakeRefPtr(); + VideoModelNG().Create(videoController); + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); CHECK_NULL_RETURN(frameNode, nullptr); auto videoPattern = AceType::DynamicCast(frameNode->GetPattern()); CHECK_NULL_RETURN(videoPattern, nullptr); EXPECT_CALL(*(AceType::DynamicCast(videoPattern->mediaPlayer_)), IsMediaPlayerValid()) - .WillRepeatedly(Return(false)); + .WillRepeatedly(Return(true)); if (testProperty.src.has_value()) { VideoModelNG().SetSrc(testProperty.src.value()); @@ -126,8 +123,7 @@ RefPtr VideoPatternFocusTestNg::CreateVideoNode(TestProperty& testPro if (testProperty.loop.has_value()) { VideoModelNG().SetLoop(testProperty.loop.value()); } - - RefPtr element = ViewStackProcessor::GetInstance()->Finish(); // pop + RefPtr element = ViewStackProcessor::GetInstance()->GetMainFrameNode(); return AceType::DynamicCast(element); } @@ -158,39 +154,29 @@ HWTEST_F(VideoPatternFocusTestNg, VideoFocusTest001, TestSize.Level1) */ HWTEST_F(VideoPatternFocusTestNg, VideoFocusTest002, TestSize.Level1) { - VideoModelNG video; - auto videoController = AceType::MakeRefPtr(); - video.Create(videoController); - /** * @tc.steps: step1. Create Video * @tc.expected: step1. Create Video successfully */ - auto frameNodeTemp = ViewStackProcessor::GetInstance()->GetMainFrameNode(); - CHECK_NULL_VOID(frameNodeTemp); - auto videoPatternTemp = AceType::DynamicCast(frameNodeTemp->GetPattern()); - CHECK_NULL_VOID(videoPatternTemp); - EXPECT_CALL(*(AceType::DynamicCast(videoPatternTemp->mediaPlayer_)), IsMediaPlayerValid()) - .WillRepeatedly(Return(false)); - - // when video set preview image and control, it will contains two children which are image and row respectively. - video.SetPosterSourceInfo(VIDEO_POSTER_URL); - video.SetControls(true); - - auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); - EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::VIDEO_ETS_TAG); + auto frameNode = CreateVideoNode(testProperty); + EXPECT_TRUE(frameNode); + EXPECT_EQ(frameNode->GetTag(), V2::VIDEO_ETS_TAG); + frameNode->GetOrCreateFocusHub()->currentFocus_ = true; + auto videoPattern = frameNode->GetPattern(); + CHECK_NULL_VOID(videoPattern); + EXPECT_CALL(*(AceType::DynamicCast(videoPattern->mediaPlayer_)), IsMediaPlayerValid()) + .WillRepeatedly(Return(true)); + auto videoLayoutProperty = frameNode->GetLayoutProperty(); ASSERT_NE(videoLayoutProperty, nullptr); /** * @tc.steps: step2. Create LayoutWrapper and set videoLayoutAlgorithm. - * @tc.expected: step2. Create video pattern nad node successfully. + * @tc.expected: step2. Create video pattern and node successfully. */ RefPtr geometryNode = AceType::MakeRefPtr(); ASSERT_NE(geometryNode, nullptr); LayoutWrapper layoutWrapper = LayoutWrapper(frameNode, geometryNode, frameNode->GetLayoutProperty()); - auto videoPattern = frameNode->GetPattern(); - ASSERT_NE(videoPattern, nullptr); auto videoLayoutAlgorithm = videoPattern->CreateLayoutAlgorithm(); ASSERT_NE(videoLayoutAlgorithm, nullptr); layoutWrapper.SetLayoutAlgorithm(AceType::MakeRefPtr(videoLayoutAlgorithm)); @@ -211,7 +197,6 @@ HWTEST_F(VideoPatternFocusTestNg, VideoFocusTest002, TestSize.Level1) * @tc.steps: step4. Set the framenode tree, and test the focus. * @tc.expected: step4. Test focus on child successfully. */ - videoPattern->OnModifyDone(); frameNode->GetOrCreateFocusHub()->RequestFocusImmediately(); for (const auto& child : frameNode->GetChildren()) { diff --git a/frameworks/core/components_ng/test/pattern/video/video_pattern_test_ng.cpp b/frameworks/core/components_ng/test/pattern/video/video_pattern_test_ng.cpp index a374fd5bf45..d3b21553e9d 100644 --- a/frameworks/core/components_ng/test/pattern/video/video_pattern_test_ng.cpp +++ b/frameworks/core/components_ng/test/pattern/video/video_pattern_test_ng.cpp @@ -130,6 +130,9 @@ void VideoPropertyTestNg::SetUpTestSuite() testProperty.loop = LOOP_VALUE; testProperty.objectFit = VIDEO_IMAGE_FIT; MockPipelineBase::SetUp(); + auto themeManager = AceType::MakeRefPtr(); + MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); + EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); } void VideoPropertyTestNg::TearDownTestSuite() @@ -150,7 +153,7 @@ RefPtr VideoPropertyTestNg::CreateVideoNode(TestProperty& testPropert auto videoPattern = AceType::DynamicCast(frameNode->GetPattern()); CHECK_NULL_RETURN(videoPattern, nullptr); EXPECT_CALL(*(AceType::DynamicCast(videoPattern->mediaPlayer_)), IsMediaPlayerValid()) - .WillRepeatedly(Return(false)); + .WillRepeatedly(Return(true)); if (testProperty.src.has_value()) { VideoModelNG().SetSrc(testProperty.src.value()); @@ -177,7 +180,7 @@ RefPtr VideoPropertyTestNg::CreateVideoNode(TestProperty& testPropert VideoModelNG().SetObjectFit(testProperty.objectFit.value()); } - RefPtr element = ViewStackProcessor::GetInstance()->Finish(); // pop + RefPtr element = ViewStackProcessor::GetInstance()->GetMainFrameNode(); return AceType::DynamicCast(element); } @@ -224,7 +227,7 @@ HWTEST_F(VideoPropertyTestNg, VideoPropertyTest002, TestSize.Level1) video.SetLoop(LOOP_VALUE); video.SetObjectFit(VIDEO_IMAGE_FIT); - auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainFrameNode()); EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::VIDEO_ETS_TAG); auto videoLayoutProperty = frameNode->GetLayoutProperty(); EXPECT_FALSE(videoLayoutProperty == nullptr); @@ -272,7 +275,7 @@ HWTEST_F(VideoPropertyTestNg, VideoEventTest003, TestSize.Level1) video.SetOnUpdate(videoEvent); video.SetOnFullScreenChange(videoEvent); - auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainFrameNode()); EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::VIDEO_ETS_TAG); auto videoEventHub = frameNode->GetEventHub(); EXPECT_TRUE(videoEventHub != nullptr); @@ -315,7 +318,7 @@ HWTEST_F(VideoPropertyTestNg, VideoMeasureContentTest004, TestSize.Level1) EXPECT_CALL(*(AceType::DynamicCast(videoPatternTemp->mediaPlayer_)), IsMediaPlayerValid()) .WillRepeatedly(Return(false)); - auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainFrameNode()); EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::VIDEO_ETS_TAG); auto videoLayoutProperty = frameNode->GetLayoutProperty(); EXPECT_FALSE(videoLayoutProperty == nullptr); @@ -375,7 +378,7 @@ HWTEST_F(VideoPropertyTestNg, VideoMeasureTest005, TestSize.Level1) video.SetPosterSourceInfo(VIDEO_POSTER_URL); video.SetControls(CONTROL_VALUE); - auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainFrameNode()); EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::VIDEO_ETS_TAG); auto videoLayoutProperty = frameNode->GetLayoutProperty(); EXPECT_FALSE(videoLayoutProperty == nullptr); @@ -399,8 +402,6 @@ HWTEST_F(VideoPropertyTestNg, VideoMeasureTest005, TestSize.Level1) EXPECT_EQ(videoSize1, SizeF(VIDEO_WIDTH, VIDEO_WIDTH)); layoutWrapper.GetGeometryNode()->SetContentSize(videoSize1); - auto frameNodeRow = FrameNode::CreateFrameNode(V2::ROW_ETS_TAG, -1, AceType::MakeRefPtr()); - frameNode->AddChild(frameNodeRow); const auto& children = frameNode->GetChildren(); for (const auto& child : children) { auto frameNodeChild = AceType::DynamicCast(child); @@ -435,6 +436,10 @@ HWTEST_F(VideoPropertyTestNg, VideoMeasureTest005, TestSize.Level1) */ HWTEST_F(VideoPropertyTestNg, VideoPatternTest006, TestSize.Level1) { + auto themeManager = AceType::MakeRefPtr(); + MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); + EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); + /** * @tc.steps: step1. Create Video * @tc.expected: step1. Create Video successfully @@ -446,48 +451,13 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest006, TestSize.Level1) ASSERT_TRUE(pattern); /** - * @tc.steps: step2. Add a child, in order to go to some branches + * @tc.steps: step2. check the children size. */ - auto nodeRedundant = AceType::MakeRefPtr("redundant", -1, AceType::MakeRefPtr()); - frameNode->AddChild(nodeRedundant, 0); - - /** - * @tc.steps: step3. call AddPreviewNodeIfNeeded - * case1: isInitialState_ = true, has not PosterImageInfo - * case2: isInitialState_ = false, has not PosterImageInfo - * case3: isInitialState_ = false, has PosterImageInfo - * case4: isInitialState_ = true, has PosterImageInfo(), previewNode not exist - * case5: isInitialState_ = true, has PosterImageInfo(), previewNode exists - * @tc.expected: step3. previewNode create successfully - */ - pattern->AddPreviewNodeIfNeeded(); // case1 auto children = frameNode->GetChildren(); auto childrenSize = static_cast(children.size()); - EXPECT_EQ(childrenSize, 1); - - pattern->isInitialState_ = false; - pattern->AddPreviewNodeIfNeeded(); // case2 - children = frameNode->GetChildren(); - childrenSize = static_cast(children.size()); - EXPECT_EQ(childrenSize, 1); - - auto videoLayoutProperty = frameNode->GetLayoutProperty(); - videoLayoutProperty->UpdatePosterImageInfo(ImageSourceInfo(VIDEO_POSTER_URL)); - pattern->AddPreviewNodeIfNeeded(); // case3 - children = frameNode->GetChildren(); - childrenSize = static_cast(children.size()); - EXPECT_EQ(childrenSize, 1); - - pattern->isInitialState_ = true; - pattern->AddPreviewNodeIfNeeded(); // case4 - children = frameNode->GetChildren(); - childrenSize = static_cast(children.size()); - EXPECT_EQ(childrenSize, 2); - - pattern->AddPreviewNodeIfNeeded(); // case5 - children = frameNode->GetChildren(); - childrenSize = static_cast(children.size()); EXPECT_EQ(childrenSize, 2); + auto image = frameNode->GetChildAtIndex(0); + EXPECT_EQ(image->GetTag(), V2::IMAGE_ETS_TAG); } /** @@ -507,40 +477,17 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest007, TestSize.Level1) auto pattern = frameNode->GetPattern(); ASSERT_TRUE(pattern); - /** - * @tc.steps: step2. Add a child, in order to go to some branches - */ - auto nodeRedundant = AceType::MakeRefPtr("redundant", -1, AceType::MakeRefPtr()); - frameNode->AddChild(nodeRedundant, 0); - auto themeManager = AceType::MakeRefPtr(); - MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); - EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); EXPECT_CALL(*(AceType::DynamicCast(pattern->renderSurface_)), IsSurfaceValid()) .WillOnce(Return(false)); /** - * @tc.steps: step3. call AddControlBarNodeIfNeeded - * case1: ControlsValue = true, controlBar not exist - * case2: ControlsValue = true, controlBar exists - * case3: ControlsValue = false, controlBar exists - * @tc.expected: step3. controlBarNode create and destroy successfully + * @tc.steps: step2. Add a child, in order to go to some branches */ - pattern->AddControlBarNodeIfNeeded(); // case1 auto children = frameNode->GetChildren(); auto childrenSize = static_cast(children.size()); EXPECT_EQ(childrenSize, 2); - - pattern->AddControlBarNodeIfNeeded(); // case2 - children = frameNode->GetChildren(); - childrenSize = static_cast(children.size()); - EXPECT_EQ(childrenSize, 2); - - auto videoLayoutProperty = frameNode->GetLayoutProperty(); - videoLayoutProperty->UpdateControls(false); - pattern->AddControlBarNodeIfNeeded(); // case3 - children = frameNode->GetChildren(); - childrenSize = static_cast(children.size()); - EXPECT_EQ(childrenSize, 1); + auto row = frameNode->GetChildAtIndex(1); + EXPECT_EQ(row->GetTag(), V2::ROW_ETS_TAG); } /** @@ -601,7 +548,7 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest008, TestSize.Level1) * @tc.expected: step5. IsMediaPlayerValid will be called 4 times. */ EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) - .Times(4) + .Times(5) .WillRepeatedly(Return(true)); pattern->UpdateMediaPlayer(); @@ -760,6 +707,9 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest009, TestSize.Level1) */ HWTEST_F(VideoPropertyTestNg, VideoPatternTest010, TestSize.Level1) { + auto themeManager = AceType::MakeRefPtr(); + MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); + EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); /** * @tc.steps: step1. Create Video * @tc.expected: step1. Create Video successfully @@ -773,15 +723,9 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest010, TestSize.Level1) /** * @tc.steps: step2. Prepare the childNode & videoEvent */ - auto themeManager = AceType::MakeRefPtr(); - MockPipelineBase::GetCurrent()->SetThemeManager(themeManager); - EXPECT_CALL(*themeManager, GetTheme(_)).WillRepeatedly(Return(AceType::MakeRefPtr())); - frameNode->RemoveChildAtIndex(0); // remove the controlBar created in onModifyDone - auto controlBar = pattern->CreateControlBar(); + // frameNode->RemoveChildAtIndex(0); // remove the controlBar created in onModifyDone + auto controlBar = frameNode->GetChildAtIndex(1); ASSERT_TRUE(controlBar); - auto tempFrameNode = AceType::MakeRefPtr("TEMP", -1, AceType::MakeRefPtr()); - frameNode->AddChild(controlBar); // Add ControlBar - frameNode->AddChild(tempFrameNode, 0); // Add a redundant node to go other branch auto playBtn = AceType::DynamicCast(controlBar->GetChildAtIndex(0)); ASSERT_TRUE(playBtn); @@ -817,12 +761,10 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest010, TestSize.Level1) // case1: MediaPlayer is invalid auto flag = playBtnGestureEventHub->ActClick(); EXPECT_TRUE(flag); - // case2: MediaPlayer is valid & isPlaying = true EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), Pause()).Times(1).WillOnce(Return(0)); flag = playBtnGestureEventHub->ActClick(); EXPECT_TRUE(flag); - // case3: MediaPlayer is valid & isPlaying = false pattern->isPlaying_ = false; flag = playBtnGestureEventHub->ActClick(); @@ -836,8 +778,6 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest010, TestSize.Level1) .Times(2) .WillOnce(Return(false)) .WillOnce(Return(true)); - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), GetVideoWidth()).Times(1); - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), GetVideoHeight()).Times(1); // case1: MediaPlayer is invalid pattern->OnPlayerStatus(PlaybackStatus::PREPARED); EXPECT_EQ(pauseCheck, VIDEO_PAUSE_EVENT); @@ -856,7 +796,6 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest010, TestSize.Level1) */ pattern->OnPlayerStatus(PlaybackStatus::PLAYBACK_COMPLETE); // case1: controls = true EXPECT_EQ(finishCheck, VIDEO_FINISH_EVENT); - auto videoLayoutProperty = pattern->GetLayoutProperty(); videoLayoutProperty->UpdateControls(false); pattern->OnPlayerStatus(PlaybackStatus::PLAYBACK_COMPLETE); // case2: controls = false @@ -880,9 +819,6 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest011, TestSize.Level1) auto pattern = frameNode->GetPattern(); ASSERT_TRUE(pattern); - auto tempFrameNode = AceType::MakeRefPtr("TEMP", -1, AceType::MakeRefPtr()); - frameNode->AddChild(tempFrameNode, 0); // Add a redundant node to go other branch - // set videoEvent auto videoEventHub = frameNode->GetEventHub(); ASSERT_TRUE(videoEventHub); @@ -897,8 +833,13 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest011, TestSize.Level1) * case1: needControlBar & needFireEvent = true, isStop_ & autoPlay_ = false * @tc.expected: step2. FirePreparedEvent will be called & duration_ has changed */ + EXPECT_CALL(*(AceType::DynamicCast(pattern->renderSurface_)), IsSurfaceValid()) + .WillOnce(Return(false)); + EXPECT_TRUE(videoLayoutProperty->GetControlsValue(true)); - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()).Times(2); + EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) + .Times(3) + .WillRepeatedly(Return(true)); pattern->OnPrepared(VIDEO_WIDTH, VIDEO_HEIGHT, DURATION, 0, true); EXPECT_EQ(pattern->duration_, DURATION); EXPECT_EQ(preparedCheck, VIDEO_PREPARED_EVENT); @@ -908,12 +849,13 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest011, TestSize.Level1) * case2: needControlBar & needFireEvent = false, isStop_ & autoPlay_ = true * @tc.expected: step3. FirePreparedEvent will not be called & duration_ has changed */ - videoLayoutProperty->UpdateControls(false); preparedCheck.clear(); pattern->duration_ = 0; pattern->isStop_ = true; pattern->autoPlay_ = true; - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()).Times(4); + EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) + .Times(5) + .WillRepeatedly(Return(true)); pattern->OnPrepared(VIDEO_WIDTH, VIDEO_HEIGHT, DURATION, 0, false); EXPECT_EQ(pattern->duration_, DURATION); EXPECT_TRUE(preparedCheck.empty()); @@ -936,10 +878,7 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest012, TestSize.Level1) auto pattern = frameNode->GetPattern(); ASSERT_TRUE(pattern); - auto tempFrameNode = AceType::MakeRefPtr("TEMP", -1, AceType::MakeRefPtr()); - frameNode->AddChild(tempFrameNode, 0); // Add a redundant node to go other branch - auto imageFrameNode = AceType::MakeRefPtr(V2::IMAGE_ETS_TAG, -1, AceType::MakeRefPtr()); - frameNode->AddChild(imageFrameNode); // Add a image node to go other branch + auto imageFrameNode = frameNode->GetChildAtIndex(0); auto rawChildNum = static_cast(frameNode->GetChildren().size()); // set video event @@ -974,36 +913,42 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest012, TestSize.Level1) pattern->Start(); auto childNum = static_cast(frameNode->GetChildren().size()); EXPECT_EQ(childNum, rawChildNum); - } else { - EXPECT_CALL(*(AceType::DynamicCast(pattern->renderSurface_)), IsSurfaceValid()) - .Times(1) - .WillOnce(Return(prepareReturn == 0)); - if (prepareReturn == 0) { - frameNode->AddChild(imageFrameNode); - } - pattern->isPlaying_ = false; - pattern->Start(); // will remove the imageFrameNode - auto childNum = static_cast(frameNode->GetChildren().size()); - EXPECT_EQ(childNum, rawChildNum - 1); } } } /** - * @tc.steps: step3. Call Stop + * @tc.steps: step3. Call Stop when the mediaplayer is not valid. * @tc.expected: step3. relevant functions called correctly */ + pattern->currentPos_ = 10; + pattern->isStop_ = false; EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) .WillOnce(Return(false)); - pattern->Stop(); // case1: media player is invalid + pattern->Stop(); + EXPECT_EQ(static_cast(pattern->currentPos_), 10); + EXPECT_EQ(pattern->isStop_, false); + + /** + * @tc.steps: step3. Call Stop when the mediaplayer is valid. + * @tc.expected: step3. relevant functions called correctly + */ + pattern->currentPos_ = 10; + pattern->isStop_ = false; + pattern->duration_ = 20; + EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) + .WillOnce(Return(true)); + EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), Stop()).WillOnce(Return(0)); + pattern->Stop(); + EXPECT_EQ(static_cast(pattern->currentPos_), 0); + EXPECT_EQ(pattern->isStop_, true); EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) .WillOnce(Return(true)); EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), Stop()).WillOnce(Return(0)); EXPECT_EQ(static_cast(pattern->currentPos_), 0); pattern->Stop(); // case2: media player is valid & currentPos = currentPos_ = 0 - EXPECT_EQ(pauseCheck, VIDEO_PAUSE_EVENT); - EXPECT_TRUE(updateCheck.empty()); + EXPECT_EQ(pattern->isStop_, true); EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) .Times(2) @@ -1017,17 +962,16 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest012, TestSize.Level1) pattern->Stop(); // case3: media player is valid & currentPos != currentPos_ & duration_ = 0 & // mediaPlayer_->GetDuration return ok // this will call OnUpdateTime(pos=DURATION_POS) - EXPECT_EQ(pauseCheck, VIDEO_PAUSE_EVENT); EXPECT_EQ(static_cast(pattern->currentPos_), 1); EXPECT_EQ(updateCheck, ""); - + EXPECT_EQ(pattern->isStop_, true); updateCheck.clear(); pattern->currentPos_ = 1; pattern->Stop(); // case4: media player is valid & currentPos != currentPos_ & duration_ = 0 & // mediaPlayer_->GetDuration return err - EXPECT_EQ(pauseCheck, VIDEO_PAUSE_EVENT); EXPECT_EQ(static_cast(pattern->currentPos_), 1); EXPECT_EQ(updateCheck, ""); + EXPECT_EQ(pattern->isStop_, true); } /** @@ -1179,7 +1123,7 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest013, TestSize.Level1) /** * @tc.name: VideoPatternTest014 - * @tc.desc: Test OnResolutionChange & OnHiddenChange + * @tc.desc: Test OnResolutionChange * @tc.type: FUNC */ HWTEST_F(VideoPropertyTestNg, VideoPatternTest014, TestSize.Level1) @@ -1199,50 +1143,14 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest014, TestSize.Level1) * @tc.expected: step2. related functions will be called */ EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) - .Times(2) - .WillOnce(Return(false)) + .Times(1) .WillOnce(Return(true)); - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), GetVideoWidth()).Times(1); - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), GetVideoHeight()).Times(1); pattern->OnResolutionChange(); - pattern->OnResolutionChange(); - - /** - * @tc.steps: step3. Call OnVisibleChange several times - * @tc.expected: step3. related functions will be called - */ - EXPECT_CALL(*(AceType::DynamicCast(pattern->mediaPlayer_)), IsMediaPlayerValid()) - .WillRepeatedly(Return(false)); - pattern->OnModifyDone(); - - pattern->hiddenChangeEvent_ = nullptr; - pattern->OnVisibleChange(false); // case: hiddenChangeEvent_ is null - - pattern->OnModifyDone(); // after that, hiddenChangeEvent is not null - pattern->isPlaying_ = false; - pattern->OnVisibleChange(false); // case: isPlaying_=false, hidden=true, mediaPlayer is not null - EXPECT_FALSE(pattern->pastPlayingStatus_); - - pattern->isPlaying_ = true; - pattern->OnVisibleChange(false); // case: isPlaying_=true, hidden=true, mediaPlayer is not null - EXPECT_TRUE(pattern->pastPlayingStatus_); - - pattern->isPlaying_ = false; - pattern->OnVisibleChange(false); // // case: isPlaying_=false, hidden = true, pastPlayingStatus_ = true - - pattern->isPlaying_ = true; - pattern->OnVisibleChange(true); // case: isPlaying_=true, hidden = false, pastPlayingStatus_ = true - EXPECT_FALSE(pattern->pastPlayingStatus_); - - pattern->OnVisibleChange(true); // case: isPlaying_=true, hidden = false, pastPlayingStatus_ = false - EXPECT_FALSE(pattern->pastPlayingStatus_); - - pattern->mediaPlayer_ = nullptr; - pattern->isPlaying_ = true; - pattern->OnVisibleChange(false); // case: isPlaying_=true, hidden=true, mediaPlayer is null - pattern->OnVisibleChange(true); // case: isPlaying_=true, hidden=false, mediaPlayer is null - EXPECT_FALSE(pattern->pastPlayingStatus_); + auto videoLayoutProperty = frameNode->GetLayoutProperty(); + EXPECT_TRUE(videoLayoutProperty->HasVideoSize()); + EXPECT_EQ(videoLayoutProperty->GetVideoSizeValue(SizeF(0, 0)).Width(), 100); + EXPECT_EQ(videoLayoutProperty->GetVideoSizeValue(SizeF(0, 0)).Height(), 100); } /** @@ -1268,7 +1176,7 @@ HWTEST_F(VideoPropertyTestNg, VideoFullScreenTest015, TestSize.Level1) EXPECT_CALL(*(AceType::DynamicCast(videoPatternTemp->mediaPlayer_)), IsMediaPlayerValid()) .WillRepeatedly(Return(false)); - auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->Finish()); + auto frameNode = AceType::DynamicCast(ViewStackProcessor::GetInstance()->GetMainFrameNode()); EXPECT_TRUE(frameNode != nullptr && frameNode->GetTag() == V2::VIDEO_ETS_TAG); auto videoLayoutProperty = frameNode->GetLayoutProperty(); EXPECT_FALSE(videoLayoutProperty == nullptr); @@ -1445,9 +1353,13 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest017, TestSize.Level1) std::unique_ptr tempPtr = std::make_unique(); videoLayoutProperty->propVideoStyle_ = std::move(tempPtr); videoLayoutProperty->propVideoStyle_->propVideoSize = videoSize; - geometryNode->SetContentSize(SizeF(SCREEN_WIDTH_SMALL, 0.0f)); + geometryNode->SetContentSize(SizeF(SCREEN_WIDTH_SMALL, SCREEN_HEIGHT_SMALL)); auto mockRenderContext = AceType::MakeRefPtr(); videoPattern->renderContextForMediaPlayer_ = mockRenderContext; + EXPECT_CALL(*(AceType::RawPtr(AceType::DynamicCast(videoPattern->renderContextForMediaPlayer_))), + SetBounds(0.0f, 0.0f, SCREEN_WIDTH_SMALL, SCREEN_HEIGHT_SMALL)) + .WillOnce(Return()); + EXPECT_FALSE(videoPattern->OnDirtyLayoutWrapperSwap(layoutWrapper, config)); } @@ -1623,7 +1535,7 @@ HWTEST_F(VideoPropertyTestNg, VideoPatternTest020, TestSize.Level1) ASSERT_NE(videoPattern, nullptr); videoPattern->src_ = "test"; - videoPattern->OnModifyDone(); + videoPattern->EnableDrag(); auto eventHub = frameNode->GetEventHub(); ASSERT_NE(eventHub, nullptr); auto dragEnd = eventHub->onDrop_; -- Gitee