From c55f639368ad282724efe46adceb4eb94914e455 Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Thu, 29 Jul 2021 14:19:19 +0200 Subject: [PATCH] Fix artist cover visualization --- .../play/glide/CustomGlideRequest.java | 2 - .../cappielloantonio/play/model/Album.java | 31 +------ .../play/model/AlbumArtistCross.java | 61 -------------- .../cappielloantonio/play/model/Artist.java | 23 +++++- .../play/model/PlaylistSongCross.java | 46 ----------- .../play/model/SongArtistCross.java | 49 ----------- .../play/model/SongGenreCross.java | 82 ------------------- .../play/repository/AlbumRepository.java | 14 +++- .../play/repository/ArtistRepository.java | 69 +++++++++++++++- ...pository.java => SearchingRepository.java} | 4 +- .../play/subsonic/models/ArtistID3.java | 2 +- .../subsonic/models/ArtistWithAlbumsID3.java | 31 +++---- .../subsonic/models/SubsonicResponse.java | 1 + .../play/ui/fragment/HomeFragment.java | 7 +- .../play/util/MappingUtil.java | 9 +- .../cappielloantonio/play/util/UIUtil.java | 14 ++++ .../com/cappielloantonio/play/util/Util.java | 14 ---- .../play/viewmodel/HomeViewModel.java | 8 +- .../play/viewmodel/LibraryViewModel.java | 7 ++ .../play/viewmodel/SearchViewModel.java | 13 ++- app/src/main/res/layout/fragment_login.xml | 4 +- 21 files changed, 157 insertions(+), 334 deletions(-) delete mode 100644 app/src/main/java/com/cappielloantonio/play/model/AlbumArtistCross.java delete mode 100644 app/src/main/java/com/cappielloantonio/play/model/PlaylistSongCross.java delete mode 100644 app/src/main/java/com/cappielloantonio/play/model/SongArtistCross.java delete mode 100644 app/src/main/java/com/cappielloantonio/play/model/SongGenreCross.java rename app/src/main/java/com/cappielloantonio/play/repository/{RecentSearchRepository.java => SearchingRepository.java} (97%) create mode 100644 app/src/main/java/com/cappielloantonio/play/util/UIUtil.java delete mode 100644 app/src/main/java/com/cappielloantonio/play/util/Util.java diff --git a/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java b/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java index b2049cb7..b4e13c05 100644 --- a/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java +++ b/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java @@ -58,8 +58,6 @@ public class CustomGlideRequest { "&c=" + params.get("c") + "&id=" + item; - Log.d(TAG, "--- createUrl() - " + sb); - return sb; } 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 8b0d549a..f87c88b3 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Album.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Album.java @@ -11,44 +11,17 @@ import androidx.room.PrimaryKey; import com.cappielloantonio.play.subsonic.models.AlbumID3; -@Entity(tableName = "album") public class Album implements Parcelable { private static final String TAG = "Album"; - @NonNull - @PrimaryKey - @ColumnInfo(name = "id") public String id; - - @ColumnInfo(name = "title") public String title; - - @ColumnInfo(name = "year") public int year; - - @ColumnInfo(name = "artistId") public String artistId; - - @ColumnInfo(name = "artistName") public String artistName; - - @ColumnInfo(name = "primary") public String primary; - - @ColumnInfo(name = "blurHash") public String blurHash; - public Album(@NonNull String id, String title, int year, String artistId, String artistName, String primary, String blurHash) { - this.id = id; - this.title = title; - this.year = year; - this.artistId = artistId; - this.artistName = artistName; - this.primary = primary; - this.blurHash = blurHash; - } - - @Ignore public Album(AlbumID3 albumID3) { this.id = albumID3.getId(); this.title = albumID3.getName(); @@ -57,13 +30,11 @@ public class Album implements Parcelable { this.artistName = albumID3.getArtist(); this.primary = albumID3.getCoverArtId(); } - - @NonNull public String getId() { return id; } - public void setId(@NonNull String id) { + public void setId(String id) { this.id = id; } diff --git a/app/src/main/java/com/cappielloantonio/play/model/AlbumArtistCross.java b/app/src/main/java/com/cappielloantonio/play/model/AlbumArtistCross.java deleted file mode 100644 index 195895dd..00000000 --- a/app/src/main/java/com/cappielloantonio/play/model/AlbumArtistCross.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.cappielloantonio.play.model; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -@Entity(tableName = "album_artist_cross") -public class AlbumArtistCross { - @NonNull - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = "id") - private int id; - - @ColumnInfo(name = "album_id") - private String albumId; - - @ColumnInfo(name = "artist_id") - private String artistId; - - @ColumnInfo(name = "is_producer") - private boolean isProducer; - - public AlbumArtistCross(String albumId, String artistId, boolean isProducer) { - this.albumId = albumId; - this.artistId = artistId; - this.isProducer = isProducer; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getAlbumId() { - return albumId; - } - - public void setAlbumId(String albumId) { - this.albumId = albumId; - } - - public String getArtistId() { - return artistId; - } - - public void setArtistId(String artistId) { - this.artistId = artistId; - } - - public boolean isProducer() { - return isProducer; - } - - public void setProducer(boolean producer) { - isProducer = producer; - } -} 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 f958db6a..7c881bde 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Artist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Artist.java @@ -2,6 +2,7 @@ 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; @@ -10,11 +11,12 @@ import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.cappielloantonio.play.subsonic.models.ArtistID3; +import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; +import com.cappielloantonio.play.util.MappingUtil; import java.util.ArrayList; import java.util.List; -@Entity(tableName = "artist") public class Artist implements Parcelable { private static final String TAG = "Artist"; @@ -33,11 +35,20 @@ public class Artist implements Parcelable { public Artist(ArtistID3 artistID3) { this.id = artistID3.getId(); this.name = artistID3.getName(); - this.primary = artistID3.getCoverArtId() != null ? artistID3.getCoverArtId() : artistID3.getId(); + this.primary = artistID3.getCoverArtId(); this.backdrop = artistID3.getCoverArtId(); this.albumCount = artistID3.getAlbumCount(); } + public Artist(ArtistWithAlbumsID3 artistWithAlbumsID3) { + this.id = artistWithAlbumsID3.getId(); + this.name = artistWithAlbumsID3.getName(); + this.primary = artistWithAlbumsID3.getCoverArtId(); + this.backdrop = artistWithAlbumsID3.getCoverArtId(); + this.albumCount = artistWithAlbumsID3.getAlbumCount(); + this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums()); + } + public Artist(String id, String name) { this.id = id; this.name = name; @@ -99,6 +110,14 @@ public class Artist implements Parcelable { this.albumCount = albumCount; } + public List getAlbums() { + return albums; + } + + public void setAlbums(List albums) { + this.albums = albums; + } + @Override public boolean equals(Object o) { if (this == o) return true; diff --git a/app/src/main/java/com/cappielloantonio/play/model/PlaylistSongCross.java b/app/src/main/java/com/cappielloantonio/play/model/PlaylistSongCross.java deleted file mode 100644 index d45076f5..00000000 --- a/app/src/main/java/com/cappielloantonio/play/model/PlaylistSongCross.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.cappielloantonio.play.model; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -@Entity(tableName = "playlist_song_cross", primaryKeys = {"playlist_id","song_id"}) -public class PlaylistSongCross { - @NonNull - @ColumnInfo(name = "playlist_id") - private String playlistId; - - @NonNull - @ColumnInfo(name = "song_id") - private String songId; - - @ColumnInfo(name = "item_number") - private int itemNumber; - - public PlaylistSongCross(String playlistId, String songId, int itemNumber) { - this.playlistId = playlistId; - this.songId = songId; - this.itemNumber = itemNumber; - } - - public String getPlaylistId() { - return playlistId; - } - - public void setPlaylistId(String playlistId) { - this.playlistId = playlistId; - } - - public String getSongId() { - return songId; - } - - public void setSongId(String songId) { - this.songId = songId; - } - - public int getItemNumber() { return itemNumber; } - - public void setItemNumber(int itemNumber) { this.itemNumber = itemNumber; } -} diff --git a/app/src/main/java/com/cappielloantonio/play/model/SongArtistCross.java b/app/src/main/java/com/cappielloantonio/play/model/SongArtistCross.java deleted file mode 100644 index 227c676f..00000000 --- a/app/src/main/java/com/cappielloantonio/play/model/SongArtistCross.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.cappielloantonio.play.model; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -@Entity(tableName = "song_artist_cross") -public class SongArtistCross { - @NonNull - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = "id") - private int id; - - @ColumnInfo(name = "song_id") - private String songId; - - @ColumnInfo(name = "artist_id") - private String artistId; - - public SongArtistCross(String songId, String artistId) { - this.songId = songId; - this.artistId = artistId; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getSongId() { - return songId; - } - - public void setSongId(String songId) { - this.songId = songId; - } - - public String getArtistId() { - return artistId; - } - - public void setArtistId(String artistId) { - this.artistId = artistId; - } -} diff --git a/app/src/main/java/com/cappielloantonio/play/model/SongGenreCross.java b/app/src/main/java/com/cappielloantonio/play/model/SongGenreCross.java deleted file mode 100644 index d6ad03ac..00000000 --- a/app/src/main/java/com/cappielloantonio/play/model/SongGenreCross.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.cappielloantonio.play.model; - -import android.os.Parcel; -import android.os.Parcelable; - -import androidx.annotation.NonNull; -import androidx.room.ColumnInfo; -import androidx.room.Entity; -import androidx.room.PrimaryKey; - -@Entity(tableName = "song_genre_cross") -public class SongGenreCross implements Parcelable { - @NonNull - @PrimaryKey(autoGenerate = true) - @ColumnInfo(name = "id") - private int id; - - @ColumnInfo(name = "song_id") - private String songId; - - @ColumnInfo(name = "genre_id") - private String genreId; - - public SongGenreCross(String songId, String genreId) { - this.songId = songId; - this.genreId = genreId; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public String getSongId() { - return songId; - } - - public void setSongId(String songId) { - this.songId = songId; - } - - public String getGenreId() { - return genreId; - } - - public void setGenreId(String genreId) { - this.genreId = genreId; - } - - protected SongGenreCross(Parcel in) { - id = in.readInt(); - songId = in.readString(); - genreId = in.readString(); - } - - @Override - public void writeToParcel(Parcel dest, int flags) { - dest.writeInt(id); - dest.writeString(songId); - dest.writeString(genreId); - } - - @Override - public int describeContents() { - return 0; - } - - public static final Creator CREATOR = new Creator() { - @Override - public SongGenreCross createFromParcel(Parcel in) { - return new SongGenreCross(in); - } - - @Override - public SongGenreCross[] newArray(int size) { - return new SongGenreCross[size]; - } - }; -} 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 381da01e..7cb280f2 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java @@ -26,13 +26,15 @@ public class AlbumRepository { private MutableLiveData> listLiveRecentlyAddedAlbums = new MutableLiveData<>(); private MutableLiveData> listLiveMostPlayedAlbums = new MutableLiveData<>(); private MutableLiveData> listLiveRecentlyPlayedAlbums = new MutableLiveData<>(); + private MutableLiveData> listLiveRandomAlbums = new MutableLiveData<>(); public AlbumRepository(Application application) { this.application = application; } - public LiveData> getListLiveAlbums(String type, int size) { - App.getSubsonicClientInstance(application, false).getAlbumSongListClient() + public LiveData> getAlbums(String type, int size) { + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() .getAlbumList2(type, size, 0) .enqueue(new Callback() { @Override @@ -49,6 +51,9 @@ public class AlbumRepository { case "recent": listLiveRecentlyPlayedAlbums.setValue(albums); break; + case "random": + listLiveRandomAlbums.setValue(albums); + break; } } @@ -65,6 +70,8 @@ public class AlbumRepository { return listLiveMostPlayedAlbums; case "recent": return listLiveRecentlyPlayedAlbums; + case "random": + return listLiveRandomAlbums; default: return new MutableLiveData<>(); } @@ -73,7 +80,8 @@ public class AlbumRepository { public MutableLiveData> getStarredAlbums() { MutableLiveData> starredAlbums = new MutableLiveData<>(); - App.getSubsonicClientInstance(application, false).getAlbumSongListClient() + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() .getStarred2() .enqueue(new Callback() { @Override 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 ed654dc0..171ea924 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -6,11 +6,14 @@ import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; +import com.cappielloantonio.play.subsonic.models.IndexID3; 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; @@ -20,21 +23,24 @@ import retrofit2.Response; public class ArtistRepository { private Application application; - private MutableLiveData> starredArtists = new MutableLiveData<>(); + private MutableLiveData> starredArtists = new MutableLiveData<>(new ArrayList<>()); + private MutableLiveData> listLiveRandomArtists = new MutableLiveData<>(new ArrayList<>()); + private MutableLiveData> listLiveArtists = new MutableLiveData<>(new ArrayList<>()); public ArtistRepository(Application application) { this.application = application; } public MutableLiveData> getStarredArtists() { - App.getSubsonicClientInstance(application, false).getAlbumSongListClient() + App.getSubsonicClientInstance(application, false) + .getAlbumSongListClient() .getStarred2() .enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { List artists = new ArrayList<>(MappingUtil.mapArtist(response.body().getStarred2().getArtists())); - starredArtists.setValue(artists); + getArtistInfo(artists, starredArtists); } } @@ -45,4 +51,61 @@ public class ArtistRepository { return starredArtists; } + + public MutableLiveData> getArtists(boolean random, int size) { + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getArtists() + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List artists = new ArrayList<>(); + + for (IndexID3 index : response.body().getArtists().getIndices()) { + artists.addAll(MappingUtil.mapArtist(index.getArtists())); + } + + listLiveArtists.setValue(artists); + Collections.shuffle(artists); + getArtistInfo(artists.subList(0, artists.size() / size > 0 ? size : artists.size()), listLiveRandomArtists); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + } + }); + + if (random) { + return listLiveRandomArtists; + } else { + return listLiveArtists; + } + } + + public void getArtistInfo(List artists, MutableLiveData> list) { + for (Artist artist : artists) { + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getArtist(artist.getId()) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + addToMutableLiveData(list, MappingUtil.mapArtistWithAlbum(response.body().getArtist())); + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + } + + private void addToMutableLiveData(MutableLiveData> liveData, Artist artist) { + List liveArtists = liveData.getValue(); + liveArtists.add(artist); + liveData.setValue(liveArtists); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/repository/RecentSearchRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java similarity index 97% rename from app/src/main/java/com/cappielloantonio/play/repository/RecentSearchRepository.java rename to app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java index 162d59ff..dcecbc52 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/RecentSearchRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SearchingRepository.java @@ -9,10 +9,10 @@ import com.cappielloantonio.play.model.RecentSearch; import java.util.ArrayList; import java.util.List; -public class RecentSearchRepository { +public class SearchingRepository { private RecentSearchDao recentSearchDao; - public RecentSearchRepository(Application application) { + public SearchingRepository(Application application) { AppDatabase database = AppDatabase.getInstance(application); recentSearchDao = database.recentSearchDao(); } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistID3.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistID3.java index 5779ec6d..cc1bfe8e 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistID3.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistID3.java @@ -7,7 +7,7 @@ import com.tickaroo.tikxml.converters.date.rfc3339.DateRfc3339TypeConverter; import java.time.LocalDateTime; import java.util.Date; -@Xml +@Xml(name = "artist") public class ArtistID3 { @Attribute protected String id; diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistWithAlbumsID3.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistWithAlbumsID3.java index 280540c9..7ee8a6f8 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistWithAlbumsID3.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistWithAlbumsID3.java @@ -1,35 +1,24 @@ package com.cappielloantonio.play.subsonic.models; +import com.tickaroo.tikxml.annotation.Element; +import com.tickaroo.tikxml.annotation.Xml; + import java.util.ArrayList; import java.util.List; +@Xml public class ArtistWithAlbumsID3 extends ArtistID3 { + @Element(name = "album") protected List albums; - /** - * Gets the value of the albums property. - * - *

- * This accessor method returns a reference to the live list, - * not a snapshot. Therefore any modification you make to the - * returned list will be present inside the JAXB object. - * This is why there is not a set method for the albums property. - * - *

- * For example, to add a new item, do as follows: - *

-     *    getAlbums().add(newItem);
-     * 
- * - * - *

- * Objects of the following type(s) are allowed in the list - * {@link AlbumID3 } - */ public List getAlbums() { if (albums == null) { - albums = new ArrayList(); + albums = new ArrayList<>(); } return this.albums; } + + public void setAlbums(List albums) { + this.albums = albums; + } } 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 015df222..75943ee9 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 @@ -52,6 +52,7 @@ public class SubsonicResponse { private Child song; @Element(name = "album") private AlbumWithSongsID3 album; + @Element(name = "artist") private ArtistWithAlbumsID3 artist; @Element(name = "artists") private ArtistsID3 artists; 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 6214a50d..51bf5ac5 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 @@ -28,6 +28,7 @@ import com.cappielloantonio.play.databinding.FragmentHomeBinding; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.util.UIUtil; import com.cappielloantonio.play.viewmodel.HomeViewModel; import java.util.List; @@ -198,7 +199,7 @@ public class HomeFragment extends Fragment { bind.starredTracksRecyclerView.setAdapter(starredSongAdapter); homeViewModel.getStarredTracks().observe(requireActivity(), songs -> { if(bind != null) bind.homeStarredTracksSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); - bind.starredTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), (songs.size() / 5) > 0 ? 5 : songs.size() % 5, GridLayoutManager.HORIZONTAL, false)); + bind.starredTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(songs.size(), 5), GridLayoutManager.HORIZONTAL, false)); starredSongAdapter.setItems(songs); }); @@ -213,7 +214,7 @@ public class HomeFragment extends Fragment { bind.starredAlbumsRecyclerView.setAdapter(starredAlbumAdapter); homeViewModel.getStarredAlbums().observe(requireActivity(), albums -> { if(bind != null) bind.homeStarredAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); - bind.starredAlbumsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), (albums.size() / 5) > 0 ? 5 : albums.size() % 5, GridLayoutManager.HORIZONTAL, false)); + bind.starredAlbumsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false)); starredAlbumAdapter.setItems(albums); }); @@ -228,7 +229,7 @@ public class HomeFragment extends Fragment { bind.starredArtistsRecyclerView.setAdapter(starredArtistAdapter); homeViewModel.getStarredArtists().observe(requireActivity(), artists -> { if(bind != null) bind.homeStarredArtistsSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE); - bind.starredArtistsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), (artists.size() / 5) > 0 ? 5 : artists.size() % 5, GridLayoutManager.HORIZONTAL, false)); + bind.starredArtistsRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(artists.size(), 5), GridLayoutManager.HORIZONTAL, false)); starredArtistAdapter.setItems(artists); }); 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 c47f31f3..7dafde65 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java @@ -6,6 +6,7 @@ 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.ArtistID3; +import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; import com.cappielloantonio.play.subsonic.models.Child; import java.util.ArrayList; @@ -32,16 +33,20 @@ public class MappingUtil { return albums; } - public static ArrayList mapArtist(List albumID3List) { + public static ArrayList mapArtist(List artistID3List) { ArrayList artists = new ArrayList(); - for(ArtistID3 artistID3 : albumID3List){ + for(ArtistID3 artistID3 : artistID3List){ artists.add(new Artist(artistID3)); } return artists; } + public static Artist mapArtistWithAlbum(ArtistWithAlbumsID3 artistWithAlbumsID3) { + return new Artist(artistWithAlbumsID3); + } + public static ArrayList mapQueue(List queueList) { ArrayList songs = new ArrayList(); diff --git a/app/src/main/java/com/cappielloantonio/play/util/UIUtil.java b/app/src/main/java/com/cappielloantonio/play/util/UIUtil.java new file mode 100644 index 00000000..7eb50c62 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/util/UIUtil.java @@ -0,0 +1,14 @@ +package com.cappielloantonio.play.util; + +public class UIUtil { + public static int getSpanCount(int itemCount, int maxSpan) { + int itemSize = itemCount == 0 ? 1 : itemCount; + + if (itemSize / maxSpan > 0) { + return maxSpan; + } + else { + return itemSize % maxSpan; + } + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/util/Util.java b/app/src/main/java/com/cappielloantonio/play/util/Util.java deleted file mode 100644 index e7723f84..00000000 --- a/app/src/main/java/com/cappielloantonio/play/util/Util.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.cappielloantonio.play.util; - -import java.text.SimpleDateFormat; -import java.util.Date; - -public class Util { - public static String getDate() { - String pattern = "EEEE, MMMM d"; - SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); - String date = simpleDateFormat.format(new Date()); - - return date; - } -} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java index 03483275..5b0c03b0 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java @@ -1,14 +1,12 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; -import android.widget.Toast; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import com.cappielloantonio.play.adapter.DiscoverSongAdapter; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; @@ -54,9 +52,9 @@ public class HomeViewModel extends AndroidViewModel { downloadedSongSample = new MutableLiveData<>(); years = new ArrayList<>(); - mostPlayedAlbumSample = albumRepository.getListLiveAlbums("frequent", 20); - recentlyAddedAlbumSample = albumRepository.getListLiveAlbums("newest", 20); - recentlyPlayedAlbumSample = albumRepository.getListLiveAlbums("recent", 20); + mostPlayedAlbumSample = albumRepository.getAlbums("frequent", 20); + recentlyAddedAlbumSample = albumRepository.getAlbums("newest", 20); + recentlyPlayedAlbumSample = albumRepository.getAlbums("recent", 20); starredTracks = songRepository.getStarredSongs(); starredAlbums = albumRepository.getStarredAlbums(); 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 cc9e6298..a256a70c 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java @@ -5,6 +5,7 @@ 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; @@ -15,6 +16,7 @@ import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.GenreRepository; import com.cappielloantonio.play.repository.PlaylistRepository; +import java.util.ArrayList; import java.util.List; public class LibraryViewModel extends AndroidViewModel { @@ -42,6 +44,11 @@ public class LibraryViewModel extends AndroidViewModel { // sampleArtist = artistRepository.getListLiveSampleArtist(); // sampleGenres = genreRepository.getListLiveSampleGenre(); // playlistSample = playlistRepository.getRandomSample(5); + + sampleAlbum = albumRepository.getAlbums("random", 20); + sampleArtist = artistRepository.getArtists(true, 20); + sampleGenres = new MutableLiveData<>(); + playlistSample = new ArrayList<>(); } public List getPlaylistSample() { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java index a632427a..98354e87 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java @@ -15,9 +15,8 @@ import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.GenreRepository; -import com.cappielloantonio.play.repository.RecentSearchRepository; +import com.cappielloantonio.play.repository.SearchingRepository; import com.cappielloantonio.play.repository.SongRepository; -import com.cappielloantonio.play.util.PreferenceUtil; import java.util.ArrayList; import java.util.LinkedHashSet; @@ -32,7 +31,7 @@ public class SearchViewModel extends AndroidViewModel { private AlbumRepository albumRepository; private ArtistRepository artistRepository; private GenreRepository genreRepository; - private RecentSearchRepository recentSearchRepository; + private SearchingRepository searchingRepository; private LiveData> searchSong; private LiveData> searchAlbum; @@ -46,7 +45,7 @@ public class SearchViewModel extends AndroidViewModel { albumRepository = new AlbumRepository(application); artistRepository = new ArtistRepository(application); genreRepository = new GenreRepository(application); - recentSearchRepository = new RecentSearchRepository(application); + searchingRepository = new SearchingRepository(application); } public String getQuery() { @@ -82,11 +81,11 @@ public class SearchViewModel extends AndroidViewModel { } public void insertNewSearch(String search) { - recentSearchRepository.insert(new RecentSearch(search)); + searchingRepository.insert(new RecentSearch(search)); } public void deleteRecentSearch(String search) { - recentSearchRepository.delete(new RecentSearch(search)); + searchingRepository.delete(new RecentSearch(search)); } public List getSearchSuggestion(String query) { @@ -104,7 +103,7 @@ public class SearchViewModel extends AndroidViewModel { public List getRecentSearchSuggestion() { ArrayList suggestions = new ArrayList<>(); - suggestions.addAll(recentSearchRepository.getRecentSearchSuggestion(5)); + suggestions.addAll(searchingRepository.getRecentSearchSuggestion(5)); return suggestions; } diff --git a/app/src/main/res/layout/fragment_login.xml b/app/src/main/res/layout/fragment_login.xml index e73b6f98..8e36b6b2 100644 --- a/app/src/main/res/layout/fragment_login.xml +++ b/app/src/main/res/layout/fragment_login.xml @@ -52,13 +52,15 @@ app:errorEnabled="true" app:hintTextColor="?android:textColorSecondary"> + + + android:text="!$4EBXhSPUi4$E#oagvAisCA"/>