From 8b7e383dc247aa15da8dd792670aa53db0a459a5 Mon Sep 17 00:00:00 2001 From: Antonio Cappiello Date: Sat, 21 Nov 2020 18:41:35 +0100 Subject: [PATCH] Add catalogues --- app/build.gradle | 3 + .../play/adapter/AlbumAdapter.java | 2 +- .../play/adapter/AlbumCatalogueAdapter.java | 79 +++++++++++++++++++ .../play/adapter/ArtistAdapter.java | 2 +- .../play/adapter/ArtistCatalogueAdapter.java | 76 ++++++++++++++++++ .../play/adapter/DiscoverSongAdapter.java | 6 ++ .../play/adapter/GenreCatalogueAdapter.java | 77 ++++++++++++++++++ .../play/adapter/RecentMusicAdapter.java | 7 ++ .../play/database/dao/AlbumDao.java | 3 + .../play/database/dao/ArtistDao.java | 3 + .../play/database/dao/GenreDao.java | 4 + .../play/database/dao/SongDao.java | 12 +++ .../play/repository/AlbumRepository.java | 8 +- .../play/repository/ArtistRepository.java | 9 ++- .../play/repository/GenreRepository.java | 9 ++- .../play/repository/SongRepository.java | 33 ++++++-- .../ui/fragment/AlbumCatalogueFragment.java | 60 ++++++++++++++ .../ui/fragment/ArtistCatalogueFragment.java | 65 +++++++++++++++ .../play/ui/fragment/FilterFragment.java | 13 +-- .../ui/fragment/GenreCatalogueFragment.java | 61 ++++++++++++++ .../play/ui/fragment/HomeFragment.java | 20 +++-- .../play/ui/fragment/LibraryFragment.java | 19 ++++- .../viewmodel/AlbumCatalogueViewModel.java | 32 ++++++++ .../viewmodel/ArtistCatalogueViewModel.java | 30 +++++++ .../play/viewmodel/FilterViewModel.java | 33 ++++++++ .../viewmodel/GenreCatalogueViewModel.java | 32 ++++++++ .../play/viewmodel/HomeViewModel.java | 54 +++++++------ .../play/viewmodel/LibraryViewModel.java | 51 ++++++------ .../play/viewmodel/SearchViewModel.java | 2 +- .../play/viewmodel/SongViewModel.java | 40 ---------- .../res/layout/fragment_album_catalogue.xml | 57 +++++++++++++ .../res/layout/fragment_artist_catalogue.xml | 57 +++++++++++++ app/src/main/res/layout/fragment_filter.xml | 1 - .../res/layout/fragment_genre_catalogue.xml | 57 +++++++++++++ app/src/main/res/layout/fragment_home.xml | 4 +- app/src/main/res/layout/fragment_library.xml | 3 + .../res/layout/item_home_discover_song.xml | 3 +- .../res/layout/item_home_recent_track.xml | 10 +-- .../main/res/layout/item_library_album.xml | 8 +- .../main/res/layout/item_library_artist.xml | 6 +- .../layout/item_library_catalogue_album.xml | 52 ++++++++++++ .../layout/item_library_catalogue_artist.xml | 38 +++++++++ .../layout/item_library_catalogue_genre.xml | 44 +++++++++++ .../main/res/layout/item_library_genre.xml | 5 +- app/src/main/res/navigation/nav_graph.xml | 30 ++++++- 45 files changed, 1084 insertions(+), 136 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java create mode 100644 app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java create mode 100644 app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java create mode 100644 app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java create mode 100644 app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.java create mode 100644 app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java create mode 100644 app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java create mode 100644 app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java create mode 100644 app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java create mode 100644 app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java delete mode 100644 app/src/main/java/com/cappielloantonio/play/viewmodel/SongViewModel.java create mode 100644 app/src/main/res/layout/fragment_album_catalogue.xml create mode 100644 app/src/main/res/layout/fragment_artist_catalogue.xml create mode 100644 app/src/main/res/layout/fragment_genre_catalogue.xml create mode 100644 app/src/main/res/layout/item_library_catalogue_album.xml create mode 100644 app/src/main/res/layout/item_library_catalogue_artist.xml create mode 100644 app/src/main/res/layout/item_library_catalogue_genre.xml diff --git a/app/build.gradle b/app/build.gradle index f47d0b27..847cef5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,6 +54,9 @@ dependencies { implementation "androidx.room:room-runtime:2.2.5" implementation 'com.github.jellyfin.jellyfin-apiclient-java:android:0.7.7' implementation "androidx.cardview:cardview:1.0.0" + + implementation 'org.apache.commons:commons-lang3:3.11' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' annotationProcessor 'com.github.bumptech.glide:compiler:4.11.0' annotationProcessor "androidx.room:room-compiler:2.2.5" testImplementation 'junit:junit:4.13.1' 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 1ef23c54..f9c5cb3d 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java @@ -10,7 +10,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; import com.cappielloantonio.play.model.Album; -import com.cappielloantonio.play.model.Genre; +import com.cappielloantonio.play.util.Util; import java.util.List; diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java new file mode 100644 index 00000000..7a741521 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java @@ -0,0 +1,79 @@ +package com.cappielloantonio.play.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.model.Album; + +import java.util.List; + +public class AlbumCatalogueAdapter extends RecyclerView.Adapter { + private static final String TAG = "AlbumAdapter"; + private List albums; + private LayoutInflater mInflater; + private Context context; + private ItemClickListener itemClickListener; + + public AlbumCatalogueAdapter(Context context, List albums) { + this.context = context; + this.mInflater = LayoutInflater.from(context); + this.albums = albums; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_library_catalogue_album, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Album album = albums.get(position); + + holder.textAlbumName.setText(album.getTitle()); + holder.textArtistName.setText(album.getArtistName()); + } + + @Override + public int getItemCount() { + return albums.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + TextView textAlbumName; + TextView textArtistName; + + ViewHolder(View itemView) { + super(itemView); + + textAlbumName = itemView.findViewById(R.id.album_name_label); + textArtistName = itemView.findViewById(R.id.artist_name_label); + + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition()); + } + } + + public void setItems(List albums) { + 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/ArtistAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java index 72e28376..9cb18cba 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistAdapter.java @@ -9,8 +9,8 @@ import android.widget.TextView; 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; diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java new file mode 100644 index 00000000..a13d6279 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java @@ -0,0 +1,76 @@ +package com.cappielloantonio.play.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.model.Artist; + +import java.util.List; + +public class ArtistCatalogueAdapter extends RecyclerView.Adapter { + private static final String TAG = "ArtistAdapter"; + private List artists; + private LayoutInflater mInflater; + private Context context; + private ItemClickListener itemClickListener; + + public ArtistCatalogueAdapter(Context context, List artists) { + this.context = context; + this.mInflater = LayoutInflater.from(context); + this.artists = artists; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_library_catalogue_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()); + } + + @Override + public int getItemCount() { + return artists.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + TextView textArtistName; + + ViewHolder(View itemView) { + super(itemView); + + textArtistName = itemView.findViewById(R.id.artist_name_label); + + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition()); + } + } + + public void setItems(List artists) { + this.artists = artists; + 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/DiscoverSongAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java index c42bf0c4..5e1540ea 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java @@ -11,6 +11,7 @@ import androidx.annotation.NonNull; import androidx.viewpager.widget.PagerAdapter; import com.cappielloantonio.play.R; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import java.util.List; @@ -57,6 +58,11 @@ public class DiscoverSongAdapter extends PagerAdapter { return view; } + public void setItems(List songs) { + this.songs = songs; + notifyDataSetChanged(); + } + @Override public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) { container.removeView((View)object); diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java new file mode 100644 index 00000000..24bf0a8c --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java @@ -0,0 +1,77 @@ +package com.cappielloantonio.play.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.model.Genre; + +import java.util.List; + +public class GenreCatalogueAdapter extends RecyclerView.Adapter { + private static final String TAG = "GenreAdapter"; + private List genres; + private LayoutInflater mInflater; + private Context context; + private ItemClickListener itemClickListener; + + public GenreCatalogueAdapter(Context context, List genres) { + this.context = context; + this.mInflater = LayoutInflater.from(context); + this.genres = genres; + } + + // inflates the row layout from xml when needed + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_library_catalogue_genre, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + Genre genre = genres.get(position); + + holder.textGenre.setText(genre.getName()); + } + + @Override + public int getItemCount() { + return genres.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + TextView textGenre; + + ViewHolder(View itemView) { + super(itemView); + + textGenre = itemView.findViewById(R.id.genre_label); + + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition()); + } + } + + public void setItems(List genres) { + this.genres = genres; + 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/RecentMusicAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java index 85114d33..e3a82141 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/RecentMusicAdapter.java @@ -9,7 +9,9 @@ import android.widget.TextView; import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.R; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.util.Util; import java.util.List; @@ -67,6 +69,11 @@ public class RecentMusicAdapter extends RecyclerView.Adapter songs) { + this.songs = songs; + notifyDataSetChanged(); + } + public void setClickListener(ItemClickListener itemClickListener) { this.itemClickListener = itemClickListener; } diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/AlbumDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/AlbumDao.java index 6d6fe712..950efce4 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/dao/AlbumDao.java +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/AlbumDao.java @@ -17,6 +17,9 @@ public interface AlbumDao { @Query("SELECT * FROM album") LiveData> getAll(); + @Query("SELECT * FROM album ORDER BY RANDOM() LIMIT :number;") + LiveData> getSample(int number); + @Query("SELECT EXISTS(SELECT * FROM album WHERE id = :id)") boolean exist(String id); diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/ArtistDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/ArtistDao.java index 10a847fa..ffb96e11 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/dao/ArtistDao.java +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/ArtistDao.java @@ -17,6 +17,9 @@ public interface ArtistDao { @Query("SELECT * FROM artist") LiveData> getAll(); + @Query("SELECT * FROM artist ORDER BY RANDOM() LIMIT :number;") + LiveData> getSample(int number); + @Query("SELECT EXISTS(SELECT * FROM artist WHERE id = :id)") boolean exist(String id); diff --git a/app/src/main/java/com/cappielloantonio/play/database/dao/GenreDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/GenreDao.java index b9fba993..ada403b6 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/dao/GenreDao.java +++ b/app/src/main/java/com/cappielloantonio/play/database/dao/GenreDao.java @@ -7,6 +7,7 @@ import androidx.room.Insert; import androidx.room.OnConflictStrategy; import androidx.room.Query; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Genre; @@ -17,6 +18,9 @@ public interface GenreDao { @Query("SELECT * FROM genre") LiveData> getAll(); + @Query("SELECT * FROM genre ORDER BY RANDOM() LIMIT :number;") + LiveData> getSample(int number); + @Query("SELECT EXISTS(SELECT * FROM genre WHERE id = :id)") boolean exist(String id); 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 e2f178cc..66075692 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 @@ -19,6 +19,18 @@ public interface SongDao { @Query("SELECT * FROM song WHERE title LIKE '%' || :title || '%'") LiveData> searchSong(String title); + @Query("SELECT * FROM song ORDER BY RANDOM() LIMIT :number") + LiveData> getDiscoverSample(int number); + + @Query("SELECT * FROM song ORDER BY RANDOM() LIMIT :number") + LiveData> getRecentlyAddedSample(int number); + + @Query("SELECT * FROM song ORDER BY RANDOM() LIMIT :number") + LiveData> getRecentlyPlayedSample(int number); + + @Query("SELECT * FROM song ORDER BY RANDOM() LIMIT :number") + LiveData> getMostPlayedSample(int number); + @Query("SELECT EXISTS(SELECT * FROM song WHERE id = :id)") boolean exist(String id); diff --git a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java index 906dc45d..c916510e 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/AlbumRepository.java @@ -14,17 +14,23 @@ import java.util.List; public class AlbumRepository { private AlbumDao albumDao; private LiveData> listLiveAlbums; + private LiveData> listLiveSampleAlbum; public AlbumRepository(Application application) { AppDatabase database = AppDatabase.getInstance(application); albumDao = database.albumDao(); - listLiveAlbums = albumDao.getAll(); } public LiveData> getListLiveAlbums() { + listLiveAlbums = albumDao.getAll(); return listLiveAlbums; } + public LiveData> getListLiveSampleAlbum() { + listLiveSampleAlbum = albumDao.getSample(10); + return listLiveSampleAlbum; + } + public boolean exist(Album album) { boolean exist = false; diff --git a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java index cb531828..41bc5c59 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/ArtistRepository.java @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData; import com.cappielloantonio.play.database.AppDatabase; import com.cappielloantonio.play.database.dao.ArtistDao; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import java.util.ArrayList; @@ -14,17 +15,23 @@ import java.util.List; public class ArtistRepository { private ArtistDao artistDao; private LiveData> listLiveArtists; + private LiveData> listLiveSampleArtist; public ArtistRepository(Application application) { AppDatabase database = AppDatabase.getInstance(application); artistDao = database.artistDao(); - listLiveArtists = artistDao.getAll(); } public LiveData> getListLiveArtists() { + listLiveArtists = artistDao.getAll(); return listLiveArtists; } + public LiveData> getListLiveSampleArtist() { + listLiveSampleArtist = artistDao.getSample(10); + return listLiveSampleArtist; + } + public boolean exist(Artist artist) { boolean exist = false; diff --git a/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java index f3d8a1f1..7eaf156b 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/GenreRepository.java @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData; import com.cappielloantonio.play.database.AppDatabase; import com.cappielloantonio.play.database.dao.GenreDao; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Genre; import java.util.ArrayList; @@ -14,17 +15,23 @@ import java.util.List; public class GenreRepository { private GenreDao genreDao; private LiveData> listLiveGenres; + private LiveData> listLiveAlbumGenre; public GenreRepository(Application application) { AppDatabase database = AppDatabase.getInstance(application); genreDao = database.genreDao(); - listLiveGenres = genreDao.getAll(); } public LiveData> getListLiveGenres() { + listLiveGenres = genreDao.getAll(); return listLiveGenres; } + public LiveData> getListLiveSampleGenre() { + listLiveAlbumGenre = genreDao.getSample(6 * 3); + return listLiveAlbumGenre; + } + public boolean exist(Genre genre) { boolean exist = false; 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 13dc7d4c..4181120c 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -6,6 +6,7 @@ import androidx.lifecycle.LiveData; import com.cappielloantonio.play.database.AppDatabase; import com.cappielloantonio.play.database.dao.SongDao; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Song; import java.util.ArrayList; @@ -15,22 +16,42 @@ public class SongRepository { private SongDao songDao; private LiveData> listLiveSongs; private LiveData> searchListLiveSongs; + private LiveData> listLiveSampleDiscoverSongs; + private LiveData> listLiveSampleRecentlyAddedSongs; + private LiveData> listLiveSampleRecentlyPlayedSongs; + private LiveData> listLiveSampleMostPlayedSongs; + public SongRepository(Application application) { AppDatabase database = AppDatabase.getInstance(application); songDao = database.songDao(); } - public LiveData> getListLiveSongs() { - listLiveSongs = songDao.getAll(); - return listLiveSongs; - } - - public LiveData> searchListLiveSongs(String title) { + public LiveData> searchListLiveSong(String title) { searchListLiveSongs = songDao.searchSong(title); return searchListLiveSongs; } + public LiveData> getListLiveDiscoverSampleSong() { + listLiveSampleDiscoverSongs = songDao.getDiscoverSample(5); + return listLiveSampleDiscoverSongs; + } + + public LiveData> getListLiveRecentlyAddedSampleSong() { + listLiveSampleRecentlyAddedSongs = songDao.getRecentlyAddedSample(20); + return listLiveSampleRecentlyAddedSongs; + } + + public LiveData> getListLiveRecentlyPlayedSampleSong() { + listLiveSampleRecentlyPlayedSongs = songDao.getRecentlyPlayedSample(20); + return listLiveSampleRecentlyPlayedSongs; + } + + public LiveData> getListLiveMostPlayedSampleSong() { + listLiveSampleMostPlayedSongs = songDao.getMostPlayedSample(20); + return listLiveSampleMostPlayedSongs; + } + 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 new file mode 100644 index 00000000..4e200479 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumCatalogueFragment.java @@ -0,0 +1,60 @@ +package com.cappielloantonio.play.ui.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.cappielloantonio.play.adapter.AlbumCatalogueAdapter; +import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; +import com.cappielloantonio.play.databinding.FragmentAlbumCatalogueBinding; +import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; +import com.cappielloantonio.play.viewmodel.AlbumCatalogueViewModel; +import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; + +import java.util.ArrayList; + +public class AlbumCatalogueFragment extends Fragment { + private static final String TAG = "ArtistCatalogueFragment"; + + private FragmentAlbumCatalogueBinding bind; + private AlbumCatalogueViewModel albumCatalogueViewModel; + + private AlbumCatalogueAdapter albumAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + bind = FragmentAlbumCatalogueBinding.inflate(inflater, container, false); + View view = bind.getRoot(); + albumCatalogueViewModel = new ViewModelProvider(requireActivity()).get(AlbumCatalogueViewModel.class); + + initAlbumCatalogueView(); + + return view; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void initAlbumCatalogueView() { + bind.albumCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); + bind.albumCatalogueRecyclerView.setHasFixedSize(true); + + albumAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); + albumAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Click: " + position, Toast.LENGTH_SHORT).show()); + bind.albumCatalogueRecyclerView.setAdapter(albumAdapter); + albumCatalogueViewModel.getAlbumList().observe(requireActivity(), albums -> { + bind.loadingProgressBar.setVisibility(View.GONE); + bind.albumCatalogueContainer.setVisibility(View.VISIBLE); + albumAdapter.setItems(albums); + }); + } +} \ 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 new file mode 100644 index 00000000..fc0fe413 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistCatalogueFragment.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 android.widget.Toast; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.cappielloantonio.play.R; +import com.cappielloantonio.play.adapter.ArtistAdapter; +import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; +import com.cappielloantonio.play.adapter.RecentMusicAdapter; +import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; +import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.ui.activities.MainActivity; +import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; + +import java.util.ArrayList; +import java.util.List; + +public class ArtistCatalogueFragment extends Fragment { + private static final String TAG = "ArtistCatalogueFragment"; + + private FragmentArtistCatalogueBinding bind; + private ArtistCatalogueViewModel artistCatalogueViewModel; + + private ArtistCatalogueAdapter artistAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + bind = FragmentArtistCatalogueBinding.inflate(inflater, container, false); + View view = bind.getRoot(); + artistCatalogueViewModel = new ViewModelProvider(requireActivity()).get(ArtistCatalogueViewModel.class); + + initArtistCatalogueView(); + + return view; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void initArtistCatalogueView() { + bind.artistCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); + bind.artistCatalogueRecyclerView.setHasFixedSize(true); + + artistAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); + artistAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Click: " + position, Toast.LENGTH_SHORT).show()); + bind.artistCatalogueRecyclerView.setAdapter(artistAdapter); + artistCatalogueViewModel.getArtistList().observe(requireActivity(), artists -> { + bind.loadingProgressBar.setVisibility(View.GONE); + bind.artistCatalogueContainer.setVisibility(View.VISIBLE); + artistAdapter.setItems(artists); + }); + } +} \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java index 50e15913..83dc79da 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/FilterFragment.java @@ -1,7 +1,6 @@ package com.cappielloantonio.play.ui.fragment; import android.os.Bundle; -import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,26 +14,22 @@ import androidx.lifecycle.ViewModelProvider; import com.cappielloantonio.play.R; import com.cappielloantonio.play.databinding.FragmentFilterBinding; import com.cappielloantonio.play.model.Genre; -import com.cappielloantonio.play.ui.activities.MainActivity; -import com.cappielloantonio.play.viewmodel.SearchViewModel; +import com.cappielloantonio.play.viewmodel.FilterViewModel; import com.google.android.material.chip.Chip; public class FilterFragment extends Fragment { private static final String TAG = "FilterFragment"; - private MainActivity activity; private FragmentFilterBinding bind; - private SearchViewModel searchViewModel; + private FilterViewModel filterViewModel; @Nullable @Override public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - activity = (MainActivity) getActivity(); - bind = FragmentFilterBinding.inflate(inflater, container, false); View view = bind.getRoot(); - searchViewModel = new ViewModelProvider(requireActivity()).get(SearchViewModel.class); + filterViewModel = new ViewModelProvider(requireActivity()).get(FilterViewModel.class); setFilterChips(); return view; @@ -47,7 +42,7 @@ public class FilterFragment extends Fragment { } private void setFilterChips() { - searchViewModel.getGenreList().observe(requireActivity(), genres -> { + filterViewModel.getGenreList().observe(requireActivity(), genres -> { bind.loadingProgressBar.setVisibility(View.GONE); for (Genre genre : genres) { Chip mChip = (Chip) requireActivity().getLayoutInflater().inflate(R.layout.chip_search_filter_genre, null, false); 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 new file mode 100644 index 00000000..5a4e9e5e --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/GenreCatalogueFragment.java @@ -0,0 +1,61 @@ +package com.cappielloantonio.play.ui.fragment; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.Toast; + +import androidx.fragment.app.Fragment; +import androidx.lifecycle.ViewModelProvider; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.cappielloantonio.play.adapter.ArtistCatalogueAdapter; +import com.cappielloantonio.play.adapter.GenreAdapter; +import com.cappielloantonio.play.adapter.GenreCatalogueAdapter; +import com.cappielloantonio.play.databinding.FragmentArtistCatalogueBinding; +import com.cappielloantonio.play.databinding.FragmentGenreCatalogueBinding; +import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; +import com.cappielloantonio.play.viewmodel.GenreCatalogueViewModel; + +import java.util.ArrayList; + +public class GenreCatalogueFragment extends Fragment { + private static final String TAG = "GenreCatalogueFragment";; + + private FragmentGenreCatalogueBinding bind; + private GenreCatalogueViewModel genreCatalogueViewModel; + + private GenreCatalogueAdapter genreCatalogueAdapter; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + bind = FragmentGenreCatalogueBinding.inflate(inflater, container, false); + View view = bind.getRoot(); + genreCatalogueViewModel = new ViewModelProvider(requireActivity()).get(GenreCatalogueViewModel.class); + + initArtistCatalogueView(); + + return view; + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + bind = null; + } + + private void initArtistCatalogueView() { + bind.genreCatalogueRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); + bind.genreCatalogueRecyclerView.setHasFixedSize(true); + + genreCatalogueAdapter = new GenreCatalogueAdapter(requireContext(), new ArrayList<>()); + genreCatalogueAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Click: " + position, Toast.LENGTH_SHORT).show()); + bind.genreCatalogueRecyclerView.setAdapter(genreCatalogueAdapter); + genreCatalogueViewModel.getGenreList().observe(requireActivity(), genres -> { + bind.loadingProgressBar.setVisibility(View.GONE); + bind.genreCatalogueContainer.setVisibility(View.VISIBLE); + genreCatalogueAdapter.setItems(genres); + }); + } +} \ 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 4e3e69e3..84b78f36 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 @@ -9,16 +9,21 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.Fragment; +import androidx.lifecycle.Observer; import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.adapter.DiscoverSongAdapter; import com.cappielloantonio.play.adapter.RecentMusicAdapter; import com.cappielloantonio.play.databinding.FragmentHomeBinding; +import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.HomeViewModel; +import java.util.ArrayList; +import java.util.List; + public class HomeFragment extends Fragment implements RecentMusicAdapter.ItemClickListener { private static final String TAG = "CategoriesFragment"; @@ -27,7 +32,7 @@ public class HomeFragment extends Fragment implements RecentMusicAdapter.ItemCli private HomeViewModel homeViewModel; private DiscoverSongAdapter discoverSongAdapter; - private RecentMusicAdapter recentMusicAdapter; + private RecentMusicAdapter recentlyAddedMusicAdapter; private RecentMusicAdapter mostPlayedMusicAdapter; @Nullable @@ -61,27 +66,30 @@ public class HomeFragment extends Fragment implements RecentMusicAdapter.ItemCli } private void initDiscoverSongSlideView() { - discoverSongAdapter = new DiscoverSongAdapter(requireContext(), homeViewModel.getDiscoverSongList()); + discoverSongAdapter = new DiscoverSongAdapter(requireContext(), new ArrayList<>()); bind.discoverSongViewPager.setAdapter(discoverSongAdapter); bind.discoverSongViewPager.setPageMargin(20); + homeViewModel.getDiscoverSongList().observe(requireActivity(), songs -> discoverSongAdapter.setItems(songs)); } private void initRecentPlayedSongView() { bind.recentlyPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.recentlyPlayedTracksRecyclerView.setHasFixedSize(true); - recentMusicAdapter = new RecentMusicAdapter(requireContext(), homeViewModel.getRecentSongList()); - recentMusicAdapter.setClickListener(this); - bind.recentlyPlayedTracksRecyclerView.setAdapter(recentMusicAdapter); + recentlyAddedMusicAdapter = new RecentMusicAdapter(requireContext(), new ArrayList<>()); + recentlyAddedMusicAdapter.setClickListener(this); + bind.recentlyPlayedTracksRecyclerView.setAdapter(recentlyAddedMusicAdapter); + homeViewModel.getRecentlyAddedSongList().observe(requireActivity(), songs -> recentlyAddedMusicAdapter.setItems(songs)); } private void initMostPlayedSongView() { bind.mostPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.mostPlayedTracksRecyclerView.setHasFixedSize(true); - mostPlayedMusicAdapter = new RecentMusicAdapter(requireContext(), homeViewModel.getMostPlayedSongList()); + mostPlayedMusicAdapter = new RecentMusicAdapter(requireContext(), new ArrayList<>()); mostPlayedMusicAdapter.setClickListener(this); bind.mostPlayedTracksRecyclerView.setAdapter(mostPlayedMusicAdapter); + homeViewModel.getMostPlayedSongList().observe(requireActivity(), songs -> mostPlayedMusicAdapter.setItems(songs)); } @Override 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 020710ab..b66aa859 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 @@ -1,6 +1,7 @@ package com.cappielloantonio.play.ui.fragment; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -14,11 +15,14 @@ import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.GridLayoutManager; import androidx.recyclerview.widget.LinearLayoutManager; +import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.AlbumAdapter; 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.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Genre; import com.cappielloantonio.play.model.Playlist; import com.cappielloantonio.play.ui.activities.MainActivity; @@ -48,6 +52,7 @@ public class LibraryFragment extends Fragment { View view = bind.getRoot(); libraryViewModel = new ViewModelProvider(requireActivity()).get(LibraryViewModel.class); + init(); initAlbumView(); initArtistView(); initGenreView(); @@ -62,22 +67,30 @@ public class LibraryFragment extends Fragment { bind = null; } + private void init() { + bind.albumCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_albumCatalogueFragment)); + bind.artistCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_artistCatalogueFragment)); + bind.genreCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_genreCatalogueFragment)); + } + private void initAlbumView() { bind.albumRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.albumRecyclerView.setHasFixedSize(true); - albumAdapter = new AlbumAdapter(requireContext(), libraryViewModel.getAlbumSample()); + albumAdapter = new AlbumAdapter(requireContext(), new ArrayList<>()); albumAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Album: " + position, Toast.LENGTH_SHORT).show()); bind.albumRecyclerView.setAdapter(albumAdapter); + libraryViewModel.getAlbumSample().observe(requireActivity(), albums -> albumAdapter.setItems(albums)); } private void initArtistView() { bind.artistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.artistRecyclerView.setHasFixedSize(true); - artistAdapter = new ArtistAdapter(requireContext(), libraryViewModel.getArtistSample()); + artistAdapter = new ArtistAdapter(requireContext(), new ArrayList<>()); artistAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Artist: " + position, Toast.LENGTH_SHORT).show()); bind.artistRecyclerView.setAdapter(artistAdapter); + libraryViewModel.getArtistSample().observe(requireActivity(), artists -> artistAdapter.setItems(artists)); } private void initGenreView() { @@ -87,7 +100,7 @@ public class LibraryFragment extends Fragment { genreAdapter = new GenreAdapter(requireContext(), new ArrayList<>()); genreAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Genre: " + position, Toast.LENGTH_SHORT).show()); bind.genreRecyclerView.setAdapter(genreAdapter); - libraryViewModel.getGenreList().observe(requireActivity(), genres -> genreAdapter.setItems(genres)); + libraryViewModel.getGenreSample().observe(requireActivity(), genres -> genreAdapter.setItems(genres)); } private void initPlaylistView() { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java new file mode 100644 index 00000000..23a4fbd1 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java @@ -0,0 +1,32 @@ +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.repository.AlbumRepository; +import com.cappielloantonio.play.repository.ArtistRepository; + +import java.util.List; + +public class AlbumCatalogueViewModel extends AndroidViewModel { + private AlbumRepository albumRepository; + + private LiveData> albumList; + + public AlbumCatalogueViewModel(@NonNull Application application) { + super(application); + + albumRepository = new AlbumRepository(application); + + albumList = albumRepository.getListLiveAlbums(); + } + + public LiveData> getAlbumList() { + return albumList; + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java new file mode 100644 index 00000000..2e1b862f --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistCatalogueViewModel.java @@ -0,0 +1,30 @@ +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.Artist; +import com.cappielloantonio.play.repository.ArtistRepository; + +import java.util.List; + +public class ArtistCatalogueViewModel extends AndroidViewModel { + private ArtistRepository artistRepository; + + private LiveData> artistList; + + public ArtistCatalogueViewModel(@NonNull Application application) { + super(application); + + artistRepository = new ArtistRepository(application); + + artistList = artistRepository.getListLiveArtists(); + } + + public LiveData> getArtistList() { + return artistList; + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java new file mode 100644 index 00000000..8a9da55c --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/FilterViewModel.java @@ -0,0 +1,33 @@ +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.Genre; +import com.cappielloantonio.play.model.RecentSearch; +import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.GenreRepository; +import com.cappielloantonio.play.repository.RecentSearchRepository; +import com.cappielloantonio.play.repository.SongRepository; + +import java.util.List; + +public class FilterViewModel extends AndroidViewModel { + private GenreRepository genreRepository; + + private LiveData> allGenres; + + public FilterViewModel(@NonNull Application application) { + super(application); + + genreRepository = new GenreRepository(application); + } + + public LiveData> getGenreList() { + allGenres = genreRepository.getListLiveGenres(); + return allGenres; + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java new file mode 100644 index 00000000..46e67440 --- /dev/null +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/GenreCatalogueViewModel.java @@ -0,0 +1,32 @@ +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.Artist; +import com.cappielloantonio.play.model.Genre; +import com.cappielloantonio.play.repository.ArtistRepository; +import com.cappielloantonio.play.repository.GenreRepository; + +import java.util.List; + +public class GenreCatalogueViewModel extends AndroidViewModel { + private GenreRepository genreRepository; + + private LiveData> genreList; + + public GenreCatalogueViewModel(@NonNull Application application) { + super(application); + + genreRepository = new GenreRepository(application); + + genreList = genreRepository.getListLiveGenres(); + } + + public LiveData> getGenreList() { + return genreList; + } +} diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java index 3d4438a7..6f7ca9eb 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java @@ -1,41 +1,51 @@ package com.cappielloantonio.play.viewmodel; +import android.app.Application; + +import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; +import androidx.lifecycle.LiveData; import androidx.lifecycle.ViewModel; import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.SongRepository; import java.util.ArrayList; import java.util.List; -public class HomeViewModel extends ViewModel { +public class HomeViewModel extends AndroidViewModel { + private SongRepository songRepository; - public List getDiscoverSongList() { - List discover_songs = new ArrayList<>(); - discover_songs.add(new Song("Holiday", "American Idiot")); - discover_songs.add(new Song("Brioschi", "Stanza Singola")); - discover_songs.add(new Song("HappySad", "Ceri Singles")); - discover_songs.add(new Song("Falling back to Earth", "Haken")); + private LiveData> dicoverSongSample; + private LiveData> recentlyPlayedSongSample; + private LiveData> recentlyAddedSongSample; + private LiveData> mostPlayedSongSample; - return discover_songs; + public HomeViewModel(@NonNull Application application) { + super(application); + + songRepository = new SongRepository(application); + + dicoverSongSample = songRepository.getListLiveDiscoverSampleSong(); + recentlyPlayedSongSample = songRepository.getListLiveRecentlyPlayedSampleSong(); + recentlyAddedSongSample = songRepository.getListLiveRecentlyAddedSampleSong(); + mostPlayedSongSample = songRepository.getListLiveMostPlayedSampleSong(); } - public List getRecentSongList() { - List recent_songs = new ArrayList<>(); - recent_songs.add(new Song("Holiday", "American Idiot")); - recent_songs.add(new Song("Brioschi", "Stanza Singola")); - recent_songs.add(new Song("HappySad", "Ceri Singles")); - recent_songs.add(new Song("Falling back to Earth", "Haken")); - return recent_songs; + public LiveData> getDiscoverSongList() { + return dicoverSongSample; } - public List getMostPlayedSongList() { - List most_played_songs = new ArrayList<>(); - most_played_songs.add(new Song("Holiday", "American Idiot")); - most_played_songs.add(new Song("Brioschi", "Stanza Singola")); - most_played_songs.add(new Song("HappySad", "Ceri Singles")); - most_played_songs.add(new Song("Falling back to Earth", "Haken")); + public LiveData> getRecentlyAddedSongList() { + return recentlyAddedSongSample; + } - return most_played_songs; + public LiveData> getRecentlyPlayedSongList() { + return recentlyPlayedSongSample; + } + + public LiveData> getMostPlayedSongList() { + return mostPlayedSongSample; } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java index 4cdaf630..a495ab4b 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/LibraryViewModel.java @@ -10,54 +10,53 @@ import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Genre; import com.cappielloantonio.play.model.Playlist; +import com.cappielloantonio.play.repository.AlbumRepository; +import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.GenreRepository; import java.util.ArrayList; import java.util.List; public class LibraryViewModel extends AndroidViewModel { + private AlbumRepository albumRepository; + private ArtistRepository artistRepository; private GenreRepository genreRepository; + + private LiveData> sampleAlbum; + private LiveData> sampleArtist; + private LiveData> sampleGenres; + private LiveData> allGenres; public LibraryViewModel(@NonNull Application application) { super(application); + albumRepository = new AlbumRepository(application); + artistRepository = new ArtistRepository(application); genreRepository = new GenreRepository(application); - allGenres = genreRepository.getListLiveGenres(); + + // Inizializzate all'interno del costruttore, in modo da rimanere immutabili per tutto il + // ciclo di vita dell'applicazione + sampleAlbum = albumRepository.getListLiveSampleAlbum(); + sampleArtist = artistRepository.getListLiveSampleArtist(); + sampleGenres = genreRepository.getListLiveSampleGenre(); } public LiveData> getGenreList() { + allGenres = genreRepository.getListLiveGenres(); return allGenres; } - public ArrayList getAlbumSample() { - ArrayList albums = new ArrayList<>(); - albums.add(new Album("1", "aaaa", 1, "1", "qqqq", "", "")); - albums.add(new Album("2", "ssss", 1, "2", "wwww", "", "")); - albums.add(new Album("3", "dddd", 1, "3", "eeee", "", "")); - albums.add(new Album("4", "ffff", 1, "4", "rrrr", "", "")); - albums.add(new Album("5", "gggg", 1, "5", "tttt", "", "")); - albums.add(new Album("6", "hhhh", 1, "6", "yyyy", "", "")); - albums.add(new Album("7", "jjjj", 1, "7", "uuuu", "", "")); - albums.add(new Album("8", "kkkk", 1, "8", "iiii", "", "")); - albums.add(new Album("9", "llll", 1, "9", "oooo", "", "")); - - return albums; + public LiveData> getAlbumSample() { + return sampleAlbum; } - public ArrayList getArtistSample() { - ArrayList artists = new ArrayList<>(); - artists.add(new Artist("1", "dhgr", "", "")); - artists.add(new Artist("2", "kdnu", "", "")); - artists.add(new Artist("3", "wfty", "", "")); - artists.add(new Artist("4", "hfds", "", "")); - artists.add(new Artist("5", "jgab", "", "")); - artists.add(new Artist("6", "iudg", "", "")); - artists.add(new Artist("7", "istr", "", "")); - artists.add(new Artist("8", "dger", "", "")); - artists.add(new Artist("9", "jhjk", "", "")); + public LiveData> getArtistSample() { + return sampleArtist; + } - return artists; + public LiveData> getGenreSample() { + return sampleGenres; } public ArrayList getPlaylist() { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java index 43602035..e44cffc4 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SearchViewModel.java @@ -33,7 +33,7 @@ public class SearchViewModel extends AndroidViewModel { } public LiveData> searchSong(String title) { - searchSong = songRepository.searchListLiveSongs(title); + searchSong = songRepository.searchListLiveSong(title); return searchSong; } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongViewModel.java deleted file mode 100644 index ee74622d..00000000 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongViewModel.java +++ /dev/null @@ -1,40 +0,0 @@ -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.Song; -import com.cappielloantonio.play.repository.SongRepository; - -import java.util.List; - -public class SongViewModel extends AndroidViewModel { - private SongRepository repository; - private LiveData> allSongs; - - public SongViewModel(@NonNull Application application) { - super(application); - - repository = new SongRepository(application); - allSongs = repository.getListLiveSongs(); - } - - public boolean exist(Song song) { - return repository.exist(song); - } - - public void insert(Song song) { - repository.insert(song); - } - - public void delete(Song song) { - repository.delete(song); - } - - public LiveData> getAllSongs() { - return allSongs; - } -} diff --git a/app/src/main/res/layout/fragment_album_catalogue.xml b/app/src/main/res/layout/fragment_album_catalogue.xml new file mode 100644 index 00000000..b3a8b717 --- /dev/null +++ b/app/src/main/res/layout/fragment_album_catalogue.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_artist_catalogue.xml b/app/src/main/res/layout/fragment_artist_catalogue.xml new file mode 100644 index 00000000..9c437506 --- /dev/null +++ b/app/src/main/res/layout/fragment_artist_catalogue.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_filter.xml b/app/src/main/res/layout/fragment_filter.xml index f6f1450e..9fcfa92b 100644 --- a/app/src/main/res/layout/fragment_filter.xml +++ b/app/src/main/res/layout/fragment_filter.xml @@ -35,5 +35,4 @@ android:layout_height="wrap_content" app:singleSelection="false" /> - diff --git a/app/src/main/res/layout/fragment_genre_catalogue.xml b/app/src/main/res/layout/fragment_genre_catalogue.xml new file mode 100644 index 00000000..53ff3515 --- /dev/null +++ b/app/src/main/res/layout/fragment_genre_catalogue.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + diff --git a/app/src/main/res/layout/fragment_home.xml b/app/src/main/res/layout/fragment_home.xml index f4fc4d84..d63c5a39 100644 --- a/app/src/main/res/layout/fragment_home.xml +++ b/app/src/main/res/layout/fragment_home.xml @@ -112,7 +112,7 @@ + android:layout_height="172dp"> @@ -34,7 +35,6 @@ android:layout_height="wrap_content" android:fontFamily="@font/open_sans_font_family" android:paddingStart="2dp" - android:text="@string/label_placeholder" android:textColor="@color/titleTextColor" android:textSize="12sp" /> \ No newline at end of file diff --git a/app/src/main/res/layout/item_library_album.xml b/app/src/main/res/layout/item_library_album.xml index 46b67c78..41182647 100644 --- a/app/src/main/res/layout/item_library_album.xml +++ b/app/src/main/res/layout/item_library_album.xml @@ -7,8 +7,8 @@ diff --git a/app/src/main/res/layout/item_library_artist.xml b/app/src/main/res/layout/item_library_artist.xml index 11ca6a66..ea3abe64 100644 --- a/app/src/main/res/layout/item_library_artist.xml +++ b/app/src/main/res/layout/item_library_artist.xml @@ -7,8 +7,8 @@ + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_library_catalogue_artist.xml b/app/src/main/res/layout/item_library_catalogue_artist.xml new file mode 100644 index 00000000..8035e852 --- /dev/null +++ b/app/src/main/res/layout/item_library_catalogue_artist.xml @@ -0,0 +1,38 @@ + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_library_catalogue_genre.xml b/app/src/main/res/layout/item_library_catalogue_genre.xml new file mode 100644 index 00000000..fbe37ebb --- /dev/null +++ b/app/src/main/res/layout/item_library_catalogue_genre.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/item_library_genre.xml b/app/src/main/res/layout/item_library_genre.xml index ee8c3a1b..bf4dcfa1 100644 --- a/app/src/main/res/layout/item_library_genre.xml +++ b/app/src/main/res/layout/item_library_genre.xml @@ -6,9 +6,10 @@ android:paddingEnd="12dp" android:paddingBottom="8dp"> - + tools:layout="@layout/fragment_library"> + + + + + app:destination="@id/filterFragment" /> + + + \ No newline at end of file