From a8b014296fc5c6c10333f35014160ed155d0ba0d Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Wed, 29 Dec 2021 21:22:52 +0100 Subject: [PATCH] Initialized the song recovery logic --- .../play/adapter/DiscoverSongAdapter.java | 2 +- .../play/adapter/SimilarTrackAdapter.java | 2 +- .../play/service/MediaManager.java | 21 +++----- .../play/ui/fragment/AlbumPageFragment.java | 10 ++++ .../play/ui/fragment/HomeFragment.java | 37 +++++++++----- .../play/ui/fragment/LibraryFragment.java | 7 ++- .../ui/fragment/PlaylistPageFragment.java | 51 ++++++++++++++----- .../AlbumBottomSheetDialog.java | 50 +++++++++++++----- .../ArtistBottomSheetDialog.java | 45 ++++++++++++---- .../SongBottomSheetDialog.java | 47 +++++++++++++---- 10 files changed, 197 insertions(+), 75 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java index 24a1e70c..837b7401 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java @@ -114,7 +114,7 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter media) { - MediaManager.enqueue(mediaBrowserListenableFuture, context, (List) media, songs.size()); + MediaManager.enqueue(mediaBrowserListenableFuture, context, (List) media,false); } }); } diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/SimilarTrackAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/SimilarTrackAdapter.java index b8b90370..954df6e7 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/SimilarTrackAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/SimilarTrackAdapter.java @@ -112,7 +112,7 @@ public class SimilarTrackAdapter extends RecyclerView.Adapter media) { - MediaManager.enqueue(mediaBrowserListenableFuture, context, (List) media, songs.size()); + MediaManager.enqueue(mediaBrowserListenableFuture, context, (List) media, false); } }); } diff --git a/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java b/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java index dedcacc9..bdf0153f 100644 --- a/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java +++ b/app/src/main/java/com/cappielloantonio/play/service/MediaManager.java @@ -26,7 +26,6 @@ public class MediaManager { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().prepare(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -41,7 +40,6 @@ public class MediaManager { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().play(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -56,7 +54,6 @@ public class MediaManager { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().pause(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -71,7 +68,6 @@ public class MediaManager { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().stop(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -86,7 +82,6 @@ public class MediaManager { if (mediaBrowserListenableFuture.isDone()) { mediaBrowserListenableFuture.get().clearMediaItems(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -105,7 +100,6 @@ public class MediaManager { mediaBrowserListenableFuture.get().seekTo(startIndex, 0); mediaBrowserListenableFuture.get().play(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -123,7 +117,6 @@ public class MediaManager { mediaBrowserListenableFuture.get().prepare(); mediaBrowserListenableFuture.get().play(); } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -131,18 +124,17 @@ public class MediaManager { } } - public static void enqueue(ListenableFuture mediaBrowserListenableFuture, Context context, List songs, int afterIndex) { + public static void enqueue(ListenableFuture mediaBrowserListenableFuture, Context context, List songs, boolean playImmediatelyAfter) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { - if (afterIndex != -1) { - mediaBrowserListenableFuture.get().addMediaItems(afterIndex, MappingUtil.mapMediaItems(context, songs)); + if (playImmediatelyAfter) { + mediaBrowserListenableFuture.get().addMediaItems(mediaBrowserListenableFuture.get().getCurrentMediaItemIndex(), MappingUtil.mapMediaItems(context, songs)); } else { mediaBrowserListenableFuture.get().addMediaItems(MappingUtil.mapMediaItems(context, songs)); } } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } @@ -150,18 +142,17 @@ public class MediaManager { } } - public static void enqueue(ListenableFuture mediaBrowserListenableFuture, Context context, Song song, int afterIndex) { + public static void enqueue(ListenableFuture mediaBrowserListenableFuture, Context context, Song song, boolean playImmediatelyAfter) { if (mediaBrowserListenableFuture != null) { mediaBrowserListenableFuture.addListener(() -> { try { if (mediaBrowserListenableFuture.isDone()) { - if (afterIndex != -1) { - mediaBrowserListenableFuture.get().addMediaItem(afterIndex, MappingUtil.mapMediaItem(context, song)); + if (playImmediatelyAfter) { + mediaBrowserListenableFuture.get().addMediaItem(mediaBrowserListenableFuture.get().getCurrentMediaItemIndex(), MappingUtil.mapMediaItem(context, song)); } else { mediaBrowserListenableFuture.get().addMediaItem(MappingUtil.mapMediaItem(context, song)); } } - ; } catch (ExecutionException | InterruptedException e) { Log.e(TAG, e.getMessage()); } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java index 8e6dd09c..4590ffba 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java @@ -83,6 +83,12 @@ public class AlbumPageFragment extends Fragment { activity.setBottomNavigationBarVisibility(false); } + @Override + public void onResume() { + super.onResume(); + setMediaBrowserListenableFuture(); + } + @Override public void onStop() { releaseMediaBrowser(); @@ -192,4 +198,8 @@ public class AlbumPageFragment extends Fragment { private void releaseMediaBrowser() { MediaBrowser.releaseFuture(mediaBrowserListenableFuture); } + + private void setMediaBrowserListenableFuture() { + songHorizontalAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java index 3daf5a83..60cb7044 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/HomeFragment.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.ui.fragment; +import android.annotation.SuppressLint; +import android.content.ComponentName; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -15,6 +17,8 @@ import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.session.MediaBrowser; +import androidx.media3.session.SessionToken; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.PagerSnapHelper; @@ -37,10 +41,12 @@ import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.util.UIUtil; import com.cappielloantonio.play.viewmodel.HomeViewModel; +import com.google.common.util.concurrent.ListenableFuture; import java.util.Objects; @@ -61,6 +67,8 @@ public class HomeFragment extends Fragment { private ArtistHorizontalAdapter starredArtistAdapter; private SimilarTrackAdapter similarMusicAdapter; + private ListenableFuture mediaBrowserListenableFuture; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -108,6 +116,7 @@ public class HomeFragment extends Fragment { public void onStart() { super.onStart(); + initializeMediaBrowser(); activity.setBottomNavigationBarVisibility(true); activity.setBottomSheetVisibility(true); } @@ -120,8 +129,9 @@ public class HomeFragment extends Fragment { } @Override - public void onPause() { - super.onPause(); + public void onStop() { + releaseMediaBrowser(); + super.onStop(); } @Override @@ -143,6 +153,16 @@ public class HomeFragment extends Fragment { return false; } + @SuppressLint("UnsafeOptInUsageError") + private void initializeMediaBrowser() { + mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync(); + } + + private void releaseMediaBrowser() { + MediaBrowser.releaseFuture(mediaBrowserListenableFuture); + } + + private void init() { bind.recentlyAddedAlbumsTextViewClickable.setOnClickListener(v -> { Bundle bundle = new Bundle(); @@ -227,9 +247,9 @@ public class HomeFragment extends Fragment { } private void setMediaBrowserListenableFuture() { - discoverSongAdapter.setMediaBrowserListenableFuture(activity.getMediaBrowserListenableFuture()); - similarMusicAdapter.setMediaBrowserListenableFuture(activity.getMediaBrowserListenableFuture()); - starredSongAdapter.setMediaBrowserListenableFuture(activity.getMediaBrowserListenableFuture()); + discoverSongAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture); + similarMusicAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture); + starredSongAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture); } private void initDiscoverSongSlideView() { @@ -250,13 +270,6 @@ public class HomeFragment extends Fragment { } }); - bind.discoverSongViewPager.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - Log.d(TAG, "onClick: " + view.toString()); - } - }); - setDiscoverSongSlideViewOffset(20, 16); } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java index 325c14a8..2ec6b7e0 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java @@ -13,6 +13,7 @@ import androidx.annotation.Nullable; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.session.MediaBrowser; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.PagerSnapHelper; @@ -33,6 +34,7 @@ import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.UIUtil; import com.cappielloantonio.play.viewmodel.LibraryViewModel; +import com.google.common.util.concurrent.ListenableFuture; import java.util.Objects; @@ -49,6 +51,8 @@ public class LibraryFragment extends Fragment { private GenreAdapter genreAdapter; private PlaylistAdapter playlistAdapter; + private ListenableFuture mediaBrowserListenableFuture; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -157,7 +161,8 @@ public class LibraryFragment extends Fragment { } else { if (bind != null) bind.libraryNewReleasesPlaceholder.placeholder.setVisibility(View.GONE); if (bind != null) bind.libraryNewReleasesSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); - if (bind != null) bind.newReleasesRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false)); + if (bind != null) + bind.newReleasesRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false)); newRelesesAlbumAdapter.setItems(albums); } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java index 91f498a8..b52355f7 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.ui.fragment; +import android.annotation.SuppressLint; +import android.content.ComponentName; import android.os.Bundle; import android.view.LayoutInflater; import android.view.Menu; @@ -12,6 +14,8 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.session.MediaBrowser; +import androidx.media3.session.SessionToken; import androidx.recyclerview.widget.LinearLayoutManager; import com.bumptech.glide.load.resource.bitmap.GranularRoundedCorners; @@ -21,10 +25,13 @@ import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentPlaylistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.service.MediaManager; +import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.DownloadUtil; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.PlaylistPageViewModel; +import com.google.common.util.concurrent.ListenableFuture; import java.util.Collections; import java.util.Objects; @@ -37,6 +44,8 @@ public class PlaylistPageFragment extends Fragment { private SongHorizontalAdapter songHorizontalAdapter; + private ListenableFuture mediaBrowserListenableFuture; + @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -70,9 +79,23 @@ public class PlaylistPageFragment extends Fragment { @Override public void onStart() { super.onStart(); + + initializeMediaBrowser(); activity.setBottomNavigationBarVisibility(false); } + @Override + public void onResume() { + super.onResume(); + setMediaBrowserListenableFuture(); + } + + @Override + public void onStop() { + releaseMediaBrowser(); + super.onStop(); + } + @Override public void onDestroyView() { super.onDestroyView(); @@ -139,25 +162,14 @@ public class PlaylistPageFragment extends Fragment { playlistPageViewModel.getPlaylistSongLiveList(requireActivity()).observe(requireActivity(), songs -> { if (bind != null) { bind.playlistPagePlayButton.setOnClickListener(v -> { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); - + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); activity.setBottomSheetInPeek(true); - // activity.setBottomSheetMusicInfo(songs.get(0)); - - // MusicPlayerRemote.openQueue(songs, 0, true); }); bind.playlistPageShuffleButton.setOnClickListener(v -> { Collections.shuffle(songs); - - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); - + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); activity.setBottomSheetInPeek(true); - // activity.setBottomSheetMusicInfo(songs.get(0)); - - // MusicPlayerRemote.openQueue(songs, 0, true); }); } }); @@ -208,4 +220,17 @@ public class PlaylistPageFragment extends Fragment { playlistPageViewModel.getPlaylistSongLiveList(requireActivity()).observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs)); } + + @SuppressLint("UnsafeOptInUsageError") + private void initializeMediaBrowser() { + mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync(); + } + + private void releaseMediaBrowser() { + MediaBrowser.releaseFuture(mediaBrowserListenableFuture); + } + + private void setMediaBrowserListenableFuture() { + songHorizontalAdapter.setMediaBrowserListenableFuture(mediaBrowserListenableFuture); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index 7556060e..8ff40d64 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.ui.fragment.bottomsheetdialog; +import android.annotation.SuppressLint; +import android.content.ComponentName; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -12,6 +14,8 @@ import android.widget.ToggleButton; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.session.MediaBrowser; +import androidx.media3.session.SessionToken; import androidx.navigation.fragment.NavHostFragment; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; @@ -23,11 +27,14 @@ import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.service.MediaManager; +import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.DownloadUtil; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.Collections; @@ -39,6 +46,8 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements private AlbumBottomSheetViewModel albumBottomSheetViewModel; private Album album; + private ListenableFuture mediaBrowserListenableFuture; + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -54,6 +63,19 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements return view; } + @Override + public void onStart() { + super.onStart(); + + initializeMediaBrowser(); + } + + @Override + public void onStop() { + releaseMediaBrowser(); + super.onStop(); + } + private void init(View view) { ImageView coverAlbum = view.findViewById(R.id.album_cover_image_view); CustomGlideRequest.Builder @@ -90,13 +112,8 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements @Override public void onLoadMedia(List media) { if (media.size() > 0) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew((ArrayList) media); - + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), (ArrayList) media, 0); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); - // ((MainActivity) requireActivity()).setBottomSheetMusicInfo((Song) media.get(0)); - - // MusicPlayerRemote.openQueue((List) media, 0, true); } else { Toast.makeText(requireContext(), getString(R.string.album_error_retrieving_radio), Toast.LENGTH_SHORT).show(); } @@ -112,10 +129,7 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements albumRepository.getAlbumTracks(album.getId()).observe(requireActivity(), songs -> { Collections.shuffle(songs); - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); - - // MusicPlayerRemote.openQueue(songs, 0, true); + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); dismissBottomSheet(); @@ -124,14 +138,17 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements TextView playNext = view.findViewById(R.id.play_next_text_view); playNext.setOnClickListener(v -> albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> { - // MusicPlayerRemote.playNext(songs); + MediaManager.enqueue(mediaBrowserListenableFuture, requireContext(), songs, true); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); + dismissBottomSheet(); })); TextView addToQueue = view.findViewById(R.id.add_to_queue_text_view); addToQueue.setOnClickListener(v -> albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> { - // MusicPlayerRemote.enqueue(songs); + MediaManager.enqueue(mediaBrowserListenableFuture, requireContext(), songs, false); + ((MainActivity) requireActivity()).setBottomSheetInPeek(true); + dismissBottomSheet(); })); @@ -175,4 +192,13 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements private void dismissBottomSheet() { dismiss(); } + + @SuppressLint("UnsafeOptInUsageError") + private void initializeMediaBrowser() { + mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync(); + } + + private void releaseMediaBrowser() { + MediaBrowser.releaseFuture(mediaBrowserListenableFuture); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java index 00ca7095..20ddff1c 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.ui.fragment.bottomsheetdialog; +import android.annotation.SuppressLint; +import android.content.ComponentName; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -12,6 +14,8 @@ import android.widget.ToggleButton; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.session.MediaBrowser; +import androidx.media3.session.SessionToken; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; import com.cappielloantonio.play.App; @@ -22,10 +26,13 @@ import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.service.MediaManager; +import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.ArtistBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.List; @@ -36,6 +43,8 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement private ArtistBottomSheetViewModel artistBottomSheetViewModel; private Artist artist; + private ListenableFuture mediaBrowserListenableFuture; + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -51,6 +60,19 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement return view; } + @Override + public void onStart() { + super.onStart(); + + initializeMediaBrowser(); + } + + @Override + public void onStop() { + releaseMediaBrowser(); + super.onStop(); + } + private void init(View view) { ImageView coverArtist = view.findViewById(R.id.artist_cover_image_view); CustomGlideRequest.Builder @@ -84,13 +106,10 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement @Override public void onLoadMedia(List media) { if (media.size() > 0) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew((ArrayList) media); - + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), (ArrayList) media, 0); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); - // ((MainActivity) requireActivity()).setBottomSheetMusicInfo((Song) media.get(0)); - // MusicPlayerRemote.openQueue((List) media, 0, true); + dismissBottomSheet(); } else { Toast.makeText(requireContext(), getString(R.string.artist_error_retrieving_radio), Toast.LENGTH_SHORT).show(); } @@ -105,11 +124,10 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement ArtistRepository artistRepository = new ArtistRepository(App.getInstance()); artistRepository.getArtistRandomSong(requireActivity(), artist, 20).observe(requireActivity(), songs -> { if (songs.size() > 0) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); - - // MusicPlayerRemote.openQueue(songs, 0, true); + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); + + dismissBottomSheet(); } else { Toast.makeText(requireContext(), getString(R.string.artist_error_retrieving_tracks), Toast.LENGTH_SHORT).show(); } @@ -127,4 +145,13 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement private void dismissBottomSheet() { dismiss(); } + + @SuppressLint("UnsafeOptInUsageError") + private void initializeMediaBrowser() { + mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync(); + } + + private void releaseMediaBrowser() { + MediaBrowser.releaseFuture(mediaBrowserListenableFuture); + } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index 7a406d5c..0056f5ab 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -1,5 +1,7 @@ package com.cappielloantonio.play.ui.fragment.bottomsheetdialog; +import android.annotation.SuppressLint; +import android.content.ComponentName; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; @@ -12,6 +14,8 @@ import android.widget.ToggleButton; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import androidx.media3.session.MediaBrowser; +import androidx.media3.session.SessionToken; import androidx.navigation.fragment.NavHostFragment; import com.bumptech.glide.load.resource.bitmap.RoundedCorners; @@ -22,6 +26,8 @@ import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; +import com.cappielloantonio.play.service.MediaManager; +import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.dialog.PlaylistChooserDialog; import com.cappielloantonio.play.ui.dialog.RatingDialog; @@ -29,6 +35,7 @@ import com.cappielloantonio.play.util.DownloadUtil; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import com.google.common.util.concurrent.ListenableFuture; import java.util.ArrayList; import java.util.Collections; @@ -40,6 +47,8 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements private SongBottomSheetViewModel songBottomSheetViewModel; private Song song; + private ListenableFuture mediaBrowserListenableFuture; + @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -55,6 +64,19 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements return view; } + @Override + public void onStart() { + super.onStart(); + + initializeMediaBrowser(); + } + + @Override + public void onStop() { + releaseMediaBrowser(); + super.onStop(); + } + private void init(View view) { ImageView coverSong = view.findViewById(R.id.song_cover_image_view); CustomGlideRequest.Builder @@ -91,15 +113,8 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements TextView playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - List opener = new ArrayList<>(); - opener.add(song); - // MusicPlayerRemote.openQueue(opener, 0, true); - - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(opener); - + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), song); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); - // ((MainActivity) requireActivity()).setBottomSheetMusicInfo(song); SongRepository songRepository = new SongRepository(App.getInstance()); songRepository.getInstantMix(song, 20, new MediaCallback() { @@ -110,16 +125,16 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements @Override public void onLoadMedia(List media) { - // MusicPlayerRemote.enqueue((List) media); + MediaManager.enqueue(mediaBrowserListenableFuture, requireContext(), (List) media, true); + dismissBottomSheet(); } }); - - dismissBottomSheet(); }); TextView playNext = view.findViewById(R.id.play_next_text_view); playNext.setOnClickListener(v -> { // MusicPlayerRemote.playNext(song); + MediaManager.enqueue(mediaBrowserListenableFuture, requireContext(), song, true); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); dismissBottomSheet(); }); @@ -127,6 +142,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements TextView addToQueue = view.findViewById(R.id.add_to_queue_text_view); addToQueue.setOnClickListener(v -> { // MusicPlayerRemote.enqueue(song); + MediaManager.enqueue(mediaBrowserListenableFuture, requireContext(), song, false); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); dismissBottomSheet(); }); @@ -212,4 +228,13 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements remove.setVisibility(View.GONE); }*/ } + + @SuppressLint("UnsafeOptInUsageError") + private void initializeMediaBrowser() { + mediaBrowserListenableFuture = new MediaBrowser.Builder(requireContext(), new SessionToken(requireContext(), new ComponentName(requireContext(), MediaService.class))).buildAsync(); + } + + private void releaseMediaBrowser() { + MediaBrowser.releaseFuture(mediaBrowserListenableFuture); + } } \ No newline at end of file