From ff1a1350f9217d6ddfdeecf8b99e824747a32f43 Mon Sep 17 00:00:00 2001 From: antonio Date: Fri, 10 Mar 2023 17:46:03 +0100 Subject: [PATCH] Removed almost all hardcoded constants and deleted offline playlist model --- .../play/database/AppDatabase.java | 10 +-- .../play/repository/PlaylistRepository.java | 52 ------------- .../play/ui/adapter/ArtistAdapter.java | 4 +- .../play/ui/adapter/DiscoverSongAdapter.java | 2 +- .../play/ui/adapter/GenreAdapter.java | 2 +- .../play/ui/adapter/GridTrackAdapter.java | 2 +- .../ui/adapter/PodcastEpisodeAdapter.java | 5 +- .../play/ui/adapter/SimilarTrackAdapter.java | 2 +- .../play/ui/fragment/HomeFragment.java | 75 ++----------------- .../play/ui/fragment/LibraryFragment.java | 1 - .../fragment/PlaylistCatalogueFragment.java | 31 +------- .../ui/fragment/PlaylistPageFragment.java | 64 ++-------------- .../ui/fragment/SongListPageFragment.java | 4 +- .../PodcastBottomSheetDialog.java | 3 +- .../cappielloantonio/play/util/Constants.kt | 12 ++- .../play/viewmodel/HomeViewModel.java | 35 +++------ .../viewmodel/PlaylistCatalogueViewModel.java | 37 +-------- .../play/viewmodel/PlaylistPageViewModel.java | 43 +---------- .../play/viewmodel/SongListPageViewModel.java | 6 +- app/src/main/res/layout/fragment_download.xml | 2 +- .../res/layout/fragment_playlist_page.xml | 38 +--------- app/src/main/res/menu/playlist_page_menu.xml | 10 --- app/src/main/res/values/dimens.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 24 files changed, 64 insertions(+), 380 deletions(-) diff --git a/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java b/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java index 35d50d3f..1659fd02 100644 --- a/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java +++ b/app/src/main/java/com/cappielloantonio/play/database/AppDatabase.java @@ -10,7 +10,6 @@ import com.cappielloantonio.play.App; import com.cappielloantonio.play.database.converter.DateConverters; import com.cappielloantonio.play.database.dao.ChronologyDao; import com.cappielloantonio.play.database.dao.DownloadDao; -import com.cappielloantonio.play.database.dao.PlaylistDao; import com.cappielloantonio.play.database.dao.QueueDao; import com.cappielloantonio.play.database.dao.RecentSearchDao; import com.cappielloantonio.play.database.dao.ServerDao; @@ -19,12 +18,11 @@ import com.cappielloantonio.play.model.Download; import com.cappielloantonio.play.model.Queue; import com.cappielloantonio.play.model.RecentSearch; import com.cappielloantonio.play.model.Server; -import com.cappielloantonio.play.subsonic.models.Playlist; @Database( - version = 60, - entities = {Queue.class, Server.class, RecentSearch.class, Download.class, Playlist.class, Chronology.class}, - autoMigrations = {@AutoMigration(from = 59, to = 60)} + version = 61, + entities = {Queue.class, Server.class, RecentSearch.class, Download.class, Chronology.class}, + autoMigrations = {@AutoMigration(from = 60, to = 61)} ) @TypeConverters({DateConverters.class}) public abstract class AppDatabase extends RoomDatabase { @@ -49,7 +47,5 @@ public abstract class AppDatabase extends RoomDatabase { public abstract DownloadDao downloadDao(); - public abstract PlaylistDao playlistDao(); - public abstract ChronologyDao chronologyDao(); } diff --git a/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java b/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java index 3f689b24..45b6cb0f 100644 --- a/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java +++ b/app/src/main/java/com/cappielloantonio/play/repository/PlaylistRepository.java @@ -3,12 +3,9 @@ package com.cappielloantonio.play.repository; import android.util.Log; import androidx.annotation.NonNull; -import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.App; -import com.cappielloantonio.play.database.AppDatabase; -import com.cappielloantonio.play.database.dao.PlaylistDao; import com.cappielloantonio.play.subsonic.base.ApiResponse; import com.cappielloantonio.play.subsonic.models.Child; import com.cappielloantonio.play.subsonic.models.Playlist; @@ -22,8 +19,6 @@ import retrofit2.Callback; import retrofit2.Response; public class PlaylistRepository { - private final PlaylistDao playlistDao = AppDatabase.getInstance().playlistDao(); - public MutableLiveData> getPlaylists(boolean random, int size) { MutableLiveData> listLivePlaylists = new MutableLiveData<>(new ArrayList<>()); @@ -143,51 +138,4 @@ public class PlaylistRepository { } }); } - - public LiveData> getPinnedPlaylists(String serverId) { - // return playlistDao.getAll(serverId); - return playlistDao.getAll(); - } - - public void insert(Playlist playlist) { - InsertThreadSafe insert = new InsertThreadSafe(playlistDao, playlist); - Thread thread = new Thread(insert); - thread.start(); - } - - public void delete(Playlist playlist) { - DeleteThreadSafe delete = new DeleteThreadSafe(playlistDao, playlist); - Thread thread = new Thread(delete); - thread.start(); - } - - private static class InsertThreadSafe implements Runnable { - private final PlaylistDao playlistDao; - private final Playlist playlist; - - public InsertThreadSafe(PlaylistDao playlistDao, Playlist playlist) { - this.playlistDao = playlistDao; - this.playlist = playlist; - } - - @Override - public void run() { - playlistDao.insert(playlist); - } - } - - private static class DeleteThreadSafe implements Runnable { - private final PlaylistDao playlistDao; - private final Playlist playlist; - - public DeleteThreadSafe(PlaylistDao playlistDao, Playlist playlist) { - this.playlistDao = playlistDao; - this.playlist = playlist; - } - - @Override - public void run() { - playlistDao.delete(playlist); - } - } } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/adapter/ArtistAdapter.java b/app/src/main/java/com/cappielloantonio/play/ui/adapter/ArtistAdapter.java index 88f1f091..ec823003 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/adapter/ArtistAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/adapter/ArtistAdapter.java @@ -96,8 +96,8 @@ public class ArtistAdapter extends RecyclerView.Adapter private void onClick() { Bundle bundle = new Bundle(); - bundle.putString(Constants.MEDIA_BY_GENRES, Constants.MEDIA_BY_GENRE); + bundle.putString(Constants.MEDIA_BY_GENRE, Constants.MEDIA_BY_GENRE); bundle.putParcelable(Constants.GENRE_OBJECT, genres.get(getBindingAdapterPosition())); click.onGenreClick(bundle); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/adapter/GridTrackAdapter.java b/app/src/main/java/com/cappielloantonio/play/ui/adapter/GridTrackAdapter.java index 7e21561d..0f75a35f 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/adapter/GridTrackAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/adapter/GridTrackAdapter.java @@ -75,7 +75,7 @@ public class GridTrackAdapter extends RecyclerView.Adapter(items)); - bundle.putBoolean("is_chronology", true); + bundle.putBoolean(Constants.MEDIA_CHRONOLOGY, true); bundle.putInt(Constants.ITEM_POSITION, getBindingAdapterPosition()); click.onMediaClick(bundle); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/adapter/PodcastEpisodeAdapter.java b/app/src/main/java/com/cappielloantonio/play/ui/adapter/PodcastEpisodeAdapter.java index ed8cfbf3..1cf7952c 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/adapter/PodcastEpisodeAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/adapter/PodcastEpisodeAdapter.java @@ -14,6 +14,7 @@ import com.cappielloantonio.play.databinding.ItemHomePodcastEpisodeBinding; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.interfaces.ClickCallback; import com.cappielloantonio.play.subsonic.models.PodcastEpisode; +import com.cappielloantonio.play.util.Constants; import com.cappielloantonio.play.util.MusicUtil; import java.text.SimpleDateFormat; @@ -79,14 +80,14 @@ public class PodcastEpisodeAdapter extends RecyclerView.Adapter { - if (bind != null && playlists != null) { - for (Playlist playlist : playlists) { - int playlistViewHashCode = playlist.getId().hashCode(); - if (requireView().findViewById(playlistViewHashCode) == null) { - View genericPlaylistView = activity.getLayoutInflater().inflate(R.layout.generic_playlist_sector, null); - genericPlaylistView.setId(playlistViewHashCode); - genericPlaylistView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); - - TextView genericPlaylistTitleTextView = genericPlaylistView.findViewById(R.id.generic_playlist_title_text_view); - TextView genericPlaylistCickableTextView = genericPlaylistView.findViewById(R.id.generic_playlist_text_view_clickable); - RecyclerView genericPlaylistRecyclerView = genericPlaylistView.findViewById(R.id.generic_playlist_recycler_view); - - genericPlaylistTitleTextView.setText(MusicUtil.getReadableString(playlist.getName())); - genericPlaylistRecyclerView.setHasFixedSize(true); - - SongHorizontalAdapter trackAdapter = new SongHorizontalAdapter(this, true); - genericPlaylistRecyclerView.setAdapter(trackAdapter); - - homeViewModel.getPlaylistSongLiveList(playlist.getId()).observe(getViewLifecycleOwner(), songs -> { - if (songs.size() > 0) { - int songsNumber = Math.min(20, songs.size()); - - genericPlaylistRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(songsNumber, 5), GridLayoutManager.HORIZONTAL, false)); - trackAdapter.setItems(songs.subList(0, songsNumber)); - } - }); - - genericPlaylistCickableTextView.setOnClickListener(view -> { - Bundle bundle = new Bundle(); - bundle.putParcelable(Constants.PLAYLIST_OBJECT, playlist); - bundle.putBoolean("is_offline", false); - activity.navController.navigate(R.id.action_homeFragment_to_playlistPageFragment, bundle); - }); - - SnapHelper genericPlaylistSnapHelper = new PagerSnapHelper(); - genericPlaylistSnapHelper.attachToRecyclerView(genericPlaylistRecyclerView); - - genericPlaylistRecyclerView.addItemDecoration( - new DotsIndicatorDecoration( - getResources().getDimensionPixelSize(R.dimen.radius), - getResources().getDimensionPixelSize(R.dimen.radius) * 4, - getResources().getDimensionPixelSize(R.dimen.dots_height), - requireContext().getResources().getColor(R.color.titleTextColor, null), - requireContext().getResources().getColor(R.color.titleTextColor, null)) - ); - - - bind.homeLinearLayoutContainer.addView(genericPlaylistView); - } - } - } - }); - } - private void initNewestPodcastsView() { bind.newestPodcastsViewPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL); @@ -740,7 +679,7 @@ public class HomeFragment extends Fragment implements ClickCallback { @Override public void onMediaClick(Bundle bundle) { - if (bundle.containsKey("is_mix")) { + if (bundle.containsKey(Constants.MEDIA_MIX)) { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), bundle.getParcelable(Constants.TRACK_OBJECT)); activity.setBottomSheetInPeek(true); @@ -751,7 +690,7 @@ public class HomeFragment extends Fragment implements ClickCallback { } }); } - } else if (bundle.containsKey("is_chronology")) { + } else if (bundle.containsKey(Constants.MEDIA_CHRONOLOGY)) { List media = bundle.getParcelableArrayList(Constants.TRACKS_OBJECT); MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), media, bundle.getInt(Constants.ITEM_POSITION)); activity.setBottomSheetInPeek(true); @@ -778,22 +717,22 @@ public class HomeFragment extends Fragment implements ClickCallback { @Override public void onArtistClick(Bundle bundle) { - if (bundle.containsKey("is_mix") && bundle.getBoolean("is_mix")) { + if (bundle.containsKey(Constants.MEDIA_MIX) && bundle.getBoolean(Constants.MEDIA_MIX)) { Snackbar.make(requireView(), R.string.artist_adapter_radio_station_starting, Snackbar.LENGTH_LONG) .setAnchorView(activity.bind.playerBottomSheet) .show(); if (mediaBrowserListenableFuture != null) { - homeViewModel.getArtistInstantMix(bundle.getParcelable(Constants.ARTIST_OBJECT)).observe(getViewLifecycleOwner(), songs -> { + homeViewModel.getArtistInstantMix(getViewLifecycleOwner(), bundle.getParcelable(Constants.ARTIST_OBJECT)).observe(getViewLifecycleOwner(), songs -> { if (songs.size() > 0) { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); activity.setBottomSheetInPeek(true); } }); } - } else if (bundle.containsKey("is_best_of") && bundle.getBoolean("is_best_of")) { + } else if (bundle.containsKey(Constants.MEDIA_BEST_OF) && bundle.getBoolean(Constants.MEDIA_BEST_OF)) { if (mediaBrowserListenableFuture != null) { - homeViewModel.getArtistBestOf(bundle.getParcelable(Constants.ARTIST_OBJECT)).observe(getViewLifecycleOwner(), songs -> { + homeViewModel.getArtistBestOf(getViewLifecycleOwner(), bundle.getParcelable(Constants.ARTIST_OBJECT)).observe(getViewLifecycleOwner(), songs -> { if (songs.size() > 0) { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); activity.setBottomSheetInPeek(true); @@ -817,7 +756,7 @@ public class HomeFragment extends Fragment implements ClickCallback { @Override public void onPodcastClick(Bundle bundle) { - MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), bundle.getParcelable("podcast_object")); + MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), bundle.getParcelable(Constants.PODCAST_OBJECT)); activity.setBottomSheetInPeek(true); } 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 25796883..9c9610b8 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 @@ -264,7 +264,6 @@ public class LibraryFragment extends Fragment implements ClickCallback { @Override public void onPlaylistClick(Bundle bundle) { - bundle.putBoolean("is_offline", false); Navigation.findNavController(requireView()).navigate(R.id.playlistPageFragment, bundle); } diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistCatalogueFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistCatalogueFragment.java index 8c90fb03..6a87e14b 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistCatalogueFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistCatalogueFragment.java @@ -26,16 +26,12 @@ import androidx.recyclerview.widget.LinearLayoutManager; import com.cappielloantonio.play.R; import com.cappielloantonio.play.databinding.FragmentPlaylistCatalogueBinding; import com.cappielloantonio.play.interfaces.ClickCallback; -import com.cappielloantonio.play.subsonic.models.Playlist; import com.cappielloantonio.play.ui.activity.MainActivity; import com.cappielloantonio.play.ui.adapter.PlaylistHorizontalAdapter; import com.cappielloantonio.play.ui.dialog.PlaylistEditorDialog; import com.cappielloantonio.play.util.Constants; import com.cappielloantonio.play.viewmodel.PlaylistCatalogueViewModel; -import java.util.ArrayList; -import java.util.List; - @UnstableApi public class PlaylistCatalogueFragment extends Fragment implements ClickCallback { private FragmentPlaylistCatalogueBinding bind; @@ -111,32 +107,7 @@ public class PlaylistCatalogueFragment extends Fragment implements ClickCallback bind.playlistCatalogueRecyclerView.setAdapter(playlistHorizontalAdapter); if (getActivity() != null) { - playlistCatalogueViewModel.getPlaylistList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), playlists -> - playlistCatalogueViewModel.getPinnedPlaylistList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), - pinnedPlaylists -> { - List sortedList = new ArrayList<>(); - List unsortedList = new ArrayList<>(playlists); - - List pinnedPlaylistsVerified = new ArrayList<>(); - List pinnedPlaylistsNotFound = new ArrayList<>(); - - if (unsortedList.size() > 0) { - for (Playlist pinnedPlaylist : pinnedPlaylists) { - if (playlists.contains(pinnedPlaylist)) { - pinnedPlaylistsVerified.add(pinnedPlaylist); - } else { - pinnedPlaylistsNotFound.add(pinnedPlaylist); - } - } - - unsortedList.removeAll(pinnedPlaylistsVerified); - sortedList.addAll(pinnedPlaylistsVerified); - sortedList.addAll(unsortedList); - } - - playlistHorizontalAdapter.setItems(sortedList); - playlistCatalogueViewModel.unpinPlaylist(pinnedPlaylistsNotFound); - })); + playlistCatalogueViewModel.getPlaylistList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), playlists -> playlistHorizontalAdapter.setItems(playlists)); } bind.playlistCatalogueRecyclerView.setOnTouchListener((v, event) -> { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java index 5155529f..a8e309cf 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/PlaylistPageFragment.java @@ -61,7 +61,6 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { public void onCreateOptionsMenu(@NonNull Menu menu, @NonNull MenuInflater inflater) { super.onCreateOptionsMenu(menu, inflater); inflater.inflate(R.menu.playlist_page_menu, menu); - initMenuOption(menu); } @Override @@ -103,7 +102,7 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { @Override public boolean onOptionsItemSelected(@NonNull MenuItem item) { if (item.getItemId() == R.id.action_download_playlist) { - playlistPageViewModel.getPlaylistSongLiveList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), songs -> { + playlistPageViewModel.getPlaylistSongLiveList().observe(getViewLifecycleOwner(), songs -> { if (isVisible() && getActivity() != null) { DownloadUtil.getDownloadTracker(requireContext()).download( MappingUtil.mapMediaItems(songs, false), @@ -117,12 +116,6 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { } }); return true; - } else if (item.getItemId() == R.id.action_pin_playlist) { - playlistPageViewModel.setPinned(true); - return true; - } else if (item.getItemId() == R.id.action_unpin_playlist) { - playlistPageViewModel.setPinned(false); - return true; } return false; @@ -130,14 +123,6 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { private void init() { playlistPageViewModel.setPlaylist(requireArguments().getParcelable(Constants.PLAYLIST_OBJECT)); - playlistPageViewModel.setOffline(requireArguments().getBoolean("is_offline")); - } - - private void initMenuOption(Menu menu) { - playlistPageViewModel.isPinned(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), isPinned -> { - menu.findItem(R.id.action_unpin_playlist).setVisible(isPinned); - menu.findItem(R.id.action_pin_playlist).setVisible(!isPinned); - }); } private void initAppBar() { @@ -154,18 +139,13 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { bind.playlistSongCountLabel.setText(getString(R.string.playlist_song_count, playlistPageViewModel.getPlaylist().getSongCount())); bind.playlistDurationLabel.setText(getString(R.string.playlist_duration, MusicUtil.getReadableDurationString(playlistPageViewModel.getPlaylist().getDuration(), false))); - if (playlistPageViewModel.isOffline()) { - bind.playlistSongCountLabel.setVisibility(View.GONE); - bind.playlistDurationLabel.setVisibility(View.GONE); - } - bind.animToolbar.setNavigationOnClickListener(v -> activity.navController.navigateUp()); Objects.requireNonNull(bind.animToolbar.getOverflowIcon()).setTint(requireContext().getResources().getColor(R.color.titleTextColor, null)); } private void initMusicButton() { - playlistPageViewModel.getPlaylistSongLiveList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), songs -> { + playlistPageViewModel.getPlaylistSongLiveList().observe(getViewLifecycleOwner(), songs -> { if (bind != null) { bind.playlistPagePlayButton.setOnClickListener(v -> { MediaManager.startQueue(mediaBrowserListenableFuture, requireContext(), songs, 0); @@ -182,39 +162,11 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { } private void initBackCover() { - playlistPageViewModel.getPlaylistSongLiveList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), songs -> { - if (bind != null) { - Collections.shuffle(songs); - - // Pic top-left - CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 0 ? songs.get(0).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.PLAYLIST_PIC, null) - .build() - .transform(new CenterCrop(), new GranularRoundedCorners(CustomGlideRequest.CORNER_RADIUS, 0, 0, 0)) - .into(bind.playlistCoverImageViewTopLeft); - - // Pic top-right - CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 1 ? songs.get(1).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.PLAYLIST_PIC, null) - .build() - .transform(new CenterCrop(), new GranularRoundedCorners(0, CustomGlideRequest.CORNER_RADIUS, 0, 0)) - .into(bind.playlistCoverImageViewTopRight); - - // Pic bottom-left - CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 2 ? songs.get(2).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.PLAYLIST_PIC, null) - .build() - .transform(new CenterCrop(), new GranularRoundedCorners(0, 0, 0, CustomGlideRequest.CORNER_RADIUS)) - .into(bind.playlistCoverImageViewBottomLeft); - - // Pic bottom-right - CustomGlideRequest.Builder - .from(requireContext(), songs.size() > 3 ? songs.get(3).getCoverArtId() : playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.PLAYLIST_PIC, null) - .build() - .transform(new CenterCrop(), new GranularRoundedCorners(0, 0, CustomGlideRequest.CORNER_RADIUS, 0)) - .into(bind.playlistCoverImageViewBottomRight); - } - }); + CustomGlideRequest.Builder + .from(requireContext(), playlistPageViewModel.getPlaylist().getCoverArtId(), CustomGlideRequest.PLAYLIST_PIC, null) + .build() + .transform(new CenterCrop(), new GranularRoundedCorners(CustomGlideRequest.CORNER_RADIUS, 0, 0, 0)) + .into(bind.playlistCoverImageView); } private void initSongsView() { @@ -224,7 +176,7 @@ public class PlaylistPageFragment extends Fragment implements ClickCallback { songHorizontalAdapter = new SongHorizontalAdapter(this, true); bind.songRecyclerView.setAdapter(songHorizontalAdapter); - playlistPageViewModel.getPlaylistSongLiveList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs)); + playlistPageViewModel.getPlaylistSongLiveList().observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs)); } private void initializeMediaBrowser() { 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 d7072a50..367b4c6b 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 @@ -146,7 +146,7 @@ public class SongListPageFragment extends Fragment implements ClickCallback { } private void initButtons() { - songListPageViewModel.getSongList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), songs -> { + songListPageViewModel.getSongList().observe(getViewLifecycleOwner(), songs -> { if (bind != null) { bind.songListShuffleImageView.setOnClickListener(v -> { Collections.shuffle(songs); @@ -163,7 +163,7 @@ public class SongListPageFragment extends Fragment implements ClickCallback { songHorizontalAdapter = new SongHorizontalAdapter(this, true); bind.songListRecyclerView.setAdapter(songHorizontalAdapter); - songListPageViewModel.getSongList(getViewLifecycleOwner()).observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs)); + songListPageViewModel.getSongList().observe(getViewLifecycleOwner(), songs -> songHorizontalAdapter.setItems(songs)); } private void initializeMediaBrowser() { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/PodcastBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/PodcastBottomSheetDialog.java index d6892b6a..0282f337 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/PodcastBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/PodcastBottomSheetDialog.java @@ -22,6 +22,7 @@ import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.service.MediaService; import com.cappielloantonio.play.subsonic.models.PodcastEpisode; import com.cappielloantonio.play.ui.activity.MainActivity; +import com.cappielloantonio.play.util.Constants; import com.cappielloantonio.play.util.MusicUtil; import com.cappielloantonio.play.viewmodel.PodcastBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; @@ -39,7 +40,7 @@ public class PodcastBottomSheetDialog extends BottomSheetDialogFragment implemen public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(R.layout.bottom_sheet_podcast_dialog, container, false); - podcast = requireArguments().getParcelable("podcast_object"); + podcast = requireArguments().getParcelable(Constants.PODCAST_OBJECT); podcastBottomSheetViewModel = new ViewModelProvider(requireActivity()).get(PodcastBottomSheetViewModel.class); podcastBottomSheetViewModel.setPodcast(podcast); diff --git a/app/src/main/java/com/cappielloantonio/play/util/Constants.kt b/app/src/main/java/com/cappielloantonio/play/util/Constants.kt index 59fe4204..f24d56b4 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/Constants.kt +++ b/app/src/main/java/com/cappielloantonio/play/util/Constants.kt @@ -7,8 +7,12 @@ object Constants { const val TRACK_OBJECT = "TRACK_OBJECT" const val TRACKS_OBJECT = "TRACKS_OBJECT" - const val ALBUM_OBJECT = "ALBUM_OBJECT" + const val ARTIST_OBJECT = "ARTIST_OBJECT" + const val GENRE_OBJECT = "GENRE_OBJECT" + const val PLAYLIST_OBJECT = "PLAYLIST_OBJECT" + const val PODCAST_OBJECT = "PODCAST_OBJECT" + const val ALBUM_RECENTLY_PLAYED = "ALBUM_RECENTLY_PLAYED" const val ALBUM_MOST_PLAYED = "ALBUM_MOST_PLAYED" const val ALBUM_RECENTLY_ADDED = "ALBUM_RECENTLY_ADDED" @@ -21,17 +25,14 @@ object Constants { const val ALBUM_ORDER_BY_YEAR = "ALBUM_ORDER_BY_YEAR" const val ALBUM_ORDER_BY_RANDOM = "ALBUM_ORDER_BY_RANDOM" - const val ARTIST_OBJECT = "ARTIST_OBJECT" const val ARTIST_DOWNLOADED = "ARTIST_DOWNLOADED" const val ARTIST_STARRED = "ARTIST_STARRED" const val ARTIST_ORDER_BY_NAME = "ARTIST_ORDER_BY_NAME" const val ARTIST_ORDER_BY_RANDOM = "ARTIST_ORDER_BY_RANDOM" - const val GENRE_OBJECT = "GENRE_OBJECT" const val GENRE_ORDER_BY_NAME = "GENRE_ORDER_BY_NAME" const val GENRE_ORDER_BY_RANDOM = "GENRE_ORDER_BY_RANDOM" - const val PLAYLIST_OBJECT = "PLAYLIST_OBJECT" const val PLAYLIST_ALL = "ALL" const val PLAYLIST_DOWNLOADED = "DOWNLOADED" const val PLAYLIST_ORDER_BY_NAME = "ORDER_BY_NAME" @@ -59,4 +60,7 @@ object Constants { const val MEDIA_STARRED = "MEDIA_STARRED" const val MEDIA_DOWNLOADED = "MEDIA_DOWNLOADED" const val MEDIA_FROM_ALBUM = "MEDIA_FROM_ALBUM" + const val MEDIA_MIX = "MEDIA_MIX" + const val MEDIA_CHRONOLOGY = "MEDIA_CHRONOLOGY" + const val MEDIA_BEST_OF = "MEDIA_BEST_OF" } \ No newline at end of file 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 3f4aecd1..70785d9c 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/HomeViewModel.java @@ -12,13 +12,11 @@ import com.cappielloantonio.play.model.Chronology; import com.cappielloantonio.play.repository.AlbumRepository; import com.cappielloantonio.play.repository.ArtistRepository; import com.cappielloantonio.play.repository.ChronologyRepository; -import com.cappielloantonio.play.repository.PlaylistRepository; import com.cappielloantonio.play.repository.PodcastRepository; import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.subsonic.models.AlbumID3; import com.cappielloantonio.play.subsonic.models.ArtistID3; import com.cappielloantonio.play.subsonic.models.Child; -import com.cappielloantonio.play.subsonic.models.Playlist; import com.cappielloantonio.play.subsonic.models.PodcastEpisode; import com.cappielloantonio.play.util.Preferences; @@ -33,7 +31,6 @@ public class HomeViewModel extends AndroidViewModel { private final SongRepository songRepository; private final AlbumRepository albumRepository; private final ArtistRepository artistRepository; - private final PlaylistRepository playlistRepository; private final PodcastRepository podcastRepository; private final ChronologyRepository chronologyRepository; @@ -49,7 +46,6 @@ public class HomeViewModel extends AndroidViewModel { private final MutableLiveData> recentlyPlayedAlbumSample = new MutableLiveData<>(null); private final MutableLiveData> years = new MutableLiveData<>(null); private final MutableLiveData> recentlyAddedAlbumSample = new MutableLiveData<>(null); - private final MutableLiveData> pinnedPlaylists = new MutableLiveData<>(null); private final MutableLiveData> newestPodcastEpisodes = new MutableLiveData<>(null); private final MutableLiveData> thisGridTopSong = new MutableLiveData<>(null); @@ -63,7 +59,6 @@ public class HomeViewModel extends AndroidViewModel { songRepository = new SongRepository(); albumRepository = new AlbumRepository(); artistRepository = new ArtistRepository(); - playlistRepository = new PlaylistRepository(); podcastRepository = new PodcastRepository(); chronologyRepository = new ChronologyRepository(); } @@ -185,20 +180,6 @@ public class HomeViewModel extends AndroidViewModel { return recentlyPlayedAlbumSample; } - public LiveData> getPinnedPlaylistList(LifecycleOwner owner, int maxNumber, boolean random) { - playlistRepository.getPinnedPlaylists(Preferences.getServerId()).observe(owner, playlists -> { - if (random) Collections.shuffle(playlists); - List subPlaylist = playlists.subList(0, Math.min(maxNumber, playlists.size())); - pinnedPlaylists.postValue(subPlaylist); - }); - - return pinnedPlaylists; - } - - public LiveData> getPlaylistSongLiveList(String playlistId) { - return playlistRepository.getPlaylistSongs(playlistId); - } - public LiveData> getNewestPodcastEpisodes(LifecycleOwner owner) { if (newestPodcastEpisodes.getValue() == null) { podcastRepository.getNewestPodcastEpisodes(20).observe(owner, newestPodcastEpisodes::postValue); @@ -215,12 +196,20 @@ public class HomeViewModel extends AndroidViewModel { return mediaInstantMix; } - public LiveData> getArtistInstantMix(ArtistID3 artist) { - return artistRepository.getInstantMix(artist, 20); + public LiveData> getArtistInstantMix(LifecycleOwner owner, ArtistID3 artist) { + if (artistInstantMix.getValue() == null) { + artistRepository.getTopSongs(artist.getName(), 10).observe(owner, artistInstantMix::postValue); + } + + return artistInstantMix; } - public LiveData> getArtistBestOf(ArtistID3 artist) { - return artistRepository.getTopSongs(artist.getName(), 10); + public LiveData> getArtistBestOf(LifecycleOwner owner, ArtistID3 artist) { + if (bestOfArtists.getValue() == null) { + artistRepository.getTopSongs(artist.getName(), 10).observe(owner, artistBestOf::postValue); + } + + return artistBestOf; } public void refreshDiscoverySongSample(LifecycleOwner owner) { diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistCatalogueViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistCatalogueViewModel.java index f472f3d1..f4804e5e 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistCatalogueViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistCatalogueViewModel.java @@ -8,63 +8,32 @@ import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; -import com.cappielloantonio.play.repository.DownloadRepository; import com.cappielloantonio.play.repository.PlaylistRepository; import com.cappielloantonio.play.subsonic.models.Playlist; -import com.cappielloantonio.play.util.Constants; -import com.cappielloantonio.play.util.Preferences; -import java.util.ArrayList; import java.util.List; public class PlaylistCatalogueViewModel extends AndroidViewModel { private final PlaylistRepository playlistRepository; - private final DownloadRepository downloadRepository; private String type; - private MutableLiveData> playlistList; - private MutableLiveData> pinnedPlaylistList; + private final MutableLiveData> playlistList = new MutableLiveData<>(null); public PlaylistCatalogueViewModel(@NonNull Application application) { super(application); playlistRepository = new PlaylistRepository(); - downloadRepository = new DownloadRepository(); } public LiveData> getPlaylistList(LifecycleOwner owner) { - playlistList = new MutableLiveData<>(new ArrayList<>()); - - switch (type) { - case Constants.PLAYLIST_ALL: - playlistRepository.getPlaylists(false, -1).observe(owner, playlists -> playlistList.postValue(playlists)); - break; - case Constants.PLAYLIST_DOWNLOADED: - // TODO - //downloadRepository.getLivePlaylist().observe(owner, downloads -> playlistList.setValue(MappingUtil.mapDownloadToPlaylist(downloads))); - break; + if (playlistList.getValue() == null) { + playlistRepository.getPlaylists(false, -1).observe(owner, playlistList::postValue); } - playlistRepository.getPlaylists(false, -1); - return playlistList; } - public LiveData> getPinnedPlaylistList(LifecycleOwner owner) { - pinnedPlaylistList = new MutableLiveData<>(new ArrayList<>()); - playlistRepository.getPinnedPlaylists(Preferences.getServerId()).observe(owner, playlists -> pinnedPlaylistList.postValue(playlists)); - return pinnedPlaylistList; - } - - public void unpinPlaylist(List playlists) { - if (type.equals(Constants.PLAYLIST_ALL)) { - for (Playlist playlist : playlists) { - playlistRepository.delete(playlist); - } - } - } - public void setType(String type) { this.type = type; } diff --git a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java index 52bbedd5..b0fb96f0 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/PlaylistPageViewModel.java @@ -4,23 +4,16 @@ import android.app.Application; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; -import androidx.lifecycle.MutableLiveData; -import com.cappielloantonio.play.repository.DownloadRepository; import com.cappielloantonio.play.repository.PlaylistRepository; import com.cappielloantonio.play.subsonic.models.Child; import com.cappielloantonio.play.subsonic.models.Playlist; -import com.cappielloantonio.play.util.Preferences; import java.util.List; public class PlaylistPageViewModel extends AndroidViewModel { private final PlaylistRepository playlistRepository; - private final DownloadRepository downloadRepository; - - private MutableLiveData> playlistSongLiveList = new MutableLiveData<>(); private Playlist playlist; private boolean isOffline; @@ -29,18 +22,10 @@ public class PlaylistPageViewModel extends AndroidViewModel { super(application); playlistRepository = new PlaylistRepository(); - downloadRepository = new DownloadRepository(); } - public LiveData> getPlaylistSongLiveList(LifecycleOwner owner) { - if (isOffline) { - // TODO - // downloadRepository.getLiveDownloadFromPlaylist(playlist.getId()).observe(owner, downloads -> playlistSongLiveList.postValue(MappingUtil.mapDownloadToMedia(downloads))); - } else { - playlistSongLiveList = playlistRepository.getPlaylistSongs(playlist.getId()); - } - - return playlistSongLiveList; + public LiveData> getPlaylistSongLiveList() { + return playlistRepository.getPlaylistSongs(playlist.getId()); } public Playlist getPlaylist() { @@ -49,29 +34,5 @@ public class PlaylistPageViewModel extends AndroidViewModel { public void setPlaylist(Playlist playlist) { this.playlist = playlist; - // TODO - // this.playlist.setServer(Preferences.getServerId()); - } - - public void setOffline(boolean offline) { - isOffline = offline; - } - - public boolean isOffline() { - return isOffline; - } - - public LiveData isPinned(LifecycleOwner owner) { - MutableLiveData isPinnedLive = new MutableLiveData<>(); - playlistRepository.getPinnedPlaylists(Preferences.getServerId()).observe(owner, playlists -> isPinnedLive.postValue(playlists.contains(playlist))); - return isPinnedLive; - } - - public void setPinned(boolean isNowPinned) { - if (isNowPinned) { - playlistRepository.insert(playlist); - } else { - playlistRepository.delete(playlist); - } } } 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 05b3057a..b624109e 100644 --- a/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java +++ b/app/src/main/java/com/cappielloantonio/play/viewmodel/SongListPageViewModel.java @@ -5,12 +5,10 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.lifecycle.AndroidViewModel; -import androidx.lifecycle.LifecycleOwner; import androidx.lifecycle.LiveData; import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.play.repository.ArtistRepository; -import com.cappielloantonio.play.repository.DownloadRepository; import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.subsonic.models.AlbumID3; import com.cappielloantonio.play.subsonic.models.ArtistID3; @@ -24,7 +22,6 @@ import java.util.List; public class SongListPageViewModel extends AndroidViewModel { private final SongRepository songRepository; private final ArtistRepository artistRepository; - private final DownloadRepository downloadRepository; public String title; public String toolbarTitle; @@ -44,10 +41,9 @@ public class SongListPageViewModel extends AndroidViewModel { songRepository = new SongRepository(); artistRepository = new ArtistRepository(); - downloadRepository = new DownloadRepository(); } - public LiveData> getSongList(LifecycleOwner owner) { + public LiveData> getSongList() { songList = new MutableLiveData<>(new ArrayList<>()); switch (title) { diff --git a/app/src/main/res/layout/fragment_download.xml b/app/src/main/res/layout/fragment_download.xml index 68763949..a8dfd7be 100644 --- a/app/src/main/res/layout/fragment_download.xml +++ b/app/src/main/res/layout/fragment_download.xml @@ -104,7 +104,7 @@ android:paddingStart="16dp" android:paddingTop="8dp" android:paddingEnd="16dp" - android:text="@string/download_title_tracks_section" /> + android:text="@string/download_title_section" /> - - - - - - + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintTop_toBottomOf="@+id/playlist_cover_image_view" /> - - \ No newline at end of file diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 46b156f0..5a159144 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -2,7 +2,7 @@ 296dp 24dp 56dp - 64dp + 128dp 2dp 2dp \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index af15fad7..6087724a 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -56,7 +56,7 @@ See all Playlists See all - Tracks + Downloads See all Required