implemented the playlist management logic

This commit is contained in:
CappielloAntonio 2021-08-12 17:33:19 +02:00
parent d2092f5239
commit 4adde9e951
13 changed files with 448 additions and 27 deletions

View file

@ -7,14 +7,21 @@ import android.os.Bundle;
import android.text.TextUtils;
import android.view.LayoutInflater;
import androidx.annotation.NonNull;
import androidx.fragment.app.DialogFragment;
import androidx.lifecycle.ViewModelProvider;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.cappielloantonio.play.R;
import com.cappielloantonio.play.adapter.PlaylistDialogSongHorizontalAdapter;
import com.cappielloantonio.play.databinding.DialogPlaylistEditorBinding;
import com.cappielloantonio.play.ui.activity.MainActivity;
import com.cappielloantonio.play.util.MusicUtil;
import com.cappielloantonio.play.viewmodel.PlaylistEditorViewModel;
import java.util.Collections;
import java.util.Objects;
public class PlaylistEditorDialog extends DialogFragment {
@ -26,6 +33,7 @@ public class PlaylistEditorDialog extends DialogFragment {
private PlaylistEditorViewModel playlistEditorViewModel;
private String playlistName;
private PlaylistDialogSongHorizontalAdapter playlistDialogSongHorizontalAdapter;
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
@ -41,6 +49,7 @@ public class PlaylistEditorDialog extends DialogFragment {
.setTitle("Create playlist")
.setPositiveButton("Save", (dialog, id) -> {
})
.setNeutralButton("Delete", (dialog, id) -> dialog.cancel())
.setNegativeButton("Cancel", (dialog, id) -> dialog.cancel());
return builder.create();
@ -50,15 +59,28 @@ public class PlaylistEditorDialog extends DialogFragment {
public void onStart() {
super.onStart();
setSongInfo();
setParameterInfo();
setButtonAction();
initSongsView();
}
private void setSongInfo() {
private void setParameterInfo() {
if (getArguments() != null) {
playlistEditorViewModel.setSongToAdd(getArguments().getParcelable("song_object"));
if (getArguments().getParcelable("song_object") != null) {
playlistEditorViewModel.setSongToAdd(getArguments().getParcelable("song_object"));
playlistEditorViewModel.setPlaylistToEdit(null);
}
else if (getArguments().getParcelable("playlist_object") != null) {
playlistEditorViewModel.setSongToAdd(null);
playlistEditorViewModel.setPlaylistToEdit(getArguments().getParcelable("playlist_object"));
if (playlistEditorViewModel.getPlaylistToEdit() != null) {
bind.playlistNameTextView.setText(MusicUtil.getReadableString(playlistEditorViewModel.getPlaylistToEdit().getName()));
}
}
} else {
playlistEditorViewModel.setSongToAdd(null);
playlistEditorViewModel.setPlaylistToEdit(null);
}
}
@ -69,10 +91,74 @@ public class PlaylistEditorDialog extends DialogFragment {
((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(v -> {
if (validateInput()) {
playlistEditorViewModel.createPlaylist(playlistName);
if (playlistEditorViewModel.getSongToAdd() != null) {
playlistEditorViewModel.createPlaylist(playlistName);
} else if (playlistEditorViewModel.getPlaylistToEdit() != null) {
playlistEditorViewModel.updatePlaylist(playlistName);
}
Objects.requireNonNull(getDialog()).dismiss();
}
});
((AlertDialog) Objects.requireNonNull(getDialog())).getButton(AlertDialog.BUTTON_NEUTRAL).setOnClickListener(v -> {
playlistEditorViewModel.deletePlaylist();
Objects.requireNonNull(getDialog()).dismiss();
});
}
private void initSongsView() {
bind.playlistSongRecyclerView.setLayoutManager(new LinearLayoutManager(requireContext()));
bind.playlistSongRecyclerView.setHasFixedSize(true);
playlistDialogSongHorizontalAdapter = new PlaylistDialogSongHorizontalAdapter(activity, requireContext(), getChildFragmentManager());
bind.playlistSongRecyclerView.setAdapter(playlistDialogSongHorizontalAdapter);
playlistEditorViewModel.getPlaylistSongLiveList().observe(requireActivity(), songs -> {
playlistDialogSongHorizontalAdapter.setItems(songs);
});
new ItemTouchHelper(new ItemTouchHelper.SimpleCallback(ItemTouchHelper.UP | ItemTouchHelper.DOWN, ItemTouchHelper.LEFT) {
int originalPosition = -1;
int fromPosition = -1;
int toPosition = -1;
@Override
public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
if (originalPosition == -1)
originalPosition = viewHolder.getBindingAdapterPosition();
fromPosition = viewHolder.getBindingAdapterPosition();
toPosition = target.getBindingAdapterPosition();
Collections.swap(playlistDialogSongHorizontalAdapter.getItems(), fromPosition, toPosition);
recyclerView.getAdapter().notifyItemMoved(fromPosition, toPosition);
return false;
}
@Override
public void clearView(@NonNull RecyclerView recyclerView, @NonNull RecyclerView.ViewHolder viewHolder) {
super.clearView(recyclerView, viewHolder);
/*
* Qui vado a riscivere tutta la table Queue, quando teoricamente potrei solo swappare l'ordine degli elementi interessati
* Nel caso la coda contenesse parecchi brani, potrebbero verificarsi rallentamenti pesanti
*/
playlistEditorViewModel.orderPlaylistSongLiveListAfterSwap(playlistDialogSongHorizontalAdapter.getItems());
originalPosition = -1;
fromPosition = -1;
toPosition = -1;
}
@Override
public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
playlistEditorViewModel.removeFromPlaylistSongLiveList(playlistDialogSongHorizontalAdapter.getItem(viewHolder.getBindingAdapterPosition()));
bind.playlistSongRecyclerView.getAdapter().notifyItemRemoved(viewHolder.getBindingAdapterPosition());
}
}
).attachToRecyclerView(bind.playlistSongRecyclerView);
}
private boolean validateInput() {