package com.kabouzeid.gramophone.adapter; import android.os.Build; import android.support.annotation.NonNull; import android.support.v4.util.Pair; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; 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.ATHUtil; import com.kabouzeid.gramophone.R; import com.kabouzeid.gramophone.adapter.base.MediaEntryViewHolder; import com.kabouzeid.gramophone.glide.SongGlideRequest; import com.kabouzeid.gramophone.glide.artistimage.ArtistImage; import com.kabouzeid.gramophone.helper.MusicPlayerRemote; import com.kabouzeid.gramophone.helper.menu.SongMenuHelper; import com.kabouzeid.gramophone.model.Album; 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 java.util.ArrayList; import java.util.List; /** * @author Karim Abou Zeid (kabouzeid) */ public class SearchAdapter extends RecyclerView.Adapter<SearchAdapter.ViewHolder> { private static final int HEADER = 0; private static final int ALBUM = 1; private static final int ARTIST = 2; private static final int SONG = 3; private final AppCompatActivity activity; private List<Object> dataSet; public SearchAdapter(@NonNull AppCompatActivity activity, @NonNull List<Object> dataSet) { this.activity = activity; this.dataSet = dataSet; } public void swapDataSet(@NonNull List<Object> dataSet) { this.dataSet = dataSet; notifyDataSetChanged(); } @Override public int getItemViewType(int position) { if (dataSet.get(position) instanceof Album) return ALBUM; if (dataSet.get(position) instanceof Artist) return ARTIST; if (dataSet.get(position) instanceof Song) return SONG; return HEADER; } @NonNull @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == HEADER) return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.sub_header, parent, false), viewType); return new ViewHolder(LayoutInflater.from(activity).inflate(R.layout.item_list, parent, false), viewType); } @SuppressWarnings("ConstantConditions") @Override public void onBindViewHolder(@NonNull final ViewHolder holder, int position) { switch (getItemViewType(position)) { case ALBUM: final Album album = (Album) dataSet.get(position); holder.title.setText(album.getTitle()); holder.text.setText(album.getArtistName()); SongGlideRequest.Builder.from(Glide.with(activity), album.safeGetFirstSong()) .checkIgnoreMediaStore(activity).build() .into(holder.image); break; case ARTIST: final Artist artist = (Artist) dataSet.get(position); holder.title.setText(artist.getName()); holder.text.setText(MusicUtil.getArtistInfoString(activity, artist)); Glide.with(activity) .load(new ArtistImage(artist.getName(), false)) .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(holder.image); break; case SONG: final Song song = (Song) dataSet.get(position); holder.title.setText(song.title); holder.text.setText(song.albumName); break; default: holder.title.setText(dataSet.get(position).toString()); break; } } @Override public int getItemCount() { return dataSet.size(); } public class ViewHolder extends MediaEntryViewHolder { public ViewHolder(@NonNull View itemView, int itemViewType) { super(itemView); itemView.setOnLongClickListener(null); if (itemViewType != HEADER) { itemView.setBackgroundColor(ATHUtil.resolveColor(activity, R.attr.cardBackgroundColor)); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { itemView.setElevation(activity.getResources().getDimensionPixelSize(R.dimen.card_elevation)); } if (shortSeparator != null) { shortSeparator.setVisibility(View.GONE); } } if (menu != null) { if (itemViewType == SONG) { menu.setVisibility(View.VISIBLE); menu.setOnClickListener(new SongMenuHelper.OnClickSongMenu(activity) { @Override public Song getSong() { return (Song) dataSet.get(getAdapterPosition()); } }); } else { menu.setVisibility(View.GONE); } } switch (itemViewType) { case ALBUM: setImageTransitionName(activity.getString(R.string.transition_album_art)); break; case ARTIST: setImageTransitionName(activity.getString(R.string.transition_artist_image)); break; default: View container = itemView.findViewById(R.id.image_container); if (container != null) { container.setVisibility(View.GONE); } break; } } @Override public void onClick(View view) { Object item = dataSet.get(getAdapterPosition()); switch (getItemViewType()) { case ALBUM: NavigationUtil.goToAlbum(activity, ((Album) item).getId(), Pair.create(image, activity.getResources().getString(R.string.transition_album_art) )); break; case ARTIST: NavigationUtil.goToArtist(activity, ((Artist) item).getId(), Pair.create(image, activity.getResources().getString(R.string.transition_artist_image) )); break; case SONG: ArrayList<Song> playList = new ArrayList<>(); playList.add((Song) item); MusicPlayerRemote.openQueue(playList, 0, true); break; } } } }