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());
}
}
}