diff --git a/Telegram/SourceFiles/core/application.cpp b/Telegram/SourceFiles/core/application.cpp index bde661b70b..734850ab2a 100644 --- a/Telegram/SourceFiles/core/application.cpp +++ b/Telegram/SourceFiles/core/application.cpp @@ -123,7 +123,14 @@ Application::Application(not_null launcher) Application::~Application() { _window.reset(); - _mediaView.reset(); + if (_mediaView) { + _mediaView->clearData(); + _mediaView = nullptr; + } + + if (activeAccount().sessionExists()) { + activeAccount().session().saveSettingsNowIfNeeded(); + } // This can call writeMap() that serializes Main::Session. // In case it gets called after destroySession() we get missing data. diff --git a/Telegram/SourceFiles/main/main_session.cpp b/Telegram/SourceFiles/main/main_session.cpp index b88690b84e..39fb807544 100644 --- a/Telegram/SourceFiles/main/main_session.cpp +++ b/Telegram/SourceFiles/main/main_session.cpp @@ -203,6 +203,13 @@ Support::Templates& Session::supportTemplates() const { return supportHelper().templates(); } +void Session::saveSettingsNowIfNeeded() { + if (_saveSettingsTimer.isActive()) { + _saveSettingsTimer.cancel(); + Local::writeUserSettings(); + } +} + } // namespace Main Main::Session &Auth() { diff --git a/Telegram/SourceFiles/main/main_session.h b/Telegram/SourceFiles/main/main_session.h index a215ee8154..10ef88afb0 100644 --- a/Telegram/SourceFiles/main/main_session.h +++ b/Telegram/SourceFiles/main/main_session.h @@ -106,6 +106,7 @@ public: return _settings; } void saveSettingsDelayed(crl::time delay = kDefaultSaveDelay); + void saveSettingsNowIfNeeded(); [[nodiscard]] not_null mtp(); [[nodiscard]] ApiWrap &api() { diff --git a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp index 5f12d0f794..d9cf894d1c 100644 --- a/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp +++ b/Telegram/SourceFiles/media/view/media_view_overlay_widget.cpp @@ -439,9 +439,12 @@ bool OverlayWidget::documentBubbleShown() const { void OverlayWidget::clearStreaming(bool savePosition) { if (_streamed && _doc && savePosition) { + using State = Media::Player::State; const auto state = _streamed->instance.player().prepareLegacyState(); const auto time = (state.position == kTimeUnknown - || state.length == kTimeUnknown) + || state.length == kTimeUnknown + || state.state == State::PausedAtEnd + || Media::Player::IsStopped(state.state)) ? TimeId(0) : (state.length >= kMinLengthForSavePosition * state.frequency) ? (state.position / state.frequency) * crl::time(1000)