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 f9c5cb3d..6a9e15e5 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.util.Util; import java.util.List; @@ -65,6 +66,10 @@ public class AlbumAdapter extends RecyclerView.Adapter } } + public Album getItem(int position) { + return albums.get(position); + } + public void setItems(List albums) { this.albums = albums; notifyDataSetChanged(); 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 01b3f372..cfe4dfa2 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java @@ -61,6 +61,10 @@ public class AlbumArtistPageAdapter extends RecyclerView.Adapter albums) { this.albums = albums; notifyDataSetChanged(); diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java index 7a741521..50eb191f 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java @@ -10,6 +10,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import java.util.List; @@ -64,6 +65,10 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter albums) { this.albums = albums; notifyDataSetChanged(); diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java index 9cb18cba..f3097682 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java @@ -62,6 +62,10 @@ public class ArtistAdapter extends RecyclerView.Adapter artists) { this.artists = artists; notifyDataSetChanged(); diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java index be90252e..744456dd 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java @@ -35,6 +35,9 @@ public interface SongDao { @Query("SELECT * FROM song WHERE play_count != 0 AND artistId = :artistID ORDER BY play_count DESC LIMIT :number") LiveData> getArtistTopSongsSample(String artistID, int number); + @Query("SELECT * FROM song WHERE albumId = :albumID ORDER BY trackNumber ASC") + LiveData> getAlbumSong(String albumID); + @Query("SELECT EXISTS(SELECT * FROM song WHERE id = :id)") boolean exist(String id); diff --git a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java index ba8d6602..75287189 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -19,6 +19,7 @@ public class SongRepository { private LiveData> listLiveSampleRecentlyPlayedSongs; private LiveData> listLiveSampleMostPlayedSongs; private LiveData> listLiveSampleArtistTopSongs; + private LiveData> listLiveAlbumSongs; public SongRepository(Application application) { @@ -51,6 +52,11 @@ public class SongRepository { return listLiveSampleArtistTopSongs; } + public LiveData> getAlbumListLiveSong(String albumID) { + listLiveAlbumSongs = songDao.getAlbumSong(albumID); + return listLiveAlbumSongs; + } + public boolean exist(Song song) { boolean exist = false; 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 7d9a0457..9f46575e 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 @@ -10,9 +10,11 @@ import androidx.fragment.app.Fragment; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; +import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumCatalogueAdapter; import com.cappielloantonio.play.databinding.FragmentAlbumCatalogueBinding; import com.cappielloantonio.play.helper.recyclerview.ItemlDecoration; +import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.AlbumCatalogueViewModel; import java.util.ArrayList; @@ -21,12 +23,15 @@ public class AlbumCatalogueFragment extends Fragment { private static final String TAG = "ArtistCatalogueFragment"; private FragmentAlbumCatalogueBinding bind; + private MainActivity activity; private AlbumCatalogueViewModel albumCatalogueViewModel; private AlbumCatalogueAdapter albumAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + activity = (MainActivity) getActivity(); + bind = FragmentAlbumCatalogueBinding.inflate(inflater, container, false); View view = bind.getRoot(); albumCatalogueViewModel = new ViewModelProvider(requireActivity()).get(AlbumCatalogueViewModel.class); @@ -48,7 +53,11 @@ public class AlbumCatalogueFragment extends Fragment { bind.albumCatalogueRecyclerView.setHasFixedSize(true); albumAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); - albumAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Click: " + position, Toast.LENGTH_SHORT).show()); + 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.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 new file mode 100644 index 00000000..7222f5d0 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumPageFragment.java @@ -0,0 +1,65 @@ +package com.cappielloantonio.play.ui.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.cappielloantonio.play.adapter.AlbumArtistPageAdapter; +import com.cappielloantonio.play.adapter.SongResultSearchAdapter; +import com.cappielloantonio.play.databinding.FragmentAlbumPageBinding; +import com.cappielloantonio.play.databinding.FragmentArtistPageBinding; +import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.ui.activities.MainActivity; +import com.cappielloantonio.play.viewmodel.AlbumPageViewModel; +import com.cappielloantonio.play.viewmodel.ArtistPageViewModel; + +import java.util.ArrayList; + +public class AlbumPageFragment extends Fragment { + + private FragmentAlbumPageBinding bind; + private MainActivity activity; + private AlbumPageViewModel albumPageViewModel; + + private SongResultSearchAdapter songResultSearchAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + activity = (MainActivity) getActivity(); + + bind = FragmentAlbumPageBinding.inflate(inflater, container, false); + View view = bind.getRoot(); + albumPageViewModel = new ViewModelProvider(requireActivity()).get(AlbumPageViewModel.class); + + init(); + initSongsView(); + + return view; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void init() { + albumPageViewModel.setAlbum(getArguments().getParcelable("album_object")); + + bind.albumTitleLabel.setText(albumPageViewModel.getAlbum().getTitle()); + } + + private void initSongsView() { + bind.songRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); + bind.songRecyclerView.setHasFixedSize(true); + + songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), new ArrayList<>()); + bind.songRecyclerView.setAdapter(songResultSearchAdapter); + albumPageViewModel.getAlbumSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs)); + } +} \ 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 31a71289..e0b417e8 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 @@ -29,12 +29,15 @@ public class ArtistCatalogueFragment extends Fragment { private static final String TAG = "ArtistCatalogueFragment"; private FragmentArtistCatalogueBinding bind; + private MainActivity activity; private ArtistCatalogueViewModel artistCatalogueViewModel; private ArtistCatalogueAdapter artistAdapter; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + activity = (MainActivity) getActivity(); + bind = FragmentArtistCatalogueBinding.inflate(inflater, container, false); View view = bind.getRoot(); artistCatalogueViewModel = new ViewModelProvider(requireActivity()).get(ArtistCatalogueViewModel.class); @@ -56,7 +59,11 @@ public class ArtistCatalogueFragment extends Fragment { bind.artistCatalogueRecyclerView.setHasFixedSize(true); artistAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); - artistAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Click: " + position, Toast.LENGTH_SHORT).show()); + 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 c9e3ff95..09e45311 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 @@ -31,8 +31,6 @@ public class ArtistPageFragment extends Fragment { private SongResultSearchAdapter songResultSearchAdapter; private AlbumArtistPageAdapter albumArtistPageAdapter; - private String artistID; - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { activity = (MainActivity) getActivity(); @@ -55,7 +53,9 @@ public class ArtistPageFragment extends Fragment { } private void init() { - artistID = getArguments().getString("artistID"); + artistPageViewModel.setArtist(getArguments().getParcelable("artist_object")); + + bind.artistNameLabel.setText(artistPageViewModel.getArtist().getName()); } private void initTopSongsView() { @@ -64,7 +64,7 @@ public class ArtistPageFragment extends Fragment { songResultSearchAdapter = new SongResultSearchAdapter(requireContext(), new ArrayList<>()); bind.mostStreamedSongRecyclerView.setAdapter(songResultSearchAdapter); - artistPageViewModel.getArtistTopSongList(artistID).observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs)); + artistPageViewModel.getArtistTopSongList().observe(requireActivity(), songs -> songResultSearchAdapter.setItems(songs)); } private void initAlbumsView() { @@ -72,7 +72,12 @@ public class ArtistPageFragment extends Fragment { bind.albumsRecyclerView.setHasFixedSize(true); albumArtistPageAdapter = new AlbumArtistPageAdapter(requireContext(), new ArrayList<>()); + 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(artistID).observe(requireActivity(), songs -> albumArtistPageAdapter.setItems(songs)); + artistPageViewModel.getAlbumList().observe(requireActivity(), songs -> albumArtistPageAdapter.setItems(songs)); } } \ No newline at end of file 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 22661e2a..f432cc74 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 @@ -78,7 +78,11 @@ public class LibraryFragment extends Fragment { bind.albumRecyclerView.setHasFixedSize(true); albumAdapter = new AlbumAdapter(requireContext(), new ArrayList<>()); - albumAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Album: " + position, Toast.LENGTH_SHORT).show()); + 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)); } @@ -88,7 +92,11 @@ public class LibraryFragment extends Fragment { bind.artistRecyclerView.setHasFixedSize(true); artistAdapter = new ArtistAdapter(requireContext(), new ArrayList<>()); - artistAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Artist: " + position, Toast.LENGTH_SHORT).show()); + 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 e69ba52f..9b7a9907 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 @@ -99,7 +99,9 @@ public class SearchFragment extends Fragment { albumResultSearchAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); albumResultSearchAdapter.setClickListener((view, position) -> { - Toast.makeText(requireContext(), "Album " + position, Toast.LENGTH_SHORT).show(); + 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); @@ -110,9 +112,8 @@ public class SearchFragment extends Fragment { artistResultSearchAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); artistResultSearchAdapter.setClickListener((view, position) -> { - Toast.makeText(requireContext(), "Artist " + position, Toast.LENGTH_SHORT).show(); Bundle bundle = new Bundle(); - bundle.putString("artistID", artistResultSearchAdapter.getItem(position).id); + 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/viewmodel/AlbumPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumPageViewModel.java new file mode 100644 index 00000000..6f3fbb86 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumPageViewModel.java @@ -0,0 +1,42 @@ +package com.cappielloantonio.play.viewmodel; + +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; + +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.SongRepository; + +import java.util.List; + +public class AlbumPageViewModel extends AndroidViewModel { + private SongRepository songRepository; + + private LiveData> songList; + + private Album album; + + public AlbumPageViewModel(@NonNull Application application) { + super(application); + + songRepository = new SongRepository(application); + } + + public LiveData> getAlbumSongList() { + songList = songRepository.getAlbumListLiveSong(album.getId()); + return songList; + } + + public Album getAlbum() { + return album; + } + + public void setAlbum(Album album) { + this.album = album; + } +} 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 bbd15099..a04de724 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistPageViewModel.java @@ -7,6 +7,7 @@ import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; 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.SongRepository; @@ -20,6 +21,8 @@ public class ArtistPageViewModel extends AndroidViewModel { private LiveData> songList; private LiveData> albumList; + private Artist artist; + public ArtistPageViewModel(@NonNull Application application) { super(application); @@ -27,13 +30,21 @@ public class ArtistPageViewModel extends AndroidViewModel { albumRepository = new AlbumRepository(application); } - public LiveData> getAlbumList(String artistID) { - albumList = albumRepository.getArtistListLiveAlbums(artistID); + public LiveData> getAlbumList() { + albumList = albumRepository.getArtistListLiveAlbums(artist.id); return albumList; } - public LiveData> getArtistTopSongList(String artistID) { - songList = songRepository.getArtistListLiveTopSong(artistID); + public LiveData> getArtistTopSongList() { + songList = songRepository.getArtistListLiveTopSong(artist.id); return songList; } + + public Artist getArtist() { + return artist; + } + + public void setArtist(Artist artist) { + this.artist = artist; + } } diff --git a/app/src/main/res/layout/fragment_album_page.xml b/app/src/main/res/layout/fragment_album_page.xml new file mode 100644 index 00000000..52a9b3db --- /dev/null +++ b/app/src/main/res/layout/fragment_album_page.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_artist_page.xml b/app/src/main/res/layout/fragment_artist_page.xml index b60d8b7b..3a999399 100644 --- a/app/src/main/res/layout/fragment_artist_page.xml +++ b/app/src/main/res/layout/fragment_artist_page.xml @@ -29,14 +29,17 @@ android:layout_height="match_parent"> + android:paddingBottom="54dp" /> diff --git a/app/src/main/res/layout/item_search_result_song.xml b/app/src/main/res/layout/item_search_result_song.xml index fb082d41..56e78fe2 100644 --- a/app/src/main/res/layout/item_search_result_song.xml +++ b/app/src/main/res/layout/item_search_result_song.xml @@ -1,19 +1,18 @@ - + android:paddingEnd="4dp" + android:paddingBottom="2dp"> + card_view:cardUseCompatPadding="false" /> - + android:layout_height="match_parent" + android:orientation="vertical" + android:layout_weight="1"> - + + + + - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index eb0ce174..b008c643 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -83,11 +83,10 @@ app:destination="@id/genreCatalogueFragment" /> - - + app:destination="@id/artistPageFragment"/> + - - + app:destination="@id/artistPageFragment"/> + - - + app:destination="@id/artistPageFragment"/> + tools:layout="@layout/fragment_album_catalogue"> + + + tools:layout="@layout/fragment_artist_page"> + + + \ No newline at end of file