From 08e04cdcb1d77f5a5ccc00d0b409dbc760c00327 Mon Sep 17 00:00:00 2001
From: John Preston <johnprestonmail@gmail.com>
Date: Wed, 25 Dec 2019 12:01:49 +0300
Subject: [PATCH] Fix autoplay settings apply in albums.

---
 Telegram/SourceFiles/data/data_session.cpp    | 28 ++++++++++++++-----
 Telegram/SourceFiles/data/data_session.h      |  2 +-
 .../history/view/media/history_view_game.h    |  4 +--
 .../history/view/media/history_view_gif.cpp   | 10 +++++--
 .../history/view/media/history_view_gif.h     |  2 +-
 .../history/view/media/history_view_media.h   |  3 +-
 .../view/media/history_view_media_grouped.cpp | 20 +++++++++++++
 .../view/media/history_view_media_grouped.h   |  4 +++
 .../view/media/history_view_web_page.h        |  4 +--
 9 files changed, 60 insertions(+), 17 deletions(-)

diff --git a/Telegram/SourceFiles/data/data_session.cpp b/Telegram/SourceFiles/data/data_session.cpp
index ec79b54ad..745dcb626 100644
--- a/Telegram/SourceFiles/data/data_session.cpp
+++ b/Telegram/SourceFiles/data/data_session.cpp
@@ -3225,17 +3225,25 @@ void Session::unregisterContactItem(
 }
 
 void Session::registerPlayingVideoFile(not_null<ViewElement*> view) {
-	_playingVideoFiles.emplace(view);
-	registerHeavyViewPart(view);
+	if (++_playingVideoFiles[view] == 1) {
+		registerHeavyViewPart(view);
+	}
 }
 
 void Session::unregisterPlayingVideoFile(not_null<ViewElement*> view) {
-	_playingVideoFiles.remove(view);
-	unregisterHeavyViewPart(view);
+	const auto i = _playingVideoFiles.find(view);
+	if (i != _playingVideoFiles.end()) {
+		if (!--i->second) {
+			_playingVideoFiles.erase(i);
+			unregisterHeavyViewPart(view);
+		}
+	} else {
+		unregisterHeavyViewPart(view);
+	}
 }
 
 void Session::stopPlayingVideoFiles() {
-	for (const auto view : base::take(_playingVideoFiles)) {
+	for (const auto &[view, count] : base::take(_playingVideoFiles)) {
 		if (const auto media = view->media()) {
 			media->stopAnimation();
 		}
@@ -3243,10 +3251,16 @@ void Session::stopPlayingVideoFiles() {
 }
 
 void Session::checkPlayingVideoFiles() {
-	for (const auto view : base::take(_playingVideoFiles)) {
+	const auto old = base::take(_playingVideoFiles);
+	for (const auto &[view, count] : old) {
 		if (const auto media = view->media()) {
-			media->checkAnimation();
+			if (const auto left = media->checkAnimationCount()) {
+				_playingVideoFiles.emplace(view, left);
+				registerHeavyViewPart(view);
+				continue;
+			}
 		}
+		unregisterHeavyViewPart(view);
 	}
 }
 
diff --git a/Telegram/SourceFiles/data/data_session.h b/Telegram/SourceFiles/data/data_session.h
index a2392f21d..d9a5d13a7 100644
--- a/Telegram/SourceFiles/data/data_session.h
+++ b/Telegram/SourceFiles/data/data_session.h
@@ -951,7 +951,7 @@ private:
 	std::unordered_map<
 		UserId,
 		base::flat_set<not_null<ViewElement*>>> _contactViews;
-	base::flat_set<not_null<ViewElement*>> _playingVideoFiles;
+	base::flat_map<not_null<ViewElement*>, int> _playingVideoFiles;
 
 	base::flat_set<not_null<WebPageData*>> _webpagesUpdated;
 	base::flat_set<not_null<GameData*>> _gamesUpdated;
diff --git a/Telegram/SourceFiles/history/view/media/history_view_game.h b/Telegram/SourceFiles/history/view/media/history_view_game.h
index 8f523a609..b6e30d17a 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_game.h
+++ b/Telegram/SourceFiles/history/view/media/history_view_game.h
@@ -56,8 +56,8 @@ public:
 	void stopAnimation() override {
 		if (_attach) _attach->stopAnimation();
 	}
-	void checkAnimation() override {
-		if (_attach) _attach->checkAnimation();
+	int checkAnimationCount() override {
+		return _attach ? _attach->checkAnimationCount() : 0;
 	}
 
 	not_null<GameData*> game() {
diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp
index f1ec081d2..6469c30b3 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_gif.cpp
+++ b/Telegram/SourceFiles/history/view/media/history_view_gif.cpp
@@ -1365,10 +1365,14 @@ void Gif::stopAnimation() {
 	}
 }
 
-void Gif::checkAnimation() {
-	if (_streamed && !autoplayEnabled()) {
-		stopAnimation();
+int Gif::checkAnimationCount() {
+	if (!_streamed) {
+		return 0;
+	} else if (autoplayEnabled()) {
+		return 1;
 	}
+	stopAnimation();
+	return 0;
 }
 
 float64 Gif::dataProgress() const {
diff --git a/Telegram/SourceFiles/history/view/media/history_view_gif.h b/Telegram/SourceFiles/history/view/media/history_view_gif.h
index 4ace8dfe8..0a8eb7615 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_gif.h
+++ b/Telegram/SourceFiles/history/view/media/history_view_gif.h
@@ -82,7 +82,7 @@ public:
 		StateRequest request) const override;
 
 	void stopAnimation() override;
-	void checkAnimation() override;
+	int checkAnimationCount() override;
 
 	TextWithEntities getCaption() const override {
 		return _caption.toTextWithEntities();
diff --git a/Telegram/SourceFiles/history/view/media/history_view_media.h b/Telegram/SourceFiles/history/view/media/history_view_media.h
index 99507e18d..e6782c48b 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_media.h
+++ b/Telegram/SourceFiles/history/view/media/history_view_media.h
@@ -133,7 +133,8 @@ public:
 	}
 	virtual void clearStickerLoopPlayed() {
 	}
-	virtual void checkAnimation() {
+	virtual int checkAnimationCount() {
+		return 0;
 	}
 
 	[[nodiscard]] virtual QSize sizeForGrouping() const {
diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp
index 18af76bdf..0b742bbe2 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp
+++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.cpp
@@ -408,6 +408,26 @@ void GroupedMedia::updateNeedBubbleState() {
 	_needBubble = computeNeedBubble();
 }
 
+void GroupedMedia::stopAnimation() {
+	for (auto &part : _parts) {
+		part.content->stopAnimation();
+	}
+}
+
+int GroupedMedia::checkAnimationCount() {
+	auto result = 0;
+	for (auto &part : _parts) {
+		result += part.content->checkAnimationCount();
+	}
+	return result;
+}
+
+void GroupedMedia::unloadHeavyPart() {
+	for (auto &part : _parts) {
+		part.content->unloadHeavyPart();
+	}
+}
+
 void GroupedMedia::parentTextUpdated() {
 	history()->owner().requestViewResize(_parent);
 }
diff --git a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h
index 0c5323019..c042f9ac4 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h
+++ b/Telegram/SourceFiles/history/view/media/history_view_media_grouped.h
@@ -86,6 +86,10 @@ public:
 		return true;
 	}
 
+	void stopAnimation() override;
+	int checkAnimationCount() override;
+	void unloadHeavyPart() override;
+
 	void parentTextUpdated() override;
 
 private:
diff --git a/Telegram/SourceFiles/history/view/media/history_view_web_page.h b/Telegram/SourceFiles/history/view/media/history_view_web_page.h
index f22e69f31..72d5cf906 100644
--- a/Telegram/SourceFiles/history/view/media/history_view_web_page.h
+++ b/Telegram/SourceFiles/history/view/media/history_view_web_page.h
@@ -62,8 +62,8 @@ public:
 	void stopAnimation() override {
 		if (_attach) _attach->stopAnimation();
 	}
-	void checkAnimation() override {
-		if (_attach) _attach->checkAnimation();
+	int checkAnimationCount() override {
+		return _attach ? _attach->checkAnimationCount() : 0;
 	}
 
 	not_null<WebPageData*> webpage() {