From f09d3b774d48a91eeeb0e784fa784d25297dfe7e Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Thu, 29 Jul 2021 16:00:00 +0200 Subject: [PATCH] Implemented star for tracks, albums and artists --- .../cappielloantonio/play/model/Album.java | 10 ++++ .../cappielloantonio/play/model/Artist.java | 11 ++++ .../play/repository/AlbumRepository.java | 51 +++++++++++++++++++ .../play/repository/ArtistRepository.java | 51 +++++++++++++++++++ .../play/repository/SongRepository.java | 51 +++++++++++++++++++ .../MediaAnnotationClient.java | 8 +-- .../MediaAnnotationService.java | 8 +-- .../AlbumBottomSheetDialog.java | 9 ++++ .../ArtistBottomSheetDialog.java | 9 ++++ .../viewmodel/AlbumBottomSheetViewModel.java | 10 ++++ .../viewmodel/ArtistBottomSheetViewModel.java | 16 ++++++ .../viewmodel/SongBottomSheetViewModel.java | 9 +++- .../res/layout/bottom_sheet_album_dialog.xml | 20 +++++++- .../res/layout/bottom_sheet_artist_dialog.xml | 27 ++++++++-- 14 files changed, 273 insertions(+), 17 deletions(-) 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 f87c88b3..1f019e2a 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Album.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Album.java @@ -21,6 +21,7 @@ public class Album implements Parcelable { public String artistName; public String primary; public String blurHash; + public boolean favorite; public Album(AlbumID3 albumID3) { this.id = albumID3.getId(); @@ -29,6 +30,7 @@ public class Album implements Parcelable { this.artistId = albumID3.getArtistId(); this.artistName = albumID3.getArtist(); this.primary = albumID3.getCoverArtId(); + this.favorite = albumID3.getStarred() != null; } public String getId() { return id; @@ -86,6 +88,14 @@ public class Album implements Parcelable { this.blurHash = blurHash; } + public boolean isFavorite() { + return favorite; + } + + public void setFavorite(boolean favorite) { + this.favorite = favorite; + } + @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 7c881bde..80bc1ab0 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Artist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Artist.java @@ -31,6 +31,7 @@ public class Artist implements Parcelable { public String backdrop; public String backdropBlurHash; public int albumCount; + public boolean favorite; public Artist(ArtistID3 artistID3) { this.id = artistID3.getId(); @@ -38,6 +39,7 @@ public class Artist implements Parcelable { this.primary = artistID3.getCoverArtId(); this.backdrop = artistID3.getCoverArtId(); this.albumCount = artistID3.getAlbumCount(); + this.favorite = artistID3.getStarred() != null; } public Artist(ArtistWithAlbumsID3 artistWithAlbumsID3) { @@ -47,6 +49,7 @@ public class Artist implements Parcelable { this.backdrop = artistWithAlbumsID3.getCoverArtId(); this.albumCount = artistWithAlbumsID3.getAlbumCount(); this.albums = MappingUtil.mapAlbum(artistWithAlbumsID3.getAlbums()); + this.favorite = artistWithAlbumsID3.getStarred() != null; } public Artist(String id, String name) { @@ -118,6 +121,14 @@ public class Artist implements Parcelable { this.albums = albums; } + public boolean isFavorite() { + return favorite; + } + + public void setFavorite(boolean favorite) { + this.favorite = favorite; + } + @Override public boolean equals(Object o) { if (this == o) return true; 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 7cb280f2..fd68597c 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java @@ -99,4 +99,55 @@ public class AlbumRepository { return starredAlbums; } + + public void star(String id) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .star(null, id, null) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public void unstar(String id) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .unstar(null, id, null) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public void setRating(String id, int star) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .setRating(id, star) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } } 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 171ea924..b955eda4 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -103,6 +103,57 @@ public class ArtistRepository { } } + public void star(String id) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .star(null, null, id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public void unstar(String id) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .unstar(null, null, id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public void setRating(String id, int star) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .setRating(id, star) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + 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/SongRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java index b5fa49d0..91fa758b 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -117,4 +117,55 @@ public class SongRepository { } }); } + + public void star(String id) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .star(id, null, null) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public void unstar(String id) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .unstar(id, null, null) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public void setRating(String id, int star) { + App.getSubsonicClientInstance(application, false) + .getMediaAnnotationClient() + .setRating(id, star) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java index 5e77555f..0ba51c2d 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationClient.java @@ -32,14 +32,14 @@ public class MediaAnnotationClient { this.mediaAnnotationService = retrofit.create(MediaAnnotationService.class); } - public Call star(String id) { + public Call star(String id, String albumId, String artistId) { Log.d(TAG, "star()"); - return mediaAnnotationService.star(subsonic.getParams(), id); + return mediaAnnotationService.star(subsonic.getParams(), id, albumId, artistId); } - public Call unstar(String id) { + public Call unstar(String id, String albumId, String artistId) { Log.d(TAG, "unstar()"); - return mediaAnnotationService.unstar(subsonic.getParams(), id); + return mediaAnnotationService.unstar(subsonic.getParams(), id, albumId, artistId); } public Call setRating(String id, int star) { diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationService.java b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationService.java index a3611056..7020792f 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationService.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/api/mediaannotation/MediaAnnotationService.java @@ -11,12 +11,12 @@ import retrofit2.http.QueryMap; public interface MediaAnnotationService { @GET("star") - Call star(@QueryMap Map params, @Query("id") String id); + Call star(@QueryMap Map params, @Query("id") String id, @Query("albumId") String albumId, @Query("artistId") String artistId); - @GET("stream") - Call unstar(@QueryMap Map params, @Query("id") String id); + @GET("unstar") + Call unstar(@QueryMap Map params, @Query("id") String id, @Query("albumId") String albumId, @Query("artistId") String artistId); - @GET("stream") + @GET("setRating") Call setRating(@QueryMap Map params, @Query("id") String id, @Query("star") int star); @GET("scrobble") 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 0c672354..0318906f 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 @@ -8,6 +8,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import android.widget.ToggleButton; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; @@ -43,6 +44,7 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements private ImageView coverAlbum; private TextView titleAlbum; private TextView artistAlbum; + private ToggleButton favoriteToggle; private TextView playRadio; private TextView playRandom; @@ -83,6 +85,13 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements artistAlbum = view.findViewById(R.id.album_artist_text_view); artistAlbum.setText(albumBottomSheetViewModel.getAlbum().getArtistName()); + favoriteToggle = view.findViewById(R.id.button_favorite); + favoriteToggle.setChecked(albumBottomSheetViewModel.getAlbum().isFavorite()); + favoriteToggle.setOnClickListener(v -> { + albumBottomSheetViewModel.setFavorite(); + dismissBottomSheet(); + }); + playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { SyncUtil.getInstantMix(requireContext(), new MediaCallback() { 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 777d92b3..42800fa5 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 @@ -8,6 +8,7 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import android.widget.ToggleButton; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; @@ -39,6 +40,7 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement private ImageView coverArtist; private TextView nameArtist; + private ToggleButton favoriteToggle; private TextView playRadio; private TextView playRandom; @@ -71,6 +73,13 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement nameArtist.setText(artistBottomSheetViewModel.getArtist().getName()); nameArtist.setSelected(true); + favoriteToggle = view.findViewById(R.id.button_favorite); + favoriteToggle.setChecked(artistBottomSheetViewModel.getArtist().isFavorite()); + favoriteToggle.setOnClickListener(v -> { + artistBottomSheetViewModel.setFavorite(); + dismissBottomSheet(); + }); + playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { SyncUtil.getInstantMix(requireContext(), new MediaCallback() { 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 9d0cd1a8..cc8db142 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java @@ -32,4 +32,14 @@ public class AlbumBottomSheetViewModel extends AndroidViewModel { // return artistRepository.getArtistByID(album.getArtistId()); return null; } + + public void setFavorite() { + if (album.isFavorite()) { + artistRepository.unstar(album.getId()); + album.setFavorite(false); + } else { + artistRepository.star(album.getId()); + album.setFavorite(true); + } + } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java index 7ce9a7a4..3fa7cf12 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java @@ -6,12 +6,18 @@ import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.repository.AlbumRepository; +import com.cappielloantonio.play.repository.ArtistRepository; public class ArtistBottomSheetViewModel extends AndroidViewModel { + private AlbumRepository albumRepository; + private Artist artist; public ArtistBottomSheetViewModel(@NonNull Application application) { super(application); + + albumRepository = new AlbumRepository(application); } public Artist getArtist() { @@ -21,4 +27,14 @@ public class ArtistBottomSheetViewModel extends AndroidViewModel { public void setArtist(Artist artist) { this.artist = artist; } + + public void setFavorite() { + if (artist.isFavorite()) { + albumRepository.unstar(artist.getId()); + artist.setFavorite(false); + } else { + albumRepository.star(artist.getId()); + artist.setFavorite(true); + } + } } 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 16f004c6..424d76fb 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java @@ -36,8 +36,13 @@ public class SongBottomSheetViewModel extends AndroidViewModel { } public void setFavorite() { - song.setFavorite(!song.isFavorite()); - // songRepository.setFavoriteStatus(song); + if (song.isFavorite()) { + songRepository.unstar(song.getId()); + song.setFavorite(false); + } else { + songRepository.star(song.getId()); + song.setFavorite(true); + } } public Album getAlbum() { 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 afa45758..e5c15202 100644 --- a/app/src/main/res/layout/bottom_sheet_album_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_album_dialog.xml @@ -23,6 +23,22 @@ app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + @@ -55,7 +71,7 @@ android:text="@string/label_placeholder" android:textColor="@color/subtitleTextColor" android:textSize="12sp" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/button_favorite" app:layout_constraintStart_toEndOf="@+id/album_cover_image_view" app:layout_constraintTop_toBottomOf="@+id/album_title_text_view" /> diff --git a/app/src/main/res/layout/bottom_sheet_artist_dialog.xml b/app/src/main/res/layout/bottom_sheet_artist_dialog.xml index 81022e3a..f473d822 100644 --- a/app/src/main/res/layout/bottom_sheet_artist_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_artist_dialog.xml @@ -9,9 +9,10 @@ + android:layout_marginStart="20dp" + android:layout_marginTop="12dp" + android:layout_marginEnd="12dp" + android:clipChildren="false"> + + -