diff --git a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder.java b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder.java index e0f5516e00..902bd15cf5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/giph/mp4/GiphyMp4ProjectionPlayerHolder.java @@ -159,12 +159,22 @@ public final class GiphyMp4ProjectionPlayerHolder implements Player.Listener, De @Override public void onPause(@NonNull LifecycleOwner owner) { - if (player.getExoPlayer() != null) { - player.getExoPlayer().stop(); - player.getExoPlayer().clearMediaItems(); - player.getExoPlayer().removeListener(this); - AppDependencies.getExoPlayerPool().pool(player.getExoPlayer()); + returnPlayerToPool(); + } + + @Override + public void onStop(@NonNull LifecycleOwner owner) { + returnPlayerToPool(); + } + + private void returnPlayerToPool() { + ExoPlayer exoPlayer = player.getExoPlayer(); + if (exoPlayer != null) { + exoPlayer.stop(); + exoPlayer.clearMediaItems(); + exoPlayer.removeListener(this); player.setExoPlayer(null); + AppDependencies.getExoPlayerPool().pool(exoPlayer); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt index 82db83a904..784699021b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsFragment.kt @@ -109,7 +109,7 @@ class MessageDetailsFragment : FullScreenDialogFragment(), MessageDetailsAdapter private fun initializeVideoPlayer(view: View) { val videoContainer = view.findViewById(R.id.video_container) val recyclerView = view.findViewById(R.id.message_details_list) - val holders = GiphyMp4ProjectionPlayerHolder.injectVideoViews(requireContext(), lifecycle, videoContainer, 1) + val holders = GiphyMp4ProjectionPlayerHolder.injectVideoViews(requireContext(), viewLifecycleOwner.lifecycle, videoContainer, 1) val callback = GiphyMp4ProjectionRecycler(holders) GiphyMp4PlaybackController.attach(recyclerView, callback, 1) diff --git a/app/src/main/java/org/thoughtcrime/securesms/video/exo/SimpleExoPlayerPool.kt b/app/src/main/java/org/thoughtcrime/securesms/video/exo/SimpleExoPlayerPool.kt index a282243db4..3e01f067cf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/video/exo/SimpleExoPlayerPool.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/video/exo/SimpleExoPlayerPool.kt @@ -125,6 +125,9 @@ abstract class ExoPlayerPool( fun pool(exoPlayer: T) { val poolState = pool[exoPlayer] if (poolState != null) { + exoPlayer.stop() + exoPlayer.clearMediaItems() + pool[exoPlayer] = poolState.copy(available = true, tag = null) } else { throw IllegalArgumentException("Tried to return unknown ExoPlayer to pool :: ${poolStats()}") @@ -185,6 +188,14 @@ abstract class ExoPlayerPool( @MainThread override fun onBackground() { + for ((player, state) in pool) { + if (!state.available && player.playWhenReady) { + Log.w(TAG, "Force-stopping orphaned playing player on background. Owner: ${state.tag}") + player.stop() + player.clearMediaItems() + } + } + val playersToRelease = pool.filter { (_, v) -> v.available }.keys pool -= playersToRelease