From 98ffec9b72d240238211d0b555174239c43cb6f8 Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Fri, 30 Jul 2021 14:09:50 +0200 Subject: [PATCH] Implementation of album and artist catalog recovery --- .../cappielloantonio/play/model/Artist.java | 25 ++++++ .../play/repository/AlbumRepository.java | 48 +++++++++++ .../play/repository/ArtistRepository.java | 49 +++++++++++ .../play/subsonic/models/ArtistInfo2.java | 33 +++----- .../play/subsonic/models/ArtistInfoBase.java | 84 +++---------------- .../subsonic/models/SubsonicResponse.java | 1 + .../ui/fragment/AlbumCatalogueFragment.java | 15 +++- .../play/ui/fragment/AlbumPageFragment.java | 37 +++----- .../ui/fragment/ArtistCatalogueFragment.java | 9 +- .../play/ui/fragment/ArtistPageFragment.java | 29 +++---- .../play/util/MappingUtil.java | 5 ++ .../viewmodel/AlbumCatalogueViewModel.java | 60 ++++++++++++- .../play/viewmodel/AlbumPageViewModel.java | 18 ++-- .../viewmodel/ArtistCatalogueViewModel.java | 57 ++++++++++++- .../play/viewmodel/ArtistPageViewModel.java | 20 ++++- 15 files changed, 330 insertions(+), 160 deletions(-) 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 80bc1ab0..f3f20a53 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Artist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Artist.java @@ -11,6 +11,7 @@ import androidx.room.Ignore; import androidx.room.PrimaryKey; 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.util.MappingUtil; @@ -23,6 +24,7 @@ public class Artist implements Parcelable { public List genres; public List albums; public List songs; + public List similarArtists; public String id; public String name; @@ -32,6 +34,7 @@ public class Artist implements Parcelable { public String backdropBlurHash; public int albumCount; public boolean favorite; + public String bio; public Artist(ArtistID3 artistID3) { this.id = artistID3.getId(); @@ -52,6 +55,11 @@ public class Artist implements Parcelable { this.favorite = artistWithAlbumsID3.getStarred() != null; } + public Artist(ArtistInfo2 artistInfo2) { + this.similarArtists = MappingUtil.mapArtist(artistInfo2.getSimilarArtists()); + this.bio = artistInfo2.getBiography(); + } + public Artist(String id, String name) { this.id = id; this.name = name; @@ -129,6 +137,23 @@ public class Artist implements Parcelable { this.favorite = favorite; } + + public List getSimilarArtists() { + return similarArtists; + } + + public void setSimilarArtists(List similarArtists) { + this.similarArtists = similarArtists; + } + + public String getBio() { + return bio; + } + + public void setBio(String bio) { + this.bio = bio; + } + @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 fd68597c..2a8348bd 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java @@ -7,6 +7,7 @@ import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.subsonic.models.ResponseStatus; import com.cappielloantonio.play.subsonic.models.SubsonicResponse; import com.cappielloantonio.play.util.MappingUtil; @@ -94,6 +95,7 @@ public class AlbumRepository { @Override public void onFailure(Call call, Throwable t) { + } }); @@ -150,4 +152,50 @@ public class AlbumRepository { } }); } + + public MutableLiveData> getAlbumTracks(String id) { + MutableLiveData> albumTracks = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getAlbum(id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + List tracks = new ArrayList<>(MappingUtil.mapSong(response.body().getAlbum().getSongs())); + albumTracks.setValue(tracks); + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return albumTracks; + } + + public MutableLiveData> getArtistAlbums(String id) { + MutableLiveData> artistsAlbum = 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)) { + List albums = new ArrayList<>(MappingUtil.mapAlbum(response.body().getArtist().getAlbums())); + artistsAlbum.setValue(albums); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return artistsAlbum; + } } 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 b955eda4..89de4b92 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -5,6 +5,7 @@ import android.app.Application; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; import com.cappielloantonio.play.subsonic.models.IndexID3; @@ -84,6 +85,9 @@ public class ArtistRepository { } } + /* + * Metodo che mi restituisce le informazioni essenzionali dell'artista (cover, numero di album...) + */ public void getArtistInfo(List artists, MutableLiveData> list) { for (Artist artist : artists) { App.getSubsonicClientInstance(application, false) @@ -103,6 +107,51 @@ public class ArtistRepository { } } + public MutableLiveData getArtistInfo(String id) { + MutableLiveData artist = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getArtist(id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + artist.setValue(MappingUtil.mapArtistWithAlbum(response.body().getArtist())); + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return artist; + } + + /* + * Metodo che mi restituisce le informazioni complete dell'artista (bio, immagini prese da last.fm, artisti simili...) + */ + public MutableLiveData getArtistFullInfo(String id) { + MutableLiveData artistFullInfo = new MutableLiveData<>(); + + App.getSubsonicClientInstance(application, false) + .getBrowsingClient() + .getArtistInfo2(id) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, Response response) { + artistFullInfo.setValue(MappingUtil.mapArtist(response.body().getArtistInfo2())); + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + + return artistFullInfo; + } + public void star(String id) { App.getSubsonicClientInstance(application, false) .getMediaAnnotationClient() diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfo2.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfo2.java index 46d910a9..f9e73557 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfo2.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfo2.java @@ -1,36 +1,25 @@ package com.cappielloantonio.play.subsonic.models; +import com.tickaroo.tikxml.annotation.Element; +import com.tickaroo.tikxml.annotation.ElementNameMatcher; +import com.tickaroo.tikxml.annotation.Xml; + import java.util.ArrayList; import java.util.List; +@Xml public class ArtistInfo2 extends ArtistInfoBase { - + @Element(name = "similarArtist", typesByElement = @ElementNameMatcher(type = ArtistID3.class)) protected List similarArtists; - /** - * Gets the value of the similarArtists 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 similarArtists property. - * - *

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

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

- * Objects of the following type(s) are allowed in the list - * {@link ArtistID3 } - */ public List getSimilarArtists() { if (similarArtists == null) { - similarArtists = new ArrayList(); + similarArtists = new ArrayList<>(); } return this.similarArtists; } + + public void setSimilarArtists(List similarArtists) { + this.similarArtists = similarArtists; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfoBase.java b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfoBase.java index 178e92b3..121364d6 100644 --- a/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfoBase.java +++ b/app/src/main/java/com/cappielloantonio/play/subsonic/models/ArtistInfoBase.java @@ -1,129 +1,67 @@ package com.cappielloantonio.play.subsonic.models; +import com.tickaroo.tikxml.annotation.PropertyElement; +import com.tickaroo.tikxml.annotation.Xml; + +@Xml public class ArtistInfoBase { + @PropertyElement protected String biography; + @PropertyElement protected String musicBrainzId; + @PropertyElement protected String lastFmUrl; + @PropertyElement protected String smallImageUrl; + @PropertyElement protected String mediumImageUrl; + @PropertyElement protected String largeImageUrl; - /** - * Gets the value of the biography property. - * - * @return possible object is - * {@link String } - */ public String getBiography() { return biography; } - /** - * Sets the value of the biography property. - * - * @param value allowed object is - * {@link String } - */ public void setBiography(String value) { this.biography = value; } - /** - * Gets the value of the musicBrainzId property. - * - * @return possible object is - * {@link String } - */ public String getMusicBrainzId() { return musicBrainzId; } - /** - * Sets the value of the musicBrainzId property. - * - * @param value allowed object is - * {@link String } - */ public void setMusicBrainzId(String value) { this.musicBrainzId = value; } - /** - * Gets the value of the lastFmUrl property. - * - * @return possible object is - * {@link String } - */ public String getLastFmUrl() { return lastFmUrl; } - /** - * Sets the value of the lastFmUrl property. - * - * @param value allowed object is - * {@link String } - */ public void setLastFmUrl(String value) { this.lastFmUrl = value; } - /** - * Gets the value of the smallImageUrl property. - * - * @return possible object is - * {@link String } - */ public String getSmallImageUrl() { return smallImageUrl; } - /** - * Sets the value of the smallImageUrl property. - * - * @param value allowed object is - * {@link String } - */ public void setSmallImageUrl(String value) { this.smallImageUrl = value; } - /** - * Gets the value of the mediumImageUrl property. - * - * @return possible object is - * {@link String } - */ public String getMediumImageUrl() { return mediumImageUrl; } - /** - * Sets the value of the mediumImageUrl property. - * - * @param value allowed object is - * {@link String } - */ public void setMediumImageUrl(String value) { this.mediumImageUrl = value; } - - /** - * Gets the value of the largeImageUrl property. - * - * @return possible object is - * {@link String } - */ + public String getLargeImageUrl() { return largeImageUrl; } - /** - * Sets the value of the largeImageUrl property. - * - * @param value allowed object is - * {@link String } - */ public void setLargeImageUrl(String value) { this.largeImageUrl = value; } 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 75943ee9..faef92ab 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 @@ -14,6 +14,7 @@ public class SubsonicResponse { @Element(name = "similarSongs2") private SimilarSongs2 similarSongs2; private SimilarSongs similarSongs; + @Element(name = "artistInfo2") private ArtistInfo2 artistInfo2; private ArtistInfo artistInfo; private AlbumInfo albumInfo; diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java index cce071f5..68f1a051 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java @@ -3,6 +3,7 @@ package com.cappielloantonio.play.ui.fragment; import android.annotation.SuppressLint; import android.content.Context; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuInflater; @@ -36,11 +37,14 @@ public class AlbumCatalogueFragment extends Fragment { private AlbumCatalogueViewModel albumCatalogueViewModel; private AlbumCatalogueAdapter albumAdapter; + private GridLayoutManager gridLayoutManager; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); + + initData(); } @Override @@ -49,7 +53,6 @@ public class AlbumCatalogueFragment extends Fragment { bind = FragmentAlbumCatalogueBinding.inflate(inflater, container, false); View view = bind.getRoot(); - albumCatalogueViewModel = new ViewModelProvider(requireActivity()).get(AlbumCatalogueViewModel.class); initAppBar(); initAlbumCatalogueView(); @@ -69,6 +72,11 @@ public class AlbumCatalogueFragment extends Fragment { bind = null; } + private void initData() { + albumCatalogueViewModel = new ViewModelProvider(requireActivity()).get(AlbumCatalogueViewModel.class); + albumCatalogueViewModel.loadAlbums(requireContext(), 500); + } + private void initAppBar() { activity.setSupportActionBar(bind.toolbar); @@ -94,13 +102,16 @@ public class AlbumCatalogueFragment extends Fragment { @SuppressLint("ClickableViewAccessibility") private void initAlbumCatalogueView() { - bind.albumCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); + gridLayoutManager = new GridLayoutManager(requireContext(), 2); + + bind.albumCatalogueRecyclerView.setLayoutManager(gridLayoutManager); bind.albumCatalogueRecyclerView.addItemDecoration(new GridItemDecoration(2, 20, false)); bind.albumCatalogueRecyclerView.setHasFixedSize(true); albumAdapter = new AlbumCatalogueAdapter(activity, requireContext()); albumAdapter.setStateRestorationPolicy(RecyclerView.Adapter.StateRestorationPolicy.PREVENT_WHEN_EMPTY); bind.albumCatalogueRecyclerView.setAdapter(albumAdapter); + albumCatalogueViewModel.getAlbumList().observe(requireActivity(), albums -> { albumAdapter.setItems(albums); }); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java index 78a73e0c..9bec2b2a 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java @@ -100,7 +100,7 @@ public class AlbumPageFragment extends Fragment { public boolean onOptionsItemSelected(@NonNull MenuItem item) { switch (item.getItemId()) { case R.id.action_download_album: - DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(albumPageViewModel.getAlbumSongList()); + DownloadUtil.getDownloadTracker(requireContext()).toggleDownload(albumPageViewModel.getAlbumSongLiveList().getValue()); return true; default: break; @@ -132,20 +132,21 @@ public class AlbumPageFragment extends Fragment { private void initAlbumInfoTextButton() { bind.albumArtistLabel.setOnClickListener(v -> { - Artist artist = albumPageViewModel.getArtist(); - if(artist != null) { - Bundle bundle = new Bundle(); - bundle.putParcelable("artist_object", artist); - activity.navController.navigate(R.id.action_albumPageFragment_to_artistPageFragment, bundle); - } - else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); + albumPageViewModel.getArtist().observe(requireActivity(), artist -> { + if(artist != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artist); + activity.navController.navigate(R.id.action_albumPageFragment_to_artistPageFragment, bundle); + } + else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); + }); }); bind.albumReleaseYearLabel.setOnClickListener(v -> { - Bundle bundle = new Bundle(); + /*Bundle bundle = new Bundle(); bundle.putString(Song.BY_YEAR, Song.BY_YEAR); bundle.putInt("year_object", albumPageViewModel.getAlbum().getYear()); - activity.navController.navigate(R.id.action_albumPageFragment_to_songListPageFragment, bundle); + activity.navController.navigate(R.id.action_albumPageFragment_to_songListPageFragment, bundle);*/ }); } @@ -197,22 +198,6 @@ public class AlbumPageFragment extends Fragment { } private void initSimilarAlbumsView() { - SyncUtil.getSimilarItems(requireContext(), new MediaCallback() { - @Override - public void onError(Exception exception) { - // Toast.makeText(requireContext(), "Error retrieving similar items", Toast.LENGTH_SHORT).show(); - } - @Override - public void onLoadMedia(List media) { - bind.similarAlbumSector.setVisibility(View.VISIBLE); - - bind.similarAlbumsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); - - albumArtistPageOrSimilarAdapter = new AlbumArtistPageOrSimilarAdapter(requireContext()); - bind.similarAlbumsRecyclerView.setAdapter(albumArtistPageOrSimilarAdapter); - albumArtistPageOrSimilarAdapter.setItems((ArrayList) media); - } - }, SyncUtil.ALBUM, albumPageViewModel.getAlbum().getId(), PreferenceUtil.getInstance(requireContext()).getSimilarItemsNumber()); } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java index ff9810b9..ffbfcff7 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java @@ -26,6 +26,7 @@ import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; import com.cappielloantonio.play.helper.recyclerview.GridItemDecoration; import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.viewmodel.AlbumCatalogueViewModel; import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; public class ArtistCatalogueFragment extends Fragment { @@ -41,6 +42,8 @@ public class ArtistCatalogueFragment extends Fragment { public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setHasOptionsMenu(true); + + initData(); } @Override @@ -49,7 +52,6 @@ public class ArtistCatalogueFragment extends Fragment { bind = FragmentArtistCatalogueBinding.inflate(inflater, container, false); View view = bind.getRoot(); - artistCatalogueViewModel = new ViewModelProvider(requireActivity()).get(ArtistCatalogueViewModel.class); initAppBar(); initArtistCatalogueView(); @@ -69,6 +71,11 @@ public class ArtistCatalogueFragment extends Fragment { bind = null; } + private void initData() { + artistCatalogueViewModel = new ViewModelProvider(requireActivity()).get(ArtistCatalogueViewModel.class); + artistCatalogueViewModel.loadArtists(requireContext()); + } + private void initAppBar() { activity.setSupportActionBar(bind.toolbar); 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 2ae1875d..6a1bd206 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 @@ -1,7 +1,9 @@ package com.cappielloantonio.play.ui.fragment; +import android.annotation.SuppressLint; import android.graphics.BlendMode; import android.graphics.BlendModeColorFilter; +import android.os.Build; import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; @@ -9,6 +11,7 @@ import android.view.ViewGroup; import android.widget.Toast; import androidx.annotation.Nullable; +import androidx.annotation.RequiresApi; import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; @@ -16,6 +19,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; +import com.cappielloantonio.play.adapter.AlbumAdapter; import com.cappielloantonio.play.adapter.AlbumArtistPageOrSimilarAdapter; import com.cappielloantonio.play.adapter.ArtistSimilarAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; @@ -93,6 +97,7 @@ public class ArtistPageFragment extends Fragment { }); } + @SuppressLint("NewApi") private void initAppBar() { activity.setSupportActionBar(bind.animToolbar); if (activity.getSupportActionBar() != null) @@ -168,22 +173,14 @@ public class ArtistPageFragment extends Fragment { } private void initSimilarArtistsView() { - SyncUtil.getSimilarItems(requireContext(), new MediaCallback() { - @Override - public void onError(Exception exception) { - // Toast.makeText(requireContext(), "Error retrieving similar items", Toast.LENGTH_SHORT).show(); - } + bind.similarArtistsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); + bind.similarArtistsRecyclerView.setHasFixedSize(true); - @Override - public void onLoadMedia(List media) { - bind.similarArtistSector.setVisibility(View.VISIBLE); - - bind.similarArtistsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); - - artistSimilarAdapter = new ArtistSimilarAdapter(requireContext()); - bind.similarArtistsRecyclerView.setAdapter(artistSimilarAdapter); - artistSimilarAdapter.setItems((ArrayList) media); - } - }, SyncUtil.ARTIST, artistPageViewModel.getArtist().getId(), PreferenceUtil.getInstance(requireContext()).getSimilarItemsNumber()); + artistSimilarAdapter = new ArtistSimilarAdapter(requireContext()); + bind.similarArtistsRecyclerView.setAdapter(artistSimilarAdapter); + artistPageViewModel.getArtistInfo(artistPageViewModel.getArtist().getId()).observe(requireActivity(), artist -> { + if(bind != null) bind.similarArtistSector.setVisibility(!artist.getSimilarArtists().isEmpty() ? View.VISIBLE : View.GONE); + artistSimilarAdapter.setItems(artist.getSimilarArtists()); + }); } } \ No newline at end of file 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 36cc5e2c..e066b410 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/MappingUtil.java @@ -8,6 +8,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.ArtistInfo2; import com.cappielloantonio.play.subsonic.models.ArtistWithAlbumsID3; import com.cappielloantonio.play.subsonic.models.Child; import com.cappielloantonio.play.subsonic.models.Playlists; @@ -46,6 +47,10 @@ public class MappingUtil { return artists; } + public static Artist mapArtist(ArtistInfo2 artistInfo2) { + return new Artist(artistInfo2); + } + public static Artist mapArtistWithAlbum(ArtistWithAlbumsID3 artistWithAlbumsID3) { return new Artist(artistWithAlbumsID3); } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java index cf265842..a70cba9b 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java @@ -1,20 +1,35 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; +import android.content.Context; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; 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.repository.AlbumRepository; +import com.cappielloantonio.play.subsonic.models.AlbumID3; +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.List; +import retrofit2.Call; +import retrofit2.Callback; + public class AlbumCatalogueViewModel extends AndroidViewModel { - public LiveData> albumList; + private MutableLiveData> albumList = new MutableLiveData<>(new ArrayList<>()); + private AlbumRepository albumRepository; private String query = ""; + private int page = 0; public AlbumCatalogueViewModel(@NonNull Application application) { super(application); @@ -23,10 +38,51 @@ public class AlbumCatalogueViewModel extends AndroidViewModel { } public LiveData> getAlbumList() { - // albumList = albumRepository.getListLiveAlbums(); return albumList; } + public void loadAlbums(Context context, int size) { + retrieveAlbums(context, new MediaCallback() { + @Override + public void onError(Exception exception) { + } + + @Override + public void onLoadMedia(List media) { + List liveAlbum = albumList.getValue(); + liveAlbum.addAll(MappingUtil.mapAlbum((List) media)); + albumList.setValue(liveAlbum); + + if (media.size() == size) { + loadAlbums(context, size); + } + } + }, size, size * page++); + } + + + private void retrieveAlbums(Context context, MediaCallback callback, int size, int offset) { + App.getSubsonicClientInstance(context, false) + .getAlbumSongListClient() + .getAlbumList2("alphabeticalByName", size, offset) + .enqueue(new Callback() { + @Override + public void onResponse(Call call, retrofit2.Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List albumList = new ArrayList<>(); + albumList.addAll(response.body().getAlbumList2().getAlbums()); + callback.onLoadMedia(albumList); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + callback.onError(new Exception(t.getMessage())); + } + }); + } + + public String getQuery() { return query; } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumPageViewModel.java index 0a5ef394..6201b468 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumPageViewModel.java @@ -5,10 +5,12 @@ 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 com.cappielloantonio.play.repository.SongRepository; @@ -16,9 +18,10 @@ import java.util.List; public class AlbumPageViewModel extends AndroidViewModel { private SongRepository songRepository; + private AlbumRepository albumRepository; private ArtistRepository artistRepository; - private LiveData> songLiveList; + private LiveData> songLiveList = new MutableLiveData<>(); private Album album; @@ -26,19 +29,15 @@ public class AlbumPageViewModel extends AndroidViewModel { super(application); songRepository = new SongRepository(application); + albumRepository = new AlbumRepository(application); artistRepository = new ArtistRepository(application); } public LiveData> getAlbumSongLiveList() { - // songLiveList = songRepository.getAlbumListLiveSong(album.getId()); + songLiveList = albumRepository.getAlbumTracks(album.getId()); return songLiveList; } - public List getAlbumSongList() { - // return songRepository.getAlbumListSong(album.getId(), false); - return null; - } - public Album getAlbum() { return album; } @@ -47,8 +46,7 @@ public class AlbumPageViewModel extends AndroidViewModel { this.album = album; } - public Artist getArtist() { - // return artistRepository.getArtistByID(album.getArtistId()); - return null; + public LiveData getArtist() { + return artistRepository.getArtistInfo(album.getArtistId()); } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java index 3b83e5f1..2cc2ccd0 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java @@ -1,20 +1,37 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; +import android.content.Context; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; 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.repository.ArtistRepository; +import com.cappielloantonio.play.subsonic.models.AlbumID3; +import com.cappielloantonio.play.subsonic.models.ArtistID3; +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.List; -public class ArtistCatalogueViewModel extends AndroidViewModel { - private ArtistRepository artistRepository; +import retrofit2.Call; +import retrofit2.Callback; - private LiveData> artistList; +public class ArtistCatalogueViewModel extends AndroidViewModel { + private MutableLiveData> artistList = new MutableLiveData<>(new ArrayList<>()); + + private ArtistRepository artistRepository; + private String query = ""; + private int page = 0; public ArtistCatalogueViewModel(@NonNull Application application) { super(application); @@ -23,7 +40,39 @@ public class ArtistCatalogueViewModel extends AndroidViewModel { } public LiveData> getArtistList() { - // artistList = artistRepository.getListLiveArtists(); return artistList; } + + public void loadArtists(Context context) { + App.getSubsonicClientInstance(context, false) + .getBrowsingClient() + .getArtists() + .enqueue(new Callback() { + @Override + public void onResponse(Call call, retrofit2.Response response) { + if (response.body().getStatus().getValue().equals(ResponseStatus.OK)) { + List artists = new ArrayList<>(); + + for (IndexID3 index : response.body().getArtists().getIndices()) { + artists.addAll(index.getArtists()); + } + + artistList.setValue(MappingUtil.mapArtist(artists)); + } + } + + @Override + public void onFailure(Call call, Throwable t) { + + } + }); + } + + public String getQuery() { + return query; + } + + public void setQuery(String query) { + this.query = query; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java index e4a60c49..20c1923c 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java @@ -5,22 +5,28 @@ 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 com.cappielloantonio.play.repository.SongRepository; +import java.util.ArrayList; import java.util.List; public class ArtistPageViewModel extends AndroidViewModel { private SongRepository songRepository; private AlbumRepository albumRepository; + private ArtistRepository artistRepository; - private List randomList; - private LiveData> songList; - private LiveData> albumList; + private List randomList = new ArrayList<>(); + private LiveData> songList = new MutableLiveData<>(); + private LiveData> albumList = new MutableLiveData<>(); + private LiveData> artistList = new MutableLiveData<>(); + private LiveData artistInfo = new MutableLiveData<>(); private Artist artist; @@ -29,13 +35,19 @@ public class ArtistPageViewModel extends AndroidViewModel { songRepository = new SongRepository(application); albumRepository = new AlbumRepository(application); + artistRepository = new ArtistRepository(application); } public LiveData> getAlbumList() { - // albumList = albumRepository.getArtistListLiveAlbums(artist.id); + albumList = albumRepository.getArtistAlbums(artist.id); return albumList; } + public LiveData getArtistInfo(String id) { + artistInfo = artistRepository.getArtistFullInfo(id); + return artistInfo; + } + public List getArtistRandomSongList() { // randomList = songRepository.getArtistListLiveRandomSong(artist.id); return randomList;