From ad9542f7b6af556140dc91dbbedb3858d3e329ce Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Sat, 7 Aug 2021 08:28:10 +0200 Subject: Delay loading queue until media is loaded --- .../core/service/playback/PlaybackService.java | 54 +++++++++++++--------- .../playback/PlaybackServiceTaskManager.java | 5 +- 2 files changed, 37 insertions(+), 22 deletions(-) (limited to 'core/src/main/java/de/danoeh/antennapod') 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 2da06e226..423fd9bfe 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 @@ -77,6 +77,7 @@ import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import de.danoeh.antennapod.core.widget.WidgetUpdater; import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter; import de.danoeh.antennapod.ui.appstartintent.VideoPlayerActivityStarter; +import io.reactivex.Completable; import io.reactivex.Observable; import io.reactivex.Single; import io.reactivex.android.schedulers.AndroidSchedulers; @@ -306,20 +307,6 @@ public class PlaybackService extends MediaBrowserServiceCompat { npe.printStackTrace(); } - Single.>create(emitter -> { - List queueItems = new ArrayList<>(); - for (FeedItem feedItem : taskManager.getQueue()) { - if (feedItem.getMedia() != null) { - MediaDescriptionCompat mediaDescription = feedItem.getMedia().getMediaItem().getDescription(); - queueItems.add(new MediaSessionCompat.QueueItem(mediaDescription, feedItem.getId())); - } - } - emitter.onSuccess(queueItems); - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(queueItems -> mediaSession.setQueue(queueItems), Throwable::printStackTrace); - flavorHelper.initializeMediaPlayer(PlaybackService.this); mediaSession.setActive(true); @@ -367,6 +354,22 @@ public class PlaybackService extends MediaBrowserServiceCompat { null); // Bundle of optional extras } + private void loadQueueForMediaSession() { + Single.>create(emitter -> { + List queueItems = new ArrayList<>(); + for (FeedItem feedItem : taskManager.getQueue()) { + if (feedItem.getMedia() != null) { + MediaDescriptionCompat mediaDescription = feedItem.getMedia().getMediaItem().getDescription(); + queueItems.add(new MediaSessionCompat.QueueItem(mediaDescription, feedItem.getId())); + } + } + emitter.onSuccess(queueItems); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(queueItems -> mediaSession.setQueue(queueItems), Throwable::printStackTrace); + } + private MediaBrowserCompat.MediaItem createBrowsableMediaItemForRoot() { Uri uri = new Uri.Builder() .scheme(ContentResolver.SCHEME_ANDROID_RESOURCE) @@ -414,6 +417,18 @@ public class PlaybackService extends MediaBrowserServiceCompat { public void onLoadChildren(@NonNull String parentId, @NonNull Result> result) { Log.d(TAG, "OnLoadChildren: parentMediaId=" + parentId); + result.detach(); + + Completable.create(emitter -> { + result.sendResult(loadChildrenSynchronous(parentId)); + emitter.onComplete(); + }) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(() -> { }, Throwable::printStackTrace); + } + + private List loadChildrenSynchronous(@NonNull String parentId) { List mediaItems = new ArrayList<>(); if (parentId.equals(getResources().getString(R.string.app_name))) { // Root List @@ -449,7 +464,7 @@ public class PlaybackService extends MediaBrowserServiceCompat { } } } - result.sendResult(mediaItems); + return mediaItems; } @Override @@ -815,11 +830,9 @@ public class PlaybackService extends MediaBrowserServiceCompat { mediaPlayer.getPSMPInfo().playerStatus, mediaPlayer.isStreaming()); setupNotification(newInfo); break; - case PREPARED: taskManager.startChapterLoader(newInfo.playable); break; - case PAUSED: if ((UserPreferences.isPersistNotify() || isCasting) && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { @@ -833,12 +846,10 @@ public class PlaybackService extends MediaBrowserServiceCompat { cancelPositionObserver(); PlaybackPreferences.writePlayerStatus(mediaPlayer.getPlayerStatus()); break; - case STOPPED: //writePlaybackPreferencesNoMediaPlaying(); //stopService(); break; - case PLAYING: PlaybackPreferences.writePlayerStatus(mediaPlayer.getPlayerStatus()); setupNotification(newInfo); @@ -851,13 +862,14 @@ public class PlaybackService extends MediaBrowserServiceCompat { EventBus.getDefault().post(new MessageEvent(getString(R.string.sleep_timer_enabled_label), PlaybackService.this::disableSleepTimer)); } + loadQueueForMediaSession(); break; - case ERROR: PlaybackPreferences.writeNoMediaPlaying(); stateManager.stopService(); break; - + default: + break; } IntentUtils.sendLocalBroadcast(getApplicationContext(), ACTION_PLAYER_STATUS_CHANGED); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java index 8cfbfac2a..a14605e5b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java @@ -155,7 +155,10 @@ public class PlaybackServiceTaskManager { /** * Returns the queue or waits until the PSTM has loaded the queue from the database. */ - public synchronized List getQueue() throws InterruptedException { + public List getQueue() throws InterruptedException { + if (queueFuture == null) { + loadQueue(); + } try { return queueFuture.get(); } catch (ExecutionException e) { -- cgit v1.2.3