diff options
Diffstat (limited to 'core')
4 files changed, 55 insertions, 32 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java index 4165eb84a..0336c24ab 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java @@ -140,14 +140,12 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { } // set temporarily to pause in order to update list with current position if (playerStatus == PlayerStatus.PLAYING) { - setPlayerStatus(PlayerStatus.PAUSED, media); + callback.onPlaybackPause(media, getPosition()); } if (!media.getIdentifier().equals(playable.getIdentifier())) { final Playable oldMedia = media; executor.submit(() -> callback.onPostPlayback(oldMedia, false, true)); - } else { - media.onPlaybackPause(context); } setPlayerStatus(PlayerStatus.INDETERMINATE, null); @@ -204,6 +202,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { audioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); if (focusGained == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { + Log.d(TAG, "Audiofocus successfully requested"); + Log.d(TAG, "Resuming/Starting playback"); acquireWifiLockIfNecessary(); float speed = 1.0f; try { @@ -223,10 +223,9 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { } mediaPlayer.start(); + callback.onPlaybackStart(media, INVALID_TIME); setPlayerStatus(PlayerStatus.PLAYING, media); pausedBecauseOfTransientAudiofocusLoss = false; - media.onPlaybackStart(); - } else { Log.e(TAG, "Failed to request audio focus"); } @@ -254,8 +253,8 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { if (playerStatus == PlayerStatus.PLAYING) { Log.d(TAG, "Pausing playback."); mediaPlayer.pause(); + callback.onPlaybackPause(media, getPosition()); setPlayerStatus(PlayerStatus.PAUSED, media); - media.onPlaybackPause(context.getApplicationContext()); if (abandonFocus) { audioManager.abandonAudioFocus(audioFocusChangeListener); @@ -384,8 +383,7 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { } seekLatch = new CountDownLatch(1); if (statusBeforeSeeking == PlayerStatus.PLAYING) { - media.setPosition(getPosition()); - media.onPlaybackPause(context); + callback.onPlaybackPause(media, getPosition()); } mediaPlayer.seekTo(t); try { @@ -931,13 +929,12 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer { seekLatch.countDown(); } playerLock.lock(); - media.setPosition(getPosition()); if (playerStatus == PlayerStatus.PLAYING) { - media.onPlaybackStart(); + callback.onPlaybackStart(media, getPosition()); } if (playerStatus == PlayerStatus.SEEKING) { if (statusBeforeSeeking == PlayerStatus.PLAYING) { - media.onPlaybackStart(); + callback.onPlaybackStart(media, getPosition()); } setPlayerStatus(statusBeforeSeeking, media); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index 5af34fd9f..0da0ff325 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -524,7 +524,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { private final PlaybackServiceTaskManager.PSTMCallback taskManagerCallback = new PlaybackServiceTaskManager.PSTMCallback() { @Override public void positionSaverTick() { - saveCurrentPosition(); + saveCurrentPosition(true, null, PlaybackServiceMediaPlayer.INVALID_TIME); } @Override @@ -576,9 +576,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { break; case PAUSED: - taskManager.cancelPositionSaver(); - saveCurrentPosition(); - taskManager.cancelWidgetUpdater(); if ((UserPreferences.isPersistNotify() || isCasting) && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { // do not remove notification on pause based on user pref and whether android version supports expanded notifications @@ -597,12 +594,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { break; case PLAYING: - Log.d(TAG, "Audiofocus successfully requested"); - Log.d(TAG, "Resuming/Starting playback"); - - taskManager.startPositionSaver(); - taskManager.startWidgetUpdater(); - writePlayerStatusPlaybackPreferences(); setupNotification(newInfo); started = true; break; @@ -677,11 +668,31 @@ public class PlaybackService extends MediaBrowserServiceCompat { } @Override - public void onPostPlayback(Playable media, boolean ended, boolean playingNext) { + public void onPostPlayback(@NonNull Playable media, boolean ended, boolean playingNext) { PlaybackService.this.onPostPlayback(media, ended, playingNext); } @Override + public void onPlaybackStart(@NonNull Playable playable, int position) { + taskManager.startWidgetUpdater(); + writePlayerStatusPlaybackPreferences(); + if (position != PlaybackServiceMediaPlayer.INVALID_TIME) { + playable.setPosition(position); + } + playable.onPlaybackStart(); + taskManager.startPositionSaver(); + } + + @Override + public void onPlaybackPause(@NonNull Playable playable, int position) { + taskManager.cancelPositionSaver(); + saveCurrentPosition(position == PlaybackServiceMediaPlayer.INVALID_TIME, + playable, position); + taskManager.cancelWidgetUpdater(); + playable.onPlaybackPause(getApplicationContext()); + } + + @Override public Playable getNextInQueue(Playable currentMedia) { return PlaybackService.this.getNextInQueue(currentMedia); } @@ -1200,11 +1211,22 @@ public class PlaybackService extends MediaBrowserServiceCompat { /** * Persists the current position and last played time of the media file. + * + * @param fromMediaPlayer if true, the information is gathered from the current Media Player + * and {@param playable} and {@param position} become irrelevant. + * @param playable the playable for which the current position should be saved, unless + * {@param fromMediaPlayer} is true. + * @param position the position that should be saved, unless {@param fromMediaPlayer} is true. */ - private synchronized void saveCurrentPosition() { - int position = getCurrentPosition(); - int duration = getDuration(); - final Playable playable = mediaPlayer.getPlayable(); + private synchronized void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position) { + int duration; + if (fromMediaPlayer) { + position = getCurrentPosition(); + duration = getDuration(); + playable = mediaPlayer.getPlayable(); + } else { + duration = playable.getDuration(); + } if (position != INVALID_TIME && duration != INVALID_TIME && playable != null) { Log.d(TAG, "Saving current position to " + position); playable.saveCurrentPosition( @@ -1621,7 +1643,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { PlaybackServiceMediaPlayer getMediaPlayer(); void setIsCasting(boolean isCasting); void sendNotificationBroadcast(int type, int code); - void saveCurrentPosition(); + void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position); void setupNotification(boolean connected, PlaybackServiceMediaPlayer.PSMPInfo info); MediaSessionCompat getMediaSession(); Intent registerReceiver(BroadcastReceiver receiver, IntentFilter filter); @@ -1655,8 +1677,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { } @Override - public void saveCurrentPosition() { - PlaybackService.this.saveCurrentPosition(); + public void saveCurrentPosition(boolean fromMediaPlayer, Playable playable, int position) { + PlaybackService.this.saveCurrentPosition(fromMediaPlayer, playable, position); } @Override diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java index d52d3b8bc..c7127ddb7 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java @@ -301,7 +301,11 @@ public abstract class PlaybackServiceMediaPlayer { boolean onMediaPlayerError(Object inObj, int what, int extra); - void onPostPlayback(Playable media, boolean ended, boolean playingNext); + void onPostPlayback(@NonNull Playable media, boolean ended, boolean playingNext); + + void onPlaybackStart(@NonNull Playable playable, int position); + + void onPlaybackPause(@NonNull Playable playable, int position); Playable getNextInQueue(Playable currentMedia); diff --git a/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java b/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java index 55922725f..a00e86e73 100644 --- a/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java +++ b/core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java @@ -108,7 +108,7 @@ public class PlaybackServiceFlavorHelper { // to the latest position. PlaybackServiceMediaPlayer mediaPlayer = callback.getMediaPlayer(); if (mediaPlayer != null) { - callback.saveCurrentPosition(); + callback.saveCurrentPosition(true, null, PlaybackServiceMediaPlayer.INVALID_TIME); infoBeforeCastDisconnection = mediaPlayer.getPSMPInfo(); if (reason != BaseCastManager.DISCONNECT_REASON_EXPLICIT && infoBeforeCastDisconnection.playerStatus == PlayerStatus.PLAYING) { @@ -160,7 +160,7 @@ public class PlaybackServiceFlavorHelper { // could be pause, but this way we make sure the new player will get the correct position, // since pause runs asynchronously and we could be directing the new player to play even before // the old player gives us back the position. - callback.saveCurrentPosition(); + callback.saveCurrentPosition(true, null, PlaybackServiceMediaPlayer.INVALID_TIME); } } if (info == null) { |