package com.cappielloantonio.play.service; import androidx.media3.common.MediaItem; import androidx.media3.session.MediaBrowser; import com.cappielloantonio.play.interfaces.MediaIndexCallback; import com.cappielloantonio.play.model.Chronology; import com.cappielloantonio.play.repository.ChronologyRepository; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.subsonic.models.Child; import com.cappielloantonio.play.subsonic.models.InternetRadioStation; import com.cappielloantonio.play.subsonic.models.PodcastEpisode; import com.cappielloantonio.play.util.MappingUtil; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.MoreExecutors; import java.util.List; import java.util.concurrent.ExecutionException; public class MediaManager { private static final String TAG = "MediaManager"; public static void reset(ListenableFuture mediaBrowserListenableFuture) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { if (mediaBrowserListenableFuture.get().isPlaying()) { mediaBrowserListenableFuture.get().pause(); } mediaBrowserListenableFuture.get().stop(); mediaBrowserListenableFuture.get().clearMediaItems(); clearDatabase(); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void hide(ListenableFuture mediaBrowserListenableFuture) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { if (mediaBrowserListenableFuture.get().isPlaying()) { mediaBrowserListenableFuture.get().pause(); } } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void check(ListenableFuture mediaBrowserListenableFuture) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { if (mediaBrowserListenableFuture.get().getMediaItemCount() < 1) { List media = getQueueRepository().getMedia(); if (media != null && media.size() >= 1) { init(mediaBrowserListenableFuture, media); } } } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void init(ListenableFuture mediaBrowserListenableFuture, List media) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().clearMediaItems(); mediaBrowserListenableFuture.get().setMediaItems(MappingUtil.mapMediaItems(media)); mediaBrowserListenableFuture.get().seekTo(getQueueRepository().getLastPlayedMediaIndex(), getQueueRepository().getLastPlayedMediaTimestamp()); mediaBrowserListenableFuture.get().prepare(); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void startQueue(ListenableFuture mediaBrowserListenableFuture, List media, int startIndex) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().clearMediaItems(); mediaBrowserListenableFuture.get().setMediaItems(MappingUtil.mapMediaItems(media)); mediaBrowserListenableFuture.get().prepare(); mediaBrowserListenableFuture.get().seekTo(startIndex, 0); mediaBrowserListenableFuture.get().play(); enqueueDatabase(media, true, 0); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void startQueue(ListenableFuture mediaBrowserListenableFuture, Child media) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().clearMediaItems(); mediaBrowserListenableFuture.get().setMediaItem(MappingUtil.mapMediaItem(media)); mediaBrowserListenableFuture.get().prepare(); mediaBrowserListenableFuture.get().play(); enqueueDatabase(media, true, 0); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void startRadio(ListenableFuture mediaBrowserListenableFuture, InternetRadioStation internetRadioStation) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().clearMediaItems(); mediaBrowserListenableFuture.get().setMediaItem(MappingUtil.mapInternetRadioStation(internetRadioStation)); mediaBrowserListenableFuture.get().prepare(); mediaBrowserListenableFuture.get().play(); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void startPodcast(ListenableFuture mediaBrowserListenableFuture, PodcastEpisode podcastEpisode) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().clearMediaItems(); mediaBrowserListenableFuture.get().setMediaItem(MappingUtil.mapMediaItem(podcastEpisode)); mediaBrowserListenableFuture.get().prepare(); mediaBrowserListenableFuture.get().play(); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void enqueue(ListenableFuture mediaBrowserListenableFuture, List media, boolean playImmediatelyAfter) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { if (playImmediatelyAfter && mediaBrowserListenableFuture.get().getNextMediaItemIndex() != -1) { enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getNextMediaItemIndex()); mediaBrowserListenableFuture.get().addMediaItems(mediaBrowserListenableFuture.get().getNextMediaItemIndex(), MappingUtil.mapMediaItems(media)); } else { enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getMediaItemCount()); mediaBrowserListenableFuture.get().addMediaItems(MappingUtil.mapMediaItems(media)); } } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void enqueue(ListenableFuture mediaBrowserListenableFuture, Child media, boolean playImmediatelyAfter) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { if (playImmediatelyAfter && mediaBrowserListenableFuture.get().getNextMediaItemIndex() != -1) { enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getNextMediaItemIndex()); mediaBrowserListenableFuture.get().addMediaItem(mediaBrowserListenableFuture.get().getNextMediaItemIndex(), MappingUtil.mapMediaItem(media)); } else { enqueueDatabase(media, false, mediaBrowserListenableFuture.get().getMediaItemCount()); mediaBrowserListenableFuture.get().addMediaItem(MappingUtil.mapMediaItem(media)); } } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void swap(ListenableFuture mediaBrowserListenableFuture, List media, int from, int to) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().moveMediaItem(from, to); swapDatabase(media); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void remove(ListenableFuture mediaBrowserListenableFuture, List media, int toRemove) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { if (mediaBrowserListenableFuture.get().getMediaItemCount() > 1 && mediaBrowserListenableFuture.get().getCurrentMediaItemIndex() != toRemove) { mediaBrowserListenableFuture.get().removeMediaItem(toRemove); removeDatabase(media, toRemove); } else { removeDatabase(media, -1); } } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void getCurrentIndex(ListenableFuture mediaBrowserListenableFuture, MediaIndexCallback callback) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { callback.onRecovery(mediaBrowserListenableFuture.get().getCurrentMediaItemIndex()); } } catch (ExecutionException | InterruptedException e) { e.printStackTrace(); } }, MoreExecutors.directExecutor()); } } public static void setLastPlayedTimestamp(MediaItem mediaItem) { if (mediaItem != null) getQueueRepository().setLastPlayedTimestamp(mediaItem.mediaId); } public static void setPlayingPausedTimestamp(MediaItem mediaItem, long ms) { if (mediaItem != null) getQueueRepository().setPlayingPausedTimestamp(mediaItem.mediaId, ms); } public static void scrobble(MediaItem mediaItem) { if (mediaItem != null) { getSongRepository().scrobble(mediaItem.mediaMetadata.extras.getString("id")); } } public static void saveChronology(MediaItem mediaItem) { if (mediaItem != null) { getChronologyRepository().insert(new Chronology(mediaItem)); } } private static QueueRepository getQueueRepository() { return new QueueRepository(); } private static SongRepository getSongRepository() { return new SongRepository(); } private static ChronologyRepository getChronologyRepository() { return new ChronologyRepository(); } private static void enqueueDatabase(List media, boolean reset, int afterIndex) { getQueueRepository().insertAll(media, reset, afterIndex); } private static void enqueueDatabase(Child media, boolean reset, int afterIndex) { getQueueRepository().insert(media, reset, afterIndex); } private static void swapDatabase(List media) { getQueueRepository().insertAll(media, true, 0); } private static void removeDatabase(List media, int toRemove) { if (toRemove != -1) { media.remove(toRemove); getQueueRepository().insertAll(media, true, 0); } } public static void clearDatabase() { getQueueRepository().deleteAll(); } }