diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index d8c36bc93..524b8111c 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -829,10 +829,6 @@ rpl::producer Application::appDeactivatedValue() const { }); } -void Application::call_handleObservables() { - base::HandleObservables(); -} - void Application::switchDebugMode() { if (Logs::DebugEnabled()) { Logs::SetDebugEnabled(false); diff --git a/Telegram/SourceFiles/core/application.h b/Telegram/SourceFiles/core/application.h index 63ccc30a5..badaf9f94 100644 --- a/Telegram/SourceFiles/core/application.h +++ b/Telegram/SourceFiles/core/application.h @@ -297,8 +297,6 @@ public: void preventOrInvoke(Fn &&callback); - void call_handleObservables(); - // Global runtime variables. void setScreenIsLocked(bool locked); bool screenIsLocked() const; diff --git a/Telegram/SourceFiles/core/sandbox.cpp b/Telegram/SourceFiles/core/sandbox.cpp index cc3f1ad62..692f98a6d 100644 --- a/Telegram/SourceFiles/core/sandbox.cpp +++ b/Telegram/SourceFiles/core/sandbox.cpp @@ -85,11 +85,6 @@ Sandbox::Sandbox( char **argv) : QApplication(argc, argv) , _mainThreadId(QThread::currentThreadId()) -, _handleObservables([=] { - if (_application) { - _application->call_handleObservables(); - } -}) , _launcher(launcher) { setQuitOnLastWindowClosed(false); } @@ -201,10 +196,6 @@ void Sandbox::launchApplication() { } setupScreenScale(); - base::InitObservables([] { - Instance()._handleObservables.call(); - }); - _application = std::make_unique(_launcher); // Ideally this should go to constructor. diff --git a/Telegram/SourceFiles/core/sandbox.h b/Telegram/SourceFiles/core/sandbox.h index ca8bbba3d..d2f971c4d 100644 --- a/Telegram/SourceFiles/core/sandbox.h +++ b/Telegram/SourceFiles/core/sandbox.h @@ -112,7 +112,6 @@ private: int _loopNestingLevel = 0; std::vector _previousLoopNestingLevels; std::vector _postponedCalls; - SingleQueuedInvokation _handleObservables; not_null _launcher; std::unique_ptr _application; diff --git a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp index 57296a86e..ad2034417 100644 --- a/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp +++ b/Telegram/SourceFiles/dialogs/dialogs_inner_widget.cpp @@ -2508,9 +2508,8 @@ void InnerWidget::refresh(bool toTop) { _mustScrollTo.fire({ 0, 0 }); loadPeerPhotos(); } - _controller->dialogsListDisplayForced().set( - _searchInChat || !_filter.isEmpty(), - true); + _controller->setDialogsListDisplayForced( + _searchInChat || !_filter.isEmpty()); update(); } @@ -2648,9 +2647,8 @@ void InnerWidget::searchInChat(Key key, PeerData *from) { } moveCancelSearchButtons(); - _controller->dialogsListDisplayForced().set( - _searchInChat || !_filter.isEmpty(), - true); + _controller->setDialogsListDisplayForced( + _searchInChat || !_filter.isEmpty()); } void InnerWidget::refreshSearchInChatLabel() { diff --git a/Telegram/SourceFiles/mainwidget.cpp b/Telegram/SourceFiles/mainwidget.cpp index 067f138f4..330681202 100644 --- a/Telegram/SourceFiles/mainwidget.cpp +++ b/Telegram/SourceFiles/mainwidget.cpp @@ -294,12 +294,13 @@ MainWidget::MainWidget( _player->finishAnimating(); } - subscribe(_controller->dialogsListFocused(), [this](bool) { + rpl::merge( + _controller->dialogsListFocusedChanges(), + _controller->dialogsListDisplayForcedChanges() + ) | rpl::start_with_next([=] { updateDialogsWidthAnimated(); - }); - subscribe(_controller->dialogsListDisplayForced(), [this](bool) { - updateDialogsWidthAnimated(); - }); + }, lifetime()); + rpl::merge( Core::App().settings().dialogsWidthRatioChanges() | rpl::to_empty, Core::App().settings().thirdColumnWidthChanges() | rpl::to_empty @@ -1396,7 +1397,7 @@ void MainWidget::ui_showPeerHistory( } } - _controller->dialogsListFocused().set(false, true); + _controller->setDialogsListFocused(false); _a_dialogsWidth.stop(); using Way = SectionShow::Way; @@ -1751,7 +1752,7 @@ void MainWidget::showNewSection( controller()->window().hideSettingsAndLayer(); } - _controller->dialogsListFocused().set(false, true); + _controller->setDialogsListFocused(false); _a_dialogsWidth.stop(); auto mainSectionTop = getMainSectionTop(); @@ -2619,10 +2620,10 @@ bool MainWidget::eventFilter(QObject *o, QEvent *e) { if (_history == widget || _history->isAncestorOf(widget) || (_mainSection && (_mainSection == widget || _mainSection->isAncestorOf(widget))) || (_thirdSection && (_thirdSection == widget || _thirdSection->isAncestorOf(widget)))) { - _controller->dialogsListFocused().set(false); + _controller->setDialogsListFocused(false); } else if (_dialogs && (_dialogs == widget || _dialogs->isAncestorOf(widget))) { - _controller->dialogsListFocused().set(true); + _controller->setDialogsListFocused(true); } } } else if (e->type() == QEvent::MouseButtonPress) { diff --git a/Telegram/SourceFiles/mainwidget.h b/Telegram/SourceFiles/mainwidget.h index d5a26ae89..c90f5002b 100644 --- a/Telegram/SourceFiles/mainwidget.h +++ b/Telegram/SourceFiles/mainwidget.h @@ -113,8 +113,7 @@ class ItemBase; class MainWidget : public Ui::RpWidget - , private Media::Player::FloatDelegate - , private base::Subscriber { + , private Media::Player::FloatDelegate { public: using SectionShow = Window::SectionShow; diff --git a/Telegram/SourceFiles/media/audio/media_audio.cpp b/Telegram/SourceFiles/media/audio/media_audio.cpp index cb19b704a..0f82da9b0 100644 --- a/Telegram/SourceFiles/media/audio/media_audio.cpp +++ b/Telegram/SourceFiles/media/audio/media_audio.cpp @@ -305,12 +305,12 @@ constexpr auto kCheckPlaybackPositionTimeout = crl::time(100); // 100ms per chec constexpr auto kCheckPlaybackPositionDelta = 2400LL; // update position called each 2400 samples constexpr auto kCheckFadingTimeout = crl::time(7); // 7ms -base::Observable UpdatedObservable; +rpl::event_stream UpdatedStream; } // namespace -base::Observable &Updated() { - return UpdatedObservable; +rpl::producer Updated() { + return UpdatedStream.events(); } // Thread: Any. Must be locked: AudioMutex. @@ -648,7 +648,11 @@ void Mixer::onUpdated(const AudioMsgId &audio) { if (audio.externalPlayId()) { externalSoundProgress(audio); } - Media::Player::Updated().notify(audio); + crl::on_main([=] { + // We've replaced base::Observable with on_main, because + // base::Observable::notify is not syncronous by default. + UpdatedStream.fire_copy(audio); + }); } // Thread: Any. Must be locked: AudioMutex. diff --git a/Telegram/SourceFiles/media/audio/media_audio.h b/Telegram/SourceFiles/media/audio/media_audio.h index 793e0d2e8..d1938e7f0 100644 --- a/Telegram/SourceFiles/media/audio/media_audio.h +++ b/Telegram/SourceFiles/media/audio/media_audio.h @@ -12,7 +12,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "core/file_location.h" #include "data/data_audio_msg_id.h" #include "base/bytes.h" -#include "base/observer.h" #include "base/timer.h" #include @@ -60,7 +59,7 @@ constexpr auto kWaveformSamplesCount = 100; class Fader; class Loaders; -base::Observable &Updated(); +[[nodiscard]] rpl::producer Updated(); float64 ComputeVolume(AudioMsgId::Type type); diff --git a/Telegram/SourceFiles/media/player/media_player_float.h b/Telegram/SourceFiles/media/player/media_player_float.h index af9a68014..2e9de4c1f 100644 --- a/Telegram/SourceFiles/media/player/media_player_float.h +++ b/Telegram/SourceFiles/media/player/media_player_float.h @@ -11,7 +11,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "ui/rect_part.h" #include "ui/effects/animations.h" #include "base/object_ptr.h" -#include "base/observer.h" namespace Window { class SessionController; @@ -48,7 +47,7 @@ private: }; -class Float : public Ui::RpWidget, private base::Subscriber { +class Float final : public Ui::RpWidget { public: Float( QWidget *parent, @@ -210,12 +209,13 @@ private: }; -class FloatController : private base::Subscriber { +class FloatController final { public: explicit FloatController(not_null delegate); void replaceDelegate(not_null delegate); - rpl::producer closeEvents() const { + + [[nodiscard]] rpl::producer closeEvents() const { return _closeEvents.events(); } diff --git a/Telegram/SourceFiles/media/player/media_player_instance.cpp b/Telegram/SourceFiles/media/player/media_player_instance.cpp index 9cc24e5a9..3c17f346f 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.cpp +++ b/Telegram/SourceFiles/media/player/media_player_instance.cpp @@ -146,9 +146,10 @@ Instance::Data::~Data() = default; Instance::Instance() : _songData(AudioMsgId::Type::Song, SharedMediaType::MusicFile) , _voiceData(AudioMsgId::Type::Voice, SharedMediaType::RoundVoiceFile) { - subscribe(Media::Player::Updated(), [this](const AudioMsgId &audioId) { + Media::Player::Updated( + ) | rpl::start_with_next([=](const AudioMsgId &audioId) { handleSongUpdate(audioId); - }); + }, _lifetime); repeatChanges( &_songData @@ -157,6 +158,7 @@ Instance::Instance() refreshPlaylist(&_songData); } }, _lifetime); + orderChanges( &_songData ) | rpl::start_with_next([=](OrderMode mode) { diff --git a/Telegram/SourceFiles/media/player/media_player_instance.h b/Telegram/SourceFiles/media/player/media_player_instance.h index 31f5a68f9..e8b9f847c 100644 --- a/Telegram/SourceFiles/media/player/media_player_instance.h +++ b/Telegram/SourceFiles/media/player/media_player_instance.h @@ -7,7 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "base/observer.h" #include "data/data_audio_msg_id.h" #include "data/data_shared_media.h" @@ -70,7 +69,7 @@ void SaveLastPlaybackPosition( not_null instance(); -class Instance : private base::Subscriber { +class Instance final { public: enum class Seeking { Start, diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.cpp b/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.cpp index 7b538ca24..6e80ed76f 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.cpp +++ b/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.cpp @@ -198,7 +198,7 @@ rpl::producer AudioTrack::playPosition() { if (!_subscription) { _subscription = Media::Player::Updated( - ).add_subscription([=](const AudioMsgId &id) { + ) | rpl::start_with_next([=](const AudioMsgId &id) { using State = Media::Player::State; if (id != _audioId) { return; diff --git a/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.h b/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.h index 8620f8d7b..ec6a4ff7b 100644 --- a/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.h +++ b/Telegram/SourceFiles/media/streaming/media_streaming_audio_track.h @@ -7,7 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "base/observer.h" #include "media/streaming/media_streaming_utility.h" namespace Media { @@ -80,7 +79,7 @@ private: crl::time _startedPosition = kTimeUnknown; // Accessed from the main thread. - base::Subscription _subscription; + rpl::lifetime _subscription; rpl::event_stream<> _waitingForData; // First set from the same unspecified thread before _ready is called. // After that accessed from the main thread. diff --git a/Telegram/SourceFiles/media/system_media_controls_manager.cpp b/Telegram/SourceFiles/media/system_media_controls_manager.cpp index fb37eb4c6..8601340fc 100644 --- a/Telegram/SourceFiles/media/system_media_controls_manager.cpp +++ b/Telegram/SourceFiles/media/system_media_controls_manager.cpp @@ -8,7 +8,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "media/system_media_controls_manager.h" #include "media/audio/media_audio.h" -#include "base/observer.h" #include "base/platform/base_platform_system_media_controls.h" #include "core/application.h" #include "core/core_settings.h" diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor.cpp b/Telegram/SourceFiles/window/themes/window_theme_editor.cpp index e8f34314d..961e1ddd8 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_editor.cpp @@ -201,7 +201,7 @@ QString bytesToUtf8(QLatin1String bytes) { } // namespace -class Editor::Inner : public Ui::RpWidget, private base::Subscriber { +class Editor::Inner final : public Ui::RpWidget { public: Inner(QWidget *parent, const QString &path); @@ -397,24 +397,36 @@ Editor::Inner::Inner(QWidget *parent, const QString &path) , _existingRows(this, EditorBlock::Type::Existing, &_context) , _newRows(this, EditorBlock::Type::New, &_context) { resize(st::windowMinWidth, st::windowMinHeight); - subscribe(_context.resized, [this] { + + _context.resized.events( + ) | rpl::start_with_next([=] { resizeToWidth(width()); - }); - subscribe(_context.pending, [this](const EditorBlock::Context::EditionData &data) { + }, lifetime()); + + using Context = EditorBlock::Context; + _context.pending.events( + ) | rpl::start_with_next([=](const Context::EditionData &data) { applyEditing(data.name, data.copyOf, data.value); - }); - subscribe(_context.updated, [this] { + }, lifetime()); + + _context.updated.events( + ) | rpl::start_with_next([=] { if (_context.name.isEmpty() && _focusCallback) { _focusCallback(); } - }); - subscribe(_context.scroll, [this](const EditorBlock::Context::ScrollData &data) { + }, lifetime()); + + _context.scroll.events( + ) | rpl::start_with_next([=](const Context::ScrollData &data) { if (_scrollCallback) { - auto top = (data.type == EditorBlock::Type::Existing ? _existingRows : _newRows)->y(); + auto top = (data.type == EditorBlock::Type::Existing + ? _existingRows + : _newRows)->y(); top += data.position; _scrollCallback(top, top + data.height); } - }); + }, lifetime()); + Background()->updates( ) | rpl::start_with_next([=](const BackgroundUpdate &update) { if (_applyingUpdate || !Background()->editingTheme()) { diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp b/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp index a7dda1ec1..e4e5ec98a 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp +++ b/Telegram/SourceFiles/window/themes/window_theme_editor_block.cpp @@ -167,20 +167,25 @@ void EditorBlock::Row::fillSearchIndex() { } } -EditorBlock::EditorBlock(QWidget *parent, Type type, Context *context) : TWidget(parent) +EditorBlock::EditorBlock(QWidget *parent, Type type, Context *context) +: RpWidget(parent) , _type(type) , _context(context) , _transparent(style::TransparentPlaceholder()) { setMouseTracking(true); - subscribe(_context->updated, [this] { + + _context->updated.events( + ) | rpl::start_with_next([=] { if (_mouseSelection) { _lastGlobalPos = QCursor::pos(); updateSelected(mapFromGlobal(_lastGlobalPos)); } update(); - }); + }, lifetime()); + if (_type == Type::Existing) { - subscribe(_context->appended, [this](const Context::AppendData &added) { + _context->appended.events( + ) | rpl::start_with_next([=](const Context::AppendData &added) { auto name = added.name; auto value = added.value; feed(name, value); @@ -194,14 +199,15 @@ EditorBlock::EditorBlock(QWidget *parent, Type type, Context *context) : TWidget row->setCopyOf(copyOf); addToSearch(*row); - _context->changed.notify({ QStringList(name), value }, true); - _context->resized.notify(); - _context->pending.notify({ name, copyOf, value }, true); - }); + _context->changed.fire({ QStringList(name), value }); + _context->resized.fire({}); + _context->pending.fire({ name, copyOf, value }); + }, lifetime()); } else { - subscribe(_context->changed, [this](const Context::ChangeData &data) { + _context->changed.events( + ) | rpl::start_with_next([=](const Context::ChangeData &data) { checkCopiesChanged(0, data.names, data.value); - }); + }, lifetime()); } } @@ -310,7 +316,7 @@ void EditorBlock::activateRow(const Row &row) { })); _context->box = box; _context->name = row.name(); - _context->updated.notify(); + _context->updated.fire({}); } } } @@ -335,11 +341,8 @@ bool EditorBlock::selectSkip(int direction) { void EditorBlock::scrollToSelected() { if (_selected >= 0) { - Context::ScrollData update; - update.type = _type; - update.position = rowAtIndex(_selected).top(); - update.height = rowAtIndex(_selected).height(); - _context->scroll.notify(update, true); + const auto &row = rowAtIndex(_selected); + _context->scroll.fire({ _type, row.top(), row.height() }); } } @@ -383,7 +386,7 @@ void EditorBlock::searchByQuery(QString query) { } } - _context->resized.notify(true); + _context->resized.fire({}); } } @@ -556,7 +559,7 @@ void EditorBlock::saveEditing(QColor value) { removeRow(name, false); - _context->appended.notify({ name, possibleCopyOf, color, description }, true); + _context->appended.fire({ name, possibleCopyOf, color, description }); } else if (_type == Type::Existing) { removeFromSearch(row); @@ -576,7 +579,7 @@ void EditorBlock::saveEditing(QColor value) { if (valueChanged || copyOfChanged) { checkCopiesChanged(_editing + 1, QStringList(name), value); - _context->pending.notify({ name, copyOf, value }, true); + _context->pending.fire({ name, copyOf, value }); } } cancelEditing(); @@ -593,7 +596,7 @@ void EditorBlock::checkCopiesChanged(int startIndex, QStringList names, QColor v } } if (_type == Type::Existing) { - _context->changed.notify({ names, value }, true); + _context->changed.fire({ names, value }); } } @@ -608,7 +611,7 @@ void EditorBlock::cancelEditing() { _context->possibleCopyOf = QString(); if (!_context->name.isEmpty()) { _context->name = QString(); - _context->updated.notify(); + _context->updated.fire({}); } } diff --git a/Telegram/SourceFiles/window/themes/window_theme_editor_block.h b/Telegram/SourceFiles/window/themes/window_theme_editor_block.h index a0629d580..fc90d87f0 100644 --- a/Telegram/SourceFiles/window/themes/window_theme_editor_block.h +++ b/Telegram/SourceFiles/window/themes/window_theme_editor_block.h @@ -7,7 +7,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL */ #pragma once -#include "base/observer.h" #include "ui/rp_widget.h" class EditColorBox; @@ -15,7 +14,7 @@ class EditColorBox; namespace Window { namespace Theme { -class EditorBlock : public TWidget, private base::Subscriber { +class EditorBlock final : public Ui::RpWidget { public: enum class Type { Existing, @@ -26,8 +25,8 @@ public: QString name; QString possibleCopyOf; - base::Observable updated; - base::Observable resized; + rpl::event_stream<> updated; + rpl::event_stream<> resized; struct AppendData { QString name; @@ -35,27 +34,27 @@ public: QColor value; QString description; }; - base::Observable appended; + rpl::event_stream appended; struct ChangeData { QStringList names; QColor value; }; - base::Observable changed; + rpl::event_stream changed; struct EditionData { QString name; QString copyOf; QColor value; }; - base::Observable pending; + rpl::event_stream pending; struct ScrollData { - Type type; - int position; - int height; + Type type = {}; + int position = 0; + int height = 0; }; - base::Observable scroll; + rpl::event_stream scroll; }; EditorBlock(QWidget *parent, Type type, Context *context); diff --git a/Telegram/SourceFiles/window/window_lock_widgets.cpp b/Telegram/SourceFiles/window/window_lock_widgets.cpp index 58cb91ccc..5cff225b7 100644 --- a/Telegram/SourceFiles/window/window_lock_widgets.cpp +++ b/Telegram/SourceFiles/window/window_lock_widgets.cpp @@ -41,7 +41,7 @@ not_null LockWidget::window() const { void LockWidget::setInnerFocus() { if (const auto controller = _window->sessionController()) { - controller->dialogsListFocused().set(false, true); + controller->setDialogsListFocused(false); } setFocus(); } diff --git a/Telegram/SourceFiles/window/window_session_controller.cpp b/Telegram/SourceFiles/window/window_session_controller.cpp index 7c0079c2b..ee27fd125 100644 --- a/Telegram/SourceFiles/window/window_session_controller.cpp +++ b/Telegram/SourceFiles/window/window_session_controller.cpp @@ -1234,9 +1234,9 @@ int SessionController::minimalThreeColumnWidth() const { } bool SessionController::forceWideDialogs() const { - if (dialogsListDisplayForced().value()) { + if (_dialogsListDisplayForced.current()) { return true; - } else if (dialogsListFocused().value()) { + } else if (_dialogsListFocused.current()) { return true; } return !content()->isMainSectionShown(); diff --git a/Telegram/SourceFiles/window/window_session_controller.h b/Telegram/SourceFiles/window/window_session_controller.h index b860e987e..5c6bc6dda 100644 --- a/Telegram/SourceFiles/window/window_session_controller.h +++ b/Telegram/SourceFiles/window/window_session_controller.h @@ -9,7 +9,6 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL #include "base/flags.h" #include "base/object_ptr.h" -#include "base/observer.h" #include "base/weak_ptr.h" #include "base/timer.h" #include "boxes/gift_premium_box.h" // GiftPremiumValidator. @@ -480,17 +479,24 @@ public: void toggleChooseChatTheme(not_null peer); - base::Variable &dialogsListFocused() { - return _dialogsListFocused; + [[nodiscard]] bool dialogsListFocused() const { + return _dialogsListFocused.current(); } - const base::Variable &dialogsListFocused() const { - return _dialogsListFocused; + [[nodiscard]] rpl::producer dialogsListFocusedChanges() const { + return _dialogsListFocused.changes(); } - base::Variable &dialogsListDisplayForced() { - return _dialogsListDisplayForced; + void setDialogsListFocused(bool value) { + _dialogsListFocused = value; } - const base::Variable &dialogsListDisplayForced() const { - return _dialogsListDisplayForced; + [[nodiscard]] bool dialogsListDisplayForced() const { + return _dialogsListDisplayForced.current(); + } + [[nodiscard]] auto dialogsListDisplayForcedChanges() const + -> rpl::producer { + return _dialogsListDisplayForced.changes(); + } + void setDialogsListDisplayForced(bool value) { + _dialogsListDisplayForced = value; } not_null parentController() override { @@ -611,8 +617,8 @@ private: rpl::variable _activeChatEntry; rpl::lifetime _activeHistoryLifetime; - base::Variable _dialogsListFocused = { false }; - base::Variable _dialogsListDisplayForced = { false }; + rpl::variable _dialogsListFocused = false; + rpl::variable _dialogsListDisplayForced = false; std::deque _chatEntryHistory; int _chatEntryHistoryPosition = -1; bool _filtersActivated = false; diff --git a/Telegram/lib_base b/Telegram/lib_base index ff0d99dea..456088497 160000 --- a/Telegram/lib_base +++ b/Telegram/lib_base @@ -1 +1 @@ -Subproject commit ff0d99dea36c80650acc2cd9c0dd3b24db6b8c1d +Subproject commit 4560884973dd855d9d06f0a9c09f5156e5a06dde