diff --git a/app/src/main/java/com/cappielloantonio/play/model/Album.java b/app/src/main/java/com/cappielloantonio/play/model/Album.java index 01336c27..49f7f1c9 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Album.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Album.java @@ -10,6 +10,10 @@ import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.cappielloantonio.play.subsonic.models.AlbumID3; +import com.cappielloantonio.play.subsonic.models.AlbumWithSongsID3; +import com.cappielloantonio.play.util.MappingUtil; + +import java.util.List; public class Album implements Parcelable { private static final String TAG = "Album"; @@ -27,6 +31,7 @@ public class Album implements Parcelable { public String primary; public String blurHash; public boolean favorite; + public List songs; public Album(AlbumID3 albumID3) { this.id = albumID3.getId(); @@ -37,6 +42,18 @@ public class Album implements Parcelable { this.primary = albumID3.getCoverArtId(); this.favorite = albumID3.getStarred() != null; } + + public Album(AlbumWithSongsID3 albumWithSongsID3) { + this.id = albumWithSongsID3.getId(); + this.title = albumWithSongsID3.getName(); + this.year = albumWithSongsID3.getYear(); + this.artistId = albumWithSongsID3.getArtistId(); + this.artistName = albumWithSongsID3.getArtist(); + this.primary = albumWithSongsID3.getCoverArtId(); + this.favorite = albumWithSongsID3.getStarred() != null; + this.songs = MappingUtil.mapSong(albumWithSongsID3.getSongs()); + } + public String getId() { return id; } @@ -101,6 +118,14 @@ public class Album implements Parcelable { this.favorite = favorite; } + public List getSongs() { + return songs; + } + + public void setSongs(List songs) { + this.songs = songs; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/com/cappielloantonio/play/model/Artist.java b/app/src/main/java/com/cappielloantonio/play/model/Artist.java index c7e4ccbe..8c9e2495 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Artist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Artist.java @@ -2,13 +2,8 @@ package com.cappielloantonio.play.model; import android.os.Parcel; import android.os.Parcelable; -import android.text.Html; import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.Ignore; -import androidx.room.PrimaryKey; import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.ArtistInfo2; @@ -55,6 +50,7 @@ public class Artist implements Parcelable { this.albumCount = artistWithAlbumsID3.getAlbumCount(); this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums()); this.favorite = artistWithAlbumsID3.getStarred() != null; + this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums()); } public Artist(ArtistInfo2 artistInfo2) { diff --git a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java index 2a8348bd..158482d3 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java @@ -6,7 +6,9 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; +import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.subsonic.models.ResponseStatus; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; @@ -198,4 +200,47 @@ public class AlbumRepository { return artistsAlbum; } + + public MutableLiveData getAlbum(String id) { + MutableLiveData album = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getAlbum(id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + album.setValue(MappingUtil.mapAlbum(response.body().getAlbum())); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return album; + } + + public void getInstantMix(Album album, int count, MediaCallback callback) { + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getSimilarSongs2(album.getId(), count) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List songs = new ArrayList<>(MappingUtil.mapSong(response.body().getSimilarSongs2().getSongs())); + callback.onLoadMedia(songs); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + callback.onLoadMedia(new ArrayList<>()); + } + }); + } } 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 89de4b92..421d5e88 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -2,12 +2,14 @@ package com.cappielloantonio.play.repository; import android.app.Application; +import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; +import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; -import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; +import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.subsonic.models.IndexID3; import com.cappielloantonio.play.subsonic.models.ResponseStatus; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; @@ -203,6 +205,85 @@ public class ArtistRepository { }); } + public MutableLiveData getArtist(String id) { + MutableLiveData artist = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getArtist(id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + artist.setValue(MappingUtil.mapArtist(response.body().getArtist())); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return artist; + } + + public void getInstantMix(Artist artist, int count, MediaCallback callback) { + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getSimilarSongs2(artist.getId(), count) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List songs = new ArrayList<>(MappingUtil.mapSong(response.body().getSimilarSongs2().getSongs())); + callback.onLoadMedia(songs); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + callback.onLoadMedia(new ArrayList<>()); + } + }); + } + + public MutableLiveData> getArtistRandomSong(FragmentActivity fragmentActivity, Artist artist, int count) { + MutableLiveData> randomSongs = new MutableLiveData<>(new ArrayList()); + + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getArtist(artist.getId()) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List albums = new ArrayList<>(MappingUtil.mapAlbum(response.body().getArtist().getAlbums())); + + if(albums.size() > 0) { + AlbumRepository albumRepository = new AlbumRepository(App.getInstance()); + + for (int index = 0; index < albums.size(); index++) { + albumRepository.getAlbumTracks(albums.get(index).getId()).observe(fragmentActivity, songs -> { + ArrayList liveSongs = randomSongs.getValue(); + Collections.shuffle(liveSongs); + liveSongs.addAll(songs); + randomSongs.setValue(liveSongs); + }); + } + } + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return randomSongs; + } + private void addToMutableLiveData(MutableLiveData> liveData, Artist artist) { List liveArtists = liveData.getValue(); liveArtists.add(artist); diff --git a/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java index 772ecfed..64d06730 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/QueueRepository.java @@ -47,32 +47,6 @@ public class QueueRepository { return songs; } - public void insertAll(List songs) { - InsertAllThreadSafe insertAll = new InsertAllThreadSafe(queueDao, songs); - Thread thread = new Thread(insertAll); - thread.start(); - } - - public List insertMix(ArrayList media) { - List IDs = QueueUtil.getIDsFromSongs(media); - List mix = new ArrayList<>(); - - /*GetSongsByIDThreadSafe getSongsByIDThreadSafe = new GetSongsByIDThreadSafe(songDao, IDs); - Thread thread = new Thread(getSongsByIDThreadSafe); - thread.start(); - - try { - thread.join(); - mix = QueueUtil.orderSongByIdList(IDs, getSongsByIDThreadSafe.getSongs()); - - insertAllAndStartNew(mix); - } catch (InterruptedException e) { - e.printStackTrace(); - }*/ - - return mix; - } - public void insertAllAndStartNew(List songs) { try { final Thread delete = new Thread(new DeleteAllThreadSafe(queueDao)); diff --git a/app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java index bd2bbc69..85738bf5 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java @@ -111,7 +111,7 @@ public class SearchingRepository { } public MutableLiveData> getSuggestions(String query) { - MutableLiveData> suggestions = new MutableLiveData<>(new ArrayList()); + MutableLiveData> suggestions = new MutableLiveData<>(new ArrayList()); App.getSubsonicClientInstance(application, false) .getSearchingClient() @@ -122,15 +122,15 @@ public class SearchingRepository { List newSuggestions = new ArrayList(); if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { - for(ArtistID3 artistID3 : response.body().getSearchResult3().getArtists()) { + for (ArtistID3 artistID3 : response.body().getSearchResult3().getArtists()) { newSuggestions.add(artistID3.getName()); } - for(AlbumID3 albumID3 : response.body().getSearchResult3().getAlbums()) { + for (AlbumID3 albumID3 : response.body().getSearchResult3().getAlbums()) { newSuggestions.add(albumID3.getName()); } - for(Child song : response.body().getSearchResult3().getSongs()) { + for (Child song : response.body().getSearchResult3().getSongs()) { newSuggestions.add(song.getTitle()); } 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 6a1bd206..4ab654aa 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 @@ -5,6 +5,7 @@ import android.graphics.BlendMode; import android.graphics.BlendModeColorFilter; import android.os.Build; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -27,6 +28,7 @@ import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; @@ -39,6 +41,7 @@ import java.util.ArrayList; import java.util.List; public class ArtistPageFragment extends Fragment { + private static final String TAG = "ArtistPageFragment"; private FragmentArtistPageBinding bind; private MainActivity activity; @@ -125,35 +128,44 @@ public class ArtistPageFragment extends Fragment { private void initPlayButtons() { bind.artistPageShuffleButton.setOnClickListener(v -> { - List songs = artistPageViewModel.getArtistRandomSongList(); + ArtistRepository artistRepository = new ArtistRepository(App.getInstance()); + artistRepository.getArtistRandomSong(requireActivity(), artistPageViewModel.getArtist(), 20).observe(requireActivity(), songs -> { + if (songs.size() > 0) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew(songs); - if(songs.size() > 0) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); - - MusicPlayerRemote.openQueue(songs, 0, true); - ((MainActivity) requireActivity()).isBottomSheetInPeek(true); - } - else Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show(); + MusicPlayerRemote.openQueue(songs, 0, true); + activity.isBottomSheetInPeek(true); + } else { + Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show(); + } + }); }); - bind.artistPageRadioButton.setOnClickListener(v -> SyncUtil.getInstantMix(requireContext(), new MediaCallback() { - @Override - public void onError(Exception exception) { - Toast.makeText(requireContext(), "Error retrieving artist's radio", Toast.LENGTH_SHORT).show(); - } + bind.artistPageRadioButton.setOnClickListener(v -> { + ArtistRepository artistRepository = new ArtistRepository(App.getInstance()); + artistRepository.getInstantMix(artistPageViewModel.getArtist(), 20, new MediaCallback() { + @Override + public void onError(Exception exception) { + Log.e(TAG, "onError: " + exception.getMessage()); + } - @Override - public void onLoadMedia(List media) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - List mix = queueRepository.insertMix((ArrayList) media); + @Override + public void onLoadMedia(List media) { + if (media.size() > 0) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); - activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(mix.get(0)); + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo((Song) media.get(0)); - MusicPlayerRemote.openQueue(mix, 0, true); - } - }, SyncUtil.SONG, artistPageViewModel.getArtist().getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber())); + MusicPlayerRemote.openQueue((List) media, 0, true); + } else { + Toast.makeText(requireContext(), "Error retrieving artist's radio", Toast.LENGTH_SHORT).show(); + } + } + }); + }); } private void initTopSongsView() { 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 0318906f..888eddbf 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 @@ -17,28 +17,28 @@ import androidx.navigation.fragment.NavHostFragment; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; -import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; -import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; +import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.DownloadUtil; -import com.cappielloantonio.play.util.PreferenceUtil; -import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import java.util.ArrayList; +import java.util.Collections; import java.util.List; public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { private static final String TAG = "AlbumBottomSheetDialog"; + private MainActivity activity; + private AlbumBottomSheetViewModel albumBottomSheetViewModel; - private SongRepository songRepository; private Album album; private ImageView coverAlbum; @@ -51,7 +51,6 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements private TextView playNext; private TextView addToQueue; private TextView Download; - private TextView addToPlaylist; private TextView goToArtist; @Nullable @@ -64,14 +63,14 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class); albumBottomSheetViewModel.setAlbum(album); - songRepository = new SongRepository(App.getInstance()); - init(view); return view; } private void init(View view) { + activity = (MainActivity) requireActivity(); + coverAlbum = view.findViewById(R.id.album_cover_image_view); CustomGlideRequest.Builder .from(requireContext(), albumBottomSheetViewModel.getAlbum().getPrimary(), albumBottomSheetViewModel.getAlbum().getBlurHash(), CustomGlideRequest.ALBUM_PIC) @@ -94,79 +93,87 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - SyncUtil.getInstantMix(requireContext(), new MediaCallback() { - MainActivity activity = (MainActivity) requireActivity(); - + AlbumRepository albumRepository = new AlbumRepository(App.getInstance()); + albumRepository.getInstantMix(album, 20, new MediaCallback() { @Override public void onError(Exception exception) { Log.e(TAG, "onError: " + exception.getMessage()); + + dismissBottomSheet(); } @Override public void onLoadMedia(List media) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - List mix = queueRepository.insertMix((ArrayList) media); + if(media.size() > 0) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); - activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(mix.get(0)); + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo((Song) media.get(0)); - MusicPlayerRemote.openQueue(mix, 0, true); + MusicPlayerRemote.openQueue((List) media, 0, true); + } else { + Toast.makeText(requireContext(), "Error retrieving album's radio", Toast.LENGTH_SHORT).show(); + } + + dismissBottomSheet(); } - }, SyncUtil.SONG, album.getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber()); - - dismissBottomSheet(); + }); }); playRandom = view.findViewById(R.id.play_random_text_view); playRandom.setOnClickListener(v -> { - // List songs = songRepository.getAlbumListSong(album.getId(), true); - List songs = new ArrayList<>(); + AlbumRepository albumRepository = new AlbumRepository(App.getInstance()); + albumRepository.getAlbumTracks(album.getId()).observe(requireActivity(), songs -> { + Collections.shuffle(songs); - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew(songs); - MusicPlayerRemote.openQueue(songs, 0, true); - ((MainActivity) requireActivity()).isBottomSheetInPeek(true); - dismissBottomSheet(); + MusicPlayerRemote.openQueue(songs, 0, true); + activity.isBottomSheetInPeek(true); + + dismissBottomSheet(); + }); }); playNext = view.findViewById(R.id.play_next_text_view); playNext.setOnClickListener(v -> { - // MusicPlayerRemote.playNext(songRepository.getAlbumListSong(album.getId(), false)); - ((MainActivity) requireActivity()).isBottomSheetInPeek(true); - dismissBottomSheet(); + albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> { + MusicPlayerRemote.playNext(songs); + activity.isBottomSheetInPeek(true); + dismissBottomSheet(); + }); }); addToQueue = view.findViewById(R.id.add_to_queue_text_view); addToQueue.setOnClickListener(v -> { - // MusicPlayerRemote.enqueue(songRepository.getAlbumListSong(album.getId(), false)); - dismissBottomSheet(); + albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> { + MusicPlayerRemote.enqueue(songs); + dismissBottomSheet(); + }); }); Download = view.findViewById(R.id.download_text_view); Download.setOnClickListener(v -> { - // List songs = songRepository.getAlbumListSong(album.getId(), false); - // DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(songs); - dismissBottomSheet(); - }); - - addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view); - addToPlaylist.setOnClickListener(v -> { - Toast.makeText(requireContext(), "Add to playlist", Toast.LENGTH_SHORT).show(); - dismissBottomSheet(); + albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> { + DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(songs); + dismissBottomSheet(); + }); }); goToArtist = view.findViewById(R.id.go_to_artist_text_view); goToArtist.setOnClickListener(v -> { - Artist artist = albumBottomSheetViewModel.getArtist(); - if(artist != null) { - Bundle bundle = new Bundle(); - bundle.putParcelable("artist_object", artist); - NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); - } - else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); + albumBottomSheetViewModel.getArtist().observe(requireActivity(), artist -> { + if (artist != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artist); + NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); + } else + Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); - dismissBottomSheet(); + dismissBottomSheet(); + }); }); } 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 42800fa5..5ec4de83 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 @@ -16,15 +16,13 @@ import androidx.lifecycle.ViewModelProvider; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; -import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.interfaces.MediaCallback; 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.repository.SongRepository; +import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.MainActivity; -import com.cappielloantonio.play.util.PreferenceUtil; -import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.ArtistBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; @@ -34,8 +32,9 @@ import java.util.List; public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { private static final String TAG = "AlbumBottomSheetDialog"; + private MainActivity activity; + private ArtistBottomSheetViewModel artistBottomSheetViewModel; - private SongRepository songRepository; private Artist artist; private ImageView coverArtist; @@ -55,14 +54,14 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement artistBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(ArtistBottomSheetViewModel.class); artistBottomSheetViewModel.setArtist(artist); - songRepository = new SongRepository(App.getInstance()); - init(view); return view; } private void init(View view) { + activity = (MainActivity) requireActivity(); + coverArtist = view.findViewById(R.id.artist_cover_image_view); CustomGlideRequest.Builder .from(requireContext(), artistBottomSheetViewModel.getArtist().getPrimary(), artistBottomSheetViewModel.getArtist().getPrimaryBlurHash(), CustomGlideRequest.ARTIST_PIC) @@ -82,43 +81,50 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - SyncUtil.getInstantMix(requireContext(), new MediaCallback() { - MainActivity activity = (MainActivity) requireActivity(); - + ArtistRepository artistRepository = new ArtistRepository(App.getInstance()); + artistRepository.getInstantMix(artist, 20, new MediaCallback() { @Override public void onError(Exception exception) { Log.e(TAG, "onError: " + exception.getMessage()); + + dismissBottomSheet(); } @Override public void onLoadMedia(List media) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - List mix = queueRepository.insertMix((ArrayList) media); + if (media.size() > 0) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); - activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(mix.get(0)); + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo((Song) media.get(0)); - MusicPlayerRemote.openQueue(mix, 0, true); + MusicPlayerRemote.openQueue((List) media, 0, true); + } else { + Toast.makeText(requireContext(), "Error retrieving artist's radio", Toast.LENGTH_SHORT).show(); + } + + dismissBottomSheet(); } - }, SyncUtil.SONG, artist.getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber()); - - dismissBottomSheet(); + }); }); playRandom = view.findViewById(R.id.play_random_text_view); playRandom.setOnClickListener(v -> { - // List songs = songRepository.getArtistListLiveRandomSong(artist.getId()); - List songs = new ArrayList<>(); + 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); - if(songs.size() > 0) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); + MusicPlayerRemote.openQueue(songs, 0, true); + activity.isBottomSheetInPeek(true); + } else { + Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show(); + } - MusicPlayerRemote.openQueue(songs, 0, true); - ((MainActivity) requireActivity()).isBottomSheetInPeek(true); dismissBottomSheet(); - } - else Toast.makeText(requireContext(), "Error retrieving artist's songs", Toast.LENGTH_SHORT).show(); + }); }); } 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 286fab78..ad1f3620 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 @@ -17,16 +17,13 @@ import androidx.navigation.fragment.NavHostFragment; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; -import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.interfaces.MediaCallback; -import com.cappielloantonio.play.model.Album; -import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; +import com.cappielloantonio.play.repository.SongRepository; +import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.DownloadUtil; -import com.cappielloantonio.play.util.PreferenceUtil; -import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; @@ -49,7 +46,6 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements private TextView playNext; private TextView addToQueue; private TextView download; - private TextView addToPlaylist; private TextView goToAlbum; private TextView goToArtist; @@ -92,9 +88,18 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - SyncUtil.getInstantMix(requireContext(), new MediaCallback() { - MainActivity activity = (MainActivity) requireActivity(); + List opener = new ArrayList<>(); + opener.add(song); + MusicPlayerRemote.openQueue(opener, 0, true); + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew(opener); + + ((MainActivity) requireActivity()).isBottomSheetInPeek(true); + ((MainActivity) requireActivity()).setBottomSheetMusicInfo(song); + + SongRepository songRepository = new SongRepository(App.getInstance()); + songRepository.getInstantMix(song, 20, new MediaCallback() { @Override public void onError(Exception exception) { Log.e(TAG, "onError: " + exception.getMessage()); @@ -102,15 +107,9 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements @Override public void onLoadMedia(List media) { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - List mix = queueRepository.insertMix((ArrayList) media); - - activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(mix.get(0)); - - MusicPlayerRemote.openQueue(mix, 0, true); + MusicPlayerRemote.enqueue((List) media); } - }, SyncUtil.SONG, song.getId(), PreferenceUtil.getInstance(requireContext()).getInstantMixSongNumber()); + }); dismissBottomSheet(); }); @@ -135,37 +134,32 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements dismissBottomSheet(); }); - addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view); - addToPlaylist.setOnClickListener(v -> { - Toast.makeText(requireContext(), "Add to playlist", Toast.LENGTH_SHORT).show(); - dismissBottomSheet(); - }); - goToAlbum = view.findViewById(R.id.go_to_album_text_view); goToAlbum.setOnClickListener(v -> { - Album album = songBottomSheetViewModel.getAlbum(); + songBottomSheetViewModel.getAlbum().observe(requireActivity(), album -> { + if (album != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("album_object", album); + NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle); + } else + Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show(); - if(album != null) { - Bundle bundle = new Bundle(); - bundle.putParcelable("album_object", album); - NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle); - } - else Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show(); - - dismissBottomSheet(); + dismissBottomSheet(); + }); }); goToArtist = view.findViewById(R.id.go_to_artist_text_view); goToArtist.setOnClickListener(v -> { - Artist artist = songBottomSheetViewModel.getArtist(); - if(artist != null) { - Bundle bundle = new Bundle(); - bundle.putParcelable("artist_object", artist); - NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); - } - else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); + songBottomSheetViewModel.getArtist().observe(requireActivity(), artist -> { + if (artist != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artist); + NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); + } else + Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); - dismissBottomSheet(); + dismissBottomSheet(); + }); }); } diff --git a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java index e066b410..b777e16e 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java @@ -7,11 +7,11 @@ import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.subsonic.models.AlbumID3; +import com.cappielloantonio.play.subsonic.models.AlbumWithSongsID3; import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.ArtistInfo2; import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; import com.cappielloantonio.play.subsonic.models.Child; -import com.cappielloantonio.play.subsonic.models.Playlists; import java.util.ArrayList; import java.util.List; @@ -20,7 +20,7 @@ public class MappingUtil { public static ArrayList mapSong(List children) { ArrayList songs = new ArrayList(); - for(Child child : children){ + for (Child child : children) { songs.add(new Song(child)); } @@ -30,17 +30,21 @@ public class MappingUtil { public static ArrayList mapAlbum(List albumID3List) { ArrayList albums = new ArrayList(); - for(AlbumID3 albumID3 : albumID3List){ + for (AlbumID3 albumID3 : albumID3List) { albums.add(new Album(albumID3)); } return albums; } + public static Album mapAlbum(AlbumWithSongsID3 albumWithSongsID3) { + return new Album(albumWithSongsID3); + } + public static ArrayList mapArtist(List artistID3List) { ArrayList artists = new ArrayList(); - for(ArtistID3 artistID3 : artistID3List){ + for (ArtistID3 artistID3 : artistID3List) { artists.add(new Artist(artistID3)); } @@ -51,6 +55,10 @@ public class MappingUtil { return new Artist(artistInfo2); } + public static Artist mapArtist(ArtistWithAlbumsID3 artistWithAlbumsID3) { + return new Artist(artistWithAlbumsID3); + } + public static Artist mapArtistWithAlbum(ArtistWithAlbumsID3 artistWithAlbumsID3) { return new Artist(artistWithAlbumsID3); } @@ -58,7 +66,7 @@ public class MappingUtil { public static ArrayList mapQueue(List queueList) { ArrayList songs = new ArrayList(); - for(Queue item : queueList){ + for (Queue item : queueList) { songs.add(new Song(item)); } @@ -68,7 +76,7 @@ public class MappingUtil { public static ArrayList mapPlaylist(List playlists) { ArrayList playlist = new ArrayList(); - for(com.cappielloantonio.play.subsonic.models.Playlist item : playlists){ + for (com.cappielloantonio.play.subsonic.models.Playlist item : playlists) { playlist.add(new Playlist(item)); } @@ -78,7 +86,7 @@ public class MappingUtil { public static ArrayList mapDownload(List downloads) { ArrayList songs = new ArrayList(); - for(Download download : downloads){ + for (Download download : downloads) { songs.add(new Song(download)); } @@ -88,7 +96,7 @@ public class MappingUtil { public static ArrayList mapToDownload(List songs) { ArrayList downloads = new ArrayList(); - for(Song song : songs){ + for (Song song : songs) { downloads.add(new Download(song)); } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java index cc8db142..fad33471 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java @@ -4,12 +4,19 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.ArtistRepository; +import java.util.List; + public class AlbumBottomSheetViewModel extends AndroidViewModel { + private AlbumRepository albumRepository; private ArtistRepository artistRepository; private Album album; @@ -17,6 +24,7 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { public AlbumBottomSheetViewModel(@NonNull Application application) { super(application); + albumRepository = new AlbumRepository(application); artistRepository = new ArtistRepository(application); } @@ -28,9 +36,12 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { this.album = album; } - public Artist getArtist() { - // return artistRepository.getArtistByID(album.getArtistId()); - return null; + public LiveData getArtist() { + return artistRepository.getArtist(album.getArtistId()); + } + + public MutableLiveData> getAlbumTracks() { + return albumRepository.getAlbumTracks(album.getId()); } public void setFavorite() { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java index 424d76fb..977aa708 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java @@ -4,6 +4,7 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; @@ -45,13 +46,11 @@ public class SongBottomSheetViewModel extends AndroidViewModel { } } - public Album getAlbum() { - // return albumRepository.getAlbumByID(song.getAlbumId()); - return null; + public LiveData getAlbum() { + return albumRepository.getAlbum(song.getAlbumId()); } - public Artist getArtist() { - // return artistRepository.getArtistByID(song.getArtistId()); - return null; + public LiveData getArtist() { + return artistRepository.getArtist(song.getArtistId()); } } diff --git a/app/src/main/res/layout/bottom_sheet_album_dialog.xml b/app/src/main/res/layout/bottom_sheet_album_dialog.xml index e5c15202..3679b529 100644 --- a/app/src/main/res/layout/bottom_sheet_album_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_album_dialog.xml @@ -167,22 +167,6 @@ android:textFontWeight="700" android:textSize="14sp" /> - - - -