From ae23d268cd72c2bf574293bff127ae48bb39e04b Mon Sep 17 00:00:00 2001 From: Antonio Cappiello Date: Sat, 28 Nov 2020 14:50:15 +0100 Subject: [PATCH] Adapters refactoring --- app/build.gradle | 1 + .../play/adapter/AlbumAdapter.java | 15 ++-- .../play/adapter/AlbumArtistPageAdapter.java | 10 +-- .../play/adapter/AlbumCatalogueAdapter.java | 15 ++-- .../play/adapter/ArtistAdapter.java | 10 +-- .../play/adapter/ArtistCatalogueAdapter.java | 12 +-- .../play/adapter/DiscoverSongAdapter.java | 6 +- .../play/adapter/GenreAdapter.java | 8 +- .../play/adapter/GenreCatalogueAdapter.java | 7 +- .../play/adapter/PlaylistAdapter.java | 8 +- .../play/adapter/RecentMusicAdapter.java | 6 +- .../play/adapter/RecentSearchAdapter.java | 7 +- .../play/adapter/SongResultSearchAdapter.java | 6 +- .../play/adapter/YearAdapter.java | 79 +++++++++++++++++++ .../play/database/dao/SongDao.java | 9 ++- .../play/glide/CustomGlideRequest.java | 8 +- .../com/cappielloantonio/play/model/Song.java | 3 + .../play/repository/SongRepository.java | 52 ++++++++++++ .../ui/fragment/AlbumCatalogueFragment.java | 4 +- .../ui/fragment/ArtistCatalogueFragment.java | 4 +- .../play/ui/fragment/ArtistPageFragment.java | 2 +- .../ui/fragment/GenreCatalogueFragment.java | 4 +- .../play/ui/fragment/HomeFragment.java | 25 ++++-- .../play/ui/fragment/LibraryFragment.java | 10 +-- .../play/ui/fragment/SearchFragment.java | 6 +- .../ui/fragment/SongListPageFragment.java | 5 ++ .../viewmodel/AlbumCatalogueViewModel.java | 5 +- .../play/viewmodel/HomeViewModel.java | 8 ++ .../play/viewmodel/SongListPageViewModel.java | 4 + .../res/layout/fragment_album_catalogue.xml | 6 +- .../res/layout/fragment_artist_catalogue.xml | 3 +- app/src/main/res/layout/fragment_home.xml | 40 +++++++++- app/src/main/res/layout/fragment_library.xml | 6 +- app/src/main/res/layout/item_home_year.xml | 47 +++++++++++ 34 files changed, 341 insertions(+), 100 deletions(-) create mode 100644 app/src/main/java/com/cappielloantonio/play/adapter/YearAdapter.java create mode 100644 app/src/main/res/layout/item_home_year.xml diff --git a/app/build.gradle b/app/build.gradle index f7680b0a..57388bf0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -54,6 +54,7 @@ dependencies { implementation "androidx.room:room-runtime:2.2.5" implementation "androidx.cardview:cardview:1.0.0" implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.paging:paging-runtime:2.1.2' // Android Material implementation 'com.google.android.material:material:1.2.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 d7ffb1b2..66d3180e 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumAdapter.java @@ -16,21 +16,21 @@ import com.cappielloantonio.play.model.Album; import java.util.List; public class AlbumAdapter extends RecyclerView.Adapter { - private static final String TAG = "RecentMusicAdapter"; + private static final String TAG = "AlbumAdapter"; + private List albums; - private LayoutInflater mInflater; + private LayoutInflater inflater; private Context context; private ItemClickListener itemClickListener; - public AlbumAdapter(Context context, List albums) { + public AlbumAdapter(Context context) { this.context = context; - this.mInflater = LayoutInflater.from(context); - this.albums = albums; + this.inflater = LayoutInflater.from(context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = mInflater.inflate(R.layout.item_library_album, parent, false); + View view = inflater.inflate(R.layout.item_library_album, parent, false); return new ViewHolder(view); } @@ -69,7 +69,8 @@ public class AlbumAdapter extends RecyclerView.Adapter @Override public void onClick(View view) { - if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition()); + if (itemClickListener != null) + itemClickListener.onItemClick(view, getAdapterPosition()); } } 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 f8ae179b..e3347e1e 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumArtistPageAdapter.java @@ -17,20 +17,20 @@ import java.util.List; public class AlbumArtistPageAdapter extends RecyclerView.Adapter { private static final String TAG = "AlbumArtistPageAdapter"; + private List albums; - private LayoutInflater mInflater; + private LayoutInflater inflater; private Context context; private ItemClickListener itemClickListener; - public AlbumArtistPageAdapter(Context context, List albums) { + public AlbumArtistPageAdapter(Context context) { this.context = context; - this.mInflater = LayoutInflater.from(context); - this.albums = albums; + this.inflater = LayoutInflater.from(context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = mInflater.inflate(R.layout.item_artist_page_album, parent, false); + View view = inflater.inflate(R.layout.item_artist_page_album, parent, false); return new ViewHolder(view); } 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 fc1c2911..489475eb 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumCatalogueAdapter.java @@ -16,21 +16,21 @@ import com.cappielloantonio.play.model.Album; import java.util.List; public class AlbumCatalogueAdapter extends RecyclerView.Adapter { - private static final String TAG = "AlbumAdapter"; + private static final String TAG = "AlbumCatalogueAdapter"; + private List albums; - private LayoutInflater mInflater; + private LayoutInflater inflater; private Context context; private ItemClickListener itemClickListener; - public AlbumCatalogueAdapter(Context context, List albums) { + public AlbumCatalogueAdapter(Context context) { this.context = context; - this.mInflater = LayoutInflater.from(context); - this.albums = albums; + this.inflater = LayoutInflater.from(context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = mInflater.inflate(R.layout.item_library_catalogue_album, parent, false); + View view = inflater.inflate(R.layout.item_library_catalogue_album, parent, false); return new ViewHolder(view); } @@ -70,7 +70,8 @@ public class AlbumCatalogueAdapter extends RecyclerView.Adapter { private static final String TAG = "ArtistAdapter"; + private List artists; - private LayoutInflater mInflater; + private LayoutInflater inflater; private Context context; private ItemClickListener itemClickListener; - public ArtistAdapter(Context context, List artists) { + public ArtistAdapter(Context context) { this.context = context; - this.mInflater = LayoutInflater.from(context); - this.artists = artists; + this.inflater = LayoutInflater.from(context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = mInflater.inflate(R.layout.item_library_artist, parent, false); + View view = inflater.inflate(R.layout.item_library_artist, parent, false); return new ViewHolder(view); } diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java index ace818e4..052b5405 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/ArtistCatalogueAdapter.java @@ -16,21 +16,21 @@ import com.cappielloantonio.play.model.Artist; import java.util.List; public class ArtistCatalogueAdapter extends RecyclerView.Adapter { - private static final String TAG = "ArtistAdapter"; + private static final String TAG = "ArtistCatalogueAdapter"; + private List artists; - private LayoutInflater mInflater; + private LayoutInflater inflater; private Context context; private ItemClickListener itemClickListener; - public ArtistCatalogueAdapter(Context context, List artists) { + public ArtistCatalogueAdapter(Context context) { this.context = context; - this.mInflater = LayoutInflater.from(context); - this.artists = artists; + this.inflater = LayoutInflater.from(context); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = mInflater.inflate(R.layout.item_library_catalogue_artist, parent, false); + View view = inflater.inflate(R.layout.item_library_catalogue_artist, parent, false); return new ViewHolder(view); } 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 93445af7..f1a474e0 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java @@ -21,18 +21,18 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter songs; - private LayoutInflater layoutInflater; + private LayoutInflater inflater; private Context context; public DiscoverSongAdapter(Context context, List songs) { this.context = context; - this.layoutInflater = LayoutInflater.from(context); + this.inflater = LayoutInflater.from(context); this.songs = songs; } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { - View view = layoutInflater.inflate(R.layout.item_home_discover_song, parent, false); + View view = inflater.inflate(R.layout.item_home_discover_song, parent, false); return new ViewHolder(view); } diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/GenreAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/GenreAdapter.java index c17e9fe5..60abb576 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/GenreAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/GenreAdapter.java @@ -15,18 +15,17 @@ import java.util.List; public class GenreAdapter extends RecyclerView.Adapter { private static final String TAG = "GenreAdapter"; + private List genres; private LayoutInflater mInflater; private Context context; private ItemClickListener itemClickListener; - public GenreAdapter(Context context, List genres) { + public GenreAdapter(Context context) { 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_genre, parent, false); @@ -58,7 +57,8 @@ public class GenreAdapter extends RecyclerView.Adapter @Override public void onClick(View view) { - if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition()); + if (itemClickListener != null) + itemClickListener.onItemClick(view, getAdapterPosition()); } } diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java index 2ceeb69d..6db9e725 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/GenreCatalogueAdapter.java @@ -1,7 +1,6 @@ package com.cappielloantonio.play.adapter; import android.content.Context; -import android.os.Parcelable; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -15,16 +14,16 @@ import com.cappielloantonio.play.model.Genre; import java.util.List; public class GenreCatalogueAdapter extends RecyclerView.Adapter { - private static final String TAG = "GenreAdapter"; + private static final String TAG = "GenreCatalogueAdapter"; + private List genres; private LayoutInflater mInflater; private Context context; private ItemClickListener itemClickListener; - public GenreCatalogueAdapter(Context context, List genres) { + public GenreCatalogueAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); - this.genres = genres; } // inflates the row layout from xml when needed diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java index c2381ab4..64c12551 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/PlaylistAdapter.java @@ -9,22 +9,21 @@ 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.Playlist; import java.util.List; public class PlaylistAdapter extends RecyclerView.Adapter { private static final String TAG = "PlaylistAdapter"; + private List playlists; private LayoutInflater mInflater; private Context context; private ItemClickListener itemClickListener; - public PlaylistAdapter(Context context, List playlists) { + public PlaylistAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); - this.playlists = playlists; } @Override @@ -58,7 +57,8 @@ public class PlaylistAdapter extends RecyclerView.Adapter { private static final String TAG = "RecentMusicAdapter"; + private List songs; private LayoutInflater mInflater; private Context context; - public RecentMusicAdapter(Context context, List songs) { + public RecentMusicAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); - this.songs = songs; } @Override @@ -46,7 +46,7 @@ public class RecentMusicAdapter extends RecyclerView.Adapter { - private static final String TAG = "GenreAdapter"; + private static final String TAG = "RecentSearchAdapter"; + private List searches; private LayoutInflater mInflater; private Context context; private ItemClickListener itemClickListener; - public RecentSearchAdapter(Context context, List searches) { + public RecentSearchAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); - this.searches = searches; } @Override 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 c9900437..b2c35061 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/SongResultSearchAdapter.java @@ -23,14 +23,14 @@ import java.util.List; */ public class SongResultSearchAdapter extends RecyclerView.Adapter { private static final String TAG = "SongResultSearchAdapter"; + private List songs; private LayoutInflater mInflater; private Context context; - public SongResultSearchAdapter(Context context, List songs) { + public SongResultSearchAdapter(Context context) { this.context = context; this.mInflater = LayoutInflater.from(context); - this.songs = songs; } @Override @@ -48,7 +48,7 @@ public class SongResultSearchAdapter extends RecyclerView.Adapter { + private static final String TAG = "YearAdapter"; + private List years; + private LayoutInflater mInflater; + private Context context; + private ItemClickListener itemClickListener; + + public YearAdapter(Context context, List years) { + this.context = context; + this.mInflater = LayoutInflater.from(context); + this.years = years; + } + + @Override + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + View view = mInflater.inflate(R.layout.item_home_year, parent, false); + return new ViewHolder(view); + } + + @Override + public void onBindViewHolder(ViewHolder holder, int position) { + int year = years.get(position); + + holder.textYear.setText(Integer.toString(year)); + } + + @Override + public int getItemCount() { + return years.size(); + } + + public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { + TextView textYear; + + ViewHolder(View itemView) { + super(itemView); + + textYear = itemView.findViewById(R.id.year_label); + + itemView.setOnClickListener(this); + } + + @Override + public void onClick(View view) { + if (itemClickListener != null) itemClickListener.onItemClick(view, getAdapterPosition()); + } + } + + public Integer getItem(int position) { + return years.get(position); + } + + public void setItems(List years) { + this.years = years; + 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/database/dao/SongDao.java b/app/src/main/java/com/cappielloantonio/play/database/dao/SongDao.java index 4c497cb7..b6d9d55f 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 @@ -24,9 +24,6 @@ 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 added DESC LIMIT :number") LiveData> getRecentlyAddedSample(int number); @@ -74,4 +71,10 @@ public interface SongDao { @Query("SELECT title FROM song WHERE title LIKE :query || '%' OR title like '% ' || :query || '%' GROUP BY title LIMIT :number") List searchSuggestions(String query, int number); + + @Query("SELECT year FROM song WHERE year != 0 GROUP BY year") + List getYearList(); + + @Query("SELECT * FROM song WHERE year = :year") + LiveData> getSongsByYear(int year); } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java b/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java index 19d8082a..c0f67d02 100644 --- a/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java +++ b/app/src/main/java/com/cappielloantonio/play/glide/CustomGlideRequest.java @@ -93,14 +93,14 @@ public class CustomGlideRequest { break; } case MEDIUM_QUALITY: { - options.setQuality(80); - options.setMaxHeight(500); + options.setQuality(100); + options.setMaxHeight(600); options.setEnableImageEnhancers(true); break; } case LOW_QUALITY: { - options.setQuality(60); - options.setMaxHeight(300); + options.setQuality(100); + options.setMaxHeight(400); options.setEnableImageEnhancers(true); break; } diff --git a/app/src/main/java/com/cappielloantonio/play/model/Song.java b/app/src/main/java/com/cappielloantonio/play/model/Song.java index 8444678e..a82a87a6 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Song.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Song.java @@ -37,6 +37,9 @@ public class Song implements Parcelable { @Ignore public static final String BY_ARTIST = "BY_ARTIST"; + @Ignore + public static final String BY_YEAR = "BY_YEAR"; + @NonNull @PrimaryKey @ColumnInfo(name = "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 4fe2cbcc..d4554685 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/SongRepository.java @@ -24,6 +24,7 @@ public class SongRepository { private LiveData> listLiveAlbumSongs; private LiveData> listLiveSongByGenre; private LiveData> listLiveFilteredSongs; + private LiveData> listLiveSongByYear; public SongRepository(Application application) { @@ -115,6 +116,28 @@ public class SongRepository { return catalogue; } + public List getYearList() { + List years = new ArrayList<>(); + + GetYearListThreadSafe getYearListThreadSafe = new GetYearListThreadSafe(songDao); + Thread thread = new Thread(getYearListThreadSafe); + thread.start(); + + try { + thread.join(); + years = getYearListThreadSafe.getYearList(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + + return years; + } + + public LiveData> getSongByYearListLive(int year) { + listLiveSongByYear = songDao.getSongsByYear(year); + return listLiveSongByYear; + } + public boolean exist(Song song) { boolean exist = false; @@ -383,4 +406,33 @@ public class SongRepository { songGenreCrossDao.deleteAll(); } } + + private static class GetYearListThreadSafe implements Runnable { + private SongDao songDao; + private List years = new ArrayList<>(); + private List decades = new ArrayList<>(); + + public GetYearListThreadSafe(SongDao songDao) { + this.songDao = songDao; + } + + @Override + public void run() { + years = songDao.getYearList(); + + for(int year : years) { + if(!decades.contains(year - year % 10)) { + decades.add(year); + } + } + } + + public List getYearList() { + return years; + } + + public List getDecadeList() { + return decades; + } + } } 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 c1bfe88b..866833bd 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 @@ -16,8 +16,6 @@ import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.AlbumCatalogueViewModel; -import java.util.ArrayList; - public class AlbumCatalogueFragment extends Fragment { private static final String TAG = "ArtistCatalogueFragment"; @@ -51,7 +49,7 @@ public class AlbumCatalogueFragment extends Fragment { bind.albumCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.albumCatalogueRecyclerView.setHasFixedSize(true); - albumAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); + albumAdapter = new AlbumCatalogueAdapter(requireContext()); albumAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("album_object", albumAdapter.getItem(position)); 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 017edf33..2a43590a 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 @@ -16,8 +16,6 @@ import com.cappielloantonio.play.helper.recyclerview.ItemDecoration; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.ArtistCatalogueViewModel; -import java.util.ArrayList; - public class ArtistCatalogueFragment extends Fragment { private static final String TAG = "ArtistCatalogueFragment"; @@ -51,7 +49,7 @@ public class ArtistCatalogueFragment extends Fragment { bind.artistCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.artistCatalogueRecyclerView.setHasFixedSize(true); - artistAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); + artistAdapter = new ArtistCatalogueAdapter(requireContext()); artistAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("artist_object", artistAdapter.getItem(position)); 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 8ce15aa2..2577aebd 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 @@ -83,7 +83,7 @@ public class ArtistPageFragment extends Fragment { bind.albumsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.albumsRecyclerView.setHasFixedSize(true); - albumArtistPageAdapter = new AlbumArtistPageAdapter(requireContext(), new ArrayList<>()); + albumArtistPageAdapter = new AlbumArtistPageAdapter(requireContext()); albumArtistPageAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("album_object", albumArtistPageAdapter.getItem(position)); 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 d8e72435..03c6f62e 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 @@ -17,8 +17,6 @@ import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.viewmodel.GenreCatalogueViewModel; -import java.util.ArrayList; - public class GenreCatalogueFragment extends Fragment { private static final String TAG = "GenreCatalogueFragment";; @@ -57,7 +55,7 @@ public class GenreCatalogueFragment extends Fragment { bind.genreCatalogueRecyclerView.addItemDecoration(new ItemDecoration(2, 16, false)); bind.genreCatalogueRecyclerView.setHasFixedSize(true); - genreCatalogueAdapter = new GenreCatalogueAdapter(requireContext(), new ArrayList<>()); + genreCatalogueAdapter = new GenreCatalogueAdapter(requireContext()); genreCatalogueAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putString(Song.BY_GENRE, Song.BY_GENRE); 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 e539faf9..0b57a267 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 @@ -16,14 +16,13 @@ import androidx.viewpager2.widget.ViewPager2; import com.cappielloantonio.play.R; import com.cappielloantonio.play.adapter.DiscoverSongAdapter; import com.cappielloantonio.play.adapter.RecentMusicAdapter; +import com.cappielloantonio.play.adapter.YearAdapter; 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; - public class HomeFragment extends Fragment { private static final String TAG = "CategoriesFragment"; @@ -33,6 +32,7 @@ public class HomeFragment extends Fragment { private DiscoverSongAdapter discoverSongAdapter; private RecentMusicAdapter recentlyAddedMusicAdapter; + private YearAdapter yearAdapter; private RecentMusicAdapter recentlyPlayedMusicAdapter; private RecentMusicAdapter mostPlayedMusicAdapter; @@ -48,6 +48,7 @@ public class HomeFragment extends Fragment { init(); initDiscoverSongSlideView(); initRecentAddedSongView(); + initYearSongView(); initRecentPlayedSongView(); initMostPlayedSongView(); @@ -99,16 +100,30 @@ public class HomeFragment extends Fragment { bind.recentlyAddedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.recentlyAddedTracksRecyclerView.setHasFixedSize(true); - recentlyAddedMusicAdapter = new RecentMusicAdapter(requireContext(), new ArrayList<>()); + recentlyAddedMusicAdapter = new RecentMusicAdapter(requireContext()); bind.recentlyAddedTracksRecyclerView.setAdapter(recentlyAddedMusicAdapter); homeViewModel.getRecentlyAddedSongList().observe(requireActivity(), songs -> recentlyAddedMusicAdapter.setItems(songs)); } + private void initYearSongView() { + bind.yearsRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); + bind.yearsRecyclerView.setHasFixedSize(true); + + yearAdapter = new YearAdapter(requireContext(), homeViewModel.getYearList()); + yearAdapter.setClickListener((view, position) -> { + Bundle bundle = new Bundle(); + bundle.putString(Song.BY_YEAR, Song.BY_YEAR); + bundle.putInt("year_object", yearAdapter.getItem(position)); + activity.navController.navigate(R.id.action_homeFragment_to_songListPageFragment, bundle); + }); + bind.yearsRecyclerView.setAdapter(yearAdapter); + } + private void initRecentPlayedSongView() { bind.recentlyPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.recentlyPlayedTracksRecyclerView.setHasFixedSize(true); - recentlyPlayedMusicAdapter = new RecentMusicAdapter(requireContext(), new ArrayList<>()); + recentlyPlayedMusicAdapter = new RecentMusicAdapter(requireContext()); bind.recentlyPlayedTracksRecyclerView.setAdapter(recentlyPlayedMusicAdapter); homeViewModel.getRecentlyPlayedSongList().observe(requireActivity(), songs -> recentlyPlayedMusicAdapter.setItems(songs)); } @@ -117,7 +132,7 @@ public class HomeFragment extends Fragment { bind.mostPlayedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.mostPlayedTracksRecyclerView.setHasFixedSize(true); - mostPlayedMusicAdapter = new RecentMusicAdapter(requireContext(), new ArrayList<>()); + mostPlayedMusicAdapter = new RecentMusicAdapter(requireContext()); bind.mostPlayedTracksRecyclerView.setAdapter(mostPlayedMusicAdapter); homeViewModel.getMostPlayedSongList().observe(requireActivity(), songs -> mostPlayedMusicAdapter.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 928c851a..ae7176df 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 @@ -25,8 +25,6 @@ import com.cappielloantonio.play.ui.activities.MainActivity; import com.cappielloantonio.play.util.PreferenceUtil; import com.cappielloantonio.play.viewmodel.LibraryViewModel; -import java.util.ArrayList; - public class LibraryFragment extends Fragment { private static final String TAG = "LibraryFragment"; @@ -75,7 +73,7 @@ public class LibraryFragment extends Fragment { bind.albumRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.albumRecyclerView.setHasFixedSize(true); - albumAdapter = new AlbumAdapter(requireContext(), new ArrayList<>()); + albumAdapter = new AlbumAdapter(requireContext()); albumAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("album_object", albumAdapter.getItem(position)); @@ -89,7 +87,7 @@ public class LibraryFragment extends Fragment { bind.artistRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false)); bind.artistRecyclerView.setHasFixedSize(true); - artistAdapter = new ArtistAdapter(requireContext(), new ArrayList<>()); + artistAdapter = new ArtistAdapter(requireContext()); artistAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("artist_object", artistAdapter.getItem(position)); @@ -103,7 +101,7 @@ public class LibraryFragment extends Fragment { bind.genreRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 3, GridLayoutManager.HORIZONTAL, false)); bind.genreRecyclerView.setHasFixedSize(true); - genreAdapter = new GenreAdapter(requireContext(), new ArrayList<>()); + genreAdapter = new GenreAdapter(requireContext()); genreAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putString(Song.BY_GENRE, Song.BY_GENRE); @@ -118,7 +116,7 @@ public class LibraryFragment extends Fragment { bind.playlistRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), 2)); bind.playlistRecyclerView.setHasFixedSize(true); - playlistAdapter = new PlaylistAdapter(requireContext(), new ArrayList<>()); + playlistAdapter = new PlaylistAdapter(requireContext()); playlistAdapter.setClickListener((view, position) -> Toast.makeText(requireContext(), "Playlist: " + position, Toast.LENGTH_SHORT).show()); bind.playlistRecyclerView.setAdapter(playlistAdapter); libraryViewModel.getPlaylistList().observe(requireActivity(), playlists -> playlistAdapter.setItems(playlists)); 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 39d7fc3c..62a7c95c 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 @@ -72,7 +72,7 @@ public class SearchFragment extends Fragment { bind.recentlySearchedTracksRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext())); bind.recentlySearchedTracksRecyclerView.setHasFixedSize(true); - recentSearchAdapter = new RecentSearchAdapter(requireContext(), new ArrayList<>()); + recentSearchAdapter = new RecentSearchAdapter(requireContext()); recentSearchAdapter.setClickListener((view, position) -> { RecentSearch search = recentSearchAdapter.getItem(position); search(search.getSearch()); @@ -95,7 +95,7 @@ public class SearchFragment extends Fragment { bind.searchResultAlbumRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.searchResultAlbumRecyclerView.setHasFixedSize(true); - albumResultSearchAdapter = new AlbumCatalogueAdapter(requireContext(), new ArrayList<>()); + albumResultSearchAdapter = new AlbumCatalogueAdapter(requireContext()); albumResultSearchAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("album_object", albumResultSearchAdapter.getItem(position)); @@ -108,7 +108,7 @@ public class SearchFragment extends Fragment { bind.searchResultArtistRecyclerView.addItemDecoration(new ItemDecoration(2, 20, false)); bind.searchResultArtistRecyclerView.setHasFixedSize(true); - artistResultSearchAdapter = new ArtistCatalogueAdapter(requireContext(), new ArrayList<>()); + artistResultSearchAdapter = new ArtistCatalogueAdapter(requireContext()); artistResultSearchAdapter.setClickListener((view, position) -> { Bundle bundle = new Bundle(); bundle.putParcelable("artist_object", artistResultSearchAdapter.getItem(position)); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java index f228ec05..43d747d0 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/SongListPageFragment.java @@ -74,6 +74,11 @@ public class SongListPageFragment extends Fragment { songListPageViewModel.filterNames = getArguments().getStringArrayList("filter_name_list"); bind.pageTitleLabel.setText(songListPageViewModel.getFiltersTitle()); } + else if(getArguments().getString(Song.BY_YEAR) != null) { + songListPageViewModel.title = Song.BY_YEAR; + songListPageViewModel.year = getArguments().getInt("year_object"); + bind.pageTitleLabel.setText("Year " + songListPageViewModel.year); + } } private void initSongListView() { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java index 6217c464..862d9db0 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumCatalogueViewModel.java @@ -7,16 +7,13 @@ 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 LiveData> albumList; public AlbumCatalogueViewModel(@NonNull Application application) { super(application); 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 658e7920..733a2d0f 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java @@ -1,6 +1,7 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; +import android.util.Log; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; @@ -19,6 +20,7 @@ public class HomeViewModel extends AndroidViewModel { private LiveData> recentlyPlayedSongSample; private LiveData> recentlyAddedSongSample; private LiveData> mostPlayedSongSample; + private List years; public HomeViewModel(@NonNull Application application) { super(application); @@ -29,6 +31,7 @@ public class HomeViewModel extends AndroidViewModel { recentlyPlayedSongSample = songRepository.getListLiveRecentlyPlayedSampleSong(20); recentlyAddedSongSample = songRepository.getListLiveRecentlyAddedSampleSong(20); mostPlayedSongSample = songRepository.getListLiveMostPlayedSampleSong(20); + years = songRepository.getYearList(); } @@ -51,4 +54,9 @@ public class HomeViewModel extends AndroidViewModel { public LiveData> getMostPlayedSongList() { return mostPlayedSongSample; } + + public List getYearList() { + Log.d(TAG, "getYearList: " + years.toString()); + return years; + } } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java index b2d97445..199bcfff 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java @@ -25,6 +25,7 @@ public class SongListPageViewModel extends AndroidViewModel { public Artist artist; public ArrayList filters = new ArrayList<>(); public ArrayList filterNames = new ArrayList<>(); + public int year = 0; public SongListPageViewModel(@NonNull Application application) { super(application); @@ -52,6 +53,9 @@ public class SongListPageViewModel extends AndroidViewModel { case Song.BY_GENRES: songList = songRepository.getFilteredListLiveSong(filters); break; + case Song.BY_YEAR: + songList = songRepository.getSongByYearListLive(year); + break; } return songList; diff --git a/app/src/main/res/layout/fragment_album_catalogue.xml b/app/src/main/res/layout/fragment_album_catalogue.xml index ca3ee340..0877d2a4 100644 --- a/app/src/main/res/layout/fragment_album_catalogue.xml +++ b/app/src/main/res/layout/fragment_album_catalogue.xml @@ -3,7 +3,8 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" - android:layout_height="match_parent"> + android:layout_height="match_parent" + android:paddingTop="20dp"> + android:layout_centerInParent="true" + android:visibility="visible"/> + android:layout_height="match_parent" + android:paddingTop="20dp"> @@ -63,7 +63,7 @@ android:paddingStart="8dp" android:paddingTop="12dp" android:paddingEnd="8dp" - android:text="Recently added tracks" + android:text="Recently added" android:textColor="@color/titleTextColor" android:textSize="22sp" android:textStyle="bold" /> @@ -96,6 +96,38 @@ android:paddingBottom="8dp" /> + + + + + + + + + @@ -175,7 +207,7 @@ android:paddingStart="8dp" android:paddingTop="12dp" android:paddingEnd="8dp" - android:text="Most played tracks" + android:text="Most played" android:textColor="@color/titleTextColor" android:textSize="22sp" android:textStyle="bold" /> diff --git a/app/src/main/res/layout/fragment_library.xml b/app/src/main/res/layout/fragment_library.xml index a42f0c38..58f38c3b 100644 --- a/app/src/main/res/layout/fragment_library.xml +++ b/app/src/main/res/layout/fragment_library.xml @@ -41,7 +41,7 @@ android:paddingStart="8dp" android:paddingTop="12dp" android:paddingEnd="8dp" - android:text="My Albums" + android:text="Albums" android:textColor="@color/titleTextColor" android:textSize="22sp" android:textStyle="bold" /> @@ -104,7 +104,7 @@ android:paddingStart="8dp" android:paddingTop="12dp" android:paddingEnd="8dp" - android:text="My Artists" + android:text="Artists" android:textColor="@color/titleTextColor" android:textSize="22sp" android:textStyle="bold" /> @@ -167,7 +167,7 @@ android:paddingStart="8dp" android:paddingTop="12dp" android:paddingEnd="8dp" - android:text="Music by genre" + android:text="Genres" android:textColor="@color/titleTextColor" android:textSize="22sp" android:textStyle="bold" /> diff --git a/app/src/main/res/layout/item_home_year.xml b/app/src/main/res/layout/item_home_year.xml new file mode 100644 index 00000000..f8cdda6b --- /dev/null +++ b/app/src/main/res/layout/item_home_year.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + \ No newline at end of file