mirror of
https://github.com/antebudimir/tempus.git
synced 2026-01-02 18:31:40 +00:00
Download entire playlists in separate section
This commit is contained in:
parent
f89f3454c4
commit
d2a80c064c
23 changed files with 367 additions and 79 deletions
|
|
@ -91,14 +91,11 @@ public class AlbumPageFragment extends Fragment {
|
|||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_download_album:
|
||||
albumPageViewModel.getAlbumSongLiveList(requireActivity()).observe(requireActivity(), songs -> {
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(songs);
|
||||
});
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
if (item.getItemId() == R.id.action_download_album) {
|
||||
albumPageViewModel.getAlbumSongLiveList(requireActivity()).observe(requireActivity(), songs -> {
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(songs, null, null);
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
|
|||
|
|
@ -12,35 +12,27 @@ import androidx.annotation.NonNull;
|
|||
import androidx.annotation.Nullable;
|
||||
import androidx.core.view.ViewCompat;
|
||||
import androidx.fragment.app.Fragment;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.lifecycle.ViewModelProvider;
|
||||
import androidx.recyclerview.widget.GridLayoutManager;
|
||||
import androidx.recyclerview.widget.LinearLayoutManager;
|
||||
import androidx.recyclerview.widget.PagerSnapHelper;
|
||||
import androidx.recyclerview.widget.SnapHelper;
|
||||
import androidx.viewpager2.widget.ViewPager2;
|
||||
|
||||
import com.cappielloantonio.play.R;
|
||||
import com.cappielloantonio.play.adapter.AlbumAdapter;
|
||||
import com.cappielloantonio.play.adapter.AlbumHorizontalAdapter;
|
||||
import com.cappielloantonio.play.adapter.ArtistAdapter;
|
||||
import com.cappielloantonio.play.adapter.ArtistHorizontalAdapter;
|
||||
import com.cappielloantonio.play.adapter.DiscoverSongAdapter;
|
||||
import com.cappielloantonio.play.adapter.SimilarTrackAdapter;
|
||||
import com.cappielloantonio.play.adapter.PlaylistAdapter;
|
||||
import com.cappielloantonio.play.adapter.SongHorizontalAdapter;
|
||||
import com.cappielloantonio.play.adapter.TrackAdapter;
|
||||
import com.cappielloantonio.play.adapter.YearAdapter;
|
||||
import com.cappielloantonio.play.databinding.FragmentDownloadBinding;
|
||||
import com.cappielloantonio.play.databinding.FragmentHomeBinding;
|
||||
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
|
||||
import com.cappielloantonio.play.helper.recyclerview.DotsIndicatorDecoration;
|
||||
import com.cappielloantonio.play.model.Album;
|
||||
import com.cappielloantonio.play.model.Artist;
|
||||
import com.cappielloantonio.play.model.Playlist;
|
||||
import com.cappielloantonio.play.model.Song;
|
||||
import com.cappielloantonio.play.ui.activity.MainActivity;
|
||||
import com.cappielloantonio.play.util.MappingUtil;
|
||||
import com.cappielloantonio.play.util.UIUtil;
|
||||
import com.cappielloantonio.play.viewmodel.DownloadViewModel;
|
||||
import com.cappielloantonio.play.viewmodel.HomeViewModel;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
|
|
@ -54,6 +46,7 @@ public class DownloadFragment extends Fragment {
|
|||
private ArtistHorizontalAdapter downloadedArtistAdapter;
|
||||
private AlbumHorizontalAdapter downloadedAlbumAdapter;
|
||||
private SongHorizontalAdapter downloadedTrackAdapter;
|
||||
private PlaylistAdapter playlistAdapter;
|
||||
|
||||
@Override
|
||||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
|
|
@ -89,6 +82,8 @@ public class DownloadFragment extends Fragment {
|
|||
initDownloadedArtistView();
|
||||
initDownloadedAlbumView();
|
||||
initDownloadedSongView();
|
||||
initDownloadedPlaylistSlideView();
|
||||
initPlaceholder();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -138,6 +133,12 @@ public class DownloadFragment extends Fragment {
|
|||
bundle.putString(Song.DOWNLOADED, Song.DOWNLOADED);
|
||||
activity.navController.navigate(R.id.action_downloadFragment_to_songListPageFragment, bundle);
|
||||
});
|
||||
|
||||
bind.downloadedPlaylistTextViewClickable.setOnClickListener(v -> {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(Playlist.DOWNLOADED, Playlist.DOWNLOADED);
|
||||
activity.navController.navigate(R.id.action_downloadFragment_to_playlistCatalogueFragment, bundle);
|
||||
});
|
||||
}
|
||||
|
||||
private void initAppBar() {
|
||||
|
|
@ -155,12 +156,10 @@ public class DownloadFragment extends Fragment {
|
|||
if (bind != null) bind.downloadDownloadedArtistPlaceholder.placeholder.setVisibility(View.VISIBLE);
|
||||
if (bind != null) bind.downloadDownloadedArtistSector.setVisibility(View.GONE);
|
||||
} else {
|
||||
if (bind != null && !artists.isEmpty()) bind.emptyDownloadLayout.setVisibility(View.GONE);
|
||||
if (bind != null && !artists.isEmpty()) bind.fragmentDownloadNestedScrollView.setVisibility(View.VISIBLE);
|
||||
|
||||
if (bind != null) bind.downloadDownloadedArtistPlaceholder.placeholder.setVisibility(View.GONE);
|
||||
if (bind != null) bind.downloadDownloadedArtistSector.setVisibility(!artists.isEmpty() ? View.VISIBLE : View.GONE);
|
||||
if (bind != null) bind.downloadedArtistRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(artists.size(), 5), GridLayoutManager.HORIZONTAL, false));
|
||||
if (bind != null)
|
||||
bind.downloadedArtistRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(artists.size(), 5), GridLayoutManager.HORIZONTAL, false));
|
||||
|
||||
downloadedArtistAdapter.setItems(artists);
|
||||
}
|
||||
|
|
@ -189,12 +188,10 @@ public class DownloadFragment extends Fragment {
|
|||
if (bind != null) bind.downloadDownloadedAlbumPlaceholder.placeholder.setVisibility(View.VISIBLE);
|
||||
if (bind != null) bind.downloadDownloadedAlbumSector.setVisibility(View.GONE);
|
||||
} else {
|
||||
if (bind != null && !albums.isEmpty()) bind.emptyDownloadLayout.setVisibility(View.GONE);
|
||||
if (bind != null && !albums.isEmpty()) bind.fragmentDownloadNestedScrollView.setVisibility(View.VISIBLE);
|
||||
|
||||
if (bind != null) bind.downloadDownloadedAlbumPlaceholder.placeholder.setVisibility(View.GONE);
|
||||
if (bind != null) bind.downloadDownloadedAlbumSector.setVisibility(!albums.isEmpty() ? View.VISIBLE : View.GONE);
|
||||
if (bind != null) bind.downloadedAlbumRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false));
|
||||
if (bind != null)
|
||||
bind.downloadedAlbumRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(albums.size(), 5), GridLayoutManager.HORIZONTAL, false));
|
||||
|
||||
downloadedAlbumAdapter.setItems(albums);
|
||||
}
|
||||
|
|
@ -223,12 +220,10 @@ public class DownloadFragment extends Fragment {
|
|||
if (bind != null) bind.downloadDownloadedTracksPlaceholder.placeholder.setVisibility(View.VISIBLE);
|
||||
if (bind != null) bind.downloadDownloadedTracksSector.setVisibility(View.GONE);
|
||||
} else {
|
||||
if (bind != null && !songs.isEmpty()) bind.emptyDownloadLayout.setVisibility(View.GONE);
|
||||
if (bind != null && !songs.isEmpty()) bind.fragmentDownloadNestedScrollView.setVisibility(View.VISIBLE);
|
||||
|
||||
if (bind != null) bind.downloadDownloadedTracksPlaceholder.placeholder.setVisibility(View.GONE);
|
||||
if (bind != null) bind.downloadDownloadedTracksSector.setVisibility(!songs.isEmpty() ? View.VISIBLE : View.GONE);
|
||||
if (bind != null) bind.downloadedTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(songs.size(), 5), GridLayoutManager.HORIZONTAL, false));
|
||||
if (bind != null)
|
||||
bind.downloadedTracksRecyclerView.setLayoutManager(new GridLayoutManager(requireContext(), UIUtil.getSpanCount(songs.size(), 5), GridLayoutManager.HORIZONTAL, false));
|
||||
|
||||
downloadedTrackAdapter.setItems(songs);
|
||||
}
|
||||
|
|
@ -246,4 +241,60 @@ public class DownloadFragment extends Fragment {
|
|||
requireContext().getResources().getColor(R.color.titleTextColor, null))
|
||||
);
|
||||
}
|
||||
|
||||
private void initDownloadedPlaylistSlideView() {
|
||||
bind.downloadedPlaylistViewPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
|
||||
|
||||
playlistAdapter = new PlaylistAdapter(activity, requireContext(), true);
|
||||
bind.downloadedPlaylistViewPager.setAdapter(playlistAdapter);
|
||||
bind.downloadedPlaylistViewPager.setOffscreenPageLimit(3);
|
||||
downloadViewModel.getDownloadedPlaylists(requireActivity(), 5).observe(requireActivity(), playlists -> {
|
||||
if (playlists == null) {
|
||||
if (bind != null) bind.downloadDownloadedPlaylistPlaceholder.placeholder.setVisibility(View.VISIBLE);
|
||||
if (bind != null) bind.downloadDownloadedPlaylistSector.setVisibility(View.GONE);
|
||||
} else {
|
||||
if (bind != null) bind.downloadDownloadedPlaylistPlaceholder.placeholder.setVisibility(View.GONE);
|
||||
if (bind != null) bind.downloadDownloadedPlaylistSector.setVisibility(!playlists.isEmpty() ? View.VISIBLE : View.GONE);
|
||||
|
||||
playlistAdapter.setItems(playlists);
|
||||
}
|
||||
});
|
||||
|
||||
setSlideViewOffset(20, 16);
|
||||
}
|
||||
|
||||
private void setSlideViewOffset(float pageOffset, float pageMargin) {
|
||||
bind.downloadedPlaylistViewPager.setPageTransformer((page, position) -> {
|
||||
float myOffset = position * -(2 * pageOffset + pageMargin);
|
||||
if (bind.downloadedPlaylistViewPager.getOrientation() == ViewPager2.ORIENTATION_HORIZONTAL) {
|
||||
if (ViewCompat.getLayoutDirection(bind.downloadedPlaylistViewPager) == ViewCompat.LAYOUT_DIRECTION_RTL) {
|
||||
page.setTranslationX(-myOffset);
|
||||
} else {
|
||||
page.setTranslationX(myOffset);
|
||||
}
|
||||
} else {
|
||||
page.setTranslationY(myOffset);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private void initPlaceholder() {
|
||||
FragmentActivity requiredActivity = getActivity();
|
||||
|
||||
if (requiredActivity != null) {
|
||||
downloadViewModel.getDownloadedTracks(requiredActivity, 20).observe(requiredActivity, songs ->
|
||||
downloadViewModel.getDownloadedAlbums(requiredActivity, 20).observe(requiredActivity, albums ->
|
||||
downloadViewModel.getDownloadedArtists(requiredActivity, 20).observe(requiredActivity, artists -> {
|
||||
if ((songs != null && !songs.isEmpty()) || (albums != null && !albums.isEmpty()) || (artists != null && !artists.isEmpty())) {
|
||||
if (bind != null) bind.emptyDownloadLayout.setVisibility(View.GONE);
|
||||
if (bind != null) bind.fragmentDownloadNestedScrollView.setVisibility(View.VISIBLE);
|
||||
} else {
|
||||
if (bind != null) bind.emptyDownloadLayout.setVisibility(View.VISIBLE);
|
||||
if (bind != null) bind.fragmentDownloadNestedScrollView.setVisibility(View.GONE);
|
||||
}
|
||||
})
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -28,6 +28,7 @@ import com.cappielloantonio.play.adapter.PlaylistAdapter;
|
|||
import com.cappielloantonio.play.databinding.FragmentLibraryBinding;
|
||||
import com.cappielloantonio.play.helper.recyclerview.CustomLinearSnapHelper;
|
||||
import com.cappielloantonio.play.helper.recyclerview.DotsIndicatorDecoration;
|
||||
import com.cappielloantonio.play.model.Playlist;
|
||||
import com.cappielloantonio.play.model.Song;
|
||||
import com.cappielloantonio.play.ui.activity.MainActivity;
|
||||
import com.cappielloantonio.play.util.UIUtil;
|
||||
|
|
@ -118,7 +119,11 @@ public class LibraryFragment extends Fragment {
|
|||
bind.albumCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_albumCatalogueFragment));
|
||||
bind.artistCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_artistCatalogueFragment));
|
||||
bind.genreCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_genreCatalogueFragment));
|
||||
bind.playlistCatalogueTextViewClickable.setOnClickListener(v -> activity.navController.navigate(R.id.action_libraryFragment_to_playlistCatalogueFragment));
|
||||
bind.playlistCatalogueTextViewClickable.setOnClickListener(v -> {
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putString(Playlist.ALL, Playlist.ALL);
|
||||
activity.navController.navigate(R.id.action_libraryFragment_to_playlistCatalogueFragment, bundle);
|
||||
});
|
||||
|
||||
bind.albumCatalogueSampleTextViewRefreshable.setOnLongClickListener(view -> {
|
||||
libraryViewModel.refreshAlbumSample(requireActivity());
|
||||
|
|
@ -249,7 +254,7 @@ public class LibraryFragment extends Fragment {
|
|||
private void initPlaylistSlideView() {
|
||||
bind.playlistViewPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL);
|
||||
|
||||
playlistAdapter = new PlaylistAdapter(activity, requireContext());
|
||||
playlistAdapter = new PlaylistAdapter(activity, requireContext(), false);
|
||||
bind.playlistViewPager.setAdapter(playlistAdapter);
|
||||
bind.playlistViewPager.setOffscreenPageLimit(3);
|
||||
libraryViewModel.getPlaylistSample().observe(requireActivity(), playlists -> {
|
||||
|
|
|
|||
|
|
@ -23,6 +23,8 @@ import androidx.recyclerview.widget.LinearLayoutManager;
|
|||
import com.cappielloantonio.play.R;
|
||||
import com.cappielloantonio.play.adapter.PlaylistCatalogueAdapter;
|
||||
import com.cappielloantonio.play.databinding.FragmentPlaylistCatalogueBinding;
|
||||
import com.cappielloantonio.play.model.Album;
|
||||
import com.cappielloantonio.play.model.Playlist;
|
||||
import com.cappielloantonio.play.ui.activity.MainActivity;
|
||||
import com.cappielloantonio.play.viewmodel.PlaylistCatalogueViewModel;
|
||||
|
||||
|
|
@ -39,8 +41,6 @@ public class PlaylistCatalogueFragment extends Fragment {
|
|||
public void onCreate(@Nullable Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
setHasOptionsMenu(true);
|
||||
|
||||
initData();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
@ -49,7 +49,9 @@ public class PlaylistCatalogueFragment extends Fragment {
|
|||
|
||||
bind = FragmentPlaylistCatalogueBinding.inflate(inflater, container, false);
|
||||
View view = bind.getRoot();
|
||||
playlistCatalogueViewModel = new ViewModelProvider(requireActivity()).get(PlaylistCatalogueViewModel.class);
|
||||
|
||||
init();
|
||||
initAppBar();
|
||||
initPlaylistCatalogueView();
|
||||
|
||||
|
|
@ -68,8 +70,12 @@ public class PlaylistCatalogueFragment extends Fragment {
|
|||
bind = null;
|
||||
}
|
||||
|
||||
private void initData() {
|
||||
playlistCatalogueViewModel = new ViewModelProvider(requireActivity()).get(PlaylistCatalogueViewModel.class);
|
||||
private void init() {
|
||||
if (getArguments().getString(Playlist.ALL) != null) {
|
||||
playlistCatalogueViewModel.setType(Playlist.ALL);
|
||||
} else if (getArguments().getString(Playlist.DOWNLOADED) != null) {
|
||||
playlistCatalogueViewModel.setType(Playlist.DOWNLOADED);
|
||||
}
|
||||
}
|
||||
|
||||
private void initAppBar() {
|
||||
|
|
@ -100,9 +106,9 @@ public class PlaylistCatalogueFragment extends Fragment {
|
|||
bind.playlistCatalogueRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
|
||||
bind.playlistCatalogueRecyclerView.setHasFixedSize(true);
|
||||
|
||||
playlistCatalogueAdapter = new PlaylistCatalogueAdapter(activity, requireContext());
|
||||
playlistCatalogueAdapter = new PlaylistCatalogueAdapter(activity, requireContext(), playlistCatalogueViewModel.getType().equals(Playlist.DOWNLOADED));
|
||||
bind.playlistCatalogueRecyclerView.setAdapter(playlistCatalogueAdapter);
|
||||
playlistCatalogueViewModel.getPlaylistList().observe(requireActivity(), playlist -> {
|
||||
playlistCatalogueViewModel.getPlaylistList(requireActivity()).observe(requireActivity(), playlist -> {
|
||||
playlistCatalogueAdapter.setItems(playlist);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package com.cappielloantonio.play.ui.fragment;
|
||||
|
||||
import android.content.Context;
|
||||
import android.os.Bundle;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
|
|
@ -81,12 +82,13 @@ public class PlaylistPageFragment extends Fragment {
|
|||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
switch (item.getItemId()) {
|
||||
case R.id.action_download_playlist:
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(Objects.requireNonNull(playlistPageViewModel.getPlaylistSongLiveList().getValue()));
|
||||
return true;
|
||||
default:
|
||||
break;
|
||||
if (item.getItemId() == R.id.action_download_playlist) {
|
||||
playlistPageViewModel.getPlaylistSongLiveList(requireActivity()).observe(requireActivity(), songs -> {
|
||||
if (getContext() != null) {
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(songs, playlistPageViewModel.getPlaylist().getId(), playlistPageViewModel.getPlaylist().getName());
|
||||
}
|
||||
});
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
|
@ -94,6 +96,7 @@ public class PlaylistPageFragment extends Fragment {
|
|||
|
||||
private void init() {
|
||||
playlistPageViewModel.setPlaylist(getArguments().getParcelable("playlist_object"));
|
||||
playlistPageViewModel.setOffline(getArguments().getBoolean("is_offline"));
|
||||
}
|
||||
|
||||
private void initAppBar() {
|
||||
|
|
@ -110,13 +113,18 @@ public class PlaylistPageFragment extends Fragment {
|
|||
bind.playlistSongCountLabel.setText("Song count: " + playlistPageViewModel.getPlaylist().getSongCount());
|
||||
bind.playlistDurationLabel.setText("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().observe(requireActivity(), songs -> {
|
||||
playlistPageViewModel.getPlaylistSongLiveList(requireActivity()).observe(requireActivity(), songs -> {
|
||||
if (bind != null) {
|
||||
bind.playlistPagePlayButton.setOnClickListener(v -> {
|
||||
QueueRepository queueRepository = new QueueRepository(App.getInstance());
|
||||
|
|
@ -158,6 +166,6 @@ public class PlaylistPageFragment extends Fragment {
|
|||
songHorizontalAdapter = new SongHorizontalAdapter(activity, requireContext(), true);
|
||||
bind.songRecyclerView.setAdapter(songHorizontalAdapter);
|
||||
|
||||
playlistPageViewModel.getPlaylistSongLiveList().observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs));
|
||||
playlistPageViewModel.getPlaylistSongLiveList(requireActivity()).observe(requireActivity(), songs -> songHorizontalAdapter.setItems(songs));
|
||||
}
|
||||
}
|
||||
|
|
@ -140,9 +140,8 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements
|
|||
TextView removeAll = view.findViewById(R.id.remove_all_text_view);
|
||||
|
||||
albumBottomSheetViewModel.getAlbumTracks().observe(requireActivity(), songs -> {
|
||||
|
||||
downloadAll.setOnClickListener(v -> {
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(songs);
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(songs, null, null);
|
||||
dismissBottomSheet();
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -148,7 +148,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements
|
|||
|
||||
TextView download = view.findViewById(R.id.download_text_view);
|
||||
download.setOnClickListener(v -> {
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(Arrays.asList(song));
|
||||
DownloadUtil.getDownloadTracker(requireContext()).download(Arrays.asList(song), null, null);
|
||||
dismissBottomSheet();
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue