diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java index 5e3d91d4..7d9b8a50 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java @@ -1,12 +1,14 @@ 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; @@ -22,7 +24,6 @@ public class AlbumAdapter extends RecyclerView.Adapter private List albums; private LayoutInflater inflater; private Context context; - private ItemClickListener itemClickListener; public AlbumAdapter(Context context) { this.context = context; @@ -54,7 +55,7 @@ public class AlbumAdapter extends RecyclerView.Adapter return albums.size(); } - public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener, View.OnLongClickListener { TextView textAlbumName; TextView textArtistName; ImageView cover; @@ -67,12 +68,22 @@ public class AlbumAdapter extends RecyclerView.Adapter cover = itemView.findViewById(R.id.album_cover_image_view); itemView.setOnClickListener(this); + itemView.setOnLongClickListener(this); } @Override public void onClick(View view) { - if (itemClickListener != null) - itemClickListener.onItemClick(view, getAdapterPosition()); + Bundle bundle = new Bundle(); + bundle.putParcelable("album_object", albums.get(getAdapterPosition())); + Navigation.findNavController(view).navigate(R.id.action_libraryFragment_to_albumPageFragment, bundle); + } + + @Override + public boolean onLongClick(View v) { + Bundle bundle = new Bundle(); + bundle.putParcelable("album_object", albums.get(getAdapterPosition())); + Navigation.findNavController(v).navigate(R.id.albumBottomSheetDialog, bundle); + return true; } } @@ -84,12 +95,4 @@ public class AlbumAdapter extends RecyclerView.Adapter this.albums = albums; notifyDataSetChanged(); } - - public void setClickListener(ItemClickListener itemClickListener) { - this.itemClickListener = itemClickListener; - } - - public interface ItemClickListener { - void onItemClick(View view, int position); - } } diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java index 43daae57..d452a0fd 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java @@ -1,12 +1,14 @@ 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; @@ -22,7 +24,6 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter albums; private LayoutInflater inflater; private Context context; - private ItemClickListener itemClickListener; public AlbumArtistPageAdapter(Context context) { this.context = context; @@ -53,7 +54,7 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter { private static final String TAG = "AlbumCatalogueAdapter"; @@ -22,7 +25,6 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter albums; private LayoutInflater inflater; private Context context; - private ItemClickListener itemClickListener; public AlbumCatalogueAdapter(Context context) { this.context = context; @@ -55,7 +57,7 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter artists; private LayoutInflater inflater; private Context context; - private ItemClickListener itemClickListener; public ArtistAdapter(Context context) { this.context = context; @@ -53,7 +54,7 @@ public class ArtistAdapter extends RecyclerView.Adapter { private static final String TAG = "ArtistCatalogueAdapter"; @@ -22,7 +25,6 @@ public class ArtistCatalogueAdapter extends RecyclerView.Adapter artists; private LayoutInflater inflater; private Context context; - private ItemClickListener itemClickListener; public ArtistCatalogueAdapter(Context context) { this.context = context; @@ -53,7 +55,7 @@ public class ArtistCatalogueAdapter extends RecyclerView.Adapter songs; private LayoutInflater mInflater; private Context context; + private FragmentManager fragmentManager; - public RecentMusicAdapter(Context context) { + public RecentMusicAdapter(Context context, FragmentManager fragmentManager) { this.context = context; + this.fragmentManager = fragmentManager; this.mInflater = LayoutInflater.from(context); this.songs = new ArrayList<>(); } @@ -58,7 +63,7 @@ public class RecentMusicAdapter extends RecyclerView.Adapter songs) { diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java index b89a13bf..4732a9e8 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java @@ -1,6 +1,7 @@ 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; @@ -8,6 +9,7 @@ import android.widget.ImageView; import android.widget.TextView; import androidx.fragment.app.FragmentManager; +import androidx.navigation.Navigation; import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.App; @@ -15,7 +17,6 @@ import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.SongRepository; -import com.cappielloantonio.play.ui.fragment.bottomsheetdialog.SongBottomSheetDialog; import com.cappielloantonio.play.util.Util; import java.util.ArrayList; @@ -90,8 +91,9 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter { - Bundle bundle = new Bundle(); - bundle.putParcelable("album_object", albumAdapter.getItem(position)); - activity.navController.navigate(R.id.action_albumCatalogueFragment_to_albumPageFragment, bundle); - }); bind.albumCatalogueRecyclerView.setAdapter(albumAdapter); albumCatalogueViewModel.getAlbumList().observe(requireActivity(), albums -> { bind.loadingProgressBar.setVisibility(View.GONE); 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 6baa5371..f0af8742 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 @@ -13,7 +13,6 @@ import com.cappielloantonio.play.adapter.SongResultSearchAdapter; import com.cappielloantonio.play.databinding.FragmentAlbumPageBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.ui.activities.MainActivity; -import com.cappielloantonio.play.ui.fragment.bottomsheetdialog.AlbumBottomSheetDialog; import com.cappielloantonio.play.viewmodel.AlbumPageViewModel; public class AlbumPageFragment extends Fragment { @@ -33,7 +32,6 @@ public class AlbumPageFragment extends Fragment { albumPageViewModel = new ViewModelProvider(requireActivity()).get(AlbumPageViewModel.class); init(); - initBottomSheetDialog(); initBackCover(); initSongsView(); @@ -65,13 +63,6 @@ public class AlbumPageFragment extends Fragment { bind.albumTitleLabel.setText(albumPageViewModel.getAlbum().getTitle()); } - private void initBottomSheetDialog() { - bind.albumSettingsImageButton.setOnClickListener(v -> { - AlbumBottomSheetDialog albumBottomSheetDialog = new AlbumBottomSheetDialog(albumPageViewModel.getAlbum()); - albumBottomSheetDialog.show(this.getChildFragmentManager(), null); - }); - } - private void initSongsView() { bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.songRecyclerView.setHasFixedSize(true); 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 f361f65f..e568711e 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 @@ -9,10 +9,9 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; -import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; +import com.cappielloantonio.play.helper.recyclerview.GridItemDecoration; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; @@ -52,15 +51,10 @@ public class ArtistCatalogueFragment extends Fragment { private void initArtistCatalogueView() { bind.artistCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.artistCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); + bind.artistCatalogueRecyclerView.addItemDecoration(new GridItemDecoration(2, 20, false)); bind.artistCatalogueRecyclerView.setHasFixedSize(true); artistAdapter = new ArtistCatalogueAdapter(requireContext()); - artistAdapter.setClickListener((view, position) -> { - Bundle bundle = new Bundle(); - bundle.putParcelable("artist_object", artistAdapter.getItem(position)); - activity.navController.navigate(R.id.action_artistCatalogueFragment_to_artistPageFragment, bundle); - }); bind.artistCatalogueRecyclerView.setAdapter(artistAdapter); artistCatalogueViewModel.getArtistList().observe(requireActivity(), artists -> { bind.loadingProgressBar.setVisibility(View.GONE); 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 195c70df..287782d6 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 @@ -89,11 +89,6 @@ public class ArtistPageFragment extends Fragment { bind.albumsRecyclerView.setHasFixedSize(true); albumArtistPageAdapter = new AlbumArtistPageAdapter(requireContext()); - albumArtistPageAdapter.setClickListener((view, position) -> { - Bundle bundle = new Bundle(); - bundle.putParcelable("album_object", albumArtistPageAdapter.getItem(position)); - activity.navController.navigate(R.id.action_artistPageFragment_to_albumPageFragment, bundle); - }); bind.albumsRecyclerView.setAdapter(albumArtistPageAdapter); artistPageViewModel.getAlbumList().observe(requireActivity(), songs -> albumArtistPageAdapter.setItems(songs)); } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java index aa279215..46a51ba4 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java @@ -12,7 +12,7 @@ import androidx.recyclerview.widget.GridLayoutManager; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.GenreCatalogueAdapter; import com.cappielloantonio.play.databinding.FragmentGenreCatalogueBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; +import com.cappielloantonio.play.helper.recyclerview.GridItemDecoration; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.GenreCatalogueViewModel; @@ -58,7 +58,7 @@ public class GenreCatalogueFragment extends Fragment { private void initArtistCatalogueView() { bind.genreCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.genreCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 16, false)); + bind.genreCatalogueRecyclerView.addItemDecoration(new GridItemDecoration(2, 16, false)); bind.genreCatalogueRecyclerView.setHasFixedSize(true); genreCatalogueAdapter = new GenreCatalogueAdapter(requireContext()); 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 c9b435bc..e087b476 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 @@ -13,6 +13,7 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; +import androidx.recyclerview.widget.PagerSnapHelper; import androidx.viewpager2.widget.ViewPager2; import com.cappielloantonio.play.R; @@ -129,7 +130,7 @@ public class HomeFragment extends Fragment { bind.recentlyAddedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.recentlyAddedTracksRecyclerView.setHasFixedSize(true); - recentlyAddedMusicAdapter = new RecentMusicAdapter(requireContext()); + recentlyAddedMusicAdapter = new RecentMusicAdapter(requireContext(), getChildFragmentManager()); bind.recentlyAddedTracksRecyclerView.setAdapter(recentlyAddedMusicAdapter); homeViewModel.getRecentlyAddedSongList().observe(requireActivity(), songs -> recentlyAddedMusicAdapter.setItems(songs)); } @@ -149,19 +150,22 @@ public class HomeFragment extends Fragment { } private void initFavoritesSongView() { - bind.favoritesTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 3, GridLayoutManager.HORIZONTAL, false)); + bind.favoritesTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 5, GridLayoutManager.HORIZONTAL, false)); bind.favoritesTracksRecyclerView.setHasFixedSize(true); favoriteSongAdapter = new SongResultSearchAdapter(requireContext(), getChildFragmentManager()); bind.favoritesTracksRecyclerView.setAdapter(favoriteSongAdapter); homeViewModel.getFavorites().observe(requireActivity(), songs -> favoriteSongAdapter.setItems(songs)); + + PagerSnapHelper pagerSnapHelper = new PagerSnapHelper(); + pagerSnapHelper.attachToRecyclerView(bind.favoritesTracksRecyclerView); } private void initMostPlayedSongView() { bind.mostPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.mostPlayedTracksRecyclerView.setHasFixedSize(true); - mostPlayedMusicAdapter = new RecentMusicAdapter(requireContext()); + mostPlayedMusicAdapter = new RecentMusicAdapter(requireContext(), getChildFragmentManager()); bind.mostPlayedTracksRecyclerView.setAdapter(mostPlayedMusicAdapter); homeViewModel.getMostPlayedSongList().observe(requireActivity(), songs -> mostPlayedMusicAdapter.setItems(songs)); } @@ -170,7 +174,7 @@ public class HomeFragment extends Fragment { bind.recentlyPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.recentlyPlayedTracksRecyclerView.setHasFixedSize(true); - recentlyPlayedMusicAdapter = new RecentMusicAdapter(requireContext()); + recentlyPlayedMusicAdapter = new RecentMusicAdapter(requireContext(), getChildFragmentManager()); bind.recentlyPlayedTracksRecyclerView.setAdapter(recentlyPlayedMusicAdapter); homeViewModel.getRecentlyPlayedSongList().observe(requireActivity(), songs -> recentlyPlayedMusicAdapter.setItems(songs)); } 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 942e767e..dae84f90 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 @@ -79,11 +79,6 @@ public class LibraryFragment extends Fragment { bind.albumRecyclerView.setHasFixedSize(true); albumAdapter = new AlbumAdapter(requireContext()); - albumAdapter.setClickListener((view, position) -> { - Bundle bundle = new Bundle(); - bundle.putParcelable("album_object", albumAdapter.getItem(position)); - activity.navController.navigate(R.id.action_libraryFragment_to_albumPageFragment, bundle); - }); bind.albumRecyclerView.setAdapter(albumAdapter); libraryViewModel.getAlbumSample().observe(requireActivity(), albums -> albumAdapter.setItems(albums)); } @@ -93,11 +88,6 @@ public class LibraryFragment extends Fragment { bind.artistRecyclerView.setHasFixedSize(true); artistAdapter = new ArtistAdapter(requireContext()); - artistAdapter.setClickListener((view, position) -> { - Bundle bundle = new Bundle(); - bundle.putParcelable("artist_object", artistAdapter.getItem(position)); - activity.navController.navigate(R.id.action_libraryFragment_to_artistPageFragment, bundle); - }); bind.artistRecyclerView.setAdapter(artistAdapter); libraryViewModel.getArtistSample().observe(requireActivity(), artists -> artistAdapter.setItems(artists)); } 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 11cbc971..177d9949 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 @@ -13,13 +13,12 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; -import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumCatalogueAdapter; import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; import com.cappielloantonio.play.adapter.RecentSearchAdapter; import com.cappielloantonio.play.adapter.SongResultSearchAdapter; import com.cappielloantonio.play.databinding.FragmentSearchBinding; -import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; +import com.cappielloantonio.play.helper.recyclerview.GridItemDecoration; import com.cappielloantonio.play.model.RecentSearch; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.SearchViewModel; @@ -98,28 +97,18 @@ public class SearchFragment extends Fragment { // Albums bind.searchResultAlbumRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.searchResultAlbumRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); + bind.searchResultAlbumRecyclerView.addItemDecoration(new GridItemDecoration(2, 20, false)); bind.searchResultAlbumRecyclerView.setHasFixedSize(true); albumResultSearchAdapter = new AlbumCatalogueAdapter(requireContext()); - albumResultSearchAdapter.setClickListener((view, position) -> { - Bundle bundle = new Bundle(); - bundle.putParcelable("album_object", albumResultSearchAdapter.getItem(position)); - activity.navController.navigate(R.id.action_searchFragment_to_albumPageFragment, bundle); - }); bind.searchResultAlbumRecyclerView.setAdapter(albumResultSearchAdapter); // Artist bind.searchResultArtistRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); - bind.searchResultArtistRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); + bind.searchResultArtistRecyclerView.addItemDecoration(new GridItemDecoration(2, 20, false)); bind.searchResultArtistRecyclerView.setHasFixedSize(true); artistResultSearchAdapter = new ArtistCatalogueAdapter(requireContext()); - artistResultSearchAdapter.setClickListener((view, position) -> { - Bundle bundle = new Bundle(); - bundle.putParcelable("artist_object", artistResultSearchAdapter.getItem(position)); - activity.navController.navigate(R.id.action_searchFragment_to_artistPageFragment, bundle); - }); bind.searchResultArtistRecyclerView.setAdapter(artistResultSearchAdapter); } 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 5231d205..eecc8b70 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 @@ -4,51 +4,123 @@ import android.os.Bundle; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; import android.widget.Toast; import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.fragment.NavHostFragment; import com.cappielloantonio.play.R; +import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { private static final String TAG = "AlbumBottomSheetDialog"; + private AlbumBottomSheetViewModel albumBottomSheetViewModel; private Album album; - public AlbumBottomSheetDialog(Album album) { - this.album = album; - } + private ImageView coverAlbum; + private TextView titleAlbum; + private TextView artistAlbum; + + private TextView playRadio; + private TextView playRandom; + private TextView playNext; + private TextView addToQueue; + private TextView Download; + private TextView addToPlaylist; + private TextView goToArtist; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bottom_sheet_album_dialog, container, false); + album = this.getArguments().getParcelable("album_object"); + + albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class); + albumBottomSheetViewModel.setAlbum(album); + init(view); return view; } private void init(View view) { - Button button1 = view.findViewById(R.id.button1); - Button button2 = view.findViewById(R.id.button2); + coverAlbum = view.findViewById(R.id.album_cover_image_view); + CustomGlideRequest.Builder + .from(requireContext(), albumBottomSheetViewModel.getAlbum().getPrimary(), albumBottomSheetViewModel.getAlbum().getBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.TOP_QUALITY) + .build() + .into(coverAlbum); - button1.setOnClickListener(v -> { - Toast.makeText(requireContext(), album.getTitle(), Toast.LENGTH_SHORT).show(); - dismiss(); + titleAlbum = view.findViewById(R.id.album_title_text_view); + titleAlbum.setText(albumBottomSheetViewModel.getAlbum().getTitle()); + + artistAlbum = view.findViewById(R.id.album_artist_text_view); + artistAlbum.setText(albumBottomSheetViewModel.getAlbum().getArtistName()); + + playRadio = view.findViewById(R.id.play_radio_text_view); + playRadio.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Play radio", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); }); - button2.setOnClickListener(v -> { - Toast.makeText(requireContext(), album.getArtistName(), Toast.LENGTH_SHORT).show(); - dismiss(); + playRandom = view.findViewById(R.id.play_random_text_view); + playRandom.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Play next", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + + playNext = view.findViewById(R.id.play_next_text_view); + playNext.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Play next", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + + addToQueue = view.findViewById(R.id.add_to_queue_text_view); + addToQueue.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Add to queue", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + + Download = view.findViewById(R.id.download_text_view); + Download.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Download", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + + addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view); + addToPlaylist.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Add to playlist", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + + goToArtist = view.findViewById(R.id.go_to_artist_text_view); + goToArtist.setOnClickListener(v -> { + Artist artist = albumBottomSheetViewModel.getArtist(); + if(artist != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artist); + NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); + } + else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); + + dismissBottomSheet(); }); } @Override public void onClick(View v) { + dismissBottomSheet(); + } + + private void dismissBottomSheet() { dismiss(); } } \ No newline at end of file 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 new file mode 100644 index 00000000..356b0592 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java @@ -0,0 +1,78 @@ +package com.cappielloantonio.play.ui.fragment.bottomsheetdialog; + +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 android.widget.Toast; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProvider; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.glide.CustomGlideRequest; +import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.viewmodel.ArtistBottomSheetViewModel; +import com.google.android.material.bottomsheet.BottomSheetDialogFragment; + +public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { + private static final String TAG = "AlbumBottomSheetDialog"; + + private ArtistBottomSheetViewModel artistBottomSheetViewModel; + private Artist artist; + + private ImageView coverArtist; + private TextView nameArtist; + + private TextView playRadio; + private TextView playRandom; + + @Nullable + @Override + public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.bottom_sheet_artist_dialog, container, false); + + artist = this.getArguments().getParcelable("artist_object"); + + artistBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(ArtistBottomSheetViewModel.class); + artistBottomSheetViewModel.setArtist(artist); + + init(view); + + return view; + } + + private void init(View view) { + coverArtist = view.findViewById(R.id.artist_cover_image_view); + CustomGlideRequest.Builder + .from(requireContext(), artistBottomSheetViewModel.getArtist().getPrimary(), artistBottomSheetViewModel.getArtist().getPrimaryBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.TOP_QUALITY) + .build() + .into(coverArtist); + + nameArtist = view.findViewById(R.id.song_title_text_view); + nameArtist.setText(artistBottomSheetViewModel.getArtist().getName()); + + playRadio = view.findViewById(R.id.play_radio_text_view); + playRadio.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Play radio", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + + playRandom = view.findViewById(R.id.play_random_text_view); + playRandom.setOnClickListener(v -> { + Toast.makeText(requireContext(), "Play random", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); + }); + } + + @Override + public void onClick(View v) { + dismissBottomSheet(); + } + + private void dismissBottomSheet() { + dismiss(); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index c1f785c5..9b6ca9de 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -11,17 +11,20 @@ import android.widget.ToggleButton; import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; +import androidx.navigation.fragment.NavHostFragment; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; +import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; -import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel; +import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { - private static final String TAG = "AlbumBottomSheetDialog"; + private static final String TAG = "SongBottomSheetDialog"; - private AlbumBottomSheetViewModel albumBottomSheetViewModel; + private SongBottomSheetViewModel songBottomSheetViewModel; private Song song; private ImageView coverSong; @@ -34,19 +37,18 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements private TextView addToQueue; private TextView Download; private TextView addToPlaylist; + private TextView goToAlbum; private TextView goToArtist; - - public SongBottomSheetDialog(Song song) { - this.song = song; - } - @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bottom_sheet_song_dialog, container, false); - albumBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(AlbumBottomSheetViewModel.class); - albumBottomSheetViewModel.setSong(song); + + song = this.getArguments().getParcelable("song_object"); + + songBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(SongBottomSheetViewModel.class); + songBottomSheetViewModel.setSong(song); init(view); @@ -56,20 +58,20 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements private void init(View view) { coverSong = view.findViewById(R.id.song_cover_image_view); CustomGlideRequest.Builder - .from(requireContext(), albumBottomSheetViewModel.getSong().getPrimary(), albumBottomSheetViewModel.getSong().getBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.TOP_QUALITY) + .from(requireContext(), songBottomSheetViewModel.getSong().getPrimary(), songBottomSheetViewModel.getSong().getBlurHash(), CustomGlideRequest.PRIMARY, CustomGlideRequest.TOP_QUALITY) .build() .into(coverSong); titleSong = view.findViewById(R.id.song_title_text_view); - titleSong.setText(albumBottomSheetViewModel.getSong().getTitle()); + titleSong.setText(songBottomSheetViewModel.getSong().getTitle()); artistSong = view.findViewById(R.id.song_artist_text_view); - artistSong.setText(albumBottomSheetViewModel.getSong().getArtistName()); + artistSong.setText(songBottomSheetViewModel.getSong().getArtistName()); thumbToggle = view.findViewById(R.id.button_favorite); - thumbToggle.setChecked(albumBottomSheetViewModel.getSong().isFavorite()); + thumbToggle.setChecked(songBottomSheetViewModel.getSong().isFavorite()); thumbToggle.setOnClickListener(v -> { - albumBottomSheetViewModel.setFavorite(); + songBottomSheetViewModel.setFavorite(); dismissBottomSheet(); }); @@ -103,9 +105,30 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements dismissBottomSheet(); }); + goToAlbum = view.findViewById(R.id.go_to_album_text_view); + goToAlbum.setOnClickListener(v -> { + Album album = songBottomSheetViewModel.getAlbum(); + + if(album != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("album_object", album); + NavHostFragment.findNavController(this).navigate(R.id.albumPageFragment, bundle); + } + else Toast.makeText(requireContext(), "Error retrieving album", Toast.LENGTH_SHORT).show(); + + dismissBottomSheet(); + }); + goToArtist = view.findViewById(R.id.go_to_artist_text_view); goToArtist.setOnClickListener(v -> { - Toast.makeText(requireContext(), "Go to artist", Toast.LENGTH_SHORT).show(); + Artist artist = songBottomSheetViewModel.getArtist(); + if(artist != null) { + Bundle bundle = new Bundle(); + bundle.putParcelable("artist_object", artist); + NavHostFragment.findNavController(this).navigate(R.id.artistPageFragment, bundle); + } + else Toast.makeText(requireContext(), "Error retrieving artist", Toast.LENGTH_SHORT).show(); + dismissBottomSheet(); }); } diff --git a/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java b/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java index fdf51524..6922020f 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java @@ -2,7 +2,6 @@ package com.cappielloantonio.play.util; import android.content.Context; import android.os.Bundle; -import android.util.Log; import com.cappielloantonio.play.App; import com.cappielloantonio.play.interfaces.MediaCallback; @@ -222,8 +221,6 @@ public class SyncUtil { private static Song updateSongData(Map library, Song newSong) { if(library.containsKey(newSong.hashCode())) { - Log.d(TAG, "updateSongData: " + newSong.getTitle()); - Song oldSong = library.get(newSong.hashCode()); newSong.setFavorite(oldSong.isFavorite()); newSong.setAdded(oldSong.getAdded()); 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 71f78669..f17f403e 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumBottomSheetViewModel.java @@ -5,35 +5,30 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; -import com.cappielloantonio.play.model.Song; -import com.cappielloantonio.play.repository.SongRepository; +import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.repository.ArtistRepository; public class AlbumBottomSheetViewModel extends AndroidViewModel { - private SongRepository songRepository; - private Song song; + private ArtistRepository artistRepository; + + private Album album; public AlbumBottomSheetViewModel(@NonNull Application application) { super(application); - songRepository = new SongRepository(application); + artistRepository = new ArtistRepository(application); } - public void setSong(Song song) { - this.song = song; + public Album getAlbum() { + return album; } - public Song getSong() { - return song; + public void setAlbum(Album album) { + this.album = album; } - public void setFavorite() { - if(song.isFavorite()) { - song.setFavorite(false); - } - else { - song.setFavorite(true); - } - - songRepository.setFavoriteStatus(song); + public Artist getArtist() { + return artistRepository.getArtistByID(album.getArtistId()); } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java new file mode 100644 index 00000000..b2a2a36d --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistBottomSheetViewModel.java @@ -0,0 +1,24 @@ +package com.cappielloantonio.play.viewmodel; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; + +import com.cappielloantonio.play.model.Artist; + +public class ArtistBottomSheetViewModel extends AndroidViewModel { + private Artist artist; + + public ArtistBottomSheetViewModel(@NonNull Application application) { + super(application); + } + + public void setArtist(Artist artist) { + this.artist = artist; + } + + public Artist getArtist() { + return artist; + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java new file mode 100644 index 00000000..5f8a8645 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongBottomSheetViewModel.java @@ -0,0 +1,54 @@ +package com.cappielloantonio.play.viewmodel; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; + +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; + +public class SongBottomSheetViewModel extends AndroidViewModel { + private SongRepository songRepository; + private AlbumRepository albumRepository; + private ArtistRepository artistRepository; + + private Song song; + + public SongBottomSheetViewModel(@NonNull Application application) { + super(application); + + songRepository = new SongRepository(application); + albumRepository = new AlbumRepository(application); + artistRepository = new ArtistRepository(application); + } + + public void setSong(Song song) { + this.song = song; + } + + public Song getSong() { + return song; + } + + public void setFavorite() { + if(song.isFavorite()) + song.setFavorite(false); + else + song.setFavorite(true); + + songRepository.setFavoriteStatus(song); + } + + public Album getAlbum() { + return albumRepository.getAlbumByID(song.getAlbumId()); + } + + public Artist getArtist() { + return artistRepository.getArtistByID(song.getArtistId()); + } +} diff --git a/app/src/main/res/drawable/ic_thumb_up.xml b/app/src/main/res/drawable/ic_thumb_up.xml index 3fc92f22..17426e64 100644 --- a/app/src/main/res/drawable/ic_thumb_up.xml +++ b/app/src/main/res/drawable/ic_thumb_up.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> diff --git a/app/src/main/res/drawable/ic_thumb_up_outlined.xml b/app/src/main/res/drawable/ic_thumb_up_outlined.xml index bd54a0d0..2c82f1a4 100644 --- a/app/src/main/res/drawable/ic_thumb_up_outlined.xml +++ b/app/src/main/res/drawable/ic_thumb_up_outlined.xml @@ -4,6 +4,6 @@ android:viewportWidth="24" android:viewportHeight="24"> 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 ee01a88b..fd8be142 100644 --- a/app/src/main/res/layout/bottom_sheet_album_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_album_dialog.xml @@ -1,23 +1,188 @@ - - + + -