From 2c75fe033cb6bce49fdc8b23ada3ba34185a12b4 Mon Sep 17 00:00:00 2001 From: John Preston Date: Wed, 18 Jan 2023 14:57:07 +0400 Subject: [PATCH] Fix inline GIFs play start in separate windows. Fixes #25694. --- .../SourceFiles/data/data_document_resolver.cpp | 4 ---- Telegram/SourceFiles/data/data_session.cpp | 17 ----------------- Telegram/SourceFiles/data/data_session.h | 3 --- .../admin_log/history_admin_log_inner.cpp | 8 -------- Telegram/SourceFiles/history/history_widget.cpp | 9 --------- .../history/view/history_view_list_widget.cpp | 8 -------- .../history/view/media/history_view_file.cpp | 7 +++++-- .../history/view/media/history_view_file.h | 3 ++- .../history/view/media/history_view_gif.cpp | 10 +++++++++- 9 files changed, 16 insertions(+), 53 deletions(-) diff --git a/Telegram/SourceFiles/data/data_document_resolver.cpp b/Telegram/SourceFiles/data/data_document_resolver.cpp index ad9e6c9fcf..74b39eb446 100644 --- a/Telegram/SourceFiles/data/data_document_resolver.cpp +++ b/Telegram/SourceFiles/data/data_document_resolver.cpp @@ -286,10 +286,6 @@ void ResolveDocument( || document->isVoiceMessage() || document->isVideoMessage()) { ::Media::Player::instance()->playPause({ document, msgId }); - } else if (item - && document->isAnimation() - && HistoryView::Gif::CanPlayInline(document)) { - document->owner().requestAnimationPlayInline(item); } else { showDocument(); } diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp index 51a83419b4..f06cf74fc1 100644 --- a/Telegram/SourceFiles/data/data_session.cpp +++ b/Telegram/SourceFiles/data/data_session.cpp @@ -1695,29 +1695,12 @@ void Session::requestItemTextRefresh(not_null item) { } } -void Session::requestAnimationPlayInline(not_null item) { - _animationPlayInlineRequest.fire_copy(item); - - if (const auto media = item->media()) { - if (const auto data = media->document()) { - if (data && data->isVideoMessage()) { - const auto msgId = item->fullId(); - ::Media::Player::instance()->playPause({ data, msgId }); - } - } - } -} - void Session::requestUnreadReactionsAnimation(not_null item) { enumerateItemViews(item, [&](not_null view) { view->animateUnreadReactions(); }); } -rpl::producer> Session::animationPlayInlineRequest() const { - return _animationPlayInlineRequest.events(); -} - rpl::producer> Session::itemRemoved() const { return _itemRemoved.events(); } diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h index e82b5218b9..776c9cadcd 100644 --- a/Telegram/SourceFiles/data/data_session.h +++ b/Telegram/SourceFiles/data/data_session.h @@ -275,9 +275,7 @@ public: void requestItemViewRefresh(not_null item); [[nodiscard]] rpl::producer> itemViewRefreshRequest() const; void requestItemTextRefresh(not_null item); - void requestAnimationPlayInline(not_null item); void requestUnreadReactionsAnimation(not_null item); - [[nodiscard]] rpl::producer> animationPlayInlineRequest() const; void notifyHistoryUnloaded(not_null history); [[nodiscard]] rpl::producer> historyUnloaded() const; void notifyItemDataChange(not_null item); @@ -861,7 +859,6 @@ private: rpl::event_stream> _itemViewRefreshRequest; rpl::event_stream> _itemTextRefreshRequest; rpl::event_stream> _itemDataChanges; - rpl::event_stream> _animationPlayInlineRequest; rpl::event_stream> _itemRemoved; rpl::event_stream> _viewRemoved; rpl::event_stream> _historyUnloaded; diff --git a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp index 6f9e274496..c2dd3e4ceb 100644 --- a/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp +++ b/Telegram/SourceFiles/history/admin_log/history_admin_log_inner.cpp @@ -294,14 +294,6 @@ InnerWidget::InnerWidget( view->itemDataChanged(); } }, lifetime()); - session().data().animationPlayInlineRequest( - ) | rpl::start_with_next([=](auto item) { - if (const auto view = viewForItem(item)) { - if (const auto media = view->media()) { - media->playAnimation(); - } - } - }, lifetime()); session().data().itemVisibilityQueries( ) | rpl::filter([=]( const Data::Session::ItemVisibilityQuery &query) { diff --git a/Telegram/SourceFiles/history/history_widget.cpp b/Telegram/SourceFiles/history/history_widget.cpp index 8b731ee0f7..3832200b07 100644 --- a/Telegram/SourceFiles/history/history_widget.cpp +++ b/Telegram/SourceFiles/history/history_widget.cpp @@ -553,15 +553,6 @@ HistoryWidget::HistoryWidget( }); }, lifetime()); - session().data().animationPlayInlineRequest( - ) | rpl::start_with_next([=](not_null item) { - if (const auto view = item->mainView()) { - if (const auto media = view->media()) { - media->playAnimation(); - } - } - }, lifetime()); - session().data().webPageUpdates( ) | rpl::filter([=](not_null page) { return (_previewData == page.get()); diff --git a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp index d20eec433e..9ed264ec3d 100644 --- a/Telegram/SourceFiles/history/view/history_view_list_widget.cpp +++ b/Telegram/SourceFiles/history/view/history_view_list_widget.cpp @@ -341,14 +341,6 @@ ListWidget::ListWidget( view->itemDataChanged(); } }, lifetime()); - session().data().animationPlayInlineRequest( - ) | rpl::start_with_next([this](auto item) { - if (const auto view = viewForItem(item)) { - if (const auto media = view->media()) { - media->playAnimation(); - } - } - }, lifetime()); session().downloaderTaskFinished( ) | rpl::start_with_next([=] { diff --git a/Telegram/SourceFiles/history/view/media/history_view_file.cpp b/Telegram/SourceFiles/history/view/media/history_view_file.cpp index 3a77d6d2a3..00f3c5e4c3 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_file.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_file.cpp @@ -117,13 +117,16 @@ void File::checkAnimationFinished() const { } void File::setDocumentLinks( not_null document, - not_null realParent) { + not_null realParent, + Fn openHook) { const auto context = realParent->fullId(); setLinks( std::make_shared( document, crl::guard(this, [=](FullMsgId id) { - _parent->delegate()->elementOpenDocument(document, id); + if (!openHook || !openHook()) { + _parent->delegate()->elementOpenDocument(document, id); + } }), context), std::make_shared(document, context), diff --git a/Telegram/SourceFiles/history/view/media/history_view_file.h b/Telegram/SourceFiles/history/view/media/history_view_file.h index dcdf400633..33546da203 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_file.h +++ b/Telegram/SourceFiles/history/view/media/history_view_file.h @@ -52,7 +52,8 @@ protected: FileClickHandlerPtr &&cancell); void setDocumentLinks( not_null document, - not_null realParent); + not_null realParent, + Fn openHook = nullptr); // >= 0 will contain download / upload string, _statusSize = loaded bytes // < 0 will contain played string, _statusSize = -(seconds + 1) played diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp index bc4078da50..939a3b4c99 100644 --- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp +++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp @@ -89,7 +89,15 @@ Gif::Gif( , _caption(st::minPhotoSize - st::msgPadding.left() - st::msgPadding.right()) , _spoiler(spoiler ? std::make_unique() : nullptr) , _downloadSize(Ui::FormatSizeText(_data->size)) { - setDocumentLinks(_data, realParent); + setDocumentLinks(_data, realParent, [=] { + if (!_data->createMediaView()->canBePlayed(realParent) + || !_data->isAnimation() + || !CanPlayInline(_data)) { + return false; + } + playAnimation(false); + return true; + }); setStatusSize(Ui::FileStatusSizeReady); if (_spoiler) {