summaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/LocalPSMP.java19
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java58
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceMediaPlayer.java6
-rw-r--r--core/src/play/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceFlavorHelper.java4
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) {