package io.hefuyi.listener.ui.adapter;
import android.graphics.PorterDuff;
import android.os.Handler;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.PopupMenu;
import android.widget.RelativeLayout;
import android.widget.TextView;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.util.ArrayList;
import java.util.List;
import io.hefuyi.listener.Constants;
import io.hefuyi.listener.MusicPlayer;
import io.hefuyi.listener.R;
import io.hefuyi.listener.mvp.model.Song;
import io.hefuyi.listener.util.ATEUtil;
import io.hefuyi.listener.util.DensityUtil;
import io.hefuyi.listener.util.ListenerUtil;
import io.hefuyi.listener.util.NavigationUtil;
import io.hefuyi.listener.widget.fastscroller.FastScrollRecyclerView;
public class SongsListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements FastScrollRecyclerView.SectionedAdapter {
public int currentlyPlayingPosition;
private List<Song> arraylist;
private AppCompatActivity mContext;
private long[] songIDs;
private boolean withHeader;
private float topPlayScore;
private String action;
public SongsListAdapter(AppCompatActivity context, List<Song> arraylist, String action, boolean withHeader) {
if (arraylist == null) {
this.arraylist = new ArrayList<>();
} else {
this.arraylist = arraylist;
}
this.mContext = context;
this.songIDs = getSongIds();
this.withHeader = withHeader;
this.action = action;
}
@Override
public int getItemViewType(int position) {
if (position == 0 && withHeader) {
return Type.TYPE_PLAY_SHUFFLE;
} else {
return Type.TYPE_SONG;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
RecyclerView.ViewHolder viewHolder = null;
switch (viewType) {
case Type.TYPE_PLAY_SHUFFLE:
View playShuffle = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_play_shuffle, viewGroup, false);
ImageView imageView = (ImageView) playShuffle.findViewById(R.id.play_shuffle);
imageView.getDrawable().setColorFilter(ATEUtil.getThemeAccentColor(mContext), PorterDuff.Mode.SRC_IN);
viewHolder = new PlayShuffleViewHoler(playShuffle);
break;
case Type.TYPE_SONG:
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list_linear_layout_item, viewGroup, false);
viewHolder = new ItemHolder(v);
break;
}
return viewHolder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case Type.TYPE_PLAY_SHUFFLE:
break;
case Type.TYPE_SONG:
ItemHolder itemHolder = (ItemHolder) holder;
Song localItem;
if (withHeader){
localItem = arraylist.get(position - 1);
}else {
localItem = arraylist.get(position);
}
itemHolder.title.setText(localItem.title);
itemHolder.artist.setText(localItem.artistName);
itemHolder.album.setText(localItem.albumName);
Glide.with(holder.itemView.getContext()).load(ListenerUtil.getAlbumArtUri(localItem.albumId).toString())
.error(ATEUtil.getDefaultAlbumDrawable(mContext))
.placeholder(ATEUtil.getDefaultAlbumDrawable(mContext))
.diskCacheStrategy(DiskCacheStrategy.SOURCE)
.centerCrop()
.into(itemHolder.albumArt);
if (MusicPlayer.getCurrentAudioId() == localItem.id) {
itemHolder.title.setTextColor(ATEUtil.getThemeAccentColor(mContext));
} else {
itemHolder.title.setTextColor(ATEUtil.getThemeTextColorPrimary(mContext));
}
if (topPlayScore != 0) {
itemHolder.playscore.setVisibility(View.VISIBLE);
RelativeLayout.LayoutParams layoutParams = (RelativeLayout.LayoutParams) itemHolder.playscore.getLayoutParams();
int full = DensityUtil.getScreenWidth(mContext);
layoutParams.width = (int) (full * (localItem.getPlayCountScore() / topPlayScore));
}
setOnPopupMenuListener(itemHolder, position);
break;
}
}
@Override
public int getItemCount() {
if (withHeader && arraylist.size() != 0) {
return (null != arraylist ? arraylist.size() + 1 : 0);
} else {
return (null != arraylist ? arraylist.size() : 0);
}
}
private void setOnPopupMenuListener(ItemHolder itemHolder, final int position) {
final int realSongPosition;
if (withHeader) {
realSongPosition = position - 1;
} else {
realSongPosition = position;
}
itemHolder.popupMenu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final PopupMenu menu = new PopupMenu(mContext, v);
menu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.popup_song_play_next:
long[] ids = new long[1];
ids[0] = arraylist.get(realSongPosition).id;
MusicPlayer.playNext(mContext, ids, -1, ListenerUtil.IdType.NA);
break;
case R.id.popup_song_goto_album:
NavigationUtil.goToAlbum(mContext, arraylist.get(realSongPosition).albumId,
arraylist.get(realSongPosition).title);
break;
case R.id.popup_song_goto_artist:
NavigationUtil.goToArtist(mContext, arraylist.get(realSongPosition).artistId,
arraylist.get(realSongPosition).artistName);
break;
case R.id.popup_song_addto_queue:
long[] id = new long[1];
id[0] = arraylist.get(realSongPosition).id;
MusicPlayer.addToQueue(mContext, id, -1, ListenerUtil.IdType.NA);
break;
case R.id.popup_song_addto_playlist:
ListenerUtil.showAddPlaylistDialog(mContext,new long[]{arraylist.get(realSongPosition).id});
break;
case R.id.popup_song_delete:
long[] deleteIds = {arraylist.get(realSongPosition).id};
switch (action) {
case Constants.NAVIGATE_PLAYLIST_FAVOURATE:
ListenerUtil.showDeleteFromFavourate(mContext,deleteIds);
break;
case Constants.NAVIGATE_PLAYLIST_RECENTPLAY:
ListenerUtil.showDeleteFromRecentlyPlay(mContext,deleteIds);
break;
default:
ListenerUtil.showDeleteDialog(mContext, arraylist.get(realSongPosition).title, deleteIds,
new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
arraylist.remove(realSongPosition);
songIDs = getSongIds();
notifyItemRemoved(position);
}
});
break;
}
break;
}
return false;
}
});
menu.inflate(R.menu.popup_song);
menu.show();
}
});
}
public long[] getSongIds() {
int songNum = arraylist.size();
long[] ret = new long[songNum];
for (int i = 0; i < songNum; i++) {
ret[i] = arraylist.get(i).id;
}
return ret;
}
public void setSongList(List<Song> arraylist) {
this.arraylist = arraylist;
this.songIDs = getSongIds();
if (arraylist.size() != 0) {
this.topPlayScore = arraylist.get(0).getPlayCountScore();
}
notifyDataSetChanged();
}
@NonNull
@Override
public String getSectionName(int position) {
if (arraylist == null || arraylist.size() == 0||(withHeader && position == 0))
return "";
if (withHeader){
position = position - 1;
}
Character ch = arraylist.get(position).title.charAt(0);
if (Character.isDigit(ch)) {
return "#";
} else
return Character.toString(ch);
}
public static class Type {
public static final int TYPE_PLAY_SHUFFLE=0;
public static final int TYPE_SONG = 1;
}
public class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView title;
private TextView artist;
private TextView album;
private ImageView albumArt;
private ImageView popupMenu;
private View playscore;
public ItemHolder(View view) {
super(view);
this.title = (TextView) view.findViewById(R.id.text_item_title);
this.artist = (TextView) view.findViewById(R.id.text_item_subtitle);
this.album = (TextView) view.findViewById(R.id.text_item_subtitle_2);
this.albumArt = (ImageView) view.findViewById(R.id.image);
this.popupMenu = (ImageView) view.findViewById(R.id.popup_menu);
this.playscore = view.findViewById(R.id.playscore);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
MusicPlayer.playAll(mContext, songIDs, getAdapterPosition() - 1, -1, ListenerUtil.IdType.NA, false);
}
}, 100);
}
}
public class PlayShuffleViewHoler extends RecyclerView.ViewHolder implements View.OnClickListener {
public PlayShuffleViewHoler(View view) {
super(view);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
MusicPlayer.playAll(mContext, songIDs, -1, -1, ListenerUtil.IdType.NA, true);
Handler handler1 = new Handler();
handler1.postDelayed(new Runnable() {
@Override
public void run() {
notifyItemChanged(currentlyPlayingPosition);
notifyItemChanged(getAdapterPosition());
currentlyPlayingPosition = getAdapterPosition();
}
}, 50);
}
}, 100);
}
}
}