mirror of
https://github.com/telegramdesktop/tdesktop
synced 2025-04-11 04:01:18 +00:00
Stop playing documents when items are deleted.
This commit is contained in:
parent
47bb8ec687
commit
3d54a263b8
@ -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) {
|
||||
|
@ -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;
|
||||
|
@ -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(
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -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) {
|
||||
|
@ -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,
|
||||
|
@ -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
|
Loading…
Reference in New Issue
Block a user