package com.marverenic.music.adapter; import android.view.LayoutInflater; import android.view.ViewGroup; import com.marverenic.adapter.EnhancedViewHolder; import com.marverenic.adapter.HeterogeneousAdapter; import com.marverenic.music.databinding.InstanceSongQueueBinding; import com.marverenic.music.fragments.BaseFragment; import com.marverenic.music.model.Song; import com.marverenic.music.player.PlayerController; import com.marverenic.music.viewmodel.QueueSongViewModel; import java.util.List; import timber.log.Timber; public class QueueSection extends EditableSongSection { private BaseFragment mFragment; private PlayerController mPlayerController; public QueueSection(BaseFragment fragment, PlayerController playerController, List<Song> data) { super(data); mFragment = fragment; mPlayerController = playerController; } @Override protected void onDrop(int from, int to) { if (from == to) return; // Calculate where the current song index is moving to mPlayerController.getQueuePosition().take(1).subscribe(nowPlayingIndex -> { int futureNowPlayingIndex; if (from == nowPlayingIndex) { futureNowPlayingIndex = to; } else if (from < nowPlayingIndex && to >= nowPlayingIndex) { futureNowPlayingIndex = nowPlayingIndex - 1; } else if (from > nowPlayingIndex && to <= nowPlayingIndex) { futureNowPlayingIndex = nowPlayingIndex + 1; } else { futureNowPlayingIndex = nowPlayingIndex; } // Push the change to the service mPlayerController.editQueue(mData, futureNowPlayingIndex); }, throwable -> { Timber.e(throwable, "Failed to drop queue item"); }); } @Override public EnhancedViewHolder<Song> createViewHolder(HeterogeneousAdapter adapter, ViewGroup parent) { InstanceSongQueueBinding binding = InstanceSongQueueBinding.inflate( LayoutInflater.from(parent.getContext()), parent, false); return new ViewHolder(binding, getData(), adapter); } public class ViewHolder extends EnhancedViewHolder<Song> { private InstanceSongQueueBinding mBinding; public ViewHolder(InstanceSongQueueBinding binding, List<Song> songList, HeterogeneousAdapter adapter) { super(binding.getRoot()); mBinding = binding; binding.setViewModel(new QueueSongViewModel(mFragment, songList, adapter::notifyDataSetChanged)); } @Override public void onUpdate(Song s, int sectionPosition) { mBinding.getViewModel().setSong(getData(), sectionPosition); } } }