diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java index e0f334fa..50e53b7a 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.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.View; @@ -10,6 +12,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.cappielloantonio.play.R; @@ -18,9 +22,11 @@ import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentSearchBinding; import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; +import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.SearchViewModel; +import com.google.common.util.concurrent.ListenableFuture; import com.paulrybitskyi.persistentsearchview.adapters.model.SuggestionItem; import com.paulrybitskyi.persistentsearchview.listeners.OnSuggestionChangeListener; import com.paulrybitskyi.persistentsearchview.utils.SuggestionCreationUtil; @@ -36,6 +42,8 @@ public class SearchFragment extends Fragment { private AlbumAdapter albumAdapter; private SongHorizontalAdapter songHorizontalAdapter; + private ListenableFuture mediaBrowserListenableFuture; + @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -54,15 +62,23 @@ public class SearchFragment extends Fragment { @Override public void onStart() { super.onStart(); + initializeMediaBrowser(); activity.setBottomNavigationBarVisibility(false); } @Override public void onResume() { super.onResume(); + setMediaBrowserListenableFuture(); inputFocus(); } + @Override + public void onStop() { + releaseMediaBrowser(); + super.onStop(); + } + @Override public void onDestroyView() { super.onDestroyView(); @@ -191,4 +207,17 @@ public class SearchFragment extends Fragment { bind.persistentSearchView.expand(); } } + + @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); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java index 58fad804..bcb84ead 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.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.View; @@ -9,17 +11,20 @@ import androidx.annotation.NonNull; 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.LinearLayoutManager; -import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentSongListPageBinding; import com.cappielloantonio.play.model.Song; -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.SongListPageViewModel; +import com.google.common.util.concurrent.ListenableFuture; import java.util.Collections; @@ -31,6 +36,8 @@ public class SongListPageFragment extends Fragment { private SongHorizontalAdapter songHorizontalAdapter; + private ListenableFuture mediaBrowserListenableFuture; + @Override public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = (MainActivity) getActivity(); @@ -50,9 +57,22 @@ public class SongListPageFragment 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(); @@ -133,14 +153,8 @@ public class SongListPageFragment extends Fragment { if (bind != null) { bind.songListShuffleImageView.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); }); } }); @@ -154,4 +168,17 @@ public class SongListPageFragment extends Fragment { bind.songListRecyclerView.setAdapter(songHorizontalAdapter); songListPageViewModel.getSongList(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