diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java index f0266c84..5c0b119c 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistChooserDialog.java @@ -57,14 +57,14 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba } private void setSongInfo() { - playlistChooserViewModel.setSongToAdd(requireArguments().getParcelable(Constants.TRACK_OBJECT)); + playlistChooserViewModel.setSongsToAdd(requireArguments().getParcelableArrayList(Constants.TRACKS_OBJECT)); } private void setButtonAction() { androidx.appcompat.app.AlertDialog alertDialog = (androidx.appcompat.app.AlertDialog) Objects.requireNonNull(getDialog()); alertDialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v -> { Bundle bundle = new Bundle(); - bundle.putParcelable(Constants.TRACK_OBJECT, playlistChooserViewModel.getSongToAdd()); + bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, playlistChooserViewModel.getSongsToAdd()); PlaylistEditorDialog dialog = new PlaylistEditorDialog(null); dialog.setArguments(bundle); @@ -98,7 +98,7 @@ public class PlaylistChooserDialog extends DialogFragment implements ClickCallba @Override public void onPlaylistClick(Bundle bundle) { Playlist playlist = bundle.getParcelable(Constants.PLAYLIST_OBJECT); - playlistChooserViewModel.addSongToPlaylist(playlist.getId()); + playlistChooserViewModel.addSongsToPlaylist(playlist.getId()); dismiss(); } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistEditorDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistEditorDialog.java index 4d265beb..dea70d7d 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistEditorDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/dialog/PlaylistEditorDialog.java @@ -74,11 +74,11 @@ public class PlaylistEditorDialog extends DialogFragment { } private void setParameterInfo() { - if (requireArguments().getParcelable(Constants.TRACK_OBJECT) != null) { - playlistEditorViewModel.setSongToAdd(requireArguments().getParcelable(Constants.TRACK_OBJECT)); + if (requireArguments().getParcelableArrayList(Constants.TRACKS_OBJECT) != null) { + playlistEditorViewModel.setSongsToAdd(requireArguments().getParcelableArrayList(Constants.TRACKS_OBJECT)); playlistEditorViewModel.setPlaylistToEdit(null); } else if (requireArguments().getParcelable(Constants.PLAYLIST_OBJECT) != null) { - playlistEditorViewModel.setSongToAdd(null); + playlistEditorViewModel.setSongsToAdd(null); playlistEditorViewModel.setPlaylistToEdit(requireArguments().getParcelable(Constants.PLAYLIST_OBJECT)); if (playlistEditorViewModel.getPlaylistToEdit() != null) { @@ -92,7 +92,7 @@ public class PlaylistEditorDialog extends DialogFragment { alertDialog.getButton(androidx.appcompat.app.AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> { if (validateInput()) { - if (playlistEditorViewModel.getSongToAdd() != null) { + if (playlistEditorViewModel.getSongsToAdd() != null) { playlistEditorViewModel.createPlaylist(playlistName); } else if (playlistEditorViewModel.getPlaylistToEdit() != null) { playlistEditorViewModel.updatePlaylist(playlistName); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java index 8162b16b..f830888e 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/AlbumPageFragment.java @@ -31,6 +31,7 @@ import com.cappielloantonio.tempo.service.MediaManager; import com.cappielloantonio.tempo.service.MediaService; import com.cappielloantonio.tempo.ui.activity.MainActivity; import com.cappielloantonio.tempo.ui.adapter.SongHorizontalAdapter; +import com.cappielloantonio.tempo.ui.dialog.PlaylistChooserDialog; import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; @@ -38,6 +39,7 @@ import com.cappielloantonio.tempo.util.MusicUtil; import com.cappielloantonio.tempo.viewmodel.AlbumPageViewModel; import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; import java.util.Collections; import java.util.Objects; import java.util.stream.Collectors; @@ -108,6 +110,17 @@ public class AlbumPageFragment extends Fragment implements ClickCallback { }); return true; } + if (item.getItemId() == R.id.action_add_to_playlist) { + albumPageViewModel.getAlbumSongLiveList().observe(getViewLifecycleOwner(), songs -> { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(songs)); + + PlaylistChooserDialog dialog = new PlaylistChooserDialog(); + dialog.setArguments(bundle); + dialog.show(requireActivity().getSupportFragmentManager(), null); + }); + return true; + } return false; } diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java index a498f473..cfcefe9d 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/AlbumBottomSheetDialog.java @@ -31,6 +31,7 @@ import com.cappielloantonio.tempo.service.MediaService; import com.cappielloantonio.tempo.subsonic.models.AlbumID3; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.ui.activity.MainActivity; +import com.cappielloantonio.tempo.ui.dialog.PlaylistChooserDialog; import com.cappielloantonio.tempo.util.Constants; import com.cappielloantonio.tempo.util.DownloadUtil; import com.cappielloantonio.tempo.util.MappingUtil; @@ -167,6 +168,20 @@ public class AlbumBottomSheetDialog extends BottomSheetDialogFragment implements }); }); + TextView addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view); + addToPlaylist.setOnClickListener(v -> { + albumBottomSheetViewModel.getAlbumTracks().observe(getViewLifecycleOwner(), songs -> { + Bundle bundle = new Bundle(); + bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(songs)); + + PlaylistChooserDialog dialog = new PlaylistChooserDialog(); + dialog.setArguments(bundle); + dialog.show(requireActivity().getSupportFragmentManager(), null); + + dismissBottomSheet(); + }); + }); + TextView removeAll = view.findViewById(R.id.remove_all_text_view); albumBottomSheetViewModel.getAlbumTracks().observe(getViewLifecycleOwner(), songs -> { List mediaItems = MappingUtil.mapDownloads(songs); diff --git a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java index b22830eb..0d15ad2f 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java +++ b/app/src/main/java/com/cappielloantonio/tempo/ui/fragment/bottomsheetdialog/SongBottomSheetDialog.java @@ -39,6 +39,9 @@ import com.cappielloantonio.tempo.viewmodel.SongBottomSheetViewModel; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; import com.google.common.util.concurrent.ListenableFuture; +import java.util.ArrayList; +import java.util.Collections; + @UnstableApi public class SongBottomSheetDialog extends BottomSheetDialogFragment implements View.OnClickListener { private HomeViewModel homeViewModel; @@ -177,7 +180,7 @@ public class SongBottomSheetDialog extends BottomSheetDialogFragment implements TextView addToPlaylist = view.findViewById(R.id.add_to_playlist_text_view); addToPlaylist.setOnClickListener(v -> { Bundle bundle = new Bundle(); - bundle.putParcelable(Constants.TRACK_OBJECT, song); + bundle.putParcelableArrayList(Constants.TRACKS_OBJECT, new ArrayList<>(Collections.singletonList(song))); PlaylistChooserDialog dialog = new PlaylistChooserDialog(); dialog.setArguments(bundle); diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java index cb8833fe..fdee85c6 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistChooserViewModel.java @@ -11,6 +11,7 @@ import androidx.lifecycle.MutableLiveData; import com.cappielloantonio.tempo.repository.PlaylistRepository; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.subsonic.models.Playlist; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collections; @@ -20,7 +21,7 @@ public class PlaylistChooserViewModel extends AndroidViewModel { private final PlaylistRepository playlistRepository; private final MutableLiveData> playlists = new MutableLiveData<>(null); - private Child toAdd; + private ArrayList toAdd; public PlaylistChooserViewModel(@NonNull Application application) { super(application); @@ -33,15 +34,15 @@ public class PlaylistChooserViewModel extends AndroidViewModel { return playlists; } - public void addSongToPlaylist(String playlistId) { - playlistRepository.addSongToPlaylist(playlistId, new ArrayList(Collections.singletonList(toAdd.getId()))); + public void addSongsToPlaylist(String playlistId) { + playlistRepository.addSongToPlaylist(playlistId, new ArrayList<>(Lists.transform(toAdd, Child::getId))); } - public void setSongToAdd(Child song) { - toAdd = song; + public void setSongsToAdd(ArrayList songs) { + toAdd = songs; } - public Child getSongToAdd() { + public ArrayList getSongsToAdd() { return toAdd; } } diff --git a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistEditorViewModel.java b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistEditorViewModel.java index 8f9181a0..aceedb95 100644 --- a/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistEditorViewModel.java +++ b/app/src/main/java/com/cappielloantonio/tempo/viewmodel/PlaylistEditorViewModel.java @@ -12,6 +12,7 @@ import com.cappielloantonio.tempo.repository.SharingRepository; import com.cappielloantonio.tempo.subsonic.models.Child; import com.cappielloantonio.tempo.subsonic.models.Playlist; import com.cappielloantonio.tempo.subsonic.models.Share; +import com.google.common.collect.Lists; import java.util.ArrayList; import java.util.Collections; @@ -24,7 +25,7 @@ public class PlaylistEditorViewModel extends AndroidViewModel { private final PlaylistRepository playlistRepository; private final SharingRepository sharingRepository; - private Child toAdd; + private ArrayList toAdd; private Playlist toEdit; private MutableLiveData> songLiveList = new MutableLiveData<>(); @@ -37,7 +38,7 @@ public class PlaylistEditorViewModel extends AndroidViewModel { } public void createPlaylist(String name) { - playlistRepository.createPlaylist(null, name, new ArrayList(Collections.singletonList(toAdd.getId()))); + playlistRepository.createPlaylist(null, name, new ArrayList(Lists.transform(toAdd, Child::getId))); } public void updatePlaylist(String name) { @@ -48,12 +49,12 @@ public class PlaylistEditorViewModel extends AndroidViewModel { if (toEdit != null) playlistRepository.deletePlaylist(toEdit.getId()); } - public Child getSongToAdd() { - return toAdd; + public void setSongsToAdd(ArrayList songs) { + toAdd = songs; } - public void setSongToAdd(Child song) { - this.toAdd = song; + public ArrayList getSongsToAdd() { + return toAdd; } public Playlist getPlaylistToEdit() { diff --git a/app/src/main/res/layout/bottom_sheet_album_dialog.xml b/app/src/main/res/layout/bottom_sheet_album_dialog.xml index a6ed37a5..b37a5f90 100644 --- a/app/src/main/res/layout/bottom_sheet_album_dialog.xml +++ b/app/src/main/res/layout/bottom_sheet_album_dialog.xml @@ -146,6 +146,19 @@ android:paddingBottom="12dp" android:text="@string/album_bottom_sheet_download_all" /> + + + \ No newline at end of file diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index a2b89f17..abf40990 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -3,6 +3,7 @@ Bitte deaktiviere die Batterieoptimierung, damit die Medienwiedergabe bei ausgeschaltetem Bildschirm richtig funktioniert. Batterie Optimierung Offlinebetrieb + Zu Playliste hinzufügen Zur Warteschlange hinzufügen Alle herunterladen Gehe zu Künstler @@ -154,6 +155,7 @@ Subsonic Server Cast Hinzufügen + Zu Playliste hinzufügen Alle Herunterladen Downloads Alle diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 03a2f0db..d62bd653 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -3,6 +3,7 @@ Veuillez désactiver les optimisations de la batterie pour permettre la lecture des médias lorsque l\'écran est éteint. Optimisations de la batterie Mode hors-ligne + Ajouter à une playlist Ajouter à la file d\'attente Télécharger tout Aller à l\'artiste @@ -133,6 +134,7 @@ Serveurs Subsonic Cast Ajouter + Ajouter à une playlist Télécharger tout Téléchargé Tout diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 493161b7..08c9b31e 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -3,7 +3,8 @@ Per favore, disabilita le ottimizzazioni della batteria per la riproduzione multimediale quando lo schermo è spento. Ottimizzazioni della Batteria Modalità offline - Aggiungi alla coda + Aggiungi alla playlist + Aggiungi alla coda Scarica tutto Vai all\'artista Mix istantaneo @@ -156,7 +157,8 @@ Server Subsonic Trasmetti Aggiungi - Scarica tutto + Aggiungi alla playlist + Scarica tutto Scarica Tutti Scaricati diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 59e5e39a..d9d26d7e 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -3,6 +3,7 @@ 화면이 꺼진 상태에서 음악 재생을 하기 위해서는 배터리 최적화를 비활성화 해주세요. 배터리 최적화 오프라인 모드 + 플레이리스트에 추가 재생목록에 추가 모두 다운로드 아티스트로 이동 @@ -135,6 +136,7 @@ Subsonic 서버 Cast 추가 + 플레이리스트에 추가 모두 다운로드 다운로드 모두 diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 223093d8..12680a11 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -3,6 +3,7 @@ Por favor, desative as otimizações de bateria para a reprodução de mídia enquanto a tela estiver desligada. Otimizações de bateria Modo offline + Adicionar a uma playlist Adicionar à fila Baixar todos Ir para o(a) artista @@ -134,6 +135,7 @@ Servidores Subsonic Transmitir Adicionar + Adicionar a uma playlist Baixar todos Download Todos diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 259036f4..5c2a4a45 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -3,6 +3,7 @@ Пожалуйста, отключите оптимизацию батареи для воспроизведения мультимедиа при выключенном экране. Оптимизация батареи Офлайн-режим + Добавить в плейлист Добавить в очередь Скачать все Перейти к исполнителю @@ -153,6 +154,7 @@ Subsonic серверы Cast Добавить + Добавить в плейлист Скачать все Скачать Все diff --git a/app/src/main/res/values-zh/strings.xml b/app/src/main/res/values-zh/strings.xml index 4564147b..9ffd6877 100644 --- a/app/src/main/res/values-zh/strings.xml +++ b/app/src/main/res/values-zh/strings.xml @@ -3,6 +3,7 @@ 请禁用针对媒体锁屏播放的电池优化。 电池优化 离线模式 + 添加到播放列表 添加到队列 全部下载 查看该艺术家 @@ -137,6 +138,7 @@ Subsonic 服务器 投送 添加 + 添加到播放列表 全部下载 下载 全部 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3db80974..78f6b382 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -3,6 +3,7 @@ Please disable battery optimizations for media playback while the screen is off. Battery Optimizations Offline mode + Add to playlist Add to queue Download all Go to artist @@ -158,6 +159,7 @@ Subsonic servers Cast Add + Add to playlist Download all Download All