From cc7775c98680f35b982c277776ab05d109eaf9b9 Mon Sep 17 00:00:00 2001 From: antonio Date: Fri, 10 Mar 2023 16:11:10 +0100 Subject: [PATCH] Speed up fetching artist songs for shuffle and radio --- .../play/repository/ArtistRepository.java | 28 ++++++------------- .../play/ui/fragment/ArtistPageFragment.java | 18 ++++-------- .../ArtistBottomSheetDialog.java | 2 +- .../play/viewmodel/ArtistPageViewModel.java | 12 ++++++-- 4 files changed, 26 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java index 7caf173c..2ad1b346 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -1,12 +1,10 @@ package com.cappielloantonio.play.repository; import androidx.annotation.NonNull; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; import com.cappielloantonio.play.subsonic.base.ApiResponse; -import com.cappielloantonio.play.subsonic.models.AlbumID3; import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.ArtistInfo2; import com.cappielloantonio.play.subsonic.models.Child; @@ -258,31 +256,23 @@ public class ArtistRepository { return instantMix; } - public MutableLiveData> getArtistRandomSong(LifecycleOwner owner, ArtistID3 artist, int count) { - MutableLiveData> randomSongs = new MutableLiveData<>(); + public MutableLiveData> getRandomSong(ArtistID3 artist, int count) { + MutableLiveData> randomSongs = new MutableLiveData<>(); App.getSubsonicClientInstance(false) .getBrowsingClient() - .getArtist(artist.getId()) + .getTopSongs(artist.getName(), count) .enqueue(new Callback() { @Override public void onResponse(@NonNull Call call, @NonNull Response response) { - if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getArtist() != null && response.body().getSubsonicResponse().getArtist().getAlbums() != null) { - List albums = response.body().getSubsonicResponse().getArtist().getAlbums(); + if (response.isSuccessful() && response.body() != null && response.body().getSubsonicResponse().getTopSongs() != null && response.body().getSubsonicResponse().getTopSongs().getSongs() != null) { + List songs = response.body().getSubsonicResponse().getTopSongs().getSongs(); - if (albums.size() > 0) { - AlbumRepository albumRepository = new AlbumRepository(); - - for (int index = 0; index < albums.size(); index++) { - albumRepository.getAlbumTracks(albums.get(index).getId()).observe(owner, songs -> { - ArrayList liveSongs = randomSongs.getValue(); - if (liveSongs == null) liveSongs = new ArrayList<>(); - Collections.shuffle(liveSongs); - liveSongs.addAll(songs); - randomSongs.setValue(liveSongs); - }); - } + if (songs != null && !songs.isEmpty()) { + Collections.shuffle(songs); } + + randomSongs.setValue(songs); } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java index e7e1414f..b25c5774 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistPageFragment.java @@ -19,18 +19,17 @@ import androidx.navigation.Navigation; import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.R; -import com.cappielloantonio.play.ui.adapter.AlbumArtistPageOrSimilarAdapter; -import com.cappielloantonio.play.ui.adapter.ArtistSimilarAdapter; -import com.cappielloantonio.play.ui.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; import com.cappielloantonio.play.interfaces.ClickCallback; import com.cappielloantonio.play.model.Media; -import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.service.MediaManager; import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.ui.adapter.AlbumArtistPageOrSimilarAdapter; +import com.cappielloantonio.play.ui.adapter.ArtistSimilarAdapter; +import com.cappielloantonio.play.ui.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.ArtistPageViewModel; import com.google.common.util.concurrent.ListenableFuture; @@ -135,12 +134,9 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { }); } - // TODO Utilizzare il viewmodel come tramite ed evitare le chiamate dirette private void initPlayButtons() { bind.artistPageShuffleButton.setOnClickListener(v -> { - ArtistRepository artistRepository = new ArtistRepository(); - - artistRepository.getArtistRandomSong(getViewLifecycleOwner(), artistPageViewModel.getArtist(), 20).observe(getViewLifecycleOwner(), songs -> { + artistPageViewModel.getArtistShuffleList().observe(getViewLifecycleOwner(), songs -> { if (songs.size() > 0) { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); activity.setBottomSheetInPeek(true); @@ -151,9 +147,7 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { }); bind.artistPageRadioButton.setOnClickListener(v -> { - ArtistRepository artistRepository = new ArtistRepository(); - - artistRepository.getInstantMix(artistPageViewModel.getArtist(), 20).observe(getViewLifecycleOwner(), songs -> { + artistPageViewModel.getArtistInstantMix().observe(getViewLifecycleOwner(), songs -> { if (songs.size() > 0) { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); activity.setBottomSheetInPeek(true); @@ -169,7 +163,7 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { songHorizontalAdapter = new SongHorizontalAdapter(this, true); bind.mostStreamedSongRecyclerView.setAdapter(songHorizontalAdapter); - artistPageViewModel.getArtistTopSongList(10).observe(getViewLifecycleOwner(), songs -> { + artistPageViewModel.getArtistTopSongList().observe(getViewLifecycleOwner(), songs -> { if (bind != null) bind.artistPageTopSongsSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); songHorizontalAdapter.setItems(songs); 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 705850e3..8e5fe6a8 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 @@ -104,7 +104,7 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement TextView playRandom = view.findViewById(R.id.play_random_text_view); playRandom.setOnClickListener(v -> { ArtistRepository artistRepository = new ArtistRepository(); - artistRepository.getArtistRandomSong(getViewLifecycleOwner(), artist, 20).observe(getViewLifecycleOwner(), songs -> { + artistRepository.getRandomSong(artist, 50).observe(getViewLifecycleOwner(), songs -> { if (songs.size() > 0) { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); ((MainActivity) requireActivity()).setBottomSheetInPeek(true); diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java index 843e3ca8..9ee11ec3 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java @@ -36,8 +36,16 @@ public class ArtistPageViewModel extends AndroidViewModel { return artistRepository.getArtistFullInfo(id); } - public LiveData> getArtistTopSongList(int count) { - return artistRepository.getTopSongs(artist.getName(), count); + public LiveData> getArtistTopSongList() { + return artistRepository.getTopSongs(artist.getName(), 20); + } + + public LiveData> getArtistShuffleList() { + return artistRepository.getRandomSong(artist, 50); + } + + public LiveData> getArtistInstantMix() { + return artistRepository.getInstantMix(artist, 20); } public ArtistID3 getArtist() {