diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistSimilarAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistSimilarAdapter.java new file mode 100644 index 00000000..3d23146f --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistSimilarAdapter.java @@ -0,0 +1,96 @@ +package com.cappielloantonio.play.adapter; + +import android.content.Context; +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.navigation.Navigation; +import androidx.recyclerview.widget.RecyclerView; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.glide.CustomGlideRequest; +import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; + +import java.util.ArrayList; +import java.util.List; + +public class ArtistSimilarAdapter extends RecyclerView.Adapter { + private static final String TAG = "AlbumArtistPageAdapter"; + + private List artists; + private LayoutInflater inflater; + private Context context; + + public ArtistSimilarAdapter(Context context) { + this.context = context; + this.inflater = LayoutInflater.from(context); + this.artists = new ArrayList<>(); + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = inflater.inflate(R.layout.item_library_similar_artist, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Artist artist = artists.get(position); + + holder.textArtistName.setText(artist.getName()); + + CustomGlideRequest.Builder + .from(context, artist.getPrimary(), artist.getPrimaryBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.LOW_QUALITY, CustomGlideRequest.ALBUM_PIC) + .build() + .into(holder.cover); + } + + @Override + public int getItemCount() { + return artists.size(); + } + + public Artist getItem(int position) { + return artists.get(position); + } + + public void setItems(List artists) { + this.artists = artists; + notifyDataSetChanged(); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { + TextView textArtistName; + ImageView cover; + + ViewHolder(View itemView) { + super(itemView); + + textArtistName = itemView.findViewById(R.id.artist_name_label); + cover = itemView.findViewById(R.id.similar_artist_cover_image_view); + + itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); + } + + @Override + public void onClick(View view) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artists.get(getBindingAdapterPosition())); + Navigation.findNavController(view).navigate(R.id.artistPageFragment, bundle); + } + + @Override + public boolean onLongClick(View view) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artists.get(getBindingAdapterPosition())); + Navigation.findNavController(view).navigate(R.id.artistBottomSheetDialog, bundle); + return true; + } + } +} 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 de2584d9..8f58f984 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 @@ -17,10 +17,13 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumArtistPageOrSimilarAdapter; +import com.cappielloantonio.play.adapter.ArtistSimilarAdapter; import com.cappielloantonio.play.adapter.SongResultSearchAdapter; import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.interfaces.MediaCallback; +import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.service.MusicPlayerRemote; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; @@ -40,6 +43,7 @@ public class ArtistPageFragment extends Fragment { private SongResultSearchAdapter songResultSearchAdapter; private AlbumArtistPageOrSimilarAdapter albumArtistPageOrSimilarAdapter; + private ArtistSimilarAdapter artistSimilarAdapter; @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { @@ -61,6 +65,7 @@ public class ArtistPageFragment extends Fragment { initPlayButtons(); initTopSongsView(); initAlbumsView(); + initSimilarArtistsView(); return view; } @@ -162,4 +167,24 @@ public class ArtistPageFragment extends Fragment { bind.albumsRecyclerView.setAdapter(albumArtistPageOrSimilarAdapter); artistPageViewModel.getAlbumList().observe(requireActivity(), songs -> albumArtistPageOrSimilarAdapter.setItems(songs)); } + + 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(); + } + + @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()); + } } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_artist_page.xml b/app/src/main/res/layout/fragment_artist_page.xml index 5789761d..4dc759f7 100644 --- a/app/src/main/res/layout/fragment_artist_page.xml +++ b/app/src/main/res/layout/fragment_artist_page.xml @@ -169,6 +169,35 @@ android:paddingTop="8dp" android:paddingEnd="8dp" android:paddingBottom="8dp" /> + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_library_similar_artist.xml b/app/src/main/res/layout/item_library_similar_artist.xml new file mode 100644 index 00000000..223beaff --- /dev/null +++ b/app/src/main/res/layout/item_library_similar_artist.xml @@ -0,0 +1,30 @@ + + + + + + + \ No newline at end of file