Respect autodownload settings in reply previews.

This commit is contained in:
John Preston 2021-12-03 14:59:08 +04:00
parent 1c2ea8d84a
commit 9e5117d336
13 changed files with 91 additions and 39 deletions

View file

@ -1084,13 +1084,19 @@ bool DocumentData::isStickerSetInstalled() const {
} }
} }
Image *DocumentData::getReplyPreview(Data::FileOrigin origin) { Image *DocumentData::getReplyPreview(
Data::FileOrigin origin,
not_null<PeerData*> context) {
if (!hasThumbnail()) { if (!hasThumbnail()) {
return nullptr; return nullptr;
} else if (!_replyPreview) { } else if (!_replyPreview) {
_replyPreview = std::make_unique<Data::ReplyPreview>(this); _replyPreview = std::make_unique<Data::ReplyPreview>(this);
} }
return _replyPreview->image(origin); return _replyPreview->image(origin, context);
}
Image *DocumentData::getReplyPreview(not_null<HistoryItem*> item) {
return getReplyPreview(item->fullId(), item->history()->peer);
} }
bool DocumentData::replyPreviewLoaded() const { bool DocumentData::replyPreviewLoaded() const {

View file

@ -115,7 +115,8 @@ public:
void setWaitingForAlbum(); void setWaitingForAlbum();
[[nodiscard]] bool waitingForAlbum() const; [[nodiscard]] bool waitingForAlbum() const;
[[nodiscard]] const Core::FileLocation &location(bool check = false) const; [[nodiscard]] const Core::FileLocation &location(
bool check = false) const;
void setLocation(const Core::FileLocation &loc); void setLocation(const Core::FileLocation &loc);
bool saveFromData(); bool saveFromData();
@ -124,7 +125,10 @@ public:
[[nodiscard]] bool saveToCache() const; [[nodiscard]] bool saveToCache() const;
[[nodiscard]] Image *getReplyPreview(Data::FileOrigin origin); [[nodiscard]] Image *getReplyPreview(
Data::FileOrigin origin,
not_null<PeerData*> context);
[[nodiscard]] Image *getReplyPreview(not_null<HistoryItem*> item);
[[nodiscard]] bool replyPreviewLoaded() const; [[nodiscard]] bool replyPreviewLoaded() const;
[[nodiscard]] StickerData *sticker() const; [[nodiscard]] StickerData *sticker() const;

View file

@ -164,18 +164,8 @@ using ItemPreviewImage = HistoryView::ItemPreviewImage;
} else if (const auto large = media->image(PhotoSize::Large)) { } else if (const auto large = media->image(PhotoSize::Large)) {
return { PreparePreviewImage(large, radius), readyCacheKey }; return { PreparePreviewImage(large, radius), readyCacheKey };
} }
const auto allowedToDownload = [&] { const auto allowedToDownload = media->autoLoadThumbnailAllowed(
const auto photo = media->owner(); item->history()->peer);
if (media->loaded() || photo->cancelled()) {
return false;
}
return photo->hasExact(PhotoSize::Small)
|| photo->hasExact(PhotoSize::Thumbnail)
|| AutoDownload::Should(
photo->session().settings().autoDownload(),
item->history()->peer,
photo);
}();
const auto cacheKey = allowedToDownload ? 0 : readyCacheKey; const auto cacheKey = allowedToDownload ? 0 : readyCacheKey;
if (allowedToDownload) { if (allowedToDownload) {
media->owner()->load(PhotoSize::Small, item->fullId()); media->owner()->load(PhotoSize::Small, item->fullId());
@ -533,7 +523,7 @@ bool MediaPhoto::hasReplyPreview() const {
} }
Image *MediaPhoto::replyPreview() const { Image *MediaPhoto::replyPreview() const {
return _photo->getReplyPreview(parent()->fullId()); return _photo->getReplyPreview(parent());
} }
bool MediaPhoto::replyPreviewLoaded() const { bool MediaPhoto::replyPreviewLoaded() const {
@ -738,7 +728,7 @@ bool MediaFile::hasReplyPreview() const {
} }
Image *MediaFile::replyPreview() const { Image *MediaFile::replyPreview() const {
return _document->getReplyPreview(parent()->fullId()); return _document->getReplyPreview(parent());
} }
bool MediaFile::replyPreviewLoaded() const { bool MediaFile::replyPreviewLoaded() const {
@ -1295,9 +1285,9 @@ bool MediaWebPage::hasReplyPreview() const {
Image *MediaWebPage::replyPreview() const { Image *MediaWebPage::replyPreview() const {
if (const auto document = MediaWebPage::document()) { if (const auto document = MediaWebPage::document()) {
return document->getReplyPreview(parent()->fullId()); return document->getReplyPreview(parent());
} else if (const auto photo = MediaWebPage::photo()) { } else if (const auto photo = MediaWebPage::photo()) {
return photo->getReplyPreview(parent()->fullId()); return photo->getReplyPreview(parent());
} }
return nullptr; return nullptr;
} }
@ -1368,9 +1358,9 @@ bool MediaGame::hasReplyPreview() const {
Image *MediaGame::replyPreview() const { Image *MediaGame::replyPreview() const {
if (const auto document = _game->document) { if (const auto document = _game->document) {
return document->getReplyPreview(parent()->fullId()); return document->getReplyPreview(parent());
} else if (const auto photo = _game->photo) { } else if (const auto photo = _game->photo) {
return photo->getReplyPreview(parent()->fullId()); return photo->getReplyPreview(parent());
} }
return nullptr; return nullptr;
} }
@ -1478,7 +1468,7 @@ bool MediaInvoice::hasReplyPreview() const {
Image *MediaInvoice::replyPreview() const { Image *MediaInvoice::replyPreview() const {
if (const auto photo = _invoice.photo) { if (const auto photo = _invoice.photo) {
return photo->getReplyPreview(parent()->fullId()); return photo->getReplyPreview(parent());
} }
return nullptr; return nullptr;
} }

View file

@ -13,6 +13,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_photo_media.h" #include "data/data_photo_media.h"
#include "ui/image/image.h" #include "ui/image/image.h"
#include "main/main_session.h" #include "main/main_session.h"
#include "history/history.h"
#include "history/history_item.h"
#include "media/streaming/media_streaming_loader_local.h" #include "media/streaming/media_streaming_loader_local.h"
#include "media/streaming/media_streaming_loader_mtproto.h" #include "media/streaming/media_streaming_loader_mtproto.h"
#include "mainwidget.h" #include "mainwidget.h"
@ -206,11 +208,17 @@ bool PhotoData::uploading() const {
return (uploadingData != nullptr); return (uploadingData != nullptr);
} }
Image *PhotoData::getReplyPreview(Data::FileOrigin origin) { Image *PhotoData::getReplyPreview(
Data::FileOrigin origin,
not_null<PeerData*> context) {
if (!_replyPreview) { if (!_replyPreview) {
_replyPreview = std::make_unique<Data::ReplyPreview>(this); _replyPreview = std::make_unique<Data::ReplyPreview>(this);
} }
return _replyPreview->image(origin); return _replyPreview->image(origin, context);
}
Image *PhotoData::getReplyPreview(not_null<HistoryItem*> item) {
return getReplyPreview(item->fullId(), item->history()->peer);
} }
bool PhotoData::replyPreviewLoaded() const { bool PhotoData::replyPreviewLoaded() const {

View file

@ -64,7 +64,10 @@ public:
void setWaitingForAlbum(); void setWaitingForAlbum();
[[nodiscard]] bool waitingForAlbum() const; [[nodiscard]] bool waitingForAlbum() const;
[[nodiscard]] Image *getReplyPreview(Data::FileOrigin origin); [[nodiscard]] Image *getReplyPreview(
Data::FileOrigin origin,
not_null<PeerData*> context);
[[nodiscard]] Image *getReplyPreview(not_null<HistoryItem*> item);
[[nodiscard]] bool replyPreviewLoaded() const; [[nodiscard]] bool replyPreviewLoaded() const;
void setRemoteLocation( void setRemoteLocation(

View file

@ -128,6 +128,18 @@ float64 PhotoMedia::progress() const {
: (loaded() ? 1. : 0.); : (loaded() ? 1. : 0.);
} }
bool PhotoMedia::autoLoadThumbnailAllowed(not_null<PeerData*> peer) const {
if (loaded() || _owner->cancelled()) {
return false;
}
return _owner->hasExact(PhotoSize::Small)
|| _owner->hasExact(PhotoSize::Thumbnail)
|| AutoDownload::Should(
_owner->session().settings().autoDownload(),
peer,
_owner);
}
void PhotoMedia::automaticLoad( void PhotoMedia::automaticLoad(
Data::FileOrigin origin, Data::FileOrigin origin,
const HistoryItem *item) { const HistoryItem *item) {

View file

@ -36,6 +36,8 @@ public:
[[nodiscard]] bool loaded() const; [[nodiscard]] bool loaded() const;
[[nodiscard]] float64 progress() const; [[nodiscard]] float64 progress() const;
[[nodiscard]] bool autoLoadThumbnailAllowed(
not_null<PeerData*> peer) const;
void automaticLoad(Data::FileOrigin origin, const HistoryItem *item); void automaticLoad(Data::FileOrigin origin, const HistoryItem *item);
void collectLocalData(not_null<PhotoMedia*> local); void collectLocalData(not_null<PhotoMedia*> local);

View file

@ -55,7 +55,9 @@ void ReplyPreview::prepare(not_null<Image*> image, Images::Options options) {
_good = ((options & Images::Option::Blurred) == 0); _good = ((options & Images::Option::Blurred) == 0);
} }
Image *ReplyPreview::image(Data::FileOrigin origin) { Image *ReplyPreview::image(
Data::FileOrigin origin,
not_null<PeerData*> context) {
if (_checked) { if (_checked) {
return _image.get(); return _image.get();
} }
@ -84,8 +86,14 @@ Image *ReplyPreview::image(Data::FileOrigin origin) {
} else { } else {
Assert(_photo != nullptr); Assert(_photo != nullptr);
if (!_image || !_good) { if (!_image || !_good) {
const auto createMedia = !_photoMedia;
const auto inlineThumbnailBytes = _photo->inlineThumbnailBytes();
if (!_photoMedia) { if (!_photoMedia) {
_photoMedia = _photo->createMediaView(); _photoMedia = _photo->createMediaView();
}
const auto loadThumbnail = inlineThumbnailBytes.isEmpty()
|| _photoMedia->autoLoadThumbnailAllowed(context);
if (loadThumbnail) {
_photoMedia->wanted(PhotoSize::Small, origin); _photoMedia->wanted(PhotoSize::Small, origin);
} }
if (const auto small = _photoMedia->image(PhotoSize::Small)) { if (const auto small = _photoMedia->image(PhotoSize::Small)) {

View file

@ -23,7 +23,9 @@ public:
explicit ReplyPreview(not_null<PhotoData*> photo); explicit ReplyPreview(not_null<PhotoData*> photo);
~ReplyPreview(); ~ReplyPreview();
[[nodiscard]] Image *image(Data::FileOrigin origin); [[nodiscard]] Image *image(
Data::FileOrigin origin,
not_null<PeerData*> context);
[[nodiscard]] bool loaded() const; [[nodiscard]] bool loaded() const;
private: private:

View file

@ -7162,7 +7162,7 @@ void HistoryWidget::drawField(Painter &p, const QRect &rect) {
textTop, textTop,
st::msgReplyBarSize.height(), st::msgReplyBarSize.height(),
st::msgReplyBarSize.height()); st::msgReplyBarSize.height());
if (HistoryView::DrawWebPageDataPreview(p, _previewData, to)) { if (HistoryView::DrawWebPageDataPreview(p, _previewData, _peer, to)) {
previewLeft += st::msgReplyBarSize.height() previewLeft += st::msgReplyBarSize.height()
+ st::msgReplyBarSkip + st::msgReplyBarSkip
- st::msgReplyBarSize.width() - st::msgReplyBarSize.width()

View file

@ -105,6 +105,7 @@ class FieldHeader final : public Ui::RpWidget {
public: public:
FieldHeader(QWidget *parent, not_null<Data::Session*> data); FieldHeader(QWidget *parent, not_null<Data::Session*> data);
void setHistory(const SetHistoryArgs &args);
void init(); void init();
void editMessage(FullMsgId id); void editMessage(FullMsgId id);
@ -142,7 +143,7 @@ private:
void resolveMessageData(); void resolveMessageData();
void updateShownMessageText(); void updateShownMessageText();
void paintWebPage(Painter &p); void paintWebPage(Painter &p, not_null<PeerData*> peer);
void paintEditOrReplyToMessage(Painter &p); void paintEditOrReplyToMessage(Painter &p);
struct Preview { struct Preview {
@ -152,6 +153,7 @@ private:
bool cancelled = false; bool cancelled = false;
}; };
History *_history = nullptr;
rpl::variable<QString> _title; rpl::variable<QString> _title;
rpl::variable<QString> _description; rpl::variable<QString> _description;
@ -188,6 +190,10 @@ FieldHeader::FieldHeader(QWidget *parent, not_null<Data::Session*> data)
init(); init();
} }
void FieldHeader::setHistory(const SetHistoryArgs &args) {
_history = *args.history;
}
void FieldHeader::init() { void FieldHeader::init() {
sizeValue( sizeValue(
) | rpl::start_with_next([=](QSize size) { ) | rpl::start_with_next([=](QSize size) {
@ -209,7 +215,9 @@ void FieldHeader::init() {
(!ShowWebPagePreview(_preview.data) || *leftIconPressed) (!ShowWebPagePreview(_preview.data) || *leftIconPressed)
? paintEditOrReplyToMessage(p) ? paintEditOrReplyToMessage(p)
: paintWebPage(p); : paintWebPage(
p,
_history ? _history->peer : _data->session().user());
}, lifetime()); }, lifetime());
_editMsgId.value( _editMsgId.value(
@ -415,7 +423,7 @@ void FieldHeader::previewRequested(
} }
void FieldHeader::paintWebPage(Painter &p) { void FieldHeader::paintWebPage(Painter &p, not_null<PeerData*> context) {
Expects(ShowWebPagePreview(_preview.data)); Expects(ShowWebPagePreview(_preview.data));
const auto textTop = st::msgReplyPadding.top(); const auto textTop = st::msgReplyPadding.top();
@ -432,7 +440,7 @@ void FieldHeader::paintWebPage(Painter &p) {
textTop, textTop,
st::msgReplyBarSize.height(), st::msgReplyBarSize.height(),
st::msgReplyBarSize.height()); st::msgReplyBarSize.height());
if (HistoryView::DrawWebPageDataPreview(p, _preview.data, to)) { if (HistoryView::DrawWebPageDataPreview(p, _preview.data, context, to)) {
previewLeft += st::msgReplyBarSize.height() previewLeft += st::msgReplyBarSize.height()
+ st::msgReplyBarSkip + st::msgReplyBarSkip
- st::msgReplyBarSize.width() - st::msgReplyBarSize.width()
@ -655,6 +663,7 @@ void ComposeControls::setHistory(SetHistoryArgs &&args) {
//} //}
unregisterDraftSources(); unregisterDraftSources();
_history = history; _history = history;
_header->setHistory(args);
registerDraftSource(); registerDraftSource();
_window->tabbedSelector()->setCurrentPeer( _window->tabbedSelector()->setCurrentPeer(
history ? history->peer.get() : nullptr); history ? history->peer.get() : nullptr);

View file

@ -56,9 +56,13 @@ WebPageText TitleAndDescriptionFromWebPage(not_null<WebPageData*> d) {
return { resultTitle, resultDescription }; return { resultTitle, resultDescription };
} }
bool DrawWebPageDataPreview(Painter &p, not_null<WebPageData*> d, QRect to) { bool DrawWebPageDataPreview(
const auto document = d->document; Painter &p,
const auto photo = d->photo; not_null<WebPageData*> webpage,
not_null<PeerData*> context,
QRect to) {
const auto document = webpage->document;
const auto photo = webpage->photo;
if ((!photo || photo->isNull()) if ((!photo || photo->isNull())
&& (!document && (!document
|| !document->hasThumbnail() || !document->hasThumbnail()
@ -67,8 +71,8 @@ bool DrawWebPageDataPreview(Painter &p, not_null<WebPageData*> d, QRect to) {
} }
const auto preview = photo const auto preview = photo
? photo->getReplyPreview(Data::FileOrigin()) ? photo->getReplyPreview(Data::FileOrigin(), context)
: document->getReplyPreview(Data::FileOrigin()); : document->getReplyPreview(Data::FileOrigin(), context);
if (preview) { if (preview) {
const auto w = preview->width(); const auto w = preview->width();
const auto h = preview->height(); const auto h = preview->height();

View file

@ -15,6 +15,10 @@ struct WebPageText {
}; };
WebPageText TitleAndDescriptionFromWebPage(not_null<WebPageData*> d); WebPageText TitleAndDescriptionFromWebPage(not_null<WebPageData*> d);
bool DrawWebPageDataPreview(Painter &p, not_null<WebPageData*> d, QRect to); bool DrawWebPageDataPreview(
Painter &p,
not_null<WebPageData*> webpage,
not_null<PeerData*> context,
QRect to);
} // namespace HistoryView } // namespace HistoryView