| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | /*
 | 
					
						
							|  |  |  | This file is part of Telegram Desktop, | 
					
						
							|  |  |  | the official desktop application for the Telegram messaging service. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | For license and copyright information please follow this link: | 
					
						
							|  |  |  | https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
 | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | #include "boxes/auto_download_box.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "lang/lang_keys.h"
 | 
					
						
							| 
									
										
										
										
											2019-07-24 13:45:24 +02:00
										 |  |  | #include "main/main_session.h"
 | 
					
						
							| 
									
										
										
										
											2020-06-18 16:47:09 +04:00
										 |  |  | #include "main/main_session_settings.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | #include "data/data_session.h"
 | 
					
						
							| 
									
										
										
										
											2019-12-20 15:56:39 +03:00
										 |  |  | #include "data/data_auto_download.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | #include "ui/widgets/continuous_sliders.h"
 | 
					
						
							| 
									
										
										
										
											2019-11-02 20:06:47 +03:00
										 |  |  | #include "ui/widgets/buttons.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | #include "ui/wrap/vertical_layout.h"
 | 
					
						
							|  |  |  | #include "ui/wrap/wrap.h"
 | 
					
						
							|  |  |  | #include "storage/localstorage.h"
 | 
					
						
							|  |  |  | #include "settings/settings_common.h"
 | 
					
						
							|  |  |  | #include "export/view/export_view_settings.h"
 | 
					
						
							| 
									
										
										
										
											2019-09-18 14:19:05 +03:00
										 |  |  | #include "styles/style_layers.h"
 | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | #include "styles/style_boxes.h"
 | 
					
						
							|  |  |  | #include "styles/style_settings.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | constexpr auto kMegabyte = 1024 * 1024; | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | constexpr auto kDefaultDownloadLimit = 10 * kMegabyte; | 
					
						
							|  |  |  | constexpr auto kDefaultAutoPlayLimit = 50 * kMegabyte; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | using Type = Data::AutoDownload::Type; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | not_null<int64*> AddSizeLimitSlider( | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		not_null<Ui::VerticalLayout*> container, | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 		const base::flat_map<Type, int64> &values, | 
					
						
							|  |  |  | 		int64 defaultValue) { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 	using namespace Settings; | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 	using Pair = base::flat_map<Type, int64>::value_type; | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-06-20 11:48:19 +04:00
										 |  |  | 	const auto limits = Ui::CreateChild<rpl::event_stream<int64>>( | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		container.get()); | 
					
						
							|  |  |  | 	const auto currentLimit = ranges::max_element( | 
					
						
							|  |  |  | 		values, | 
					
						
							|  |  |  | 		std::less<>(), | 
					
						
							|  |  |  | 		[](Pair pair) { return pair.second; })->second; | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 	const auto startLimit = currentLimit ? currentLimit : defaultValue; | 
					
						
							|  |  |  | 	const auto result = Ui::CreateChild<int64>(container.get(), startLimit); | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 	AddButtonWithLabel( | 
					
						
							|  |  |  | 		container, | 
					
						
							|  |  |  | 		tr::lng_media_size_limit(), | 
					
						
							|  |  |  | 		limits->events_starting_with_copy( | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 			startLimit | 
					
						
							| 
									
										
										
										
											2022-06-20 11:48:19 +04:00
										 |  |  | 		) | rpl::map([](int64 value) { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			return tr::lng_media_size_up_to( | 
					
						
							|  |  |  | 				tr::now, | 
					
						
							|  |  |  | 				lt_size, | 
					
						
							|  |  |  | 				QString::number(value / kMegabyte) + " MB"); | 
					
						
							|  |  |  | 		}), | 
					
						
							|  |  |  | 		st::autoDownloadLimitButton | 
					
						
							|  |  |  | 	)->setAttribute(Qt::WA_TransparentForMouseEvents); | 
					
						
							|  |  |  | 	const auto slider = container->add( | 
					
						
							|  |  |  | 		object_ptr<Ui::MediaSlider>(container, st::autoDownloadLimitSlider), | 
					
						
							|  |  |  | 		st::autoDownloadLimitPadding); | 
					
						
							|  |  |  | 	slider->resize(st::autoDownloadLimitSlider.seekSize); | 
					
						
							|  |  |  | 	slider->setPseudoDiscrete( | 
					
						
							|  |  |  | 		Export::View::kSizeValueCount, | 
					
						
							|  |  |  | 		Export::View::SizeLimitByIndex, | 
					
						
							|  |  |  | 		*result, | 
					
						
							| 
									
										
										
										
											2022-06-20 11:48:19 +04:00
										 |  |  | 		[=](int64 value) { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			*result = value; | 
					
						
							|  |  |  | 			limits->fire_copy(value); | 
					
						
							|  |  |  | 		}); | 
					
						
							|  |  |  | 	return result; | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | } // namespace
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | AutoDownloadBox::AutoDownloadBox( | 
					
						
							|  |  |  | 	QWidget*, | 
					
						
							| 
									
										
										
										
											2019-07-24 16:00:30 +02:00
										 |  |  | 	not_null<Main::Session*> session, | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 	Data::AutoDownload::Source source) | 
					
						
							| 
									
										
										
										
											2019-07-24 16:00:30 +02:00
										 |  |  | : _session(session) | 
					
						
							|  |  |  | , _source(source) { | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AutoDownloadBox::prepare() { | 
					
						
							|  |  |  | 	setupContent(); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | void AutoDownloadBox::setupContent() { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 	using namespace rpl::mappers; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 	using namespace Settings; | 
					
						
							|  |  |  | 	using namespace Data::AutoDownload; | 
					
						
							|  |  |  | 	using Type = Data::AutoDownload::Type; | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 	using Pair = base::flat_map<Type, int64>::value_type; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 	setTitle(tr::lng_profile_settings_section()); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-07-24 16:00:30 +02:00
										 |  |  | 	const auto settings = &_session->settings().autoDownload(); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	auto wrap = object_ptr<Ui::VerticalLayout>(this); | 
					
						
							|  |  |  | 	const auto content = wrap.data(); | 
					
						
							|  |  |  | 	setInnerWidget(object_ptr<Ui::OverrideMargins>( | 
					
						
							|  |  |  | 		this, | 
					
						
							|  |  |  | 		std::move(wrap))); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 	const auto add = [&]( | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 			not_null<base::flat_map<Type, int64>*> values, | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			Type type, | 
					
						
							|  |  |  | 			rpl::producer<QString> label) { | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		const auto value = settings->bytesLimit(_source, type); | 
					
						
							|  |  |  | 		AddButton( | 
					
						
							|  |  |  | 			content, | 
					
						
							| 
									
										
										
										
											2019-06-18 14:16:43 +02:00
										 |  |  | 			std::move(label), | 
					
						
							| 
									
										
										
										
											2022-02-13 16:30:43 +03:00
										 |  |  | 			st::settingsButtonNoIcon | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		)->toggleOn( | 
					
						
							|  |  |  | 			rpl::single(value > 0) | 
					
						
							|  |  |  | 		)->toggledChanges( | 
					
						
							|  |  |  | 		) | rpl::start_with_next([=](bool enabled) { | 
					
						
							|  |  |  | 			(*values)[type] = enabled ? 1 : 0; | 
					
						
							|  |  |  | 		}, content->lifetime()); | 
					
						
							|  |  |  | 		values->emplace(type, value); | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	AddSubsectionTitle(content, tr::lng_media_auto_title()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 	const auto downloadValues = Ui::CreateChild<base::flat_map<Type, int64>>( | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		content); | 
					
						
							|  |  |  | 	add(downloadValues, Type::Photo, tr::lng_media_photo_title()); | 
					
						
							|  |  |  | 	add(downloadValues, Type::File, tr::lng_media_file_title()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const auto downloadLimit = AddSizeLimitSlider( | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		content, | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		*downloadValues, | 
					
						
							|  |  |  | 		kDefaultDownloadLimit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	AddSkip(content); | 
					
						
							|  |  |  | 	AddSubsectionTitle(content, tr::lng_media_auto_play()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-05-10 18:22:28 +04:00
										 |  |  | 	const auto autoPlayValues = Ui::CreateChild<base::flat_map<Type, int64>>( | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		content); | 
					
						
							|  |  |  | 	add( | 
					
						
							|  |  |  | 		autoPlayValues, | 
					
						
							|  |  |  | 		Type::AutoPlayVideoMessage, | 
					
						
							|  |  |  | 		tr::lng_media_video_messages_title()); | 
					
						
							|  |  |  | 	add(autoPlayValues, Type::AutoPlayVideo, tr::lng_media_video_title()); | 
					
						
							|  |  |  | 	add(autoPlayValues, Type::AutoPlayGIF, tr::lng_media_animation_title()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const auto autoPlayLimit = AddSizeLimitSlider( | 
					
						
							|  |  |  | 		content, | 
					
						
							|  |  |  | 		*autoPlayValues, | 
					
						
							|  |  |  | 		kDefaultAutoPlayLimit); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	const auto limitByType = [=](Type type) { | 
					
						
							|  |  |  | 		return (ranges::find(kAutoPlayTypes, type) != end(kAutoPlayTypes)) | 
					
						
							|  |  |  | 			? *autoPlayLimit | 
					
						
							|  |  |  | 			: *downloadLimit; | 
					
						
							|  |  |  | 	}; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-06-18 18:53:27 +02:00
										 |  |  | 	addButton(tr::lng_connection_save(), [=] { | 
					
						
							| 
									
										
										
										
											2021-03-13 16:12:08 +04:00
										 |  |  | 		auto &&values = ranges::views::concat( | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			*downloadValues, | 
					
						
							|  |  |  | 			*autoPlayValues); | 
					
						
							| 
									
										
										
										
											2021-03-13 16:12:08 +04:00
										 |  |  | 		auto allowMore = values | ranges::views::filter([&](Pair pair) { | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 			const auto [type, enabled] = pair; | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			const auto value = enabled ? limitByType(type) : 0; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 			const auto old = settings->bytesLimit(_source, type); | 
					
						
							|  |  |  | 			return (old < value); | 
					
						
							| 
									
										
										
										
											2021-03-13 16:12:08 +04:00
										 |  |  | 		}) | ranges::views::transform([](Pair pair) { | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 			return pair.first; | 
					
						
							|  |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		const auto less = ranges::any_of(*autoPlayValues, [&](Pair pair) { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			const auto [type, enabled] = pair; | 
					
						
							|  |  |  | 			const auto value = enabled ? limitByType(type) : 0; | 
					
						
							|  |  |  | 			return value < settings->bytesLimit(_source, type); | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		const auto allowMoreTypes = base::flat_set<Type>( | 
					
						
							|  |  |  | 			allowMore.begin(), | 
					
						
							|  |  |  | 			allowMore.end()); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		const auto changed = ranges::any_of(values, [&](Pair pair) { | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 			const auto [type, enabled] = pair; | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			const auto value = enabled ? limitByType(type) : 0; | 
					
						
							|  |  |  | 			return value != settings->bytesLimit(_source, type); | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-20 15:56:39 +03:00
										 |  |  | 		const auto &kHidden = kStreamedTypes; | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		const auto hiddenChanged = ranges::any_of(kHidden, [&](Type type) { | 
					
						
							| 
									
										
										
										
											2019-03-01 17:11:47 +04:00
										 |  |  | 			const auto now = settings->bytesLimit(_source, type); | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 			return (now > 0) && (now != limitByType(type)); | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		}); | 
					
						
							| 
									
										
										
										
											2019-03-01 17:11:47 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		if (changed) { | 
					
						
							| 
									
										
										
										
											2021-03-13 12:26:58 +04:00
										 |  |  | 			for (const auto &[type, enabled] : values) { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 				const auto value = enabled ? limitByType(type) : 0; | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 				settings->setBytesLimit(_source, type, value); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2019-03-01 17:11:47 +04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (hiddenChanged) { | 
					
						
							|  |  |  | 			for (const auto type : kHidden) { | 
					
						
							|  |  |  | 				const auto now = settings->bytesLimit(_source, type); | 
					
						
							|  |  |  | 				if (now > 0) { | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 					settings->setBytesLimit( | 
					
						
							|  |  |  | 						_source, | 
					
						
							|  |  |  | 						type, | 
					
						
							|  |  |  | 						limitByType(type)); | 
					
						
							| 
									
										
										
										
											2019-03-01 17:11:47 +04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		if (changed || hiddenChanged) { | 
					
						
							| 
									
										
										
										
											2020-06-09 20:57:05 +04:00
										 |  |  | 			_session->saveSettingsDelayed(); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		if (allowMoreTypes.contains(Type::Photo)) { | 
					
						
							| 
									
										
										
										
											2019-07-24 16:00:30 +02:00
										 |  |  | 			_session->data().photoLoadSettingsChanged(); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2020-05-18 22:33:14 +03:00
										 |  |  | 		if (ranges::any_of(allowMoreTypes, _1 != Type::Photo)) { | 
					
						
							| 
									
										
										
										
											2019-07-24 16:00:30 +02:00
										 |  |  | 			_session->data().documentLoadSettingsChanged(); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		if (less) { | 
					
						
							| 
									
										
										
										
											2020-06-04 17:26:06 +04:00
										 |  |  | 			_session->data().checkPlayingAnimations(); | 
					
						
							| 
									
										
										
										
											2019-12-24 13:09:04 +03:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 		closeBox(); | 
					
						
							|  |  |  | 	}); | 
					
						
							| 
									
										
										
										
											2019-06-18 18:53:27 +02:00
										 |  |  | 	addButton(tr::lng_cancel(), [=] { closeBox(); }); | 
					
						
							| 
									
										
										
										
											2018-12-06 19:47:28 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	setDimensionsToContent(st::boxWidth, content); | 
					
						
							|  |  |  | } |