From a2bf0fc51197f56336d5eb988176478e6e769739 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 16 Jun 2023 13:34:08 +0400 Subject: [PATCH] Show unsupported stories with an Update button. --- Telegram/Resources/langs/lang.strings | 1 + .../SourceFiles/data/data_media_types.cpp | 7 ++- Telegram/SourceFiles/data/data_media_types.h | 5 ++ Telegram/SourceFiles/data/data_stories.cpp | 13 +++- Telegram/SourceFiles/data/data_stories.h | 6 +- Telegram/SourceFiles/history/history_item.cpp | 8 ++- .../info/stories/info_stories_provider.cpp | 6 ++ .../stories/media_stories_controller.cpp | 61 ++++++++++++++++++- .../media/stories/media_stories_controller.h | 2 + .../media/stories/media_stories_sibling.cpp | 19 ++++-- .../media/stories/media_stories_sibling.h | 1 + .../SourceFiles/media/view/media_view.style | 11 ++++ .../media/view/media_view_overlay_widget.cpp | 18 +++--- 13 files changed, 138 insertions(+), 20 deletions(-) diff --git a/Telegram/Resources/langs/lang.strings b/Telegram/Resources/langs/lang.strings index 982160f60..ad8e9037d 100644 --- a/Telegram/Resources/langs/lang.strings +++ b/Telegram/Resources/langs/lang.strings @@ -3807,6 +3807,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL "lng_stories_views#one" = "{count} view"; "lng_stories_views#other" = "{count} views"; "lng_stories_no_views" = "No views"; +"lng_stories_unsupported" = "This story is not supported\nby your version of Telegram."; "lng_stories_my_title" = "My Stories"; "lng_stories_archive_button" = "Archive"; diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index cd9d863dc..8cdaebc25 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -2039,6 +2039,11 @@ bool MediaStory::updateSentMedia(const MTPMessageMedia &media) { return false; } +not_null MediaStory::LoadingStoryPhoto( + not_null owner) { + return owner->photo(kLoadingStoryPhotoId); +} + std::unique_ptr MediaStory::createView( not_null message, not_null realParent, @@ -2055,7 +2060,7 @@ std::unique_ptr MediaStory::createView( return std::make_unique( message, realParent, - realParent->history()->owner().photo(kLoadingStoryPhotoId), + LoadingStoryPhoto(&realParent->history()->owner()), spoiler); } _expired = false; diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index 0ba84e928..a77e26e46 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -38,6 +38,7 @@ namespace Data { class CloudImage; class WallPaper; +class Session; enum class CallFinishReason : char { Missed, @@ -59,6 +60,7 @@ struct Call { int duration = 0; FinishReason finishReason = FinishReason::Missed; bool video = false; + }; struct ExtendedPreview { @@ -587,6 +589,9 @@ public: not_null realParent, HistoryView::Element *replacing = nullptr) override; + [[nodiscard]] static not_null LoadingStoryPhoto( + not_null owner); + private: const FullStoryId _storyId; bool _expired = false; diff --git a/Telegram/SourceFiles/data/data_stories.cpp b/Telegram/SourceFiles/data/data_stories.cpp index a0560e565..0cf32566d 100644 --- a/Telegram/SourceFiles/data/data_stories.cpp +++ b/Telegram/SourceFiles/data/data_stories.cpp @@ -63,6 +63,8 @@ using UpdateFlag = StoryUpdate::Flag; } } return {}; + }, [&](const MTPDmessageMediaUnsupported &data) { + return std::make_optional(StoryMedia{ v::null }); }, [](const auto &) { return std::optional(); }); } @@ -135,6 +137,10 @@ bool Story::expired(TimeId now) const { return _expires <= (now ? now : base::unixtime::now()); } +bool Story::unsupported() const { + return v::is_null(_media.data); +} + const StoryMedia &Story::media() const { return _media; } @@ -154,6 +160,8 @@ bool Story::hasReplyPreview() const { return !photo->isNull(); }, [](not_null document) { return document->hasThumbnail(); + }, [](v::null_t) { + return false; }); } @@ -168,6 +176,8 @@ Image *Story::replyPreview() const { Data::FileOriginStory(_peer->id, _id), _peer, false); + }, [](v::null_t) { + return (Image*)nullptr; }); } @@ -246,7 +256,8 @@ void Story::setCaption(TextWithEntities &&caption) { } const TextWithEntities &Story::caption() const { - return _caption; + static const auto empty = TextWithEntities(); + return unsupported() ? empty : _caption; } void Story::setViewsData( diff --git a/Telegram/SourceFiles/data/data_stories.h b/Telegram/SourceFiles/data/data_stories.h index 74cffd64b..c136bff5c 100644 --- a/Telegram/SourceFiles/data/data_stories.h +++ b/Telegram/SourceFiles/data/data_stories.h @@ -55,7 +55,10 @@ struct StoriesIds { }; struct StoryMedia { - std::variant, not_null> data; + std::variant< + v::null_t, + not_null, + not_null> data; friend inline bool operator==(StoryMedia, StoryMedia) = default; }; @@ -86,6 +89,7 @@ public: [[nodiscard]] FullStoryId fullId() const; [[nodiscard]] TimeId date() const; [[nodiscard]] TimeId expires() const; + [[nodiscard]] bool unsupported() const; [[nodiscard]] bool expired(TimeId now = 0) const; [[nodiscard]] const StoryMedia &media() const; [[nodiscard]] PhotoData *photo() const; diff --git a/Telegram/SourceFiles/history/history_item.cpp b/Telegram/SourceFiles/history/history_item.cpp index 2e73286a8..3fb9ab309 100644 --- a/Telegram/SourceFiles/history/history_item.cpp +++ b/Telegram/SourceFiles/history/history_item.cpp @@ -685,7 +685,10 @@ HistoryItem::HistoryItem( : id(StoryIdToMsgId(story->id())) , _history(history) , _from(history->peer) -, _flags(MessageFlag::Local | MessageFlag::Outgoing | MessageFlag::FakeHistoryItem | MessageFlag::StoryItem) +, _flags(MessageFlag::Local + | MessageFlag::Outgoing + | MessageFlag::FakeHistoryItem + | MessageFlag::StoryItem) , _date(story->date()) { setStoryFields(story); } @@ -1522,8 +1525,7 @@ void HistoryItem::setStoryFields(not_null story) { const auto spoiler = false; if (const auto photo = story->photo()) { _media = std::make_unique(this, photo, spoiler); - } else { - const auto document = story->document(); + } else if (const auto document = story->document()) { _media = std::make_unique( this, document, diff --git a/Telegram/SourceFiles/info/stories/info_stories_provider.cpp b/Telegram/SourceFiles/info/stories/info_stories_provider.cpp index bd5d88f93..388602347 100644 --- a/Telegram/SourceFiles/info/stories/info_stories_provider.cpp +++ b/Telegram/SourceFiles/info/stories/info_stories_provider.cpp @@ -302,6 +302,12 @@ std::unique_ptr Provider::createLayout( return std::make_unique(delegate, item, photo, spoiler); } else if (const auto file = getFile()) { return std::make_unique