From cfd9e1f8862cd2175fc0a2a184196582664691ae Mon Sep 17 00:00:00 2001 From: Mino Date: Mon, 4 Aug 2025 07:39:00 +0100 Subject: [PATCH] Fix playback position not saved after being changed, when episode is paused (#7911) --- .../ui/episodeslist/EpisodeItemViewHolder.java | 4 ++-- .../ui/episodeslist/EpisodesListFragment.java | 2 +- .../danoeh/antennapod/ui/screen/SearchFragment.java | 2 +- .../screen/download/CompletedDownloadsFragment.java | 2 +- .../ui/screen/feed/FeedItemlistFragment.java | 2 +- .../ui/screen/home/sections/DownloadsSection.java | 2 +- .../antennapod/ui/screen/queue/QueueFragment.java | 2 +- .../playback/service/PlaybackController.java | 12 +++++++++--- 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeItemViewHolder.java b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeItemViewHolder.java index 8f97bd5d7..5bedcc843 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeItemViewHolder.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodeItemViewHolder.java @@ -256,8 +256,8 @@ public class EpisodeItemViewHolder extends RecyclerView.ViewHolder { return item; } - public boolean isCurrentlyPlayingItem() { - return item.getMedia() != null && PlaybackStatus.isCurrentlyPlaying(item.getMedia()); + public boolean isPlayingItem() { + return item.getMedia() != null && PlaybackStatus.isPlaying(item.getMedia()); } public void notifyPlaybackPositionUpdated(PlaybackPositionEvent event) { diff --git a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodesListFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodesListFragment.java index 931273f72..28b124579 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodesListFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/episodeslist/EpisodesListFragment.java @@ -347,7 +347,7 @@ public abstract class EpisodesListFragment extends Fragment public void onEventMainThread(PlaybackPositionEvent event) { for (int i = 0; i < listAdapter.getItemCount(); i++) { EpisodeItemViewHolder holder = (EpisodeItemViewHolder) recyclerView.findViewHolderForAdapterPosition(i); - if (holder != null && holder.isCurrentlyPlayingItem()) { + if (holder != null && holder.isPlayingItem()) { holder.notifyPlaybackPositionUpdated(event); break; } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java index a7c6c556b..d0cbb6fb1 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/SearchFragment.java @@ -358,7 +358,7 @@ public class SearchFragment extends Fragment implements EpisodeItemListAdapter.O if (adapter != null) { for (int i = 0; i < adapter.getItemCount(); i++) { EpisodeItemViewHolder holder = (EpisodeItemViewHolder) recyclerView.findViewHolderForAdapterPosition(i); - if (holder != null && holder.isCurrentlyPlayingItem()) { + if (holder != null && holder.isPlayingItem()) { holder.notifyPlaybackPositionUpdated(event); break; } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/download/CompletedDownloadsFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/download/CompletedDownloadsFragment.java index f0c3db176..c0827fb21 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/download/CompletedDownloadsFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/download/CompletedDownloadsFragment.java @@ -277,7 +277,7 @@ public class CompletedDownloadsFragment extends Fragment if (adapter != null) { for (int i = 0; i < adapter.getItemCount(); i++) { EpisodeItemViewHolder holder = (EpisodeItemViewHolder) recyclerView.findViewHolderForAdapterPosition(i); - if (holder != null && holder.isCurrentlyPlayingItem()) { + if (holder != null && holder.isPlayingItem()) { holder.notifyPlaybackPositionUpdated(event); break; } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java index eecc44895..13f785bc9 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/feed/FeedItemlistFragment.java @@ -424,7 +424,7 @@ public class FeedItemlistFragment extends Fragment implements AdapterView.OnItem for (int i = 0; i < adapter.getItemCount(); i++) { EpisodeItemViewHolder holder = (EpisodeItemViewHolder) viewBinding.recyclerView.findViewHolderForAdapterPosition(i); - if (holder != null && holder.isCurrentlyPlayingItem()) { + if (holder != null && holder.isPlayingItem()) { holder.notifyPlaybackPositionUpdated(event); break; } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/sections/DownloadsSection.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/sections/DownloadsSection.java index 9087f0c52..6ff6ef7a6 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/home/sections/DownloadsSection.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/home/sections/DownloadsSection.java @@ -96,7 +96,7 @@ public class DownloadsSection extends HomeSection { for (int i = 0; i < adapter.getItemCount(); i++) { EpisodeItemViewHolder holder = (EpisodeItemViewHolder) viewBinding.recyclerView.findViewHolderForAdapterPosition(i); - if (holder != null && holder.isCurrentlyPlayingItem()) { + if (holder != null && holder.isPlayingItem()) { holder.notifyPlaybackPositionUpdated(event); break; } diff --git a/app/src/main/java/de/danoeh/antennapod/ui/screen/queue/QueueFragment.java b/app/src/main/java/de/danoeh/antennapod/ui/screen/queue/QueueFragment.java index 2fba47f49..75a20345e 100644 --- a/app/src/main/java/de/danoeh/antennapod/ui/screen/queue/QueueFragment.java +++ b/app/src/main/java/de/danoeh/antennapod/ui/screen/queue/QueueFragment.java @@ -217,7 +217,7 @@ public class QueueFragment extends Fragment implements MaterialToolbar.OnMenuIte for (int i = 0; i < recyclerAdapter.getItemCount(); i++) { EpisodeItemViewHolder holder = (EpisodeItemViewHolder) recyclerView.findViewHolderForAdapterPosition(i); - if (holder != null && holder.isCurrentlyPlayingItem()) { + if (holder != null && holder.isPlayingItem()) { holder.notifyPlaybackPositionUpdated(event); break; } diff --git a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackController.java b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackController.java index f7ae97dbb..127ef10c0 100644 --- a/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackController.java +++ b/playback/service/src/main/java/de/danoeh/antennapod/playback/service/PlaybackController.java @@ -13,6 +13,7 @@ import android.util.Pair; import android.view.SurfaceHolder; import androidx.annotation.NonNull; import androidx.core.content.ContextCompat; +import de.danoeh.antennapod.playback.service.internal.PlayableUtils; import de.danoeh.antennapod.storage.database.DBReader; import de.danoeh.antennapod.storage.database.DBWriter; import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; @@ -376,13 +377,18 @@ public abstract class PlaybackController { } public void seekTo(int time) { + Playable playable = getMedia(); if (playbackService != null) { + if (playable != null) { + long timestamp = playable.getLastPlayedTimeStatistics(); + PlayableUtils.saveCurrentPosition(playable, time, timestamp); + } playbackService.seekTo(time); - } else if (getMedia() instanceof FeedMedia) { - FeedMedia media = (FeedMedia) getMedia(); + } else if (playable instanceof FeedMedia) { + FeedMedia media = (FeedMedia) playable; media.setPosition(time); DBWriter.setFeedItem(media.getItem()); - EventBus.getDefault().post(new PlaybackPositionEvent(time, getMedia().getDuration())); + EventBus.getDefault().post(new PlaybackPositionEvent(time, playable.getDuration())); } }