package com.kabouzeid.gramophone.adapter.song; import android.graphics.drawable.Drawable; import android.support.annotation.LayoutRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.util.Pair; import android.support.v7.app.AppCompatActivity; import android.view.LayoutInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; import com.afollestad.materialcab.MaterialCab; import com.bumptech.glide.Glide; import com.kabouzeid.appthemehelper.util.ColorUtil; import com.kabouzeid.appthemehelper.util.MaterialValueHelper; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.AbsMultiSelectAdapter; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.glide.PhonographColoredTarget; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import java.util.ArrayList; /** * @author Karim Abou Zeid (kabouzeid) */ public class SongAdapter extends AbsMultiSelectAdapter<SongAdapter.ViewHolder, Song> implements MaterialCab.Callback, FastScrollRecyclerView.SectionedAdapter { public static final String TAG = AlbumSongAdapter.class.getSimpleName(); protected final AppCompatActivity activity; protected ArrayList<Song> dataSet; protected int itemLayoutRes; protected boolean usePalette = false; public SongAdapter(AppCompatActivity activity, ArrayList<Song> dataSet, @LayoutRes int itemLayoutRes, boolean usePalette, @Nullable CabHolder cabHolder) { super(activity, cabHolder, R.menu.menu_media_selection); this.activity = activity; this.dataSet = dataSet; this.itemLayoutRes = itemLayoutRes; this.usePalette = usePalette; setHasStableIds(true); } public void swapDataSet(ArrayList<Song> dataSet) { this.dataSet = dataSet; notifyDataSetChanged(); } public void usePalette(boolean usePalette) { this.usePalette = usePalette; notifyDataSetChanged(); } public ArrayList<Song> getDataSet() { return dataSet; } @Override public long getItemId(int position) { return dataSet.get(position).id; } @NonNull @Override public ViewHolder onCreateViewHolder(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(getSongTitle(song)); } if (holder.text != null) { holder.text.setText(getSongText(song)); } loadAlbumCover(song, holder); } private 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 void loadAlbumCover(Song song, final ViewHolder holder) { if (holder.image == null) return; SongGlideRequest.Builder.from(Glide.with(activity), song) .checkIgnoreMediaStore(activity) .generatePalette(activity).build() .into(new PhonographColoredTarget(holder.image) { @Override public void onLoadCleared(Drawable placeholder) { super.onLoadCleared(placeholder); setColors(getDefaultFooterColor(), holder); } @Override public void onColorReady(int color) { if (usePalette) setColors(color, holder); else setColors(getDefaultFooterColor(), holder); } }); } protected String getSongTitle(Song song) { return song.title; } protected String getSongText(Song song) { return song.artistName; } @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) { return MusicUtil.getSectionName(dataSet.get(position).title); } 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.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() { return dataSet.get(getAdapterPosition()); } protected int getSongMenuRes() { return DEFAULT_MENU_RES; } protected boolean onSongMenuItemClick(MenuItem item) { if (image != null && image.getVisibility() == View.VISIBLE) { switch (item.getItemId()) { case 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()); } } }