package com.poupa.vinylmusicplayer.adapter.song; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import androidx.annotation.LayoutRes; import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.appcompat.app.AppCompatActivity; import androidx.core.util.Pair; import androidx.recyclerview.widget.RecyclerView; import com.afollestad.materialcab.MaterialCab; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.poupa.vinylmusicplayer.R; import com.poupa.vinylmusicplayer.adapter.base.AbsMultiSelectAdapter; import com.poupa.vinylmusicplayer.adapter.base.MediaEntryViewHolder; import com.poupa.vinylmusicplayer.helper.MusicPlayerRemote; import com.poupa.vinylmusicplayer.helper.SortOrder; import com.poupa.vinylmusicplayer.helper.menu.SongMenuHelper; import com.poupa.vinylmusicplayer.helper.menu.SongsMenuHelper; import com.poupa.vinylmusicplayer.interfaces.CabHolder; import com.poupa.vinylmusicplayer.model.Song; import com.poupa.vinylmusicplayer.util.MusicUtil; import com.poupa.vinylmusicplayer.util.NavigationUtil; import com.poupa.vinylmusicplayer.util.PlayingSongDecorationUtil; import com.poupa.vinylmusicplayer.util.PreferenceUtil; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import java.text.DateFormat; import java.util.ArrayList; import java.util.Date; /** * @author Karim Abou Zeid (kabouzeid) */ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song> implements MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter { protected final AppCompatActivity activity; protected ArrayList<Song> dataSet; protected int itemLayoutRes; protected boolean usePalette = false; protected boolean showSectionName = true; protected boolean showAlbumImage = true; public RecyclerView recyclerView; public SongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { this(activity, dataSet, itemLayoutRes, usePalette, cabHolder, true); } public SongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder, boolean showSectionName) { super(activity, cabHolder, R.menu.menu_media_selection); this.activity = activity; this.dataSet = dataSet; this.itemLayoutRes = itemLayoutRes; this.usePalette = usePalette; this.showSectionName = showSectionName; setHasStableIds(true); } @Override public void onAttachedToRecyclerView(RecyclerView rV) { super.onAttachedToRecyclerView(rV); recyclerView = rV; } public void swapDataSet(ArrayList<Song> dataSet) { this.dataSet = dataSet; notifyDataSetChanged(); } public boolean isUsePalette() { return this.usePalette; } public void usePalette(boolean usePalette) { this.usePalette = usePalette; notifyDataSetChanged(); } public boolean isShowAlbumImage() { return this.showAlbumImage; } public ArrayList<Song> getDataSet() { return dataSet; } @Override public long getItemId(int position) { return dataSet.get(position).id; } @Override @NonNull public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(activity).inflate(itemLayoutRes, parent, false); return createViewHolder(view); } protected ViewHolder createViewHolder(View view) { return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { final Song song = dataSet.get(position); boolean isChecked = isChecked(song); holder.itemView.setActivated(isChecked); if (holder.getAdapterPosition() == getItemCount() - 1) { if (holder.shortSeparator != null) { holder.shortSeparator.setVisibility(View.GONE); } } else { if (holder.shortSeparator != null) { holder.shortSeparator.setVisibility(View.VISIBLE); } } if (holder.title != null) { holder.title.setText(song.title); } if (holder.text != null) { holder.text.setText(getSongText(song)); } PlayingSongDecorationUtil.decorate(this, holder, song, activity); } public void setColors(int color, ViewHolder holder) { if (holder.paletteColorContainer != null) { holder.paletteColorContainer.setBackgroundColor(color); if (holder.title != null) { holder.title.setTextColor(MaterialValueHelper.getPrimaryTextColor(activity, ColorUtil.isColorLight(color))); } if (holder.text != null) { holder.text.setTextColor(MaterialValueHelper.getSecondaryTextColor(activity, ColorUtil.isColorLight(color))); } } } protected String getSongText(Song song) { return MusicUtil.getSongInfoString(song); } @Override public int getItemCount() { return dataSet.size(); } @Override protected Song getIdentifier(int position) { return dataSet.get(position); } @Override protected String getName(Song song) { return song.title; } @Override protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList<Song> selection) { SongsMenuHelper.handleMenuClick(activity, selection, menuItem.getItemId()); } @NonNull @Override public String getSectionName(int position) { if (!showSectionName) { return ""; } @Nullable String sectionName = null; switch (PreferenceUtil.getInstance().getSongSortOrder()) { case SortOrder.SongSortOrder.SONG_A_Z: case SortOrder.SongSortOrder.SONG_Z_A: sectionName = dataSet.get(position).title; break; case SortOrder.SongSortOrder.SONG_ALBUM: sectionName = dataSet.get(position).albumName; break; case SortOrder.SongSortOrder.SONG_ARTIST: sectionName = dataSet.get(position).artistName; break; case SortOrder.SongSortOrder.SONG_DATE_ADDED: Date date = new Date(dataSet.get(position).dateAdded); DateFormat dateFormat = android.text.format.DateFormat.getDateFormat(activity); sectionName = dateFormat.format(date); break; case SortOrder.SongSortOrder.SONG_YEAR: return MusicUtil.getYearString(dataSet.get(position).year); } return MusicUtil.getSectionName(sectionName); } public class ViewHolder extends MediaEntryViewHolder { protected int DEFAULT_MENU_RES = SongMenuHelper.MENU_RES; public ViewHolder(@NonNull View itemView) { super(itemView); setImageTransitionName(activity.getString(R.string.transition_album_art)); if (menu == null) { return; } menu.setOnTouchListener((v, ev) -> { menu.getParent().requestDisallowInterceptTouchEvent(true); return false; }); menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) { @Override public Song getSong() { return ViewHolder.this.getSong(); } @Override public int getMenuRes() { return getSongMenuRes(); } @Override public boolean onMenuItemClick(MenuItem item) { return onSongMenuItemClick(item) || super.onMenuItemClick(item); } }); } protected Song getSong() { final int position = getAdapterPosition(); if (position < 0 || position >= dataSet.size()) {return Song.EMPTY_SONG;} return dataSet.get(getAdapterPosition()); } protected int getSongMenuRes() { return DEFAULT_MENU_RES; } protected boolean onSongMenuItemClick(MenuItem item) { if ((image != null) && (image.getVisibility() == View.VISIBLE) && (item.getItemId() == R.id.action_go_to_album)) { Pair[] albumPairs = new Pair[]{ Pair.create(image, activity.getResources().getString(R.string.transition_album_art)) }; NavigationUtil.goToAlbum(activity, getSong().albumId, albumPairs); return true; } return false; } @Override public void onClick(View v) { if (isInQuickSelectMode()) { toggleChecked(getAdapterPosition()); } else { MusicPlayerRemote.openQueue(dataSet, getAdapterPosition(), true); } } @Override public boolean onLongClick(View view) { return toggleChecked(getAdapterPosition()); } } }