package com.architjn.acjmusicplayer.utils.adapters;
import android.animation.ArgbEvaluator;
import android.animation.ValueAnimator;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;
import com.architjn.acjmusicplayer.R;
import com.architjn.acjmusicplayer.service.PlayerService;
import com.architjn.acjmusicplayer.ui.layouts.activity.MainActivity;
import com.architjn.acjmusicplayer.ui.layouts.activity.PlaylistActivity;
import com.architjn.acjmusicplayer.ui.layouts.fragments.PlaylistListFragment;
import com.architjn.acjmusicplayer.utils.handlers.PlaylistDBHelper;
import com.architjn.acjmusicplayer.utils.items.Playlist;
import java.util.ArrayList;
/**
* Created by architjn on 28/11/15.
*/
public class PlaylistListAdapter extends RecyclerView.Adapter<PlaylistListAdapter.SimpleItemViewHolder> {
private ArrayList<Playlist> items;
private PlaylistListFragment fragment;
private Context context;
private int expandedPosition = -1;
private SimpleItemViewHolder expandedHolder;
private int expandSize = 45;
public PlaylistListAdapter(Context context, ArrayList<Playlist> items, PlaylistListFragment fragment) {
this.context = context;
this.items = items;
this.fragment = fragment;
}
@Override
public PlaylistListAdapter.SimpleItemViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).
inflate(R.layout.playlist_list_item, parent, false);
return new SimpleItemViewHolder(itemView);
}
@Override
public void onBindViewHolder(final PlaylistListAdapter.SimpleItemViewHolder holder,
final int position) {
holder.name.setText(items.get(position).getPlaylistName());
holder.songCount.setText(items.get(position).getSongCount() + " "
+ context.getResources().getString(R.string.songs));
if (position == expandedPosition) {
expandWithoutAnimation(holder);
} else {
collapseWithoutAnimation(holder);
}
setOnClicks(holder, position);
}
private void setOnClicks(final SimpleItemViewHolder holder, final int position) {
holder.mainView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
// Check for an expanded view, collapse if you find one
if (expandedPosition != position) {
if (expandedPosition >= 0) {
collapse();
}
expand(holder, position);
} else {
Intent playlistSongPage = new Intent(context, PlaylistActivity.class);
playlistSongPage.putExtra("id", items.get(position).getPlaylistId());
context.startActivity(playlistSongPage);
}
}
});
holder.menu.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
final PlaylistDBHelper helper = new PlaylistDBHelper(context);
PopupMenu pm = new PopupMenu(context, view);
pm.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
@Override
public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) {
case R.id.popup_playlist_play:
playPlaylist(position);
break;
case R.id.popup_playlist_shuffle:
break;
case R.id.popup_playlist_rename:
renameDialog(helper, position);
break;
case R.id.popup_playlist_delete:
helper.deletePlaylist(items.get(position).getPlaylistId());
updateNewList(helper.getAllPlaylist());
if (items.size() == 0)
fragment.listIsEmpty();
break;
}
return false;
}
});
pm.inflate(R.menu.popup_playlist);
pm.show();
}
});
holder.playButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
playPlaylist(position);
}
});
holder.shuffleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
public void playPlaylist(final int position) {
if (items.get(position).getSongCount() != 0)
new Thread(new Runnable() {
public void run() {
Intent i = new Intent();
i.setAction(PlayerService.ACTION_PLAY_PLAYLIST);
i.putExtra("id", items.get(position).getPlaylistId());
context.sendBroadcast(i);
}
}).start();
}
private void renameDialog(final PlaylistDBHelper helper, final int position) {
final EditText edittext = new EditText(context);
AlertDialog.Builder alert = new AlertDialog.Builder(context);
alert.setTitle("Rename");
alert.setView(edittext);
alert.setPositiveButton("Done", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
if (edittext.getText().toString().matches("")) {
renameDialog(helper, position);
} else {
helper.renamePlaylist(edittext.getText().toString(),
items.get(position).getPlaylistId());
updateNewList(helper.getAllPlaylist());
notifyDataSetChanged();
}
}
});
alert.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int whichButton) {
}
});
alert.show();
}
private void expand(SimpleItemViewHolder holder, int position) {
expandedPosition = position;
expandedHolder = holder;
animateElevation(0, 12, holder.mainView);
holder.mainView.setBackgroundColor(0xffffffff);
if (expandedPosition == -1)
animateHeight(0, dpToPx(expandSize), holder.expandedArea, false);
else
animateHeight(0, dpToPx(expandSize), holder.expandedArea, true);
}
private void collapse() {
animateElevation(12, 0, expandedHolder.mainView);
expandedHolder.mainView.setBackgroundColor(0xfffafafa);
animateHeight(dpToPx(expandSize), 0, expandedHolder.expandedArea, false);
expandedPosition = -1;
expandedHolder = null;
}
private void collapseWithoutAnimation(SimpleItemViewHolder holder) {
holder.mainView.setElevation(0);
holder.expandedArea.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(0)));
holder.mainView.setBackgroundColor(0xfffafafa);
}
private void expandWithoutAnimation(SimpleItemViewHolder holder) {
holder.mainView.setElevation(12);
holder.expandedArea.setLayoutParams(new LinearLayout.LayoutParams(
ViewGroup.LayoutParams.MATCH_PARENT, dpToPx(expandSize)));
holder.mainView.setBackgroundColor(0xffffffff);
}
@Override
public int getItemCount() {
return items.size();
}
public int dpToPx(int dp) {
DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
int px = Math.round(dp * (displayMetrics.xdpi / DisplayMetrics.DENSITY_DEFAULT));
return px;
}
private void animateElevation(int from, int to, final View view) {
Integer elevationFrom = from;
Integer elevationTo = to;
ValueAnimator colorAnimation =
ValueAnimator.ofObject(
new ArgbEvaluator(), elevationFrom, elevationTo);
colorAnimation.addUpdateListener(
new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animator) {
view.setElevation(
(Integer) animator.getAnimatedValue());
}
});
colorAnimation.start();
}
private void animateHeight(int from, int to, final View view, boolean delay) {
// Declare a ValueAnimator object
int duration = 300;
ValueAnimator valueAnimator;
valueAnimator = ValueAnimator.ofInt(from, to); // These values in this method can be changed to expand however much you like
valueAnimator.setDuration(duration);
if (delay)
valueAnimator.setStartDelay(duration);
valueAnimator.setInterpolator(new AccelerateDecelerateInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
public void onAnimationUpdate(ValueAnimator animation) {
Integer value = (Integer) animation.getAnimatedValue();
view.getLayoutParams().height = value.intValue();
view.requestLayout();
}
});
valueAnimator.start();
}
public void updateNewList(ArrayList<Playlist> newList) {
items = newList;
notifyDataSetChanged();
}
public void onBackPressed() {
if (expandedPosition != -1)
collapse();
else
((MainActivity) fragment.getActivity()).killActivity();
}
public class SimpleItemViewHolder extends RecyclerView.ViewHolder {
public TextView name, songCount, playButton, shuffleButton;
public View mainView, menu;
public LinearLayout expandedArea;
public SimpleItemViewHolder(View itemView) {
super(itemView);
mainView = itemView;
name = (TextView) itemView.findViewById(R.id.playlist_item_name);
expandedArea = (LinearLayout) itemView.findViewById(R.id.playlist_expanded_area);
songCount = (TextView) itemView.findViewById(R.id.playlist_item_song_count);
menu = itemView.findViewById(R.id.playlist_item_menu);
playButton = (TextView) itemView.findViewById(R.id.playlist_play_button);
shuffleButton = (TextView) itemView.findViewById(R.id.playlist_shuffle_button);
}
}
}