From 826496871841e8a19685e1449cc119e657d7a160 Mon Sep 17 00:00:00 2001 From: John Preston Date: Fri, 26 Nov 2021 18:01:58 +0400 Subject: [PATCH] Use cloud "disable calls" settings instead of local. --- .../SourceFiles/api/api_authorizations.cpp | 37 +++++++++++++++++++ Telegram/SourceFiles/api/api_authorizations.h | 11 ++++++ Telegram/SourceFiles/calls/calls_instance.cpp | 2 - Telegram/SourceFiles/core/core_settings.cpp | 10 ++--- Telegram/SourceFiles/core/core_settings.h | 9 ++--- .../SourceFiles/settings/settings_calls.cpp | 20 ++++++---- .../settings/settings_notifications.cpp | 21 +++++++---- 7 files changed, 81 insertions(+), 29 deletions(-) diff --git a/Telegram/SourceFiles/api/api_authorizations.cpp b/Telegram/SourceFiles/api/api_authorizations.cpp index 9764f5d5a..0f1f457f8 100644 --- a/Telegram/SourceFiles/api/api_authorizations.cpp +++ b/Telegram/SourceFiles/api/api_authorizations.cpp @@ -104,6 +104,10 @@ Authorizations::Authorizations(not_null api) _listChanges.fire({}); } }, _lifetime); + + if (Core::App().settings().disableCallsLegacy()) { + toggleCallsDisabledHere(true); + } } void Authorizations::reload() { @@ -198,6 +202,39 @@ rpl::producer Authorizations::ttlDays() const { return _ttlDays.value() | rpl::filter(rpl::mappers::_1 != 0); } +void Authorizations::toggleCallsDisabled(uint64 hash, bool disabled) { + if (const auto sent = _toggleCallsDisabledRequests.take(hash)) { + _api.request(*sent).cancel(); + } + using Flag = MTPaccount_ChangeAuthorizationSettings::Flag; + const auto id = _api.request(MTPaccount_ChangeAuthorizationSettings( + MTP_flags(Flag::f_call_requests_disabled), + MTP_long(hash), + MTPBool(), // encrypted_requests_disabled + MTP_bool(disabled) + )).done([=](const MTPBool &) { + _toggleCallsDisabledRequests.remove(hash); + }).fail([=](const MTP::Error &) { + _toggleCallsDisabledRequests.remove(hash); + }).send(); + _toggleCallsDisabledRequests.emplace(hash, id); + if (!hash) { + _callsDisabledHere = disabled; + } +} + +bool Authorizations::callsDisabledHere() const { + return _callsDisabledHere.current(); +} + +rpl::producer Authorizations::callsDisabledHereValue() const { + return _callsDisabledHere.value(); +} + +rpl::producer Authorizations::callsDisabledHereChanges() const { + return _callsDisabledHere.changes(); +} + int Authorizations::total() const { return ranges::count_if( _list, diff --git a/Telegram/SourceFiles/api/api_authorizations.h b/Telegram/SourceFiles/api/api_authorizations.h index 4b28e9c17..45092eca2 100644 --- a/Telegram/SourceFiles/api/api_authorizations.h +++ b/Telegram/SourceFiles/api/api_authorizations.h @@ -43,6 +43,14 @@ public: void updateTTL(int days); [[nodiscard]] rpl::producer ttlDays() const; + void toggleCallsDisabledHere(bool disabled) { + toggleCallsDisabled(0, disabled); + } + void toggleCallsDisabled(uint64 hash, bool disabled); + [[nodiscard]] bool callsDisabledHere() const; + [[nodiscard]] rpl::producer callsDisabledHereValue() const; + [[nodiscard]] rpl::producer callsDisabledHereChanges() const; + private: MTP::Sender _api; mtpRequestId _requestId = 0; @@ -53,6 +61,9 @@ private: mtpRequestId _ttlRequestId = 0; rpl::variable _ttlDays = 0; + base::flat_map _toggleCallsDisabledRequests; + rpl::variable _callsDisabledHere; + crl::time _lastReceived = 0; rpl::lifetime _lifetime; diff --git a/Telegram/SourceFiles/calls/calls_instance.cpp b/Telegram/SourceFiles/calls/calls_instance.cpp index 874126fc5..3d1750a12 100644 --- a/Telegram/SourceFiles/calls/calls_instance.cpp +++ b/Telegram/SourceFiles/calls/calls_instance.cpp @@ -503,8 +503,6 @@ void Instance::handleCallUpdate( } else if (phoneCall.vdate().v + (config.callRingTimeoutMs / 1000) < base::unixtime::now()) { LOG(("Ignoring too old call.")); - } else if (Core::App().settings().disableCalls()) { - LOG(("Ignoring call because of 'accept calls' settings.")); } else { createCall(user, Call::Type::Incoming, phoneCall.is_video()); _currentCall->handleUpdate(call); diff --git a/Telegram/SourceFiles/core/core_settings.cpp b/Telegram/SourceFiles/core/core_settings.cpp index 1863fb27d..ca15ba2cf 100644 --- a/Telegram/SourceFiles/core/core_settings.cpp +++ b/Telegram/SourceFiles/core/core_settings.cpp @@ -203,7 +203,7 @@ QByteArray Settings::serialize() const { << _groupCallPushToTalkShortcut << qint64(_groupCallPushToTalkDelay) << qint32(0) // Call audio backend - << qint32(_disableCalls ? 1 : 0) + << qint32(0) // Legacy disable calls, now in session settings << windowPosition << qint32(recentEmojiPreloadData.size()); for (const auto &[id, rating] : recentEmojiPreloadData) { @@ -300,7 +300,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { QByteArray groupCallPushToTalkShortcut = _groupCallPushToTalkShortcut; qint64 groupCallPushToTalkDelay = _groupCallPushToTalkDelay; qint32 callAudioBackend = 0; - qint32 disableCalls = _disableCalls ? 1 : 0; + qint32 disableCallsLegacy = 0; QByteArray windowPosition; std::vector recentEmojiPreload; base::flat_map emojiVariants; @@ -413,7 +413,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { stream >> callAudioBackend; } if (!stream.atEnd()) { - stream >> disableCalls; + stream >> disableCallsLegacy; } if (!stream.atEnd()) { stream >> windowPosition; @@ -593,7 +593,7 @@ void Settings::addFromSerialized(const QByteArray &serialized) { _groupCallPushToTalk = (groupCallPushToTalk == 1); _groupCallPushToTalkShortcut = groupCallPushToTalkShortcut; _groupCallPushToTalkDelay = groupCallPushToTalkDelay; - _disableCalls = (disableCalls == 1); + _disableCallsLegacy = (disableCallsLegacy == 1); if (!windowPosition.isEmpty()) { _windowPosition = Deserialize(windowPosition); } @@ -870,7 +870,7 @@ void Settings::resetOnLastLogout() { //_callInputVolume = 100; //_callAudioDuckingEnabled = true; - _disableCalls = false; + _disableCallsLegacy = false; _groupCallPushToTalk = false; _groupCallPushToTalkShortcut = QByteArray(); diff --git a/Telegram/SourceFiles/core/core_settings.h b/Telegram/SourceFiles/core/core_settings.h index b36112fa4..b057a1f64 100644 --- a/Telegram/SourceFiles/core/core_settings.h +++ b/Telegram/SourceFiles/core/core_settings.h @@ -265,11 +265,8 @@ public: _callAudioDuckingEnabled = value; } [[nodiscard]] Webrtc::Backend callAudioBackend() const; - void setDisableCalls(bool value) { - _disableCalls = value; - } - [[nodiscard]] bool disableCalls() const { - return _disableCalls; + [[nodiscard]] bool disableCallsLegacy() const { + return _disableCallsLegacy; } [[nodiscard]] bool groupCallPushToTalk() const { return _groupCallPushToTalk; @@ -714,7 +711,7 @@ private: int _callOutputVolume = 100; int _callInputVolume = 100; bool _callAudioDuckingEnabled = true; - bool _disableCalls = false; + bool _disableCallsLegacy = false; bool _groupCallPushToTalk = false; bool _groupCallNoiseSuppression = false; QByteArray _groupCallPushToTalkShortcut; diff --git a/Telegram/SourceFiles/settings/settings_calls.cpp b/Telegram/SourceFiles/settings/settings_calls.cpp index df6dbdeb5..fb0ec060d 100644 --- a/Telegram/SourceFiles/settings/settings_calls.cpp +++ b/Telegram/SourceFiles/settings/settings_calls.cpp @@ -27,6 +27,8 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "calls/calls_call.h" #include "calls/calls_instance.h" #include "calls/calls_video_bubble.h" +#include "apiwrap.h" +#include "api/api_authorizations.h" #include "webrtc/webrtc_media_devices.h" #include "webrtc/webrtc_video_track.h" #include "webrtc/webrtc_audio_input_tester.h" @@ -268,19 +270,21 @@ void Calls::setupContent() { AddSkip(content); AddSubsectionTitle(content, tr::lng_settings_call_section_other()); + const auto api = &_controller->session().api(); AddButton( content, tr::lng_settings_call_accept_calls(), st::settingsButton - )->toggleOn(rpl::single( - !settings.disableCalls() - ))->toggledChanges( - ) | rpl::filter([&settings](bool value) { - return (settings.disableCalls() == value); - }) | rpl::start_with_next([=](bool value) { - Core::App().settings().setDisableCalls(!value); - Core::App().saveSettingsDelayed(); + )->toggleOn( + api->authorizations().callsDisabledHereValue( + ) | rpl::map(!rpl::mappers::_1) + )->toggledChanges( + ) | rpl::filter([=](bool value) { + return (value == api->authorizations().callsDisabledHere()); + }) | start_with_next([=](bool value) { + api->authorizations().toggleCallsDisabledHere(!value); }, content->lifetime()); + AddButton( content, tr::lng_settings_call_open_system_prefs(), diff --git a/Telegram/SourceFiles/settings/settings_notifications.cpp b/Telegram/SourceFiles/settings/settings_notifications.cpp index 9b477ef48..7b45f1c9c 100644 --- a/Telegram/SourceFiles/settings/settings_notifications.cpp +++ b/Telegram/SourceFiles/settings/settings_notifications.cpp @@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "main/main_session.h" #include "main/main_account.h" #include "main/main_domain.h" +#include "api/api_authorizations.h" #include "apiwrap.h" #include "facades.h" #include "styles/style_settings.h" @@ -670,15 +671,19 @@ void SetupNotificationsContent( AddSubsectionTitle( container, tr::lng_settings_notifications_calls_title()); - addCheckbox( + const auto authorizations = &session->api().authorizations(); + const auto acceptCalls = addCheckbox( tr::lng_settings_call_accept_calls(tr::now), - !settings.disableCalls() - )->checkedChanges( - ) | rpl::filter([&settings](bool value) { - return (settings.disableCalls() == value); - }) | rpl::start_with_next([=](bool value) { - Core::App().settings().setDisableCalls(!value); - Core::App().saveSettingsDelayed(); + !authorizations->callsDisabledHere()); + session->api().authorizations().callsDisabledHereChanges( + ) | rpl::start_with_next([=](bool disabled) { + acceptCalls->setChecked( + !disabled, + Ui::Checkbox::NotifyAboutChange::DontNotify); + }, acceptCalls->lifetime()); + acceptCalls->checkedChanges( + ) | rpl::start_with_next([=](bool value) { + authorizations->toggleCallsDisabledHere(!value); }, container->lifetime()); AddSkip(container, st::settingsCheckboxesSkip);