diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/ArtistPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/ArtistPageFragment.java index 4558fa86..0e4f050c 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/ArtistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/ArtistPageFragment.java @@ -16,17 +16,20 @@ import androidx.media3.common.util.UnstableApi; import androidx.media3.session.MediaBrowser; import androidx.media3.session.SessionToken; import androidx.navigation.Navigation; +import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.tempo.R; import com.cappielloantonio.tempo.databinding.FragmentArtistPageBinding; import com.cappielloantonio.tempo.glide.CustomGlideRequest; import com.cappielloantonio.tempo.helper.recyclerview.CustomLinearSnapHelper; +import com.cappielloantonio.tempo.helper.recyclerview.GridItemDecoration; import com.cappielloantonio.tempo.interfaces.ClickCallback; import com.cappielloantonio.tempo.service.MediaManager; import com.cappielloantonio.tempo.service.MediaService; import com.cappielloantonio.tempo.ui.activity.MainActivity; import com.cappielloantonio.tempo.ui.adapter.AlbumArtistPageOrSimilarAdapter; +import com.cappielloantonio.tempo.ui.adapter.AlbumCatalogueAdapter; import com.cappielloantonio.tempo.ui.adapter.ArtistSimilarAdapter; import com.cappielloantonio.tempo.ui.adapter.SongHorizontalAdapter; import com.cappielloantonio.tempo.util.Constants; @@ -42,6 +45,7 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { private SongHorizontalAdapter songHorizontalAdapter; private AlbumArtistPageOrSimilarAdapter albumArtistPageOrSimilarAdapter; + private AlbumCatalogueAdapter albumCatalogueAdapter; private ArtistSimilarAdapter artistSimilarAdapter; private ListenableFuture mediaBrowserListenableFuture; @@ -59,7 +63,8 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { initArtistInfo(); initPlayButtons(); initTopSongsView(); - initAlbumsView(); + initHorizontalAlbumsView(); + initVerticalAlbumsView(); initSimilarArtistsView(); return view; @@ -93,6 +98,13 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { bundle.putParcelable(Constants.ARTIST_OBJECT, artistPageViewModel.getArtist()); activity.navController.navigate(R.id.action_artistPageFragment_to_songListPageFragment, bundle); }); + + bind.artistPageAlbumsSwitchLayoutTextViewClickable.setOnClickListener(view -> { + boolean isHorizontalRecyclerViewVisible = bind.albumsHorizontalRecyclerView.getVisibility() == View.VISIBLE; + + bind.albumsHorizontalRecyclerView.setVisibility(isHorizontalRecyclerViewVisible ? View.GONE : View.VISIBLE); + bind.albumsVerticalRecyclerView.setVisibility(isHorizontalRecyclerViewVisible ? View.VISIBLE : View.GONE); + }); } private void initAppBar() { @@ -107,8 +119,9 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { private void initArtistInfo() { artistPageViewModel.getArtistInfo(artistPageViewModel.getArtist().getId()).observe(getViewLifecycleOwner(), artistInfo -> { - if(artistInfo == null) { - if (bind != null) bind.artistPageBioPlaceholder.placeholder.setVisibility(View.VISIBLE); + if (artistInfo == null) { + if (bind != null) + bind.artistPageBioPlaceholder.placeholder.setVisibility(View.VISIBLE); if (bind != null) bind.artistPageBioSector.setVisibility(View.GONE); } else { String normalizedBio = MusicUtil.forceReadableString(artistInfo.getBiography()); @@ -131,7 +144,8 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { startActivity(intent); }); - if (bind != null) bind.artistPageBioPlaceholder.placeholder.setVisibility(View.GONE); + if (bind != null) + bind.artistPageBioPlaceholder.placeholder.setVisibility(View.GONE); if (bind != null) bind.artistPageBioSector.setVisibility(View.VISIBLE); } }); @@ -168,34 +182,63 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { bind.mostStreamedSongRecyclerView.setAdapter(songHorizontalAdapter); artistPageViewModel.getArtistTopSongList().observe(getViewLifecycleOwner(), songs -> { if (songs == null) { - if (bind != null) bind.artistPageTopTracksPlaceholder.placeholder.setVisibility(View.VISIBLE); + if (bind != null) + bind.artistPageTopTracksPlaceholder.placeholder.setVisibility(View.VISIBLE); if (bind != null) bind.artistPageTopSongsSector.setVisibility(View.GONE); } else { - if (bind != null) bind.artistPageTopTracksPlaceholder.placeholder.setVisibility(View.GONE); - if (bind != null) bind.artistPageTopSongsSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); + if (bind != null) + bind.artistPageTopTracksPlaceholder.placeholder.setVisibility(View.GONE); + if (bind != null) + bind.artistPageTopSongsSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE); songHorizontalAdapter.setItems(songs); } }); } - private void initAlbumsView() { - bind.albumsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); + private void initHorizontalAlbumsView() { + bind.albumsHorizontalRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); albumArtistPageOrSimilarAdapter = new AlbumArtistPageOrSimilarAdapter(this); - bind.albumsRecyclerView.setAdapter(albumArtistPageOrSimilarAdapter); + bind.albumsHorizontalRecyclerView.setAdapter(albumArtistPageOrSimilarAdapter); artistPageViewModel.getAlbumList().observe(getViewLifecycleOwner(), albums -> { if (albums == null) { - if (bind != null) bind.artistPageAlbumPlaceholder.placeholder.setVisibility(View.VISIBLE); + if (bind != null) + bind.artistPageAlbumPlaceholder.placeholder.setVisibility(View.VISIBLE); if (bind != null) bind.artistPageAlbumsSector.setVisibility(View.GONE); } else { - if (bind != null) bind.artistPageAlbumPlaceholder.placeholder.setVisibility(View.GONE); - if (bind != null) bind.artistPageAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); + if (bind != null) + bind.artistPageAlbumPlaceholder.placeholder.setVisibility(View.GONE); + if (bind != null) + bind.artistPageAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); albumArtistPageOrSimilarAdapter.setItems(albums); } }); CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper(); - albumSnapHelper.attachToRecyclerView(bind.albumsRecyclerView); + albumSnapHelper.attachToRecyclerView(bind.albumsHorizontalRecyclerView); + } + + private void initVerticalAlbumsView() { + bind.albumsVerticalRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); + bind.albumsVerticalRecyclerView.addItemDecoration(new GridItemDecoration(2, 20, false)); + bind.albumsVerticalRecyclerView.setHasFixedSize(true); + + albumCatalogueAdapter = new AlbumCatalogueAdapter(this); + bind.albumsVerticalRecyclerView.setAdapter(albumCatalogueAdapter); + + artistPageViewModel.getAlbumList().observe(getViewLifecycleOwner(), albums -> { + if (albums == null) { + if (bind != null) + bind.artistPageAlbumPlaceholder.placeholder.setVisibility(View.VISIBLE); + if (bind != null) bind.artistPageAlbumsSector.setVisibility(View.GONE); + } else { + if (bind != null) + bind.artistPageAlbumPlaceholder.placeholder.setVisibility(View.GONE); + if (bind != null) + bind.artistPageAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); + albumCatalogueAdapter.setItems(albums); + } + }); } private void initSimilarArtistsView() { @@ -206,11 +249,14 @@ public class ArtistPageFragment extends Fragment implements ClickCallback { bind.similarArtistsRecyclerView.setAdapter(artistSimilarAdapter); artistPageViewModel.getArtistInfo(artistPageViewModel.getArtist().getId()).observe(getViewLifecycleOwner(), artist -> { if (artist == null) { - if (bind != null) bind.artistPageSimilarArtistPlaceholder.placeholder.setVisibility(View.VISIBLE); + if (bind != null) + bind.artistPageSimilarArtistPlaceholder.placeholder.setVisibility(View.VISIBLE); if (bind != null) bind.similarArtistSector.setVisibility(View.GONE); } else { - if (bind != null) bind.artistPageSimilarArtistPlaceholder.placeholder.setVisibility(View.GONE); - if (bind != null) bind.similarArtistSector.setVisibility(!artist.getSimilarArtists().isEmpty() ? View.VISIBLE : View.GONE); + if (bind != null) + bind.artistPageSimilarArtistPlaceholder.placeholder.setVisibility(View.GONE); + if (bind != null) + bind.similarArtistSector.setVisibility(!artist.getSimilarArtists().isEmpty() ? View.VISIBLE : View.GONE); artistSimilarAdapter.setItems(artist.getSimilarArtists()); } }); diff --git a/app/src/main/res/layout/fragment_artist_page.xml b/app/src/main/res/layout/fragment_artist_page.xml index 14a08a06..a62fdfa6 100644 --- a/app/src/main/res/layout/fragment_artist_page.xml +++ b/app/src/main/res/layout/fragment_artist_page.xml @@ -204,17 +204,31 @@ android:layout_height="wrap_content" android:orientation="vertical"> - + android:orientation="horizontal"> + + + + + + android:paddingBottom="8dp" + android:visibility="visible"/> + + Artists Radio Shuffle + Switch layout More like this Albums More