Remove corner download if noforwards.

This commit is contained in:
John Preston 2021-11-05 22:32:26 +04:00
parent 96c910190b
commit c849d17667
13 changed files with 59 additions and 50 deletions

View File

@ -1158,12 +1158,14 @@ bool DocumentData::useStreamingLoader() const {
|| isVoiceMessage();
}
bool DocumentData::canBeStreamed() const {
bool DocumentData::canBeStreamed(HistoryItem *item) const {
// Streaming couldn't be used with external player
// Maybe someone brave will implement this once upon a time...
return hasRemoteLocation()
&& supportsStreaming()
&& (!cUseExternalVideoPlayer() || !isVideoFile());
&& (!isVideoFile()
|| !cUseExternalVideoPlayer()
|| (item && !item->history()->peer->allowsForwarding()));
}
void DocumentData::setInappPlaybackFailed() {

View File

@ -233,7 +233,7 @@ public:
[[nodiscard]] Storage::Cache::Key cacheKey() const;
[[nodiscard]] uint8 cacheTag() const;
[[nodiscard]] bool canBeStreamed() const;
[[nodiscard]] bool canBeStreamed(HistoryItem *item) const;
[[nodiscard]] auto createStreamingLoader(
Data::FileOrigin origin,
bool forceRemoteLoader) const

View File

@ -348,10 +348,10 @@ float64 DocumentMedia::progress() const {
: (loaded() ? 1. : 0.);
}
bool DocumentMedia::canBePlayed() const {
bool DocumentMedia::canBePlayed(HistoryItem *item) const {
return !_owner->inappPlaybackFailed()
&& _owner->useStreamingLoader()
&& (loaded() || _owner->canBeStreamed());
&& (loaded() || _owner->canBeStreamed(item));
}
bool DocumentMedia::thumbnailEnoughForSticker() const {

View File

@ -74,7 +74,7 @@ public:
[[nodiscard]] QByteArray bytes() const;
[[nodiscard]] bool loaded(bool check = false) const;
[[nodiscard]] float64 progress() const;
[[nodiscard]] bool canBePlayed() const;
[[nodiscard]] bool canBePlayed(HistoryItem *item) const;
void automaticLoad(Data::FileOrigin origin, const HistoryItem *item);

View File

@ -252,7 +252,7 @@ void ResolveDocument(
if (document->isTheme() && media->loaded(true)) {
showDocument();
location.accessDisable();
} else if (media->canBePlayed()) {
} else if (media->canBePlayed(item)) {
if (document->isAudioFile()
|| document->isVoiceMessage()
|| document->isVideoMessage()) {

View File

@ -74,7 +74,7 @@ bool IsItemGoodForType(const not_null<HistoryItem*> item, Type type) {
|| ((videoType || photoVideoType) && videoDoc)
|| (fileType && (document->isTheme()
|| document->isImage()
|| !document->canBeStreamed()));
|| !document->canBeStreamed(item)));
}
} // namespace

View File

@ -1302,7 +1302,7 @@ std::unique_ptr<QMimeData> HistoryInner::prepareDrag() {
const auto pressedHandler = ClickHandler::getPressed();
if (dynamic_cast<VoiceSeekClickHandler*>(pressedHandler.get())
|| !_peer->allowsForwarding()) {
|| hasCopyRestriction()) {
return nullptr;
}
@ -1546,7 +1546,7 @@ void HistoryInner::mouseActionFinish(
if (QGuiApplication::clipboard()->supportsSelection()
&& !_selected.empty()
&& _selected.cbegin()->second != FullSelection
&& _peer->allowsForwarding()) {
&& !hasCopyRestriction()) {
const auto [item, selection] = *_selected.cbegin();
if (const auto view = item->mainView()) {
TextUtilities::SetClipboardText(
@ -1725,7 +1725,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
};
const auto addPhotoActions = [&](not_null<PhotoData*> photo) {
const auto media = photo->activeMediaView();
if (!photo->isNull() && media && media->loaded() && _peer->allowsForwarding()) {
if (!photo->isNull() && media && media->loaded() && !hasCopyRestriction()) {
_menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] {
savePhotoToFile(photo);
}));
@ -1767,16 +1767,18 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
openContextGif(itemId);
});
}
_menu->addAction(tr::lng_context_save_gif(tr::now), [=] {
saveContextGif(itemId);
});
if (!hasCopyRestriction()) {
_menu->addAction(tr::lng_context_save_gif(tr::now), [=] {
saveContextGif(itemId);
});
}
}
if (!document->filepath(true).isEmpty()) {
_menu->addAction(Platform::IsMac() ? tr::lng_context_show_in_finder(tr::now) : tr::lng_context_show_in_folder(tr::now), [=] {
showContextInFolder(document);
});
}
if (_peer->allowsForwarding()) {
if (!hasCopyRestriction()) {
_menu->addAction(lnkIsVideo ? tr::lng_context_save_video(tr::now) : (lnkIsVoice ? tr::lng_context_save_audio(tr::now) : (lnkIsAudio ? tr::lng_context_save_audio_file(tr::now) : tr::lng_context_save_file(tr::now))), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] {
saveDocumentToFile(itemId, document);
}));
@ -1830,7 +1832,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (lnkPhoto || lnkDocument) {
const auto item = _dragStateItem;
const auto itemId = item ? item->fullId() : FullMsgId();
if (isUponSelected > 0 && _peer->allowsForwarding()) {
if (isUponSelected > 0 && !hasCopyRestriction()) {
_menu->addAction(
(isUponSelected > 1
? tr::lng_context_copy_selected_items(tr::now)
@ -1911,7 +1913,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
const auto view = item ? item->mainView() : nullptr;
if (isUponSelected > 0) {
if (_peer->allowsForwarding()) {
if (!hasCopyRestriction()) {
_menu->addAction(
((isUponSelected > 1)
? tr::lng_context_copy_selected_items(tr::now)
@ -1934,7 +1936,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
Api::ToggleFavedSticker(document, itemId);
});
}
if (_peer->allowsForwarding()) {
if (!hasCopyRestriction()) {
_menu->addAction(tr::lng_context_save_image(tr::now), App::LambdaDelayed(st::defaultDropdownMenu.menu.ripple.hideDuration, this, [=] {
saveDocumentToFile(itemId, document);
}));
@ -1963,7 +1965,7 @@ void HistoryInner::showContextMenu(QContextMenuEvent *e, bool showFromTouch) {
if (!item->isService()
&& view
&& !link
&& _peer->allowsForwarding()
&& !hasCopyRestriction()
&& (view->hasVisibleText() || mediaHasTextForCopy)) {
_menu->addAction(tr::lng_context_copy_text(tr::now), [=] {
copyContextText(itemId);
@ -2135,7 +2137,9 @@ void HistoryInner::openContextGif(FullMsgId itemId) {
}
void HistoryInner::saveContextGif(FullMsgId itemId) {
if (const auto item = session().data().message(itemId)) {
if (hasCopyRestriction()) {
return;
} else if (const auto item = session().data().message(itemId)) {
if (const auto media = item->media()) {
if (const auto document = media->document()) {
Api::ToggleSavedGif(document, item->fullId(), true);

View File

@ -241,7 +241,7 @@ void AddDocumentActions(
OpenGif(list->controller(), contextId);
});
}
if (document->isGifv()) {
if (document->isGifv() && !list->hasCopyRestriction()) {
menu->addAction(tr::lng_context_save_gif(tr::now), [=] {
SaveGif(list->controller(), contextId);
});

View File

@ -329,7 +329,7 @@ void Document::draw(
const auto cornerDownload = downloadInCorner();
if (!_dataMedia->canBePlayed()) {
if (!_dataMedia->canBePlayed(_realParent)) {
_dataMedia->automaticLoad(_realParent->fullId(), _realParent);
}
bool loaded = dataLoaded(), displayLoading = _data->displayLoading();
@ -452,8 +452,8 @@ void Document::draw(
return _data->isSongWithCover()
? sti->historyFileThumbPause
: stm->historyFilePause;
} else if (loaded || _dataMedia->canBePlayed()) {
return _dataMedia->canBePlayed()
} else if (loaded || _dataMedia->canBePlayed(_realParent)) {
return _dataMedia->canBePlayed(_realParent)
? (_data->isSongWithCover()
? sti->historyFileThumbPlay
: stm->historyFilePlay)
@ -593,7 +593,8 @@ void Document::ensureDataMediaCreated() const {
bool Document::downloadInCorner() const {
return _data->isAudioFile()
&& _data->canBeStreamed()
&& _realParent->history()->peer->allowsForwarding()
&& _data->canBeStreamed(_realParent)
&& !_data->inappPlaybackFailed()
&& _realParent->isRegular();
}
@ -782,7 +783,7 @@ TextState Document::textState(
&& (!_data->loading() || downloadInCorner())
&& !_data->uploading()
&& !_data->isNull()) {
if (loaded || _dataMedia->canBePlayed()) {
if (loaded || _dataMedia->canBePlayed(_realParent)) {
result.link = _openl;
} else {
result.link = _savel;

View File

@ -264,7 +264,8 @@ QSize Gif::videoSize() const {
bool Gif::downloadInCorner() const {
return _data->isVideoFile()
&& (_data->loading() || !autoplayEnabled())
&& _data->canBeStreamed()
&& _realParent->history()->peer->allowsForwarding()
&& _data->canBeStreamed(_realParent)
&& !_data->inappPlaybackFailed()
&& !_parent->data()->isSending();
}
@ -288,7 +289,7 @@ void Gif::draw(Painter &p, const PaintContext &context) const {
const auto stm = context.messageStyle();
const auto autoPaused = _parent->delegate()->elementIsGifPaused();
const auto cornerDownload = downloadInCorner();
const auto canBePlayed = _dataMedia->canBePlayed();
const auto canBePlayed = _dataMedia->canBePlayed(_realParent);
const auto autoplay = autoplayEnabled()
&& canBePlayed
&& CanPlayInline(_data);
@ -836,7 +837,7 @@ TextState Gif::textState(QPoint point, StateRequest request) const {
? _cancell
: _realParent->isSending()
? nullptr
: (dataLoaded() || _dataMedia->canBePlayed())
: (dataLoaded() || _dataMedia->canBePlayed(_realParent))
? _openl
: _data->loading()
? _cancell
@ -917,7 +918,7 @@ void Gif::drawGrouped(
const auto autoPaused = _parent->delegate()->elementIsGifPaused();
const auto fullFeatured = fullFeaturedGrouped(sides);
const auto cornerDownload = fullFeatured && downloadInCorner();
const auto canBePlayed = _dataMedia->canBePlayed();
const auto canBePlayed = _dataMedia->canBePlayed(_realParent);
const auto autoplay = fullFeatured
&& autoplayEnabled()
&& canBePlayed
@ -1109,7 +1110,7 @@ TextState Gif::getStateGrouped(
? _cancell
: _realParent->isSending()
? nullptr
: (dataLoaded() || _dataMedia->canBePlayed())
: (dataLoaded() || _dataMedia->canBePlayed(_realParent))
? _openl
: _data->loading()
? _cancell
@ -1258,7 +1259,7 @@ void Gif::updateStatusText() const {
statusSize = _data->uploadingData->offset;
} else if (!downloadInCorner() && _data->loading()) {
statusSize = _data->loadOffset();
} else if (dataLoaded() || _dataMedia->canBePlayed()) {
} else if (dataLoaded() || _dataMedia->canBePlayed(_realParent)) {
statusSize = Ui::FileStatusSizeLoaded;
} else {
statusSize = Ui::FileStatusSizeReady;
@ -1386,7 +1387,7 @@ void Gif::playAnimation(bool autoplay) {
}
if (_streamed) {
stopAnimation();
} else if (_dataMedia->canBePlayed()) {
} else if (_dataMedia->canBePlayed(_realParent)) {
if (!autoplayEnabled()) {
history()->owner().checkPlayingAnimations();
}

View File

@ -190,7 +190,7 @@ ClickHandlerPtr ItemBase::getResultPreviewHandler() const {
_result->_content_url,
false);
} else if (const auto document = _result->_document
; document && document->createMediaView()->canBePlayed()) {
; document && document->createMediaView()->canBePlayed(nullptr)) {
return std::make_shared<OpenFileClickHandler>();
} else if (_result->_photo) {
return std::make_shared<OpenFileClickHandler>();

View File

@ -1212,7 +1212,7 @@ bool OverlayWidget::radialAnimationCallback(crl::time now) {
update(radialRect());
}
const auto ready = _document && _documentMedia->loaded();
const auto streamVideo = ready && _documentMedia->canBePlayed();
const auto streamVideo = ready && _documentMedia->canBePlayed(_message);
const auto tryOpenImage = ready
&& (_document->size < Images::kReadBytesLimit);
if (ready && ((tryOpenImage && !_radial.animating()) || streamVideo)) {
@ -1693,7 +1693,7 @@ void OverlayWidget::downloadMedia() {
void OverlayWidget::saveCancel() {
if (_document && _document->loading()) {
_document->cancel();
if (_documentMedia->canBePlayed()) {
if (_documentMedia->canBePlayed(_message)) {
redisplayContent();
}
}
@ -2429,7 +2429,7 @@ void OverlayWidget::displayDocument(
).toImage());
}
} else {
if (_documentMedia->canBePlayed()
if (_documentMedia->canBePlayed(_message)
&& initStreaming(continueStreaming)) {
} else if (_document->isVideoFile()) {
_documentMedia->automaticLoad(fileOrigin(), _message);
@ -2577,7 +2577,7 @@ void OverlayWidget::displayFinished() {
}
bool OverlayWidget::canInitStreaming() const {
return (_document && _documentMedia->canBePlayed())
return (_document && _documentMedia->canBePlayed(_message))
|| (_photo && _photo->videoCanBePlayed());
}
@ -4106,7 +4106,7 @@ void OverlayWidget::preloadData(int delta) {
const auto [i, ok] = documents.emplace(
(*document)->createMediaView());
(*i)->thumbnailWanted(fileOrigin(entity));
if (!(*i)->canBePlayed()) {
if (!(*i)->canBePlayed(entity.item)) {
(*i)->automaticLoad(fileOrigin(entity), entity.item);
}
}

View File

@ -484,7 +484,7 @@ void Video::paint(Painter &p, const QRect &clip, TextSelection selection, const
if (!selected && !context->selecting && radialOpacity < 1.) {
if (clip.intersects(QRect(0, _height - st::normalFont->height, _width, st::normalFont->height))) {
const auto download = !loaded && !_dataMedia->canBePlayed();
const auto download = !loaded && !_dataMedia->canBePlayed(parent());
const auto &icon = download
? (selected ? st::overviewVideoDownloadSelected : st::overviewVideoDownload)
: (selected ? st::overviewVideoPlaySelected : st::overviewVideoPlay);
@ -510,7 +510,7 @@ void Video::paint(Painter &p, const QRect &clip, TextSelection selection, const
if (selected) {
p.setBrush(st::msgDateImgBgSelected);
} else {
auto over = ClickHandler::showAsActive((_data->loading() || _data->uploading()) ? _cancell : (loaded || _dataMedia->canBePlayed()) ? _openl : _savel);
auto over = ClickHandler::showAsActive((_data->loading() || _data->uploading()) ? _cancell : (loaded || _dataMedia->canBePlayed(parent())) ? _openl : _savel);
p.setBrush(anim::brush(st::msgDateImgBg, st::msgDateImgBgOver, _a_iconOver.value(over ? 1. : 0.)));
}
@ -576,7 +576,7 @@ TextState Video::getState(
ensureDataMediaCreated();
const auto link = (_data->loading() || _data->uploading())
? _cancell
: (dataLoaded() || _dataMedia->canBePlayed())
: (dataLoaded() || _dataMedia->canBePlayed(parent()))
? _openl
: _savel;
return { parent(), link };
@ -704,7 +704,7 @@ void Voice::paint(Painter &p, const QRect &clip, TextSelection selection, const
}
const auto &checkLink = (_data->loading() || _data->uploading())
? _cancell
: (_dataMedia->canBePlayed() || loaded)
: (_dataMedia->canBePlayed(parent()) || loaded)
? _openl
: _savel;
if (selected) {
@ -732,7 +732,7 @@ void Voice::paint(Painter &p, const QRect &clip, TextSelection selection, const
return &(selected ? _st.voiceCancelSelected : _st.voiceCancel);
} else if (showPause) {
return &(selected ? _st.voicePauseSelected : _st.voicePause);
} else if (_dataMedia->canBePlayed()) {
} else if (_dataMedia->canBePlayed(parent())) {
return &(selected ? _st.voicePlaySelected : _st.voicePlay);
}
return &(selected
@ -802,7 +802,7 @@ TextState Voice::getState(
if (inner.contains(point)) {
const auto link = (_data->loading() || _data->uploading())
? _cancell
: (_dataMedia->canBePlayed() || loaded)
: (_dataMedia->canBePlayed(parent()) || loaded)
? _openl
: _savel;
return { parent(), link };
@ -969,7 +969,8 @@ Document::Document(
bool Document::downloadInCorner() const {
return _data->isAudioFile()
&& _data->canBeStreamed()
&& parent()->history()->peer->allowsForwarding()
&& _data->canBeStreamed(parent())
&& !_data->inappPlaybackFailed()
&& parent()->isRegular();
}
@ -1033,7 +1034,7 @@ void Document::paint(Painter &p, const QRect &clip, TextSelection selection, con
} else {
const auto over = ClickHandler::showAsActive(isLoading
? _cancell
: (loaded || _dataMedia->canBePlayed())
: (loaded || _dataMedia->canBePlayed(parent()))
? _openl
: _savel);
p.setBrush(anim::brush(
@ -1055,7 +1056,7 @@ void Document::paint(Painter &p, const QRect &clip, TextSelection selection, con
return &(selected
? _st.voicePauseSelected
: _st.voicePause);
} else if (loaded || _dataMedia->canBePlayed()) {
} else if (loaded || _dataMedia->canBePlayed(parent())) {
return &(selected
? _st.voicePlaySelected
: _st.voicePlay);
@ -1068,7 +1069,7 @@ void Document::paint(Painter &p, const QRect &clip, TextSelection selection, con
return &(selected ? _st.songCancelSelected : _st.songCancel);
} else if (showPause) {
return &(selected ? _st.songPauseSelected : _st.songPause);
} else if (loaded || _dataMedia->canBePlayed()) {
} else if (loaded || _dataMedia->canBePlayed(parent())) {
return &(selected ? _st.songPlaySelected : _st.songPlay);
}
return &(selected ? _st.songDownloadSelected : _st.songDownload);
@ -1280,7 +1281,7 @@ TextState Document::getState(
const auto link = (!downloadInCorner()
&& (_data->loading() || _data->uploading()))
? _cancell
: (loaded || _dataMedia->canBePlayed())
: (loaded || _dataMedia->canBePlayed(parent()))
? _openl
: _savel;
return { parent(), link };