package com.kabouzeid.gramophone.adapter.artist; 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.bumptech.glide.Glide; import com.bumptech.glide.Priority; import com.bumptech.glide.load.engine.DiskCacheStrategy; import com.bumptech.glide.request.target.Target; 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.artistimage.ArtistImage; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteTranscoder; import com.kabouzeid.gramophone.glide.palette.BitmapPaletteWrapper; import com.kabouzeid.gramophone.helper.menu.SongsMenuHelper; import com.kabouzeid.gramophone.interfaces.CabHolder; import com.kabouzeid.gramophone.model.Artist; import com.kabouzeid.gramophone.model.Song; import com.kabouzeid.gramophone.util.ArtistSignatureUtil; import com.kabouzeid.gramophone.util.MusicUtil; import com.kabouzeid.gramophone.util.NavigationUtil; import com.simplecityapps.recyclerview_fastscroll.views.FastScrollRecyclerView; import java.util.ArrayList; import java.util.List; /** * @author Karim Abou Zeid (kabouzeid) */ public class ArtistAdapter extends AbsMultiSelectAdapter<ArtistAdapter.ViewHolder, Artist> implements FastScrollRecyclerView.SectionedAdapter { protected final AppCompatActivity activity; protected ArrayList<Artist> dataSet; protected int itemLayoutRes; protected boolean usePalette = false; public ArtistAdapter(@NonNull AppCompatActivity activity, ArrayList<Artist> 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<Artist> dataSet) { this.dataSet = dataSet; notifyDataSetChanged(); } public ArrayList<Artist> getDataSet() { return dataSet; } public void usePalette(boolean usePalette) { this.usePalette = usePalette; notifyDataSetChanged(); } @Override public long getItemId(int position) { return dataSet.get(position).getId(); } @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 Artist artist = dataSet.get(position); boolean isChecked = isChecked(artist); 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(artist.getName()); } if (holder.text != null) { holder.text.setText(MusicUtil.getArtistInfoString(activity, artist)); } holder.itemView.setActivated(isChecked(artist)); loadArtistImage(artist, 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 loadArtistImage(Artist artist, final ViewHolder holder) { if (holder.image == null) return; Glide.with(activity) .load(new ArtistImage(artist.getName(), false)) .asBitmap() .transcode(new BitmapPaletteTranscoder(activity), BitmapPaletteWrapper.class) .diskCacheStrategy(DiskCacheStrategy.SOURCE) .placeholder(R.drawable.default_artist_image) .animate(android.R.anim.fade_in) .priority(Priority.LOW) .signature(ArtistSignatureUtil.getInstance(activity).getArtistSignature(artist.getName())) .override(Target.SIZE_ORIGINAL, Target.SIZE_ORIGINAL) .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); } }); } @Override public int getItemCount() { return dataSet.size(); } @Override protected Artist getIdentifier(int position) { return dataSet.get(position); } @Override protected String getName(Artist artist) { return artist.getName(); } @Override protected void onMultipleItemAction(@NonNull MenuItem menuItem, @NonNull ArrayList<Artist> selection) { SongsMenuHelper.handleMenuClick(activity, getSongList(selection), menuItem.getItemId()); } @NonNull private ArrayList<Song> getSongList(@NonNull List<Artist> artists) { final ArrayList<Song> songs = new ArrayList<>(); for (Artist artist : artists) { songs.addAll(artist.getSongs()); // maybe async in future? } return songs; } @NonNull @Override public String getSectionName(int position) { return MusicUtil.getSectionName(dataSet.get(position).getName()); } public class ViewHolder extends MediaEntryViewHolder { public ViewHolder(@NonNull View itemView) { super(itemView); setImageTransitionName(activity.getString(R.string.transition_artist_image)); if (menu != null) { menu.setVisibility(View.GONE); } } @Override public void onClick(View v) { if (isInQuickSelectMode()) { toggleChecked(getAdapterPosition()); } else { Pair[] artistPairs = new Pair[]{ Pair.create(image, activity.getResources().getString(R.string.transition_artist_image) )}; NavigationUtil.goToArtist(activity, dataSet.get(getAdapterPosition()).getId(), artistPairs); } } @Override public boolean onLongClick(View view) { toggleChecked(getAdapterPosition()); return true; } } }