diff --git a/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/CustomLinearSnapHelper.java b/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/CustomLinearSnapHelper.java new file mode 100644 index 00000000..d52d9b86 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/helper/recyclerview/CustomLinearSnapHelper.java @@ -0,0 +1,24 @@ +package com.cappielloantonio.play.helper.recyclerview; + +import android.view.View; + +import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSnapHelper; +import androidx.recyclerview.widget.RecyclerView; + +public class CustomLinearSnapHelper extends LinearSnapHelper { + @Override + public View findSnapView(RecyclerView.LayoutManager layoutManager) { + if (layoutManager instanceof LinearLayoutManager) { + LinearLayoutManager linearLayoutManager = (LinearLayoutManager) layoutManager; + if (!needToDoSnap(linearLayoutManager)) { + return null; + } + } + return super.findSnapView(layoutManager); + } + + public boolean needToDoSnap(LinearLayoutManager linearLayoutManager) { + return linearLayoutManager.findFirstCompletelyVisibleItemPosition() != 0 && linearLayoutManager.findLastCompletelyVisibleItemPosition() != linearLayoutManager.getItemCount() - 1; + } +} \ No newline at end of file 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 29011561..ff4a0ddc 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 @@ -23,6 +23,7 @@ import com.cappielloantonio.play.adapter.ArtistSimilarAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; +import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.ArtistRepository; @@ -177,6 +178,9 @@ public class ArtistPageFragment extends Fragment { if (bind != null) bind.artistPageAlbumsSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); albumArtistPageOrSimilarAdapter.setItems(albums); }); + + CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper(); + albumSnapHelper.attachToRecyclerView(bind.albumsRecyclerView); } private void initSimilarArtistsView() { @@ -189,5 +193,8 @@ public class ArtistPageFragment extends Fragment { if (bind != null) bind.similarArtistSector.setVisibility(!artist.getSimilarArtists().isEmpty() ? View.VISIBLE : View.GONE); artistSimilarAdapter.setItems(artist.getSimilarArtists()); }); + + CustomLinearSnapHelper similarArtistSnapHelper = new CustomLinearSnapHelper(); + similarArtistSnapHelper.attachToRecyclerView(bind.similarArtistsRecyclerView); } } \ No newline at end of file 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 b1b8e9ef..b367bae4 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 @@ -12,7 +12,9 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.LinearSnapHelper; import androidx.recyclerview.widget.PagerSnapHelper; +import androidx.recyclerview.widget.SnapHelper; import androidx.viewpager2.widget.ViewPager2; import com.cappielloantonio.play.R; @@ -24,6 +26,7 @@ import com.cappielloantonio.play.adapter.RecentMusicAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.adapter.YearAdapter; import com.cappielloantonio.play.databinding.FragmentHomeBinding; +import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; @@ -165,6 +168,9 @@ public class HomeFragment extends Fragment { mostPlayedAlbumAdapter.setItems(albums); }); + + CustomLinearSnapHelper mostPlayedAlbumSnapHelper = new CustomLinearSnapHelper(); + mostPlayedAlbumSnapHelper.attachToRecyclerView(bind.mostPlayedAlbumsRecyclerView); } private void initRecentPlayedAlbumView() { @@ -179,6 +185,9 @@ public class HomeFragment extends Fragment { recentlyPlayedAlbumAdapter.setItems(albums); }); + + CustomLinearSnapHelper recentPlayedAlbumSnapHelper = new CustomLinearSnapHelper(); + recentPlayedAlbumSnapHelper.attachToRecyclerView(bind.recentlyPlayedAlbumsRecyclerView); } private void initYearSongView() { @@ -199,6 +208,9 @@ public class HomeFragment extends Fragment { yearAdapter.setItems(years); }); + + CustomLinearSnapHelper yearSnapHelper = new CustomLinearSnapHelper(); + yearSnapHelper.attachToRecyclerView(bind.yearsRecyclerView); } private void initStarredTracksView() { @@ -214,8 +226,8 @@ public class HomeFragment extends Fragment { starredSongAdapter.setItems(songs); }); - PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); - pagerSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView); + SnapHelper starredTrackSnapHelper = new PagerSnapHelper(); + starredTrackSnapHelper.attachToRecyclerView(bind.starredTracksRecyclerView); } private void initStarredAlbumsView() { @@ -231,8 +243,8 @@ public class HomeFragment extends Fragment { starredAlbumAdapter.setItems(albums); }); - PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); - pagerSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView); + SnapHelper starredAlbumSnapHelper = new PagerSnapHelper(); + starredAlbumSnapHelper.attachToRecyclerView(bind.starredAlbumsRecyclerView); } private void initStarredArtistsView() { @@ -248,8 +260,8 @@ public class HomeFragment extends Fragment { starredArtistAdapter.setItems(artists); }); - PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); - pagerSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView); + SnapHelper starredArtistSnapHelper = new PagerSnapHelper(); + starredArtistSnapHelper.attachToRecyclerView(bind.starredArtistsRecyclerView); } private void initRecentAddedAlbumView() { @@ -261,6 +273,9 @@ public class HomeFragment extends Fragment { homeViewModel.getMostRecentlyAddedAlbums().observe(requireActivity(), albums -> { recentlyAddedAlbumAdapter.setItems(albums); }); + + CustomLinearSnapHelper recentAddedAlbumSnapHelper = new CustomLinearSnapHelper(); + recentAddedAlbumSnapHelper.attachToRecyclerView(bind.recentlyAddedAlbumsRecyclerView); } private void initDownloadedSongView() { @@ -275,6 +290,9 @@ public class HomeFragment extends Fragment { dowanloadedMusicAdapter.setItems(MappingUtil.mapDownload(downloads)); }); + + CustomLinearSnapHelper downloadedSongSnapHelper = new CustomLinearSnapHelper(); + downloadedSongSnapHelper.attachToRecyclerView(bind.downloadedTracksRecyclerView); } private void setDiscoverSongSlideViewOffset(float pageOffset, float pageMargin) { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java index ac80c60d..80414c4e 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/LibraryFragment.java @@ -20,6 +20,7 @@ import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.GenreAdapter; import com.cappielloantonio.play.adapter.PlaylistAdapter; import com.cappielloantonio.play.databinding.FragmentLibraryBinding; +import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.viewmodel.LibraryViewModel; @@ -90,6 +91,9 @@ public class LibraryFragment extends Fragment { bind.libraryAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE); albumAdapter.setItems(albums); }); + + CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper(); + albumSnapHelper.attachToRecyclerView(bind.albumRecyclerView); } private void initArtistView() { @@ -103,6 +107,9 @@ public class LibraryFragment extends Fragment { bind.libraryArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE); artistAdapter.setItems(artists); }); + + CustomLinearSnapHelper artistSnapHelper = new CustomLinearSnapHelper(); + artistSnapHelper.attachToRecyclerView(bind.artistRecyclerView); } private void initGenreView() { @@ -122,6 +129,9 @@ public class LibraryFragment extends Fragment { bind.libraryGenresSector.setVisibility(!genres.isEmpty() ? View.VISIBLE : View.GONE); genreAdapter.setItems(genres); }); + + CustomLinearSnapHelper genreSnapHelper = new CustomLinearSnapHelper(); + genreSnapHelper.attachToRecyclerView(bind.genreRecyclerView); } private void initPlaylistSlideView() { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java index 94e1602c..744820ab 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SearchFragment.java @@ -16,6 +16,7 @@ import com.cappielloantonio.play.adapter.AlbumAdapter; import com.cappielloantonio.play.adapter.ArtistAdapter; import com.cappielloantonio.play.adapter.SongHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentSearchBinding; +import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.SearchViewModel; @@ -82,12 +83,18 @@ public class SearchFragment extends Fragment { albumAdapter = new AlbumAdapter(requireContext()); bind.searchResultAlbumRecyclerView.setAdapter(albumAdapter); + CustomLinearSnapHelper albumSnapHelper = new CustomLinearSnapHelper(); + albumSnapHelper.attachToRecyclerView(bind.searchResultAlbumRecyclerView); + // Artists bind.searchResultArtistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.searchResultArtistRecyclerView.setHasFixedSize(true); artistAdapter = new ArtistAdapter(requireContext()); bind.searchResultArtistRecyclerView.setAdapter(artistAdapter); + + CustomLinearSnapHelper artistSnapHelper = new CustomLinearSnapHelper(); + artistSnapHelper.attachToRecyclerView(bind.searchResultArtistRecyclerView); } private void initSearchView() {