package com.byoutline.kickmaterial.adapters;
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.SeekBar;
import android.widget.TextView;
import com.byoutline.kickmaterial.R;
import com.byoutline.kickmaterial.model.Project;
import com.byoutline.kickmaterial.model.ProjectTime;
import com.byoutline.kickmaterial.utils.AplaTransformation;
import com.byoutline.kickmaterial.utils.OrderedSet;
import com.byoutline.secretsauce.utils.ViewUtils;
import com.squareup.picasso.Picasso;
import com.squareup.picasso.RequestCreator;
import java.util.Collection;
import java.util.List;
/**
* @author Pawel Karczewski <pawel.karczewski at byoutline.com> on 2015-01-03
*/
public class ProjectsAdapter extends RecyclerView.Adapter<ProjectsAdapter.ViewHolder> implements View.OnClickListener, View.OnLongClickListener {
public static final String CURRENCY = "$";
public static final int BIG_ITEM = 0;
public static final int NORMAL_ITEM = 1;
public static final int HEADER_ITEM = 2;
public static final double IMAGE_RATIO = 4 / 3;
private final OrderedSet<Project> dataset = new OrderedSet<>();
private final boolean showHeader;
private final ItemViewTypeProvider itemViewTypeProvider;
private Context context;
private ProjectClickListener projectClickListener;
private final int smallItemWidth;
private final int smallItemHeight;
private final int bigItemWidth;
private final int bigItemHeight;
// Adapter's Constructor
public ProjectsAdapter(Context context, ProjectClickListener projectClickListener, boolean showHeader, ItemViewTypeProvider itemViewTypeProvider) {
this.context = context;
this.projectClickListener = projectClickListener;
this.showHeader = showHeader;
this.itemViewTypeProvider = itemViewTypeProvider;
smallItemHeight = context.getResources().getDimensionPixelSize(R.dimen.project_item_big_photo_height);
bigItemHeight = context.getResources().getDimensionPixelSize(R.dimen.project_item_big_height);
smallItemWidth = (int) (smallItemHeight * IMAGE_RATIO);
bigItemWidth = (int) (bigItemHeight * IMAGE_RATIO);
}
public static void setProjectDetailsInfo(TextView gatheredMoneyTv, TextView totalAmountTv, TextView timeLeftValueTv, TextView timeLeftTypeTv, Project project) {
gatheredMoneyTv.setText(CURRENCY + project.getGatheredAmount());
totalAmountTv.setText(gatheredMoneyTv.getContext().getString(R.string.pledged_of, project.getTotalAmount()));
ProjectTime timeLeft = project.getTimeLeft();
timeLeftValueTv.setText(timeLeft.value);
timeLeftTypeTv.setText(timeLeft.description);
}
public static void setProjectDetailsInfo(TextView title, TextView descTv, TextView gatheredMoneyTv, TextView totalAmountTv, TextView backersTv, TextView timeLeftValueTv, TextView timeLeftTypeTv, Project project) {
ViewUtils.setText(title, project.getProjectName());
ViewUtils.setTextForViewOrHideIt(descTv, project.desc);
backersTv.setText(Integer.toString(project.backers));
setProjectDetailsInfo(gatheredMoneyTv, totalAmountTv, timeLeftValueTv, timeLeftTypeTv, project);
}
public Project getItem(int position) {
if (showHeader) {
dataset.get(position - 1);
}
return dataset.get(position);
}
// Create new views. This is invoked by the layout manager.
@Override
public ProjectsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Create a new view by inflating the row item xml.
View v = null;
switch (viewType) {
case BIG_ITEM:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.project_grid_item_big, parent, false);
break;
case NORMAL_ITEM:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.project_grid_item_normal, parent, false);
break;
case HEADER_ITEM:
v = LayoutInflater.from(parent.getContext()).inflate(R.layout.projects_list_header, parent, false);
break;
}
// Set the view to the ViewHolder
ViewHolder holder = new ViewHolder(v, projectClickListener);
return holder;
}
// Replace the contents of a view. This is invoked by the layout manager.
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
int type = getItemViewType(position);
switch (type) {
case NORMAL_ITEM:
case BIG_ITEM:
Project project = getItem(position);
if (project != null) {
if (holder.projectId == project.id) {
// This view holder appears to already show correct project.
return;
} else {
holder.projectId = project.id;
}
ViewUtils.setTextForViewOrHideIt(holder.projectItemBigTitleTv, project.getProjectName());
holder.projectItemBigProgressSb.setProgress((int) project.getPercentProgress());
Picasso picasso = Picasso.with(context);
final RequestCreator picassoBuilder;
if (type == BIG_ITEM) {
setProjectDetailsInfo(null, holder.projectItemBigDescTv, holder.projectItemBigGatheredMoneyTv, holder.projectItemBigPledgedOfTv, holder.projectItemBigBackersTv, holder.projectItemBigTimeLeft, holder.projectItemBigTimeLeftType, project);
picassoBuilder = picasso.load(project.getBigPhotoUrl())
.resize(bigItemWidth, bigItemHeight)
.placeholder(R.drawable.blank_project_wide);
} else {
picassoBuilder = picasso.load(project.getPhotoUrl())
.resize(smallItemWidth, smallItemHeight)
.placeholder(R.drawable.blank_project_small);
}
picassoBuilder.onlyScaleDown()
.transform(new AplaTransformation())
.centerCrop()
.into(holder.projectItemBigPhotoIv);
}
break;
}
}
@Override
public int getItemViewType(int position) {
return itemViewTypeProvider.getViewType(position);
}
// Return the size of your dataset (invoked by the layout manager)
@Override
public int getItemCount() {
int size = dataset.size();
return size;
}
@Override
public void onClick(View view) {
// ViewHolder holder = (ViewHolder) view.getTag();
// if (view.getId() == holder.mNameTextView.getId()) {
// Toast.makeText(context, holder.mNameTextView.getText(), Toast.LENGTH_SHORT).show();
// }
}
@Override
public boolean onLongClick(View view) {
// ViewHolder holder = (ViewHolder) view.getTag();
// if (view.getId() == holder.mNameTextView.getId()) {
// int pos = holder.getPosition();
// dataset.remove(pos);
//
// // Call this method to refresh the list and display the "updated" list
// notifyItemRemoved(pos);
//
// Toast.makeText(context, "Item " + holder.mNameTextView.getText() + " has been removed from list",
// Toast.LENGTH_SHORT).show();
// }
return false;
}
public void setItems(List<Project> items) {
synchronized (dataset) {
if (showHeader) {
//Fake project to simulate header
items.add(0, new Project());
}
boolean modified = dataset.setItems(items);
if (modified) {
notifyDataSetChanged();
}
}
}
public void addItems(Collection<Project> items) {
synchronized (dataset) {
boolean modified = dataset.addAll(items);
if (modified) {
notifyDataSetChanged();
}
}
}
public final static class ItemViewTypeProvider {
private final boolean showHeader;
public ItemViewTypeProvider(boolean showHeader) {
this.showHeader = showHeader;
}
public int getViewType(int position) {
if (showHeader) {
if (position == 0) {
return HEADER_ITEM;
} else if (position % 5 == 3) {
return BIG_ITEM;
} else {
return NORMAL_ITEM;
}
} else {
if ((position + 2) % 5 == 4) {
return BIG_ITEM;
} else {
return NORMAL_ITEM;
}
}
}
}
// Create the ViewHolder class to keep references to your views
public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public ProjectClickListener mListener;
ImageView projectItemBigPhotoIv;
TextView projectItemBigTitleTv;
TextView projectItemBigDescTv;
SeekBar projectItemBigProgressSb;
TextView projectItemBigGatheredMoneyTv;
TextView projectItemBigBackersTv;
TextView projectItemBigTimeLeft;
TextView projectItemBigPledgedOfTv;
TextView projectItemBigTimeLeftType;
View projectItemBigBackersLabel;
int projectId;
/**
* Constructor
*
* @param v The container view which holds the elements from the row item xml
*/
public ViewHolder(View v, ProjectClickListener projectClickListener) {
super(v);
this.mListener = projectClickListener;
projectItemBigPhotoIv = (ImageView) v.findViewById(R.id.project_item_big_photo_iv);
projectItemBigTitleTv = (TextView) v.findViewById(R.id.project_item_big_title_tv);
projectItemBigDescTv = (TextView) v.findViewById(R.id.project_item_big_desc_tv);
projectItemBigProgressSb = (SeekBar) v.findViewById(R.id.project_item_big_progress_sb);
projectItemBigGatheredMoneyTv = (TextView) v.findViewById(R.id.project_item_big_gathered_money_tv);
projectItemBigBackersTv = (TextView) v.findViewById(R.id.project_item_big_backers_tv);
projectItemBigTimeLeft = (TextView) v.findViewById(R.id.project_item_big_days_left);
projectItemBigPledgedOfTv = (TextView) v.findViewById(R.id.project_item_big_pledged_of_tv);
projectItemBigTimeLeftType = (TextView) v.findViewById(R.id.project_item_time_left_type_tv);
projectItemBigBackersLabel = v.findViewById(R.id.project_item_big_backers_label_tv);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if (mListener != null && getItemViewType() != HEADER_ITEM) {
SharedViews views = new SharedViews(projectItemBigPhotoIv, projectItemBigTitleTv, projectItemBigTitleTv,
projectItemBigProgressSb,
projectItemBigGatheredMoneyTv, projectItemBigBackersTv, projectItemBigTimeLeft,
projectItemBigPledgedOfTv, projectItemBigBackersLabel, projectItemBigTimeLeftType);
mListener.projectClicked(getAdapterPosition(), views);
}
}
}
}