Merge pull request #5330 from ByteHamster/load-next-media

When continuous playback is disabled, show next episode in notification
This commit is contained in:
ByteHamster 2021-08-07 07:40:45 +02:00 committed by GitHub
commit 99fea4e07f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 29 additions and 37 deletions

View File

@ -947,14 +947,10 @@ public class LocalPSMP extends PlaybackServiceMediaPlayer {
// is an episode in the queue left.
// Start playback immediately if continuous playback is enabled
nextMedia = callback.getNextInQueue(currentMedia);
boolean playNextEpisode = isPlaying &&
nextMedia != null &&
UserPreferences.isFollowQueue();
boolean playNextEpisode = isPlaying && nextMedia != null;
if (playNextEpisode) {
Log.d(TAG, "Playback of next episode will start immediately.");
} else if (nextMedia == null){
} else if (nextMedia == null) {
Log.d(TAG, "No more episodes available to play");
} else {
Log.d(TAG, "Loading next episode, but not playing automatically.");

View File

@ -736,7 +736,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
mediaPlayer.playMediaObject(playable, PlaybackPreferences.getCurrentEpisodeIsStream(),
true, true);
stateManager.validStartCommandWasReceived();
PlaybackService.this.updateMediaSessionMetadata(playable);
updateNotificationAndMediaSession(playable);
addPlayableToQueue(playable);
}, error -> {
Log.d(TAG, "Playable was not loaded from preferences. Stopping service.");
@ -757,7 +757,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
public void notifyVideoSurfaceAbandoned() {
mediaPlayer.pause(true, false);
mediaPlayer.resetVideoSurface();
setupNotification(getPlayable());
updateNotificationAndMediaSession(getPlayable());
stateManager.stopForeground(!UserPreferences.isPersistNotify());
}
@ -813,7 +813,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
case INITIALIZED:
PlaybackPreferences.writeMediaPlaying(mediaPlayer.getPSMPInfo().playable,
mediaPlayer.getPSMPInfo().playerStatus, mediaPlayer.isStreaming());
setupNotification(newInfo);
updateNotificationAndMediaSession(newInfo.playable);
break;
case PREPARED:
@ -825,7 +825,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
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
// Change [Play] button to [Pause]
setupNotification(newInfo);
updateNotificationAndMediaSession(newInfo.playable);
} else if (!UserPreferences.isPersistNotify() && !isCasting) {
// remove notification on pause
stateManager.stopForeground(true);
@ -841,7 +841,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
case PLAYING:
PlaybackPreferences.writePlayerStatus(mediaPlayer.getPlayerStatus());
setupNotification(newInfo);
updateNotificationAndMediaSession(newInfo.playable);
setupPositionObserver();
stateManager.validStartCommandWasReceived();
// set sleep timer if auto-enabled
@ -868,7 +868,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
@Override
public void shouldStop() {
setupNotification(getPlayable()); // Stops foreground if not playing
updateNotificationAndMediaSession(getPlayable()); // Stops foreground if not playing
}
@Override
@ -887,7 +887,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
if (reloadUI) {
sendNotificationBroadcast(NOTIFICATION_TYPE_RELOAD, 0);
}
PlaybackService.this.updateMediaSessionMetadata(getPlayable());
updateNotificationAndMediaSession(getPlayable());
}
@Override
@ -905,8 +905,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
// Playable is being streamed and does not have a duration specified in the feed
playable.setDuration(mediaPlayer.getDuration());
DBWriter.setFeedMedia((FeedMedia) playable);
updateMediaSessionMetadata(playable);
setupNotification(playable);
updateNotificationAndMediaSession(playable);
}
return true;
@ -1000,6 +999,12 @@ public class PlaybackService extends MediaBrowserServiceCompat {
return null;
}
if (!UserPreferences.isFollowQueue()) {
Log.d(TAG, "getNextInQueue(), but follow queue is not enabled.");
updateNotificationAndMediaSession(nextItem.getMedia());
return null;
}
if (!nextItem.getMedia().localFileAvailable() && !NetworkUtils.isStreamingAllowed()
&& UserPreferences.isFollowQueue() && !nextItem.getFeed().isLocalFeed()) {
displayStreamingNotAllowedNotification(
@ -1273,6 +1278,11 @@ public class PlaybackService extends MediaBrowserServiceCompat {
(Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP));
}
private void updateNotificationAndMediaSession(final Playable p) {
updateMediaSessionMetadata(p);
setupNotification(p);
}
private void updateMediaSessionMetadata(final Playable p) {
if (p == null || mediaSession == null) {
return;
@ -1314,10 +1324,6 @@ public class PlaybackService extends MediaBrowserServiceCompat {
/**
* Prepares notification and starts the service in the foreground.
*/
private void setupNotification(final PlaybackServiceMediaPlayer.PSMPInfo info) {
setupNotification(info.playable);
}
private synchronized void setupNotification(final Playable playable) {
Log.d(TAG, "setupNotification");
if (playableIconLoaderThread != null) {
@ -1898,7 +1904,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
private final SharedPreferences.OnSharedPreferenceChangeListener prefListener =
(sharedPreferences, key) -> {
if (UserPreferences.PREF_LOCKSCREEN_BACKGROUND.equals(key)) {
updateMediaSessionMetadata(getPlayable());
updateNotificationAndMediaSession(getPlayable());
} else {
flavorHelper.onSharedPreference(key);
}
@ -1961,7 +1967,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
@Override
public void setupNotification(boolean connected, PlaybackServiceMediaPlayer.PSMPInfo info) {
if (connected) {
PlaybackService.this.setupNotification(info);
PlaybackService.this.updateNotificationAndMediaSession(info.playable);
} else {
PlayerStatus status = info.playerStatus;
if ((status == PlayerStatus.PLAYING ||
@ -1969,7 +1975,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
status == PlayerStatus.PREPARING ||
UserPreferences.isPersistNotify()) &&
android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
PlaybackService.this.setupNotification(info);
PlaybackService.this.updateNotificationAndMediaSession(info.playable);
} else if (!UserPreferences.isPersistNotify()) {
stateManager.stopForeground(true);
}

View File

@ -274,13 +274,13 @@ public abstract class PlaybackController {
*/
private void handleStatus() {
Log.d(TAG, "status: " + status.toString());
checkMediaInfoLoaded();
switch (status) {
case ERROR:
EventBus.getDefault().post(new MessageEvent(activity.getString(R.string.player_error_msg)));
handleError(MediaPlayer.MEDIA_ERROR_UNKNOWN);
break;
case PAUSED:
checkMediaInfoLoaded();
onPositionObserverUpdate();
updatePlayButtonShowsPlay(true);
if (!PlaybackService.isCasting() && PlaybackService.getCurrentMediaType() == MediaType.VIDEO) {
@ -288,7 +288,6 @@ public abstract class PlaybackController {
}
break;
case PLAYING:
checkMediaInfoLoaded();
if (!PlaybackService.isCasting() && PlaybackService.getCurrentMediaType() == MediaType.VIDEO) {
onAwaitingVideoSurface();
setScreenOn(true);
@ -296,26 +295,23 @@ public abstract class PlaybackController {
updatePlayButtonShowsPlay(false);
break;
case PREPARING:
checkMediaInfoLoaded();
if (playbackService != null) {
updatePlayButtonShowsPlay(!playbackService.isStartWhenPrepared());
}
break;
case STOPPED:
updatePlayButtonShowsPlay(true);
break;
case PREPARED:
checkMediaInfoLoaded();
updatePlayButtonShowsPlay(true);
onPositionObserverUpdate();
break;
case SEEKING:
onPositionObserverUpdate();
break;
case STOPPED: // Fall-through
case INITIALIZED:
checkMediaInfoLoaded();
updatePlayButtonShowsPlay(true);
break;
default:
break;
}
}

View File

@ -32,7 +32,6 @@ import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.model.playback.RemoteMedia;
import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.model.playback.MediaType;
import de.danoeh.antennapod.core.preferences.UserPreferences;
import de.danoeh.antennapod.core.util.RewindAfterPauseUtils;
import de.danoeh.antennapod.model.playback.Playable;
@ -367,8 +366,6 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer {
@Override
public void resume() {
try {
// TODO see comment on prepare()
// setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume());
if (playerStatus == PlayerStatus.PREPARED && media.getPosition() > 0) {
int newPosition = RewindAfterPauseUtils.calculatePositionWithRewind(
media.getPosition(),
@ -405,9 +402,6 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer {
position,
media.getLastPlayedTime());
}
// TODO We're not supporting user set stream volume yet, as we need to make a UI
// that doesn't allow changing playback speed or have different values for left/right
//setVolume(UserPreferences.getLeftVolume(), UserPreferences.getRightVolume());
castMgr.loadMedia(remoteMedia, startWhenPrepared.get(), position);
} catch (TransientNetworkDisconnectionException | NoConnectionException e) {
Log.e(TAG, "Error loading media", e);
@ -629,7 +623,7 @@ public class RemotePSMP extends PlaybackServiceMediaPlayer {
if (shouldContinue) {
nextMedia = callback.getNextInQueue(currentMedia);
boolean playNextEpisode = isPlaying && nextMedia != null && UserPreferences.isFollowQueue();
boolean playNextEpisode = isPlaying && nextMedia != null;
if (playNextEpisode) {
Log.d(TAG, "Playback of next episode will start immediately.");
} else if (nextMedia == null){