diff --git a/Telegram/SourceFiles/api/api_updates.cpp b/Telegram/SourceFiles/api/api_updates.cpp index cef69bd80..e27a521c9 100644 --- a/Telegram/SourceFiles/api/api_updates.cpp +++ b/Telegram/SourceFiles/api/api_updates.cpp @@ -1650,6 +1650,15 @@ void Updates::feedUpdate(const MTPUpdate &update) { } } break; + case mtpc_updateMessageExtendedMedia: { + const auto &d = update.c_updateMessageExtendedMedia(); + const auto peerId = peerFromMTP(d.vpeer()); + const auto msgId = d.vmsg_id().v; + if (const auto item = session().data().message(peerId, msgId)) { + item->applyEdition(d.vextended_media()); + } + } break; + // Messages being read. case mtpc_updateReadHistoryInbox: { auto &d = update.c_updateReadHistoryInbox(); diff --git a/Telegram/SourceFiles/data/data_media_types.cpp b/Telegram/SourceFiles/data/data_media_types.cpp index c633f11ed..eb3c88cf0 100644 --- a/Telegram/SourceFiles/data/data_media_types.cpp +++ b/Telegram/SourceFiles/data/data_media_types.cpp @@ -232,6 +232,49 @@ template return (i != end(*existing)) ? *i : ItemPreviewImage(); } +bool UpdateExtendedMedia( + Invoice &invoice, + not_null item, + const MTPMessageExtendedMedia &media) { + return media.match([&](const MTPDmessageExtendedMediaPreview &data) { + if (invoice.extendedMedia) { + return false; + } + auto changed = false; + auto &preview = invoice.extendedPreview; + if (const auto &w = data.vw()) { + const auto &h = data.vh(); + Assert(h.has_value()); + const auto dimensions = QSize(w->v, h->v); + if (preview.dimensions != dimensions) { + preview.dimensions = dimensions; + changed = true; + } + } + if (const auto &thumb = data.vthumb()) { + if (thumb->type() == mtpc_photoStrippedSize) { + const auto bytes = thumb->c_photoStrippedSize().vbytes().v; + if (preview.inlineThumbnailBytes != bytes) { + preview.inlineThumbnailBytes = bytes; + changed = true; + } + } + } + if (const auto &duration = data.vvideo_duration()) { + if (preview.videoDuration != duration->v) { + preview.videoDuration = duration->v; + changed = true; + } + } + return changed; + }, [&](const MTPDmessageExtendedMedia &data) { + invoice.extendedMedia = HistoryMessage::CreateMedia( + item, + data.vmedia()); + return true; + }); +} + } // namespace TextForMimeData WithCaptionClipboardText( @@ -266,29 +309,8 @@ Invoice ComputeInvoiceData( .isTest = data.is_test(), }; if (const auto &media = data.vextended_media()) { - media->match([&](const MTPDmessageExtendedMediaPreview &data) { - auto &preview = result.extendedPreview; - if (const auto &w = data.vw()) { - const auto &h = data.vh(); - Assert(h.has_value()); - preview.dimensions = QSize(w->v, h->v); - } - if (const auto &thumb = data.vthumb()) { - if (thumb->type() == mtpc_photoStrippedSize) { - preview.inlineThumbnailBytes - = thumb->c_photoStrippedSize().vbytes().v; - } - } - if (const auto &duration = data.vvideo_duration()) { - preview.videoDuration = duration->v; - } - }, [&](const MTPDmessageExtendedMedia &data) { - result.extendedMedia = HistoryMessage::CreateMedia( - item, - data.vmedia()); - }); + UpdateExtendedMedia(result, item, *media); } - return result; } @@ -1572,6 +1594,14 @@ bool MediaInvoice::updateSentMedia(const MTPMessageMedia &media) { return true; } +bool MediaInvoice::updateExtendedMedia( + not_null item, + const MTPMessageExtendedMedia &media) { + Expects(item == parent()); + + return UpdateExtendedMedia(_invoice, item, media); +} + std::unique_ptr MediaInvoice::createView( not_null message, not_null realParent, diff --git a/Telegram/SourceFiles/data/data_media_types.h b/Telegram/SourceFiles/data/data_media_types.h index 36385e8c4..7d6e02cb8 100644 --- a/Telegram/SourceFiles/data/data_media_types.h +++ b/Telegram/SourceFiles/data/data_media_types.h @@ -132,6 +132,11 @@ public: // the media (all media that was generated on client side, for example). virtual bool updateInlineResultMedia(const MTPMessageMedia &media) = 0; virtual bool updateSentMedia(const MTPMessageMedia &media) = 0; + virtual bool updateExtendedMedia( + not_null item, + const MTPMessageExtendedMedia &media) { + return false; + } virtual std::unique_ptr createView( not_null message, not_null realParent, @@ -415,6 +420,9 @@ public: bool updateInlineResultMedia(const MTPMessageMedia &media) override; bool updateSentMedia(const MTPMessageMedia &media) override; + bool updateExtendedMedia( + not_null item, + const MTPMessageExtendedMedia &media) override; std::unique_ptr createView( not_null message, not_null realParent, diff --git a/Telegram/SourceFiles/history/history_item.h b/Telegram/SourceFiles/history/history_item.h index be1f33a6f..ced1e9c87 100644 --- a/Telegram/SourceFiles/history/history_item.h +++ b/Telegram/SourceFiles/history/history_item.h @@ -281,6 +281,8 @@ public: } virtual void applyEdition(const MTPDmessageService &message) { } + virtual void applyEdition(const MTPMessageExtendedMedia &media) { + } void applyEditionToHistoryCleared(); virtual void updateSentContent( const TextWithEntities &textWithEntities, diff --git a/Telegram/SourceFiles/history/history_item_components.cpp b/Telegram/SourceFiles/history/history_item_components.cpp index 248743fba..4d51f87b1 100644 --- a/Telegram/SourceFiles/history/history_item_components.cpp +++ b/Telegram/SourceFiles/history/history_item_components.cpp @@ -914,6 +914,18 @@ void HistoryMessageReplyMarkup::updateData( inlineKeyboard = nullptr; } +bool HistoryMessageReplyMarkup::hiddenBy(Data::Media *media) const { + if (media && (data.flags & ReplyMarkupFlag::OnlyBuyButton)) { + if (const auto invoice = media->invoice()) { + if (!invoice->extendedPreview.dimensions.isEmpty() + && (!invoice->extendedMedia || !invoice->receiptMsgId)) { + return true; + } + } + } + return false; +} + HistoryMessageLogEntryOriginal::HistoryMessageLogEntryOriginal() = default; HistoryMessageLogEntryOriginal::HistoryMessageLogEntryOriginal( diff --git a/Telegram/SourceFiles/history/history_item_components.h b/Telegram/SourceFiles/history/history_item_components.h index 9417982b4..456aaffed 100644 --- a/Telegram/SourceFiles/history/history_item_components.h +++ b/Telegram/SourceFiles/history/history_item_components.h @@ -224,6 +224,8 @@ struct HistoryMessageReplyMarkup void createForwarded(const HistoryMessageReplyMarkup &original); void updateData(HistoryMessageMarkupData &&markup); + [[nodiscard]] bool hiddenBy(Data::Media *media) const; + HistoryMessageMarkupData data; std::unique_ptr inlineKeyboard; diff --git a/Telegram/SourceFiles/history/history_item_reply_markup.cpp b/Telegram/SourceFiles/history/history_item_reply_markup.cpp index 4c184ad4b..ad4b032c4 100644 --- a/Telegram/SourceFiles/history/history_item_reply_markup.cpp +++ b/Telegram/SourceFiles/history/history_item_reply_markup.cpp @@ -49,13 +49,13 @@ void HistoryMessageMarkupData::fillRows( return; } + using Type = Button::Type; rows.reserve(list.size()); for (const auto &row : list) { row.match([&](const MTPDkeyboardButtonRow &data) { auto row = std::vector