package io.hefuyi.listener.ui.adapter;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.Drawable;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.RecyclerView;
import android.util.Pair;
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.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.animation.GlideAnimation;
import com.bumptech.glide.request.target.SimpleTarget;
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.dataloader.PlaylistLoader;
import io.hefuyi.listener.dataloader.PlaylistSongLoader;
import io.hefuyi.listener.mvp.model.Playlist;
import io.hefuyi.listener.mvp.model.Song;
import io.hefuyi.listener.util.ATEUtil;
import io.hefuyi.listener.util.ColorUtil;
import io.hefuyi.listener.util.ListenerUtil;
import io.hefuyi.listener.util.NavigationUtil;
import io.hefuyi.listener.util.PreferencesUtility;
import io.hefuyi.listener.widget.fastscroller.FastScrollRecyclerView;
import rx.Observable;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.functions.Func1;
import rx.schedulers.Schedulers;
/**
* Created by hefuyi on 2016/12/4.
*/
public class PlaylistAdapter extends RecyclerView.Adapter<PlaylistAdapter.ItemHolder> implements FastScrollRecyclerView.SectionedAdapter{
private List<Playlist> arraylist;
private Fragment mFragment;
private Context mContext;
private boolean isGrid;
public PlaylistAdapter(Fragment fragment, List<Playlist> arraylist) {
if (arraylist == null) {
this.arraylist = new ArrayList<>();
} else {
this.arraylist = arraylist;
}
this.mFragment = fragment;
this.mContext = fragment.getContext();
this.isGrid = PreferencesUtility.getInstance(mFragment.getContext()).getPlaylistView() == Constants.PLAYLIST_VIEW_GRID;
}
@Override
public ItemHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
if (isGrid) {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list_grid_layout_item, viewGroup, false);
return new ItemHolder(v);
} else {
View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_list_linear_layout_item, viewGroup, false);
return new ItemHolder(v);
}
}
@Override
public void onBindViewHolder(final ItemHolder itemHolder, final int i) {
final Playlist localItem = arraylist.get(i);
itemHolder.title.setText(localItem.name);
itemHolder.songcount.setText(ListenerUtil.makeLabel(mContext, R.plurals.Nsongs, localItem.songCount));
itemHolder.subtitle1.setVisibility(View.GONE);
itemHolder.divider.setVisibility(View.GONE);
PlaylistSongLoader.getSongsInPlaylist(mContext, localItem.id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<List<Song>>() {
@Override
public void call(List<Song> playlistsongs) {
String uri = "";
long firstAlbumID = -1;
if (playlistsongs.size() != 0) {
firstAlbumID = playlistsongs.get(0).albumId;
uri = ListenerUtil.getAlbumArtUri(firstAlbumID).toString();
}
itemHolder.playlistArt.setTag(R.string.playlistArt,firstAlbumID);
Glide.with(itemHolder.itemView.getContext())
.load(uri)
.asBitmap()
.placeholder(ATEUtil.getDefaultAlbumDrawable(mContext))
.into(new SimpleTarget<Bitmap>() {
@Override
public void onLoadFailed(Exception e, Drawable errorDrawable) {
if (isGrid) {
itemHolder.footer.setBackgroundColor(ATEUtil.getThemeAlbumDefaultPaletteColor(mContext));
}
itemHolder.playlistArt.setImageDrawable(ATEUtil.getDefaultAlbumDrawable(mContext));
itemHolder.title.setTextColor(ATEUtil.getThemeTextColorPrimary(mContext));
itemHolder.songcount.setTextColor(ATEUtil.getThemeTextColorSecondly(mContext));
itemHolder.popupMenu.setColorFilter(mContext.getResources().getColor(R.color.background_floating_material_dark));
}
@Override
public void onResourceReady(final Bitmap resource, GlideAnimation<? super Bitmap> glideAnimation) {
if (isGrid) {
new Palette.Builder(resource).generate(new Palette.PaletteAsyncListener() {
@Override
public void onGenerated(Palette palette) {
Palette.Swatch swatch = ColorUtil.getMostPopulousSwatch(palette);
if (swatch != null) {
int color = swatch.getRgb();
itemHolder.footer.setBackgroundColor(color);
int detailColor = swatch.getTitleTextColor();
itemHolder.playlistArt.setImageBitmap(resource);
itemHolder.title.setTextColor(ColorUtil.getOpaqueColor(detailColor));
itemHolder.songcount.setTextColor(detailColor);
itemHolder.popupMenu.setColorFilter(detailColor);
}
}
});
} else {
itemHolder.playlistArt.setImageBitmap(resource);
}
}
});
}
});
if (ListenerUtil.isLollipop())
itemHolder.playlistArt.setTransitionName("transition_album_art" + i);
setOnPopupMenuListener(itemHolder, i);
}
@Override
public int getItemCount() {
return (null != arraylist ? arraylist.size() : 0);
}
public void setPlaylist(List<Playlist> playlists) {
this.arraylist.clear();
this.arraylist.addAll(playlists);
notifyDataSetChanged();
}
@NonNull
@Override
public String getSectionName(int position) {
if (arraylist == null || arraylist.size() == 0)
return "";
return Character.toString(arraylist.get(position).name.charAt(0));
}
private void setOnPopupMenuListener(final ItemHolder itemHolder, final int 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) {
final Playlist playlist = arraylist.get(itemHolder.getAdapterPosition());
switch (item.getItemId()) {
case R.id.popup_playlist_rename:
new MaterialDialog.Builder(mContext)
.title(R.string.rename_playlist)
.positiveText("确定")
.negativeText(R.string.cancel)
.input(null, playlist.name, false, new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
MusicPlayer.renamePlaylist(mContext, playlist.id, input.toString());
itemHolder.title.setText(input.toString());
Toast.makeText(mContext, R.string.rename_playlist_success, Toast.LENGTH_SHORT).show();
}
})
.show();
break;
case R.id.popup_playlist_addto_playlist:
getSongListIdByPlaylist(playlist.id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<long[]>() {
@Override
public void call(long[] ids) {
ListenerUtil.showAddPlaylistDialog(mFragment.getActivity(),ids);
}
});
break;
case R.id.popup_playlist_addto_queue:
getSongListIdByPlaylist(playlist.id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<long[]>() {
@Override
public void call(long[] ids) {
MusicPlayer.addToQueue(mContext, ids, -1, ListenerUtil.IdType.Playlist);
}
});
break;
case R.id.popup_playlist_delete:
new MaterialDialog.Builder(mContext)
.title(R.string.delete_playlist)
.positiveText(R.string.delete)
.negativeText(R.string.cancel)
.onPositive(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
PlaylistLoader.deletePlaylists(mContext, playlist.id);
arraylist.remove(itemHolder.getAdapterPosition());
notifyItemRemoved(itemHolder.getAdapterPosition());
Toast.makeText(mContext, R.string.delete_playlist_success, Toast.LENGTH_SHORT).show();
}
})
.onNegative(new MaterialDialog.SingleButtonCallback() {
@Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
dialog.dismiss();
}
})
.show();
break;
}
return false;
}
});
menu.inflate(R.menu.popup_playlist);
menu.show();
}
});
}
private Observable<long[]> getSongListIdByPlaylist(long playlistId) {
return PlaylistSongLoader.getSongsInPlaylist(mContext, playlistId)
.map(new Func1<List<Song>, long[]>() {
@Override
public long[] call(List<Song> songs) {
long[] ids = new long[songs.size()];
int i = 0;
for (Song song : songs) {
ids[i] = song.id;
i++;
}
return ids;
}
});
}
public class ItemHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
private TextView title;
private TextView subtitle1;
private View divider;
private TextView songcount;
private ImageView playlistArt;
private View footer;
private ImageView popupMenu;
public ItemHolder(View view) {
super(view);
this.title = (TextView) view.findViewById(R.id.text_item_title);
this.subtitle1 = (TextView) view.findViewById(R.id.text_item_subtitle);
this.divider = view.findViewById(R.id.divider_subtitle);
this.songcount = (TextView) view.findViewById(R.id.text_item_subtitle_2);
this.playlistArt = (ImageView) view.findViewById(R.id.image);
this.footer = view.findViewById(R.id.footer);
this.popupMenu = (ImageView) view.findViewById(R.id.popup_menu);
view.setOnClickListener(this);
}
@Override
public void onClick(View v) {
NavigationUtil.navigateToPlaylistDetail(mFragment.getActivity(), arraylist.get(getAdapterPosition()).id,
String.valueOf(title.getText()), (long) playlistArt.getTag(R.string.playlistArt),
new Pair<View, String>(playlistArt, "transition_album_art" + getAdapterPosition()));
}
}
}