Stop playing documents when items are deleted.

This commit is contained in:
John Preston 2020-10-23 15:22:38 +03:00
parent 47bb8ec687
commit 3d54a263b8
8 changed files with 49 additions and 4 deletions

View file

@ -31,6 +31,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "storage/storage_account.h"
#include "storage/storage_encrypted_file.h"
#include "media/player/media_player_instance.h" // instance()->play()
#include "media/audio/media_audio.h"
#include "boxes/abstract_box.h"
#include "passport/passport_form_controller.h"
#include "window/themes/window_theme.h"
@ -3333,6 +3334,15 @@ void Session::unregisterContactItem(
}
}
void Session::documentMessageRemoved(not_null<DocumentData*> document) {
if (_documentItems.find(document) != _documentItems.end()) {
return;
}
if (document->loading()) {
document->cancel();
}
}
void Session::checkPlayingAnimations() {
auto check = base::flat_set<not_null<ViewElement*>>();
for (const auto view : _heavyViewParts) {

View file

@ -547,6 +547,8 @@ public:
UserId contactId,
not_null<HistoryItem*> item);
void documentMessageRemoved(not_null<DocumentData*> document);
void checkPlayingAnimations();
HistoryItem *findWebPageItem(not_null<WebPageData*> page) const;

View file

@ -26,6 +26,7 @@ https://github.com/telegramdesktop/tdesktop/blob/master/LEGAL
#include "data/data_channel.h"
#include "data/data_chat.h"
#include "data/data_user.h"
#include "data/data_document.h"
#include "data/data_histories.h"
#include "lang/lang_keys.h"
#include "apiwrap.h"
@ -423,6 +424,11 @@ void History::destroyMessage(not_null<HistoryItem*> item) {
session().api().cancelLocalItem(item);
}
const auto document = [&] {
const auto media = item->media();
return media ? media->document() : nullptr;
}();
owner().unregisterMessage(item);
Core::App().notifications().clearFromItem(item);
@ -432,6 +438,10 @@ void History::destroyMessage(not_null<HistoryItem*> item) {
Assert(i != end(_messages));
_messages.erase(i);
if (document) {
session().data().documentMessageRemoved(document);
}
}
not_null<HistoryItem*> History::addNewItem(

View file

@ -349,6 +349,11 @@ MainWidget::MainWidget(
if (!songState.id || IsStoppedOrStopping(songState.state)) {
closeBothPlayers();
}
} else if (type == AudioMsgId::Type::Song) {
const auto songState = Media::Player::instance()->getState(AudioMsgId::Type::Song);
if (!songState.id) {
closeBothPlayers();
}
}
});

View file

@ -203,10 +203,14 @@ void Instance::setSession(not_null<Data*> data, Main::Session *session) {
) | rpl::start_with_next([=] {
setSession(data, nullptr);
}, data->sessionLifetime);
session->data().itemRemoved(
) | rpl::filter([=](not_null<const HistoryItem*> item) {
return (data->current.contextId() == item->fullId());
}) | rpl::start_with_next([=] {
stopAndClear(data);
}, data->sessionLifetime);
} else {
stop(data->type);
_tracksFinishedNotifier.notify(data->type);
*data = Data(data->type, data->overview);
stopAndClear(data);
}
}
@ -527,6 +531,12 @@ void Instance::stop(AudioMsgId::Type type) {
}
}
void Instance::stopAndClear(not_null<Data*> data) {
stop(data->type);
_tracksFinishedNotifier.notify(data->type);
*data = Data(data->type, data->overview);
}
void Instance::playPause(AudioMsgId::Type type) {
if (const auto data = getData(type)) {
if (!data->streamed) {

View file

@ -217,6 +217,7 @@ private:
void playlistUpdated(not_null<Data*> data);
bool moveInPlaylist(not_null<Data*> data, int delta, bool autonext);
HistoryItem *itemByIndex(not_null<Data*> data, int index);
void stopAndClear(not_null<Data*> data);
void handleStreamingUpdate(
not_null<Data*> data,

View file

@ -3674,6 +3674,13 @@ void OverlayWidget::setSession(not_null<Main::Session*> session) {
changingMsgId(change.item, change.oldId);
}, _sessionLifetime);
session->data().itemRemoved(
) | rpl::filter([=](not_null<const HistoryItem*> item) {
return (_document != nullptr) && (item->fullId() == _msgid);
}) | rpl::start_with_next([=] {
close();
}, _sessionLifetime);
session->account().sessionChanges(
) | rpl::start_with_next([=] {
clearSession();

@ -1 +1 @@
Subproject commit 58263c0715ebfbf586c71e856a2ad962301bdc05
Subproject commit 053e44a10107de4a0b7e9ad8826150c577db2a2b