package io.codetail.adapters; import android.content.Context; import android.content.res.ColorStateList; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.support.annotation.LayoutRes; import android.support.v7.widget.RecyclerView; import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; import com.squareup.picasso.Picasso; import java.util.ArrayList; import java.util.List; import javax.inject.Inject; import butterknife.ButterKnife; import butterknife.InjectView; import codetail.graphics.drawables.RippleDrawable; import codetail.utils.ThemeUtils; import codetail.utils.ViewUtils; import io.codetail.WatchMeApplication; import io.codetail.client.models.Video; import io.codetail.watchme.R; import io.codetail.widget.CardLinearLayout; @Deprecated public class WatchMeAdapter extends RecyclerView.Adapter<WatchMeAdapter.CardHolder>{ public static interface OnItemClickListener{ public void onItemClick(Video video); } public static interface OnItemLongClickListener{ public void onItemLongClick(Video video); } View.OnClickListener mOnMoreClickListener = new View.OnClickListener(){ @Override public void onClick(View v) { Card card = (Card) v.getTag(R.id.adapter_card); Picasso picasso = (Picasso) v.getTag(R.id.adapter_picasso_instance); CardLinearLayout layout = (CardLinearLayout) v.getParent(); int size = card.videos.size(); int color = layout.getResources().getColor(R.color.background_material_light); View viewToBind[] = layout.beginBinding(size); for(int index = 0; index < size; index++){ View item = viewToBind[index]; TextView title = ButterKnife.findById(item, R.id.card_video_item_title); TextView views = ButterKnife.findById(item, R.id.card_video_item_views); TextView author = ButterKnife.findById(item, R.id.card_video_item_author); ImageView thumbnail = ButterKnife.findById(item, R.id.card_video_item_thumbnails); Video video = card.videos.get(index); title.setText(video.getTitle()); author.setText(video.getOwner().getUsername()); views.setText(String.valueOf(video.getViewsCount())); item.setOnClickListener(mSupportItemClick); item.setOnLongClickListener(mSupportLongClick); picasso.load(video.getThumbnail()) .placeholder(new ColorDrawable(color)) .resizeDimen(R.dimen.thumbnail_width, R.dimen.thumbnail_height) .centerCrop() .into(thumbnail); if(!(item.getBackground() instanceof RippleDrawable)){ RippleDrawable.makeFor(item, mRippleColors, true); } } card.visibleItems = size; ViewUtils.setVisibilityWithGoneFlag(v, false); } }; View.OnClickListener mSupportItemClick = new View.OnClickListener() { @Override public void onClick(View v) { if(mItemClick != null){ mItemClick.onItemClick((Video) v.getTag()); } } }; View.OnLongClickListener mSupportLongClick = new View.OnLongClickListener(){ @Override public boolean onLongClick(View v) { if(mLongItemClick != null){ mLongItemClick.onItemLongClick((Video) v.getTag()); return true; } return false; } }; @Inject Picasso mPicasso; private ArrayList<Card> mCards; private int mPlaceholderColor; private ColorStateList mRippleColors; private OnItemClickListener mItemClick; private OnItemLongClickListener mLongItemClick; private String mKey; public WatchMeAdapter(Context context) { mCards = new ArrayList<>(); mPlaceholderColor = context.getResources().getColor(R.color.background_material_light); mRippleColors = ThemeUtils.getThemeColorStateList(context, R.attr.rippleOverlayColor); WatchMeApplication application = (WatchMeApplication) context.getApplicationContext(); application.inject(this); } public void setOnItemClickListener(OnItemClickListener listener) { mItemClick = listener; } public void setOnItemLongClickListener(OnItemLongClickListener listener) { mLongItemClick = listener; } public void setCustomSaveKey(String key){ mKey = key; } public WatchMeAdapter(String key, Context context, Bundle savedInstanceState){ this(context); mKey = key; if(savedInstanceState != null) { mCards = savedInstanceState .getParcelableArrayList(mKey); } } @Override public CardHolder onCreateViewHolder(ViewGroup group, int i) { return new CardHolder(LayoutInflater.from(group.getContext()) .inflate(R.layout.card_video_item, group, false)); } @Override public void onBindViewHolder(CardHolder cardHolder, int position) { Card card = mCards.get(position); TextView cardTitle = cardHolder.mTitle; TextView more = cardHolder.mShowMore; CardLinearLayout layout = cardHolder.mCardLayout; cardTitle.setText(card.title); View[] bindViews = layout.beginBinding(card.visibleItems); int index = 0; for(View item : bindViews){ TextView title = ButterKnife.findById(item, R.id.card_video_item_title); TextView views = ButterKnife.findById(item, R.id.card_video_item_views); TextView author = ButterKnife.findById(item, R.id.card_video_item_author); ImageView thumbnail = ButterKnife.findById(item, R.id.card_video_item_thumbnails); Video video = card.videos.get(index++); title.setText(video.getTitle()); author.setText(video.getOwner().getUsername()); views.setText(String.valueOf(video.getViewsCount())); item.setTag(video); item.setOnClickListener(mSupportItemClick); item.setOnLongClickListener(mSupportLongClick); mPicasso.load(video.getThumbnail()) .placeholder(new ColorDrawable(mPlaceholderColor)) .resizeDimen(R.dimen.thumbnail_width, R.dimen.thumbnail_height) .centerCrop() .into(thumbnail); if(!(item.getBackground() instanceof RippleDrawable)){ RippleDrawable.makeFor(item, mRippleColors, true); } } more.setTag(R.id.adapter_card, card); more.setTag(R.id.adapter_picasso_instance, mPicasso); more.setOnClickListener(mOnMoreClickListener); ViewUtils.setVisibilityWithGoneFlag(more, card.visibleItems != card.videos.size()); } @Override public long getItemId(int position) { return mCards.get(position).hashCode(); } public void clear(){ int size = mCards.size(); mCards.clear(); notifyDataSetChanged(); } public void add(int page, CharSequence title, List<Video> videos){ mCards.add(new Card(page, title, videos)); notifyDataSetChanged(); } public void add(int page, CharSequence title, List<Video> videos, int visible){ mCards.add(new Card(page, title, videos, visible)); notifyDataSetChanged(); } @Override public int getItemCount() { return mCards.size(); } public void onSaveInstanceState(Bundle bundle){ bundle.putParcelableArrayList(mKey, mCards); } public static class Card implements Parcelable { int page; CharSequence title; List<Video> videos; int visibleItems; Card(int page, CharSequence title, List<Video> videos) { this.page = page; this.title = title; this.videos = videos; this.visibleItems = videos.size(); } public Card(int page, CharSequence title, List<Video> videos, int visibleItems) { this.page = page; this.title = title; this.videos = videos; this.visibleItems = visibleItems; } @Override public int hashCode() { return title.hashCode() + page; } @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { TextUtils.writeToParcel(title, dest, flags); dest.writeInt(page); dest.writeInt(visibleItems); dest.writeTypedList(videos); } private Card(Parcel in) { videos = new ArrayList<>(); title = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(in); page = in.readInt(); visibleItems = in.readInt(); in.readTypedList(videos, Video.CREATOR);//FIXME 11/27/14 } public static final Parcelable.Creator<Card> CREATOR = new Parcelable.Creator<Card>() { public Card createFromParcel(Parcel source) { return new Card(source); } public Card[] newArray(int size) { return new Card[size]; } }; } public static class CardHolder extends RecyclerView.ViewHolder{ @InjectView(R.id.cardLayout) CardLinearLayout mCardLayout; @InjectView(R.id.cardTitle) TextView mTitle; @InjectView(R.id.showMoreButton) TextView mShowMore; public CardHolder(View itemView) { super(itemView); ButterKnife.inject(this, itemView); } public View inflate(@LayoutRes int id){ return LayoutInflater.from(mCardLayout.getContext()) .inflate(id, mCardLayout, false); } public void addView(View view){ int position = mCardLayout.indexOfChild(mShowMore); mCardLayout.addView(view, position); } } }