From fd4250b6f775b9202860465fa0fbdda5f9b2ab2e Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Sat, 31 Jul 2021 18:43:40 +0200 Subject: [PATCH] Fix genre retrieval and filtering --- .../cappielloantonio/play/model/Genre.java | 43 ++----------- .../play/repository/GenreRepository.java | 55 +++++++++++++++++ .../play/repository/SongRepository.java | 60 +++++++++++++++++++ .../subsonic/models/SubsonicResponse.java | 1 + .../ui/fragment/SongListPageFragment.java | 10 ---- .../play/util/MappingUtil.java | 11 ++++ .../play/viewmodel/FilterViewModel.java | 2 +- .../viewmodel/GenreCatalogueViewModel.java | 3 +- .../play/viewmodel/LibraryViewModel.java | 7 +-- .../play/viewmodel/SongListPageViewModel.java | 4 +- .../res/layout/fragment_song_list_page.xml | 16 +---- 11 files changed, 139 insertions(+), 73 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/play/model/Genre.java b/app/src/main/java/com/cappielloantonio/play/model/Genre.java index 2c35333c..02d5437a 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Genre.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Genre.java @@ -8,34 +8,19 @@ import androidx.room.ColumnInfo; import androidx.room.Entity; import androidx.room.PrimaryKey; -@Entity(tableName = "genre") public class Genre implements Parcelable { - @NonNull - @PrimaryKey - @ColumnInfo(name = "id") public String id; - - @ColumnInfo(name = "name") public String name; - - @ColumnInfo(name = "songCount") public int songCount; + public int albumCount; - @ColumnInfo(name = "primary") - public String primary; - - @ColumnInfo(name = "blurHash") - public String blurHash; - - public Genre(@NonNull String id, String name, int songCount, String primary, String blurHash) { - this.id = id; - this.name = name; - this.songCount = songCount; - this.primary = primary; - this.blurHash = blurHash; + public Genre(com.cappielloantonio.play.subsonic.models.Genre genre) { + this.id = genre.getGenre(); + this.name = genre.getGenre(); + this.songCount = genre.getSongCount(); + this.albumCount = genre.getAlbumCount(); } - @NonNull public String getId() { return id; } @@ -48,22 +33,6 @@ public class Genre implements Parcelable { return songCount; } - public String getPrimary() { - return primary; - } - - public void setPrimary(String primary) { - this.primary = primary; - } - - public String getBlurHash() { - return blurHash; - } - - public void setBlurHash(String blurHash) { - this.blurHash = blurHash; - } - @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java index b451ddad..58eb029b 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java @@ -2,7 +2,62 @@ package com.cappielloantonio.play.repository; import android.app.Application; +import androidx.lifecycle.MutableLiveData; + +import com.cappielloantonio.play.App; +import com.cappielloantonio.play.model.Genre; +import com.cappielloantonio.play.subsonic.models.ResponseStatus; +import com.cappielloantonio.play.subsonic.models.SubsonicResponse; +import com.cappielloantonio.play.util.MappingUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import retrofit2.Call; +import retrofit2.Callback; +import retrofit2.Response; + public class GenreRepository { + private static final String TAG = "GenreRepository"; + + private Application application; + + private MutableLiveData> genres = new MutableLiveData<>(); + public GenreRepository(Application application) { + this.application = application; + } + + public MutableLiveData> getGenres(boolean random, int size) { + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getGenres() + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List genreList = new ArrayList<>(MappingUtil.mapGenre(response.body().getGenres().getGenres())); + + if(random) { + Collections.shuffle(genreList); + } + + if(size != -1) { + genres.setValue(genreList.subList(0, Math.min(size, genreList.size()))); + } + else { + genres.setValue(genreList); + } + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return genres; } } diff --git a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java index 91fa758b..8d9396ea 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -12,6 +12,8 @@ import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import com.cappielloantonio.play.util.MappingUtil; import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashSet; import java.util.List; import retrofit2.Call; @@ -168,4 +170,62 @@ public class SongRepository { } }); } + + public MutableLiveData> getSongsByGenre(String id) { + MutableLiveData> songsByGenre = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() + .getSongsByGenre(id, 500, 0) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List newSongs = new ArrayList<>(MappingUtil.mapSong(response.body().getSongsByGenre().getSongs())); + List songs = songsByGenre.getValue(); + + songs.addAll(newSongs); + Collections.shuffle(songs); + + LinkedHashSet hashSet = new LinkedHashSet<>(songs); + ArrayList songsWithoutDuplicates = new ArrayList<>(hashSet); + + songsByGenre.setValue(songsWithoutDuplicates); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return songsByGenre; + } + + public MutableLiveData> getSongsByGenres(ArrayList genresId) { + MutableLiveData> songsByGenre = new MutableLiveData<>(); + + for(String id: genresId) + + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() + .getSongsByGenre(id, 500, 0) + .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().getSongsByGenre().getSongs())); + songsByGenre.setValue(songs); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return songsByGenre; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java index b178bcdf..168e1271 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/SubsonicResponse.java @@ -28,6 +28,7 @@ public class SubsonicResponse { private NewestPodcasts newestPodcasts; private Podcasts podcasts; private Lyrics lyrics; + @Element(name = "songsByGenre") private Songs songsByGenre; @Element(name = "randomSongs") private Songs randomSongs; 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 3a4782a5..95983099 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 @@ -125,16 +125,6 @@ public class SongListPageFragment extends Fragment { private void initButtons() { songListPageViewModel.getSongList().observe(requireActivity(), songs -> { if(bind != null) { - bind.songListPlayImageView.setOnClickListener(v -> { - QueueRepository queueRepository = new QueueRepository(App.getInstance()); - queueRepository.insertAllAndStartNew(songs); - - activity.isBottomSheetInPeek(true); - activity.setBottomSheetMusicInfo(songs.get(0)); - - MusicPlayerRemote.openQueue(songs, 0, true); - }); - bind.songListShuffleImageView.setOnClickListener(v -> { Collections.shuffle(songs); 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 b777e16e..77c21022 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java @@ -12,6 +12,7 @@ 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.Genre; import java.util.ArrayList; import java.util.List; @@ -106,4 +107,14 @@ public class MappingUtil { public static Download mapToDownload(Song song) { return new Download(song); } + + public static ArrayList mapGenre(List genreList) { + ArrayList genres = new ArrayList(); + + for (Genre genre : genreList) { + genres.add(new com.cappielloantonio.play.model.Genre(genre)); + } + + return genres; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java index 361ae68f..1bc15608 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java @@ -26,7 +26,7 @@ public class FilterViewModel extends AndroidViewModel { } public LiveData> getGenreList() { - // allGenres = genreRepository.getListLiveGenres(); + allGenres = genreRepository.getGenres(false, -1); return allGenres; } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java index d35c53b7..bf17b31b 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java @@ -23,7 +23,6 @@ public class GenreCatalogueViewModel extends AndroidViewModel { } public LiveData> getGenreList() { - // genreList = genreRepository.getListLiveGenres(); - return genreList; + return genreRepository.getGenres(false, -1); } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java index 4e6ff3d3..72c68730 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java @@ -40,14 +40,9 @@ public class LibraryViewModel extends AndroidViewModel { // Inizializzate all'interno del costruttore, in modo da rimanere immutabili per tutto il // ciclo di vita dell'applicazione - // sampleAlbum = albumRepository.getListLiveSampleAlbum(); - // sampleArtist = artistRepository.getListLiveSampleArtist(); - // sampleGenres = genreRepository.getListLiveSampleGenre(); - // playlistSample = playlistRepository.getRandomSample(5); - sampleAlbum = albumRepository.getAlbums("random", 20); sampleArtist = artistRepository.getArtists(true, 20); - sampleGenres = new MutableLiveData<>(new ArrayList<>()); + sampleGenres = genreRepository.getGenres(true, 15); playlistSample = playlistRepository.getPlaylists(true, 10); } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java index 709f2c30..8b7b7f9a 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java @@ -58,13 +58,13 @@ public class SongListPageViewModel extends AndroidViewModel { // songList = songRepository.getListLiveRecentlyAddedSampleSong(100); break; case Song.BY_GENRE: - // songList = songRepository.getListLiveSongByGenre(genre.getId()); + songList = songList = songRepository.getSongsByGenre(genre.getId()); break; case Song.BY_ARTIST: // songList = songRepository.getArtistListLiveTopSong(artist.getId()); break; case Song.BY_GENRES: - // songList = songRepository.getFilteredListLiveSong(filters); + songList = songRepository.getSongsByGenres(filters); break; case Song.BY_YEAR: // songList = songRepository.getSongByYearListLive(year); diff --git a/app/src/main/res/layout/fragment_song_list_page.xml b/app/src/main/res/layout/fragment_song_list_page.xml index 9fd0da7f..b1d1d5ba 100644 --- a/app/src/main/res/layout/fragment_song_list_page.xml +++ b/app/src/main/res/layout/fragment_song_list_page.xml @@ -45,20 +45,6 @@ app:layout_constraintEnd_toStartOf="@+id/song_list_shuffle_image_view" app:layout_constraintStart_toStartOf="parent" /> - - + app:layout_constraintEnd_toEndOf="parent" />