diff --git a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java index cbabbdbe..0c51fdba 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/AlbumHorizontalAdapter.java @@ -101,6 +101,8 @@ public class AlbumHorizontalAdapter extends RecyclerView.Adapter getAll(); + @Query("SELECT * FROM download WHERE server=:server") + LiveData> getAll(String server); @Query("SELECT * FROM download WHERE server=:server LIMIT :size") LiveData> getSample(int size, String server); + @Query("SELECT * FROM download WHERE server=:server AND artistId=:artistId") + LiveData> getAllFromArtist(String server, String artistId); + + @Query("SELECT * FROM download WHERE server=:server AND albumId=:albumId") + LiveData> getAllFromAlbum(String server, String albumId); + @Insert(onConflict = OnConflictStrategy.REPLACE) void insert(Download download); diff --git a/app/src/main/java/com/cappielloantonio/play/model/Album.java b/app/src/main/java/com/cappielloantonio/play/model/Album.java index 58646dec..39f40f0b 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Album.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Album.java @@ -18,7 +18,9 @@ public class Album implements Parcelable { public static final String RECENTLY_PLAYED = "RECENTLY_PLAYED"; public static final String MOST_PLAYED = "MOST_PLAYED"; public static final String RECENTLY_ADDED = "RECENTLY_ADDED"; + public static final String DOWNLOADED = "DOWNLOADED"; public static final String STARRED = "STARRED"; + public static final String FROM_ARTIST = "FROM_ARTIST"; private String id; private String title; diff --git a/app/src/main/java/com/cappielloantonio/play/model/Artist.java b/app/src/main/java/com/cappielloantonio/play/model/Artist.java index b1684c37..d02de9ce 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Artist.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Artist.java @@ -17,6 +17,7 @@ import java.util.List; public class Artist implements Parcelable { private static final String TAG = "Artist"; + public static final String DOWNLOADED = "DOWNLOADED"; public static final String STARRED = "STARRED"; private List genres; 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 d70fa204..aee409e3 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Song.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Song.java @@ -20,6 +20,7 @@ public class Song implements Parcelable { public static final String BY_YEAR = "BY_YEAR"; public static final String STARRED = "STARRED"; public static final String DOWNLOADED = "DOWNLOADED"; + public static final String FROM_ALBUM = "FROM_ALBUM"; private String id; private String title; diff --git a/app/src/main/java/com/cappielloantonio/play/repository/DownloadRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/DownloadRepository.java index 87e60515..77d1e14f 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/DownloadRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/DownloadRepository.java @@ -23,45 +23,22 @@ public class DownloadRepository { downloadDao = database.downloadDao(); } - public List getLiveDownload() { - List downloads = new ArrayList<>(); - - GetDownloadThreadSafe getDownloads = new GetDownloadThreadSafe(downloadDao); - Thread thread = new Thread(getDownloads); - thread.start(); - - try { - thread.join(); - downloads = getDownloads.getDownloads(); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - return downloads; - } - - private static class GetDownloadThreadSafe implements Runnable { - private final DownloadDao downloadDao; - private List downloads; - - public GetDownloadThreadSafe(DownloadDao downloadDao) { - this.downloadDao = downloadDao; - } - - @Override - public void run() { - downloads = downloadDao.getAll(); - } - - public List getDownloads() { - return downloads; - } + public LiveData> getLiveDownload() { + return downloadDao.getAll(PreferenceUtil.getInstance(App.getInstance()).getServerId()); } public LiveData> getLiveDownloadSample(int size) { return downloadDao.getSample(size, PreferenceUtil.getInstance(App.getInstance()).getServerId()); } + public LiveData> getLiveDownloadFromArtist(String artistId) { + return downloadDao.getAllFromArtist(PreferenceUtil.getInstance(App.getInstance()).getServerId(), artistId); + } + + public LiveData> getLiveDownloadFromAlbum(String albumId) { + return downloadDao.getAllFromAlbum(PreferenceUtil.getInstance(App.getInstance()).getServerId(), albumId); + } + public void insert(Download download) { InsertThreadSafe insert = new InsertThreadSafe(downloadDao, download); Thread thread = new Thread(insert); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumListPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumListPageFragment.java index 22109a95..0a593fed 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumListPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/AlbumListPageFragment.java @@ -65,6 +65,13 @@ public class AlbumListPageFragment extends Fragment { } else if (getArguments().getString(Album.STARRED) != null) { albumListPageViewModel.title = Album.STARRED; bind.pageTitleLabel.setText("Starred albums"); + } else if (getArguments().getString(Album.DOWNLOADED) != null) { + albumListPageViewModel.title = Album.DOWNLOADED; + bind.pageTitleLabel.setText("Downloaded albums"); + } else if (getArguments().getParcelable("artist_object") != null) { + albumListPageViewModel.artist = getArguments().getParcelable("artist_object"); + albumListPageViewModel.title = Album.FROM_ARTIST; + bind.pageTitleLabel.setText(albumListPageViewModel.artist.getName()); } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistListPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistListPageFragment.java index 18b19b2f..e2e64ca0 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistListPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/ArtistListPageFragment.java @@ -14,6 +14,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.adapter.ArtistHorizontalAdapter; import com.cappielloantonio.play.databinding.FragmentArtistListPageBinding; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.viewmodel.ArtistListPageViewModel; @@ -53,9 +54,12 @@ public class ArtistListPageFragment extends Fragment { } private void init() { - if (getArguments().getString(Album.STARRED) != null) { - artistListPageViewModel.title = Album.STARRED; + if (getArguments().getString(Artist.STARRED) != null) { + artistListPageViewModel.title = Artist.STARRED; bind.pageTitleLabel.setText("Starred artists"); + } else if (getArguments().getString(Artist.DOWNLOADED) != null) { + artistListPageViewModel.title = Artist.DOWNLOADED; + bind.pageTitleLabel.setText("Downloaded artists"); } } @@ -86,6 +90,6 @@ public class ArtistListPageFragment extends Fragment { artistHorizontalAdapter = new ArtistHorizontalAdapter(requireContext()); bind.artistListRecyclerView.setAdapter(artistHorizontalAdapter); - artistListPageViewModel.getArtistList().observe(requireActivity(), artists -> artistHorizontalAdapter.setItems(artists)); + artistListPageViewModel.getArtistList(requireActivity()).observe(requireActivity(), artists -> artistHorizontalAdapter.setItems(artists)); } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/DownloadFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/DownloadFragment.java index 96c79336..7ae6f308 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/DownloadFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/DownloadFragment.java @@ -123,13 +123,13 @@ public class DownloadFragment extends Fragment { private void init() { bind.downloadedArtistTextViewClickable.setOnClickListener(v -> { Bundle bundle = new Bundle(); - bundle.putString(Song.DOWNLOADED, Song.DOWNLOADED); + bundle.putString(Artist.DOWNLOADED, Artist.DOWNLOADED); activity.navController.navigate(R.id.action_downloadFragment_to_artistListPageFragment, bundle); }); bind.downloadedAlbumTextViewClickable.setOnClickListener(v -> { Bundle bundle = new Bundle(); - bundle.putString(Song.DOWNLOADED, Song.DOWNLOADED); + bundle.putString(Album.DOWNLOADED, Album.DOWNLOADED); activity.navController.navigate(R.id.action_downloadFragment_to_albumListPageFragment, bundle); }); 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 7bc72eb6..f964b78c 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 @@ -93,6 +93,10 @@ public class SongListPageFragment extends Fragment { } else if (getArguments().getString(Song.DOWNLOADED) != null) { songListPageViewModel.title = Song.DOWNLOADED; bind.pageTitleLabel.setText("Downloaded"); + } else if (getArguments().getParcelable("album_object") != null) { + songListPageViewModel.album = getArguments().getParcelable("album_object"); + songListPageViewModel.title = Song.FROM_ALBUM; + bind.pageTitleLabel.setText(songListPageViewModel.album.getTitle()); } } @@ -116,7 +120,7 @@ public class SongListPageFragment extends Fragment { } private void initButtons() { - songListPageViewModel.getSongList().observe(requireActivity(), songs -> { + songListPageViewModel.getSongList(requireActivity()).observe(requireActivity(), songs -> { if (bind != null) { bind.songListShuffleImageView.setOnClickListener(v -> { Collections.shuffle(songs); @@ -139,6 +143,6 @@ public class SongListPageFragment extends Fragment { songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext()); bind.songListRecyclerView.setAdapter(songHorizontalAdapter); - songListPageViewModel.getSongList().observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs)); + songListPageViewModel.getSongList(requireActivity()).observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs)); } } \ No newline at end of file diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumListPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumListPageViewModel.java index 1ebef2bb..1c741cb5 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/AlbumListPageViewModel.java @@ -9,16 +9,21 @@ import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.model.Album; +import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.AlbumRepository; +import com.cappielloantonio.play.repository.DownloadRepository; +import com.cappielloantonio.play.util.MappingUtil; import java.util.ArrayList; import java.util.List; public class AlbumListPageViewModel extends AndroidViewModel { private AlbumRepository albumRepository; + private DownloadRepository downloadRepository; public String title; + public Artist artist; private MutableLiveData> albumList; @@ -26,30 +31,41 @@ public class AlbumListPageViewModel extends AndroidViewModel { super(application); albumRepository = new AlbumRepository(application); + downloadRepository = new DownloadRepository(application); } public LiveData> getAlbumList(FragmentActivity activity) { albumList = new MutableLiveData<>(new ArrayList<>()); switch (title) { - case Song.RECENTLY_PLAYED: + case Album.RECENTLY_PLAYED: albumRepository.getAlbums("recent", 500).observe(activity, albums -> { albumList.setValue(albums); }); break; - case Song.MOST_PLAYED: + case Album.MOST_PLAYED: albumRepository.getAlbums("frequent", 500).observe(activity, albums -> { albumList.setValue(albums); }); break; - case Song.RECENTLY_ADDED: + case Album.RECENTLY_ADDED: albumRepository.getAlbums("newest", 500).observe(activity, albums -> { albumList.setValue(albums); }); break; - case Song.STARRED: + case Album.STARRED: albumList = albumRepository.getStarredAlbums(); break; + case Album.DOWNLOADED: + downloadRepository.getLiveDownload().observe(activity, downloads -> { + albumList.setValue(MappingUtil.mapDownloadToAlbum(downloads)); + }); + break; + case Album.FROM_ARTIST: + downloadRepository.getLiveDownloadFromArtist(artist.getId()).observe(activity, downloads -> { + albumList.setValue(MappingUtil.mapDownloadToAlbum(downloads)); + }); + break; } return albumList; diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistListPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistListPageViewModel.java index 0526d4b5..9f91642e 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/ArtistListPageViewModel.java @@ -3,19 +3,25 @@ package com.cappielloantonio.play.viewmodel; import android.app.Application; import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.model.Download; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.ArtistRepository; +import com.cappielloantonio.play.repository.DownloadRepository; +import com.cappielloantonio.play.util.MappingUtil; import java.util.ArrayList; import java.util.List; public class ArtistListPageViewModel extends AndroidViewModel { private ArtistRepository artistRepository; + private DownloadRepository downloadRepository; public String title; @@ -25,15 +31,21 @@ public class ArtistListPageViewModel extends AndroidViewModel { super(application); artistRepository = new ArtistRepository(application); + downloadRepository = new DownloadRepository(application); } - public LiveData> getArtistList() { + public LiveData> getArtistList(FragmentActivity activity) { artistList = new MutableLiveData<>(new ArrayList<>()); switch (title) { - case Song.STARRED: + case Artist.STARRED: artistList = artistRepository.getStarredArtists(); break; + case Artist.DOWNLOADED: + downloadRepository.getLiveDownload().observe(activity, downloads -> { + artistList.setValue(MappingUtil.mapDownloadToArtist(downloads)); + }); + break; } return artistList; 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 07d8241c..eb08d417 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java @@ -4,10 +4,12 @@ import android.app.Application; import android.text.TextUtils; import androidx.annotation.NonNull; +import androidx.fragment.app.FragmentActivity; import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; +import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Genre; import com.cappielloantonio.play.model.Song; @@ -27,6 +29,9 @@ public class SongListPageViewModel extends AndroidViewModel { public String title; public Genre genre; public Artist artist; + public Album album; + + private MutableLiveData> songList; public ArrayList filters = new ArrayList<>(); public ArrayList filterNames = new ArrayList<>(); @@ -41,8 +46,8 @@ public class SongListPageViewModel extends AndroidViewModel { downloadRepository = new DownloadRepository(application); } - public LiveData> getSongList() { - MutableLiveData> songList = new MutableLiveData<>(new ArrayList<>()); + public LiveData> getSongList(FragmentActivity activity) { + songList = new MutableLiveData<>(new ArrayList<>()); switch (title) { case Song.RECENTLY_PLAYED: @@ -70,7 +75,14 @@ public class SongListPageViewModel extends AndroidViewModel { songList = songRepository.getStarredSongs(false, -1); break; case Song.DOWNLOADED: - songList.setValue(MappingUtil.mapDownloadToSong(downloadRepository.getLiveDownload())); + downloadRepository.getLiveDownload().observe(activity, downloads -> { + songList.setValue(MappingUtil.mapDownloadToSong(downloads)); + }); + break; + case Song.FROM_ALBUM: + downloadRepository.getLiveDownloadFromAlbum(album.getId()).observe(activity, downloads -> { + songList.setValue(MappingUtil.mapDownloadToSong(downloads)); + }); break; } diff --git a/app/src/main/res/navigation/nav_graph.xml b/app/src/main/res/navigation/nav_graph.xml index f07632f0..1468cb85 100644 --- a/app/src/main/res/navigation/nav_graph.xml +++ b/app/src/main/res/navigation/nav_graph.xml @@ -33,7 +33,6 @@ app:popUpTo="@id/loginFragment" app:popUpToInclusive="true" /> -