diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index 48715a0c4..97b54a563 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -557,6 +557,10 @@ PhotoData *Media::videoCover() const { return nullptr; } +TimeId Media::videoTimestamp() const { + return 0; +} + bool Media::hasQualitiesList() const { return false; } @@ -973,19 +977,16 @@ std::unique_ptr MediaPhoto::createView( MediaFile::MediaFile( not_null parent, not_null document, - PhotoData *videoCover, - bool skipPremiumEffect, - bool hasQualitiesList, - bool spoiler, - crl::time ttlSeconds) + Args &&args) : Media(parent) , _document(document) -, _videoCover(videoCover) +, _videoCover(args.videoCover) +, _ttlSeconds(args.ttlSeconds) , _emoji(document->sticker() ? document->sticker()->alt : QString()) -, _skipPremiumEffect(skipPremiumEffect) -, _hasQualitiesList(hasQualitiesList) -, _spoiler(spoiler) -, _ttlSeconds(ttlSeconds) { +, _videoTimestamp(args.videoTimestamp) +, _skipPremiumEffect(args.skipPremiumEffect) +, _hasQualitiesList(args.hasQualitiesList) +, _spoiler(args.spoiler) { parent->history()->owner().registerDocumentItem(_document, parent); if (!_emoji.isEmpty()) { @@ -1009,14 +1010,14 @@ MediaFile::~MediaFile() { } std::unique_ptr MediaFile::clone(not_null parent) { - return std::make_unique( - parent, - _document, - _videoCover, - !_document->session().premium(), - _hasQualitiesList, - _spoiler, - _ttlSeconds); + return std::make_unique(parent, _document, MediaFile::Args{ + .ttlSeconds = _ttlSeconds, + .videoCover = _videoCover, + .videoTimestamp = _videoTimestamp, + .hasQualitiesList = _hasQualitiesList, + .skipPremiumEffect = !_document->session().premium(), + .spoiler = _spoiler, + }); } DocumentData *MediaFile::document() const { @@ -1027,6 +1028,10 @@ PhotoData *MediaFile::videoCover() const { return _videoCover; } +TimeId MediaFile::videoTimestamp() const { + return _videoTimestamp; +} + bool MediaFile::hasQualitiesList() const { return _hasQualitiesList; } diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index 4dd246ea0..b6e2a32bb 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -180,6 +180,7 @@ public: virtual DocumentData *document() const; virtual PhotoData *videoCover() const; + virtual TimeId videoTimestamp() const; virtual bool hasQualitiesList() const; virtual PhotoData *photo() const; virtual WebPageData *webpage() const; @@ -299,20 +300,26 @@ private: class MediaFile final : public Media { public: + struct Args { + crl::time ttlSeconds = 0; + PhotoData *videoCover = nullptr; + TimeId videoTimestamp = 0; + bool hasQualitiesList = false; + bool skipPremiumEffect = false; + bool spoiler = false; + }; + MediaFile( not_null parent, not_null document, - PhotoData *videoCover, - bool skipPremiumEffect, - bool hasQualitiesList, - bool spoiler, - crl::time ttlSeconds); + Args &&args); ~MediaFile(); std::unique_ptr clone(not_null parent) override; DocumentData *document() const override; PhotoData *videoCover() const override; + TimeId videoTimestamp() const override; bool hasQualitiesList() const override; bool uploading() const override; @@ -343,14 +350,16 @@ public: private: not_null _document; PhotoData *_videoCover = nullptr; - QString _emoji; - bool _skipPremiumEffect = false; - bool _hasQualitiesList = false; - bool _spoiler = false; // Video (unsupported) / Voice / Round. crl::time _ttlSeconds = 0; + QString _emoji; + TimeId _videoTimestamp = 0; + bool _skipPremiumEffect = false; + bool _hasQualitiesList = false; + bool _spoiler = false; + }; class MediaContact final : public Media { diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index fc07cf5d4..ef0741fe3 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -304,16 +304,18 @@ std::unique_ptr HistoryItem::CreateMedia( return document->match([&](const MTPDdocument &document) -> Result { const auto list = media.valt_documents(); const auto owner = &item->history()->owner(); - return std::make_unique( - item, - owner->processDocument(document, list), - (media.vvideo_cover() + const auto data = owner->processDocument(document); + using Args = Data::MediaFile::Args; + return std::make_unique(item, data, Args{ + .ttlSeconds = media.vttl_seconds().value_or_empty(), + .videoCover = (media.vvideo_cover() ? owner->processPhoto(*media.vvideo_cover()).get() : nullptr), - media.is_nopremium(), - list && !list->v.isEmpty(), - media.is_spoiler(), - media.vttl_seconds().value_or_empty()); + .videoTimestamp = media.vvideo_timestamp().value_or_empty(), + .hasQualitiesList = list && !list->v.isEmpty(), + .skipPremiumEffect = media.is_nopremium(), + .spoiler = media.is_spoiler(), + }); }, [](const MTPDdocumentEmpty &) -> Result { return nullptr; }); @@ -657,17 +659,12 @@ HistoryItem::HistoryItem( : HistoryItem(history, fields) { createComponentsHelper(std::move(fields)); - const auto skipPremiumEffect = !history->session().premium(); const auto video = document->video(); - const auto spoiler = false; - _media = std::make_unique( - this, - document, - /*videoCover=*/nullptr, - skipPremiumEffect, - video && !video->qualities.empty(), - spoiler, - /*ttlSeconds = */0); + using Args = Data::MediaFile::Args; + _media = std::make_unique(this, document, Args{ + .hasQualitiesList = video && !video->qualities.empty(), + .skipPremiumEffect = !history->session().premium(), + }); setText(caption); } @@ -1853,18 +1850,12 @@ void HistoryItem::applyChanges(not_null story) { } void HistoryItem::setStoryFields(not_null story) { - const auto spoiler = false; if (const auto photo = story->photo()) { + const auto spoiler = false; _media = std::make_unique(this, photo, spoiler); } else if (const auto document = story->document()) { - _media = std::make_unique( - this, - document, - /*videoCover=*/nullptr, - /*skipPremiumEffect=*/false, - /*hasQualitiesList=*/false, - spoiler, - /*ttlSeconds = */0); + using Args = Data::MediaFile::Args; + _media = std::make_unique(this, document, Args{}); } setText(story->caption()); if (story->pinnedToTop()) { diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp index d1551af4e..84019e776 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.cpp @@ -76,16 +76,11 @@ constexpr auto kSponsoredUserpicLines = 2; const auto spoiler = false; for (const auto &item : data.items) { if (const auto document = std::get_if(&item)) { - const auto hasQualitiesList = false; - const auto skipPremiumEffect = false; - result.push_back(std::make_unique( - parent, - *document, - /*videoCover=*/nullptr, - skipPremiumEffect, - hasQualitiesList, - spoiler, - /*ttlSeconds = */0)); + using MediaFile = Data::MediaFile; + using Args = MediaFile::Args; + const auto data = *document; + result.push_back( + std::make_unique(parent, data, Args{})); } else if (const auto photo = std::get_if(&item)) { result.push_back(std::make_unique( parent, diff --git a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp index 876afcda5..9e3153117 100644 --- a/Telegram/SourceFiles/settings/settings_credits_graphics.cpp +++ b/Telegram/SourceFiles/settings/settings_credits_graphics.cpp @@ -310,14 +310,13 @@ void AddViewMediaHandler( owner->photo(item.id), false)); // spoiler } else { - fake.push_back(std::make_unique( - state->item, - owner->document(item.id), - nullptr, // videoCover - true, // skipPremiumEffect - false, // hasQualitiesList - false, // spoiler - 0)); // ttlSeconds + const auto document = owner->document(item.id); + const auto item = state->item; + using MediaFile = Data::MediaFile; + using Args = MediaFile::Args; + fake.push_back(std::make_unique(item, document, Args{ + .skipPremiumEffect = true, + })); } } state->item->overrideMedia(std::make_unique(