diff options
author | ByteHamster <info@bytehamster.com> | 2023-02-20 23:19:34 +0100 |
---|---|---|
committer | ByteHamster <info@bytehamster.com> | 2023-02-20 23:19:34 +0100 |
commit | 2b22d4b6977f9a22abfd4bc2d269c79834551ee2 (patch) | |
tree | 58582dd73eafe2c536aa2c842b5609ded3735040 /core/src/main/java/de/danoeh/antennapod | |
parent | e58e2d063948fe52e5fed1536548b6c4220be8fb (diff) | |
parent | 2833812238c19d16d464c337adeecc575ff484ba (diff) | |
download | AntennaPod-2b22d4b6977f9a22abfd4bc2d269c79834551ee2.zip |
Merge branch 'master' into develop
Diffstat (limited to 'core/src/main/java/de/danoeh/antennapod')
2 files changed, 32 insertions, 31 deletions
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 14e11af23..176a78f0f 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 @@ -220,6 +220,24 @@ public class PlaybackService extends MediaBrowserServiceCompat { PreferenceManager.getDefaultSharedPreferences(this) .registerOnSharedPreferenceChangeListener(prefListener); + recreateMediaSessionIfNeeded(); + castStateListener = new CastStateListener(this) { + @Override + public void onSessionStartedOrEnded() { + recreateMediaPlayer(); + } + }; + EventBus.getDefault().post(new PlaybackServiceEvent(PlaybackServiceEvent.Action.SERVICE_STARTED)); + } + + void recreateMediaSessionIfNeeded() { + if (mediaSession != null) { + // Media session was not destroyed, so we can re-use it. + if (!mediaSession.isActive()) { + mediaSession.setActive(true); + } + return; + } ComponentName eventReceiver = new ComponentName(getApplicationContext(), MediaButtonReceiver.class); Intent mediaButtonIntent = new Intent(Intent.ACTION_MEDIA_BUTTON); mediaButtonIntent.setComponent(eventReceiver); @@ -243,13 +261,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { recreateMediaPlayer(); mediaSession.setActive(true); - castStateListener = new CastStateListener(this) { - @Override - public void onSessionStartedOrEnded() { - recreateMediaPlayer(); - } - }; - EventBus.getDefault().post(new PlaybackServiceEvent(PlaybackServiceEvent.Action.SERVICE_STARTED)); } void recreateMediaPlayer() { @@ -290,6 +301,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { PreferenceManager.getDefaultSharedPreferences(this).unregisterOnSharedPreferenceChangeListener(prefListener); if (mediaSession != null) { mediaSession.release(); + mediaSession = null; } unregisterReceiver(autoStateUpdated); unregisterReceiver(headsetDisconnected); @@ -702,6 +714,8 @@ public class PlaybackService extends MediaBrowserServiceCompat { mediaPlayer.playMediaObject(playable, stream, true, true); stateManager.validStartCommandWasReceived(); + stateManager.startForeground(R.id.notification_playing, notificationBuilder.build()); + recreateMediaSessionIfNeeded(); updateNotificationAndMediaSession(playable); addPlayableToQueue(playable); } @@ -760,13 +774,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { taskManager.startChapterLoader(newInfo.playable); break; case PAUSED: - if (UserPreferences.isPersistNotify() || isCasting) { - // do not remove notification on pause based on user pref - // Change [Play] button to [Pause] - updateNotificationAndMediaSession(newInfo.playable); - } else if (!UserPreferences.isPersistNotify() && !isCasting) { - // remove notification on pause - stateManager.stopForeground(true); + updateNotificationAndMediaSession(newInfo.playable); + if (!isCasting) { + stateManager.stopForeground(!UserPreferences.isPersistNotify()); } cancelPositionObserver(); PlaybackPreferences.writePlayerStatus(mediaPlayer.getPlayerStatus()); @@ -778,9 +788,11 @@ public class PlaybackService extends MediaBrowserServiceCompat { case PLAYING: PlaybackPreferences.writePlayerStatus(mediaPlayer.getPlayerStatus()); saveCurrentPosition(true, null, Playable.INVALID_TIME); + recreateMediaSessionIfNeeded(); updateNotificationAndMediaSession(newInfo.playable); setupPositionObserver(); stateManager.validStartCommandWasReceived(); + stateManager.startForeground(R.id.notification_playing, notificationBuilder.build()); // set sleep timer if auto-enabled if (newInfo.oldPlayerStatus != null && newInfo.oldPlayerStatus != PlayerStatus.SEEKING && SleepTimerPreferences.autoEnable() && !sleepTimerActive()) { @@ -811,7 +823,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { @Override public void shouldStop() { - updateNotificationAndMediaSession(getPlayable()); // Stops foreground if not playing + stateManager.stopForeground(!UserPreferences.isPersistNotify()); } @Override @@ -1271,7 +1283,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); - startForegroundIfPlaying(playerStatus); if (!notificationBuilder.isIconCached()) { playableIconLoaderThread = new Thread(() -> { @@ -1286,21 +1297,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { } } - private void startForegroundIfPlaying(@NonNull PlayerStatus status) { - Log.d(TAG, "startForegroundIfPlaying: " + status); - if (stateManager.hasReceivedValidStartCommand()) { - if (isCasting || status == PlayerStatus.PLAYING || status == PlayerStatus.PREPARING - || status == PlayerStatus.SEEKING) { - stateManager.startForeground(R.id.notification_playing, notificationBuilder.build()); - Log.d(TAG, "foreground"); - } else { - stateManager.stopForeground(false); - NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); - notificationManager.notify(R.id.notification_playing, notificationBuilder.build()); - } - } - } - /** * Persists the current position and last played time of the media file. * diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceStateManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceStateManager.java index addc6b996..9926e01da 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceStateManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceStateManager.java @@ -1,10 +1,12 @@ package de.danoeh.antennapod.core.service.playback; import android.app.Notification; +import android.util.Log; import androidx.core.app.ServiceCompat; class PlaybackServiceStateManager { + private static final String TAG = "PlaybackSrvState"; private final PlaybackService playbackService; private volatile boolean isInForeground = false; @@ -15,17 +17,20 @@ class PlaybackServiceStateManager { } void startForeground(int notificationId, Notification notification) { + Log.d(TAG, "startForeground"); playbackService.startForeground(notificationId, notification); isInForeground = true; } void stopService() { + Log.d(TAG, "stopService"); stopForeground(true); playbackService.stopSelf(); hasReceivedValidStartCommand = false; } void stopForeground(boolean removeNotification) { + Log.d(TAG, "stopForeground"); if (isInForeground) { if (removeNotification) { ServiceCompat.stopForeground(playbackService, ServiceCompat.STOP_FOREGROUND_REMOVE); |