package edu.grinnell.kdic.schedule;
import android.content.Intent;
import android.support.v4.app.FragmentActivity;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.view.animation.OvershootInterpolator;
import android.view.animation.ScaleAnimation;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.ArrayList;
import edu.grinnell.kdic.Constants;
import edu.grinnell.kdic.Favorites;
import edu.grinnell.kdic.R;
public class ScheduleRecyclerViewAdapter extends RecyclerView.Adapter<ScheduleRecyclerViewAdapter.ViewHolder> {
private static final String TAG = ScheduleRecyclerViewAdapter.class.getSimpleName();
private FragmentActivity mContext;
private Schedule mSchedule;
private Favorites mFavorites;
private int animatePos;
// define view types
public static final int SECTION_HEADER = 0; // section header card
public static final int CARD = 1; // card with show info
public static final int DAY_SCHEDULE = 2; // card for day
public static final int CARD_NO_FAV = 3; // card for Auto-Play
private ArrayList<ScheduleRecyclerItem> mContent;
public ScheduleRecyclerViewAdapter(FragmentActivity context) {
mContext = context;
mSchedule = new Schedule(context);
mFavorites = new Favorites(context);
}
public void addContent(ArrayList<ScheduleRecyclerItem> content) {
mContent = content;
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View v;
switch (viewType) {
case SECTION_HEADER:
v = inflater.inflate(R.layout.rv_item_header, parent, false);
break;
case CARD:
case CARD_NO_FAV:
v = inflater.inflate(R.layout.rv_item_card, parent, false);
break;
case DAY_SCHEDULE:
v = inflater.inflate(R.layout.rv_item_day_card, parent, false);
break;
default:
throw new IllegalArgumentException();
}
return new ViewHolder(v, viewType);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ScheduleRecyclerItem item = mContent.get(position);
switch (item.getViewType()) {
case CARD:
case CARD_NO_FAV:
bindCard(holder, item);
break;
case DAY_SCHEDULE:
bindDaySchedule(holder, item);
break;
case SECTION_HEADER:
bindSectionHeader(holder, item);
break;
}
//animateCard(holder.itemView, position);
}
private void animateCard(View v, int position) {
if (position > animatePos) {
Animation cardAnimation = AnimationUtils.loadAnimation(mContext, R.anim.scale_card_up);
v.startAnimation(cardAnimation);
animatePos = position;
}
}
private void bindSectionHeader(ViewHolder holder, ScheduleRecyclerItem item) {
holder.title.setText(item.getS1());
holder.subtitle.setText(item.getS2());
}
public void bindCard(final ViewHolder holder, final ScheduleRecyclerItem item) {
holder.title.setText(item.getS1());
holder.subtitle.setText(item.getS2());
if (holder.viewType == CARD_NO_FAV)
holder.favorite.setVisibility(View.GONE); // remove the favorite button for Auto Play card
else {
holder.favorite.setVisibility(View.VISIBLE);
// add heart if show is a favorite
if (mFavorites.isFavorite(item.getS1()))
holder.favorite.setImageResource(R.drawable.ic_favorite_white_24dp);
else
holder.favorite.setImageResource(R.drawable.ic_favorite_border_white_24dp);
holder.favorite.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
final boolean wasFavorite = mFavorites.isFavorite(item.getS1());
if (wasFavorite) {
mFavorites.removeFavorite(item.getS1());
Log.d(TAG, "Removed from Favorites");
} else {
mFavorites.addFavorites(item.getS1());
Log.d(TAG, "Added to Favorites");
}
// animate the heart button
final ScaleAnimation heartInAnim = new ScaleAnimation(0f, 1f, 0f, 1f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
heartInAnim.setInterpolator(new OvershootInterpolator());
heartInAnim.setDuration(200);
ScaleAnimation heartOutAnim = new ScaleAnimation(1f, 0f, 1f, 0f,
Animation.RELATIVE_TO_SELF, 0.5f, Animation.RELATIVE_TO_SELF, 0.5f);
heartOutAnim.setInterpolator(new AccelerateInterpolator());
heartOutAnim.setDuration(100);
heartOutAnim.setAnimationListener(new Animation.AnimationListener() {
@Override
public void onAnimationStart(Animation animation) {
}
@Override
public void onAnimationEnd(Animation animation) {
holder.favorite.setImageResource(!wasFavorite ?
R.drawable.ic_favorite_white_24dp : R.drawable.ic_favorite_border_white_24dp);
holder.favorite.startAnimation(heartInAnim);
}
@Override
public void onAnimationRepeat(Animation animation) {
}
});
holder.favorite.startAnimation(heartOutAnim);
}
});
}
}
public void bindDaySchedule(final ViewHolder holder, final ScheduleRecyclerItem item) {
holder.title.setText(item.getS1());
holder.cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, DayScheduleActivity.class);
intent.putExtra(Constants.DAY, item.getS1());
mContext.startActivity(intent);
}
});
}
@Override
public int getItemViewType(int position) {
return mContent.get(position).getViewType();
}
@Override
public int getItemCount() {
return mContent.size();
}
protected class ViewHolder extends RecyclerView.ViewHolder {
int viewType;
CardView cardView;
TextView title;
TextView subtitle;
ImageView favorite;
public ViewHolder(View itemView, int viewType) {
super(itemView);
this.viewType = viewType;
title = (TextView) itemView.findViewById(R.id.tv_title);
subtitle = (TextView) itemView.findViewById(R.id.tv_subtitle);
if (viewType == CARD || viewType == CARD_NO_FAV || viewType == DAY_SCHEDULE) {
cardView = (CardView) itemView.findViewById(R.id.card_view_item);
favorite = (ImageView) itemView.findViewById(R.id.iv_favorite);
}
}
}
}