From 7576fbb75b258bf06c68729475e3ce333dc48a27 Mon Sep 17 00:00:00 2001 From: CappielloAntonio Date: Sun, 18 Apr 2021 20:23:09 +0200 Subject: [PATCH] Added song InstantMix --- .../play/adapter/DiscoverSongAdapter.java | 35 ++++++++++++++- .../com/cappielloantonio/play/model/Song.java | 3 ++ .../play/ui/fragment/HomeFragment.java | 2 +- .../ui/fragment/SongListPageFragment.java | 5 +++ .../AlbumBottomSheetDialog.java | 29 ++++++++++++- .../ArtistBottomSheetDialog.java | 28 +++++++++++- .../SongBottomSheetDialog.java | 32 +++++++++++++- .../cappielloantonio/play/util/SyncUtil.java | 43 ++++++++++++++++++- 8 files changed, 169 insertions(+), 8 deletions(-) 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 6ea59348..9ebe4e76 100644 --- a/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java +++ b/app/src/main/java/com/cappielloantonio/play/adapter/DiscoverSongAdapter.java @@ -1,6 +1,7 @@ package com.cappielloantonio.play.adapter; import android.content.Context; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -8,14 +9,22 @@ import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; +import androidx.lifecycle.ViewModelProvider; import androidx.recyclerview.widget.RecyclerView; import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; +import com.cappielloantonio.play.helper.MusicPlayerRemote; +import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; +import com.cappielloantonio.play.ui.activities.MainActivity; +import com.cappielloantonio.play.util.SyncUtil; +import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; +import java.util.ArrayList; import java.util.List; public class DiscoverSongAdapter extends RecyclerView.Adapter { @@ -24,8 +33,10 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter songs; private LayoutInflater inflater; private Context context; + private MainActivity activity; - public DiscoverSongAdapter(Context context, List songs) { + public DiscoverSongAdapter(MainActivity activity, Context context, List songs) { + this.activity = activity; this.context = context; this.inflater = LayoutInflater.from(context); this.songs = songs; @@ -72,7 +83,27 @@ public class DiscoverSongAdapter extends RecyclerView.Adapter media) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); + + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + + PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); + playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + + MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + } + }, SyncUtil.SONG, songs.get(getBindingAdapterPosition()).getId(), 50); } } 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 60b04f3c..be07e1ec 100644 --- a/app/src/main/java/com/cappielloantonio/play/model/Song.java +++ b/app/src/main/java/com/cappielloantonio/play/model/Song.java @@ -48,6 +48,9 @@ public class Song implements Parcelable { @Ignore public static final String IS_FAVORITE = "IS_FAVORITE"; + @Ignore + public static final String RADIO = "RADIO"; + /* * TODO: Da capire chi tra albumArtist e artistItems sono i compositori e suonatori dell'album, oppure le comparse * In teoria AlbumArtist sono i creatori, mentre ArtistItems le comparse 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 cf3935a9..fdf7d358 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 @@ -103,7 +103,7 @@ public class HomeFragment extends Fragment { private void initDiscoverSongSlideView() { bind.discoverSongViewPager.setOrientation(ViewPager2.ORIENTATION_HORIZONTAL); - discoverSongAdapter = new DiscoverSongAdapter(requireContext(), homeViewModel.getDiscoverSongList()); + discoverSongAdapter = new DiscoverSongAdapter(activity, requireContext(), homeViewModel.getDiscoverSongList()); bind.discoverSongViewPager.setAdapter(discoverSongAdapter); bind.discoverSongViewPager.setOffscreenPageLimit(3); setDiscoverSongSlideViewOffset(20, 16); 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 c7d49ed1..77e5ddbf 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 @@ -87,6 +87,11 @@ public class SongListPageFragment extends Fragment { songListPageViewModel.title = Song.IS_FAVORITE; bind.pageTitleLabel.setText("Favourite song"); } + else if(getArguments().getString(Song.RADIO) != null) { + songListPageViewModel.title = Song.IS_FAVORITE; + songListPageViewModel.year = getArguments().getInt("radio_object"); + bind.pageTitleLabel.setText("Radio"); + } } private void initSongListView() { diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index edd56a63..d9dd2f22 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -1,6 +1,7 @@ package com.cappielloantonio.play.ui.fragment.bottomsheetdialog; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -16,15 +17,19 @@ import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.helper.MusicPlayerRemote; +import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.ui.activities.MainActivity; +import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.AlbumBottomSheetViewModel; +import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import java.util.ArrayList; import java.util.List; public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { @@ -79,7 +84,29 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - Toast.makeText(requireContext(), "Play radio", Toast.LENGTH_SHORT).show(); + SyncUtil.getInstantMix(requireContext(), new MediaCallback() { + MainActivity activity = (MainActivity) requireActivity(); + + @Override + public void onError(Exception exception) { + Log.e(TAG, "onError: " + exception.getMessage()); + } + + @Override + public void onLoadMedia(List media) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); + + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + + PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); + playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + + MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + } + }, SyncUtil.SONG, album.getId(), 50); + dismissBottomSheet(); }); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java index 86bdc641..b3c9e129 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/ArtistBottomSheetDialog.java @@ -16,14 +16,18 @@ import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.helper.MusicPlayerRemote; +import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Artist; import com.cappielloantonio.play.model.Song; import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.repository.SongRepository; import com.cappielloantonio.play.ui.activities.MainActivity; +import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.ArtistBottomSheetViewModel; +import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import java.util.ArrayList; import java.util.List; public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { @@ -69,7 +73,29 @@ public class ArtistBottomSheetDialog extends BottomSheetDialogFragment implement playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - Toast.makeText(requireContext(), "Play radio", Toast.LENGTH_SHORT).show(); + SyncUtil.getInstantMix(requireContext(), new MediaCallback() { + MainActivity activity = (MainActivity) requireActivity(); + + @Override + public void onError(Exception exception) { + Log.e(TAG, "onError: " + exception.getMessage()); + } + + @Override + public void onLoadMedia(List media) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); + + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + + PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); + playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + + MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + } + }, SyncUtil.SONG, artist.getId(), 50); + dismissBottomSheet(); }); diff --git a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index 31226113..423c7ad6 100644 --- a/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/play/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -1,6 +1,7 @@ package com.cappielloantonio.play.ui.fragment.bottomsheetdialog; import android.os.Bundle; +import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -13,17 +14,24 @@ import androidx.annotation.Nullable; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.fragment.NavHostFragment; +import com.cappielloantonio.play.App; import com.cappielloantonio.play.R; import com.cappielloantonio.play.glide.CustomGlideRequest; import com.cappielloantonio.play.helper.MusicPlayerRemote; +import com.cappielloantonio.play.interfaces.MediaCallback; import com.cappielloantonio.play.model.Album; import com.cappielloantonio.play.model.Artist; +import com.cappielloantonio.play.model.PlaylistSongCross; import com.cappielloantonio.play.model.Song; +import com.cappielloantonio.play.repository.QueueRepository; import com.cappielloantonio.play.ui.activities.MainActivity; +import com.cappielloantonio.play.util.SyncUtil; import com.cappielloantonio.play.viewmodel.PlayerBottomSheetViewModel; import com.cappielloantonio.play.viewmodel.SongBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { @@ -83,7 +91,29 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements playRadio = view.findViewById(R.id.play_radio_text_view); playRadio.setOnClickListener(v -> { - Toast.makeText(requireContext(), "Play radio", Toast.LENGTH_SHORT).show(); + SyncUtil.getInstantMix(requireContext(), new MediaCallback() { + MainActivity activity = (MainActivity) requireActivity(); + + @Override + public void onError(Exception exception) { + Log.e(TAG, "onError: " + exception.getMessage()); + } + + @Override + public void onLoadMedia(List media) { + QueueRepository queueRepository = new QueueRepository(App.getInstance()); + queueRepository.insertAllAndStartNew((ArrayList) media); + + activity.isBottomSheetInPeek(true); + activity.setBottomSheetMusicInfo(((ArrayList) media).get(0)); + + PlayerBottomSheetViewModel playerBottomSheetViewModel = new ViewModelProvider(activity).get(PlayerBottomSheetViewModel.class); + playerBottomSheetViewModel.setNowPlayingSong(((ArrayList) media).get(0)); + + MusicPlayerRemote.openQueue((ArrayList) media, 0, true); + } + }, SyncUtil.SONG, song.getId(), 50); + dismissBottomSheet(); }); diff --git a/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java b/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java index df1194bf..0073613d 100644 --- a/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java +++ b/app/src/main/java/com/cappielloantonio/play/util/SyncUtil.java @@ -2,7 +2,6 @@ package com.cappielloantonio.play.util; import android.content.Context; import android.os.Bundle; -import android.util.Log; import com.cappielloantonio.play.App; import com.cappielloantonio.play.interfaces.MediaCallback; @@ -16,12 +15,14 @@ import com.cappielloantonio.play.model.SongGenreCross; import org.jellyfin.apiclient.interaction.Response; import org.jellyfin.apiclient.model.dto.BaseItemDto; +import org.jellyfin.apiclient.model.dto.BaseItemType; import org.jellyfin.apiclient.model.querying.ArtistsQuery; import org.jellyfin.apiclient.model.querying.ItemFields; import org.jellyfin.apiclient.model.querying.ItemQuery; import org.jellyfin.apiclient.model.querying.ItemsByNameQuery; import org.jellyfin.apiclient.model.querying.ItemsResult; import org.jellyfin.apiclient.model.playlists.PlaylistItemQuery; +import org.jellyfin.apiclient.model.querying.SimilarItemsQuery; import java.util.ArrayList; import java.util.Arrays; @@ -31,6 +32,10 @@ import java.util.Map; public class SyncUtil { private static final String TAG = "SyncUtil"; + public static final String SONG = "song"; + public static final String ALBUM = "album"; + public static final String ARTIST = "artist"; + public static void getLibraries(Context context, MediaCallback callback) { String id = App.getApiClientInstance(context).getCurrentUserId(); @@ -216,7 +221,6 @@ public class SyncUtil { query.setId(playlistId); query.setUserId(App.getApiClientInstance(context).getCurrentUserId()); query.setFields(new ItemFields[]{ItemFields.MediaSources}); - query.setUserId(App.getApiClientInstance(context).getCurrentUserId()); App.getApiClientInstance(context).GetPlaylistItems(query, new Response() { @@ -238,6 +242,41 @@ public class SyncUtil { }); } + public static void getInstantMix(Context context, MediaCallback callback, String resultType, String itemID, int limit) { + SimilarItemsQuery query = new SimilarItemsQuery(); + + query.setId(itemID); + query.setUserId(App.getApiClientInstance(context).getCurrentUserId()); + query.setFields(new ItemFields[]{ItemFields.MediaSources}); + query.setLimit(limit); + + App.getApiClientInstance(context).GetInstantMixFromItem(query, new Response() { + @Override + public void onResponse(ItemsResult result) { + List items = new ArrayList<>(); + + for (BaseItemDto itemDto : result.getItems()) { + if (resultType.equals(ARTIST) && itemDto.getBaseItemType() == BaseItemType.MusicArtist) { + items.add(new Artist(itemDto)); + } + else if (resultType.equals(ALBUM) && itemDto.getBaseItemType() == BaseItemType.MusicAlbum) { + items.add(new Album(itemDto)); + } + else if (resultType.equals(SONG) && itemDto.getBaseItemType() == BaseItemType.Audio) { + items.add(new Song(itemDto)); + } + } + + callback.onLoadMedia(items); + } + + @Override + public void onError(Exception exception) { + callback.onError(exception); + } + }); + } + public static Bundle getSyncBundle(Boolean syncAlbum, Boolean syncArtist, Boolean syncGenres, Boolean syncPlaylist, Boolean syncSong, Boolean crossSyncSongGenre) { Bundle bundle = new Bundle(); bundle.putBoolean("sync_album", syncAlbum);