From a614ccad97ea06e7da13b03d59b054554b913586 Mon Sep 17 00:00:00 2001 From: John Preston Date: Tue, 20 Oct 2020 11:19:48 +0300 Subject: [PATCH] Correctly check media when editing files. --- Telegram/SourceFiles/apiwrap.cpp | 15 +-- .../SourceFiles/boxes/edit_caption_box.cpp | 85 ++++++++-------- Telegram/SourceFiles/boxes/edit_caption_box.h | 4 +- Telegram/SourceFiles/boxes/send_files_box.cpp | 4 +- Telegram/SourceFiles/core/file_utilities.cpp | 5 +- Telegram/SourceFiles/core/file_utilities.h | 2 +- Telegram/SourceFiles/core/mime_type.cpp | 2 +- Telegram/SourceFiles/core/mime_type.h | 2 +- .../SourceFiles/history/history_widget.cpp | 5 +- .../view/history_view_replies_section.cpp | 5 +- .../view/history_view_scheduled_section.cpp | 5 +- .../storage/storage_media_prepare.cpp | 98 ++----------------- .../storage/storage_media_prepare.h | 5 +- .../ui/chat/attach/attach_album_thumbnail.cpp | 2 +- .../ui/chat/attach/attach_prepare.cpp | 76 +++++++++----- .../ui/chat/attach/attach_prepare.h | 27 ++++- 16 files changed, 155 insertions(+), 187 deletions(-) diff --git a/Telegram/SourceFiles/apiwrap.cpp b/Telegram/SourceFiles/apiwrap.cpp index afe7639d3..0d5a88a9b 100644 --- a/Telegram/SourceFiles/apiwrap.cpp +++ b/Telegram/SourceFiles/apiwrap.cpp @@ -4228,18 +4228,11 @@ void ApiWrap::sendFiles( tasks.reserve(list.files.size()); for (auto &file : list.files) { if (album) { - switch (file.type) { - case Ui::PreparedFile::AlbumType::Photo: - type = (type == SendMediaType::File) - ? type - : SendMediaType::Photo; - break; - case Ui::PreparedFile::AlbumType::Music: - case Ui::PreparedFile::AlbumType::Video: - case Ui::PreparedFile::AlbumType::File: + if (file.type == Ui::PreparedFile::Type::Photo + && type != SendMediaType::File) { + type = SendMediaType::Photo; + } else { type = SendMediaType::File; - break; - default: Unexpected("AlbumType in ApiWrap::sendFiles."); } } tasks.push_back(std::make_unique( diff --git a/Telegram/SourceFiles/boxes/edit_caption_box.cpp b/Telegram/SourceFiles/boxes/edit_caption_box.cpp index 19e044b44..edcb57b56 100644 --- a/Telegram/SourceFiles/boxes/edit_caption_box.cpp +++ b/Telegram/SourceFiles/boxes/edit_caption_box.cpp @@ -106,10 +106,23 @@ EditCaptionBox::EditCaptionBox( Expects(item->media()->allowsEditCaption()); _isAllowedEditMedia = item->media()->allowsEditMedia(); - _isAlbum = !item->groupId().empty(); - auto dimensions = QSize(); const auto media = item->media(); + + if (!item->groupId().empty()) { + if (media->photo()) { + _albumType = Ui::AlbumType::PhotoVideo; + } else if (const auto document = media->document()) { + if (document->isVideoFile()) { + _albumType = Ui::AlbumType::PhotoVideo; + } else if (document->isSong()) { + _albumType = Ui::AlbumType::Music; + } else { + _albumType = Ui::AlbumType::File; + } + } + } + if (const auto photo = media->photo()) { _photoMedia = photo->createMediaView(); _photoMedia->wanted(PhotoSize::Large, _msgId); @@ -503,7 +516,8 @@ void EditCaptionBox::updateEditPreview() { if (const auto image = std::get_if(fileMedia)) { shouldAsDoc = !Ui::ValidateThumbDimensions( image->data.width(), - image->data.height()); + image->data.height() + ) || (_albumType == Ui::AlbumType::File); if (shouldAsDoc) { docPhotoSize.setWidth(image->data.width()); docPhotoSize.setHeight(image->data.height()); @@ -554,7 +568,7 @@ void EditCaptionBox::updateEditPreview() { _doc = true; } - const auto showCheckbox = _photo && !_isAlbum; + const auto showCheckbox = _photo && (_albumType == Ui::AlbumType::None); _wayWrap->toggle(showCheckbox, anim::type::instant); if (!_doc) { @@ -604,14 +618,10 @@ void EditCaptionBox::createEditMediaButton() { if (Core::IsMimeSticker(mime)) { showError(tr::lng_edit_media_invalid_file); return false; - } else if (_isAlbum) { // #TODO files edit in file-albums - if (!Core::IsMimeAcceptedForAlbum(mime) - || file.type == Ui::PreparedFile::AlbumType::File - || file.type == Ui::PreparedFile::AlbumType::Music - || file.type == Ui::PreparedFile::AlbumType::None) { - showError(tr::lng_edit_media_album_error); - return false; - } + } else if (_albumType != Ui::AlbumType::None + && !file.canBeInAlbumType(_albumType)) { + showError(tr::lng_edit_media_album_error); + return false; } return true; }; @@ -622,14 +632,13 @@ void EditCaptionBox::createEditMediaButton() { st::sendMediaPreviewSize); if (list) { - _preparedList = std::move(*list); - updateEditPreview(); + setPreparedList(std::move(*list)); } }; const auto buttonCallback = [=] { - const auto filters = _isAlbum - ? FileDialog::AlbumFilesFilter() + const auto filters = (_albumType == Ui::AlbumType::PhotoVideo) + ? FileDialog::PhotoVideoFilesFilter() : FileDialog::AllFilesFilter(); FileDialog::GetOpenPath( this, @@ -676,7 +685,7 @@ void EditCaptionBox::prepare() { if (action == Ui::InputField::MimeAction::Check) { if (!data->hasText() && !_isAllowedEditMedia) { return false; - } else if (Storage::ValidateDragData(data, _isAlbum)) { + } else if (Storage::ValidateEditMediaDragData(data, _albumType)) { return true; } return data->hasText(); @@ -700,40 +709,32 @@ void EditCaptionBox::prepare() { } bool EditCaptionBox::fileFromClipboard(not_null data) { + return setPreparedList(ListFromMimeData(data)); +} + +bool EditCaptionBox::setPreparedList(Ui::PreparedList &&list) { if (!_isAllowedEditMedia) { return false; } using Error = Ui::PreparedList::Error; - using AlbumType = Ui::PreparedFile::AlbumType; - auto list = ListFromMimeData(data); - + using Type = Ui::PreparedFile::Type; if (list.error != Error::None || list.files.empty()) { return false; } - - const auto file = &list.files.front(); - if (_isAlbum && (file->type == AlbumType::File - || file->type == AlbumType::None - || file->type == AlbumType::Music)) { - const auto imageAsDoc = [&] { - using Info = Ui::PreparedFileInformation; - const auto fileMedia = &file->information->media; - if (const auto image = std::get_if(fileMedia)) { - return !Ui::ValidateThumbDimensions( - image->data.width(), - image->data.height()); - } - return false; - }(); - - if (!data->hasText() || imageAsDoc) { - Ui::show( - Box(tr::lng_edit_media_album_error(tr::now)), - Ui::LayerOption::KeepOther); + auto file = &list.files.front(); + const auto invalidForAlbum = (_albumType != Ui::AlbumType::None) + && !file->canBeInAlbumType(_albumType); + if (_albumType == Ui::AlbumType::PhotoVideo) { + using Video = Ui::PreparedFileInformation::Video; + if (const auto video = std::get_if