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()) {
return nullptr;
} else if (!_replyPreview) {
_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 {

View File

@ -115,7 +115,8 @@ public:
void setWaitingForAlbum();
[[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);
bool saveFromData();
@ -124,7 +125,10 @@ public:
[[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]] StickerData *sticker() const;

View File

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

View File

@ -13,6 +13,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_photo_media.h"
#include "ui/image/image.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_mtproto.h"
#include "mainwidget.h"
@ -206,11 +208,17 @@ bool PhotoData::uploading() const {
return (uploadingData != nullptr);
}
Image *PhotoData::getReplyPreview(Data::FileOrigin origin) {
Image *PhotoData::getReplyPreview(
Data::FileOrigin origin,
not_null<PeerData*> context) {
if (!_replyPreview) {
_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 {

View File

@ -64,7 +64,10 @@ public:
void setWaitingForAlbum();
[[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;
void setRemoteLocation(

View File

@ -128,6 +128,18 @@ float64 PhotoMedia::progress() const {
: (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(
Data::FileOrigin origin,
const HistoryItem *item) {

View File

@ -36,6 +36,8 @@ public:
[[nodiscard]] bool loaded() const;
[[nodiscard]] float64 progress() const;
[[nodiscard]] bool autoLoadThumbnailAllowed(
not_null<PeerData*> peer) const;
void automaticLoad(Data::FileOrigin origin, const HistoryItem *item);
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);
}
Image *ReplyPreview::image(Data::FileOrigin origin) {
Image *ReplyPreview::image(
Data::FileOrigin origin,
not_null<PeerData*> context) {
if (_checked) {
return _image.get();
}
@ -84,8 +86,14 @@ Image *ReplyPreview::image(Data::FileOrigin origin) {
} else {
Assert(_photo != nullptr);
if (!_image || !_good) {
const auto createMedia = !_photoMedia;
const auto inlineThumbnailBytes = _photo->inlineThumbnailBytes();
if (!_photoMedia) {
_photoMedia = _photo->createMediaView();
}
const auto loadThumbnail = inlineThumbnailBytes.isEmpty()
|| _photoMedia->autoLoadThumbnailAllowed(context);
if (loadThumbnail) {
_photoMedia->wanted(PhotoSize::Small, origin);
}
if (const auto small = _photoMedia->image(PhotoSize::Small)) {

View File

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

View File

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

View File

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

View File

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

View File

@ -15,6 +15,10 @@ struct WebPageText {
};
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