package bf.io.openshop.ux.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.TextView;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
import java.util.List;
import bf.io.openshop.R;
import bf.io.openshop.entities.cart.Cart;
import bf.io.openshop.entities.cart.CartDiscountItem;
import bf.io.openshop.entities.cart.CartProductItem;
import bf.io.openshop.interfaces.CartRecyclerInterface;
import bf.io.openshop.listeners.OnSingleClickListener;
import bf.io.openshop.views.ResizableImageView;
import timber.log.Timber;
/**
* Adapter handling list of cart items.
*/
public class CartRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_ITEM_PRODUCT = 0;
private static final int TYPE_ITEM_DISCOUNT = 1;
private final List<CartProductItem> cartProductItems = new ArrayList<>();
private final List<CartDiscountItem> cartDiscountItems = new ArrayList<>();
private final CartRecyclerInterface cartRecyclerInterface;
private final Context context;
private LayoutInflater layoutInflater;
/**
* Creates an adapter that handles a list of cart items.
*
* @param context activity context.
* @param cartRecyclerInterface listener indicating events that occurred.
*/
public CartRecyclerAdapter(Context context, CartRecyclerInterface cartRecyclerInterface) {
this.context = context;
this.cartRecyclerInterface = cartRecyclerInterface;
}
@Override
public int getItemCount() {
return cartProductItems.size() + cartDiscountItems.size();
}
@Override
public int getItemViewType(int position) {
if (position < cartProductItems.size())
return TYPE_ITEM_PRODUCT;
else
return TYPE_ITEM_DISCOUNT;
}
private CartDiscountItem getCartDiscountItem(int position) {
return cartDiscountItems.get(position - cartProductItems.size());
}
private CartProductItem getCartProductItem(int position) {
return cartProductItems.get(position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (layoutInflater == null)
layoutInflater = LayoutInflater.from(parent.getContext());
if (viewType == TYPE_ITEM_DISCOUNT) {
View view = layoutInflater.inflate(R.layout.list_item_cart_discount, parent, false);
return new ViewHolderDiscount(view, cartRecyclerInterface);
} else {
View view = layoutInflater.inflate(R.layout.list_item_cart_product, parent, false);
return new ViewHolderProduct(view, cartRecyclerInterface);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
// Timber.d("Bind position: " + position);
if (holder instanceof ViewHolderProduct) {
ViewHolderProduct viewHolderProduct = (ViewHolderProduct) holder;
CartProductItem cartProductItem = getCartProductItem(position);
viewHolderProduct.bindContent(cartProductItem);
viewHolderProduct.cartProductName.setText(cartProductItem.getVariant().getName());
viewHolderProduct.cartProductPrice.setText(cartProductItem.getTotalItemPriceFormatted());
viewHolderProduct.cartProductDetails.setText(context.getString(
R.string.format_string_division, cartProductItem.getVariant().getColor().getValue(),
cartProductItem.getVariant().getSize().getValue()));
viewHolderProduct.cartProductQuantity.setText(context.getString(R.string.format_quantity,
cartProductItem.getQuantity()));
Picasso.with(context).load(cartProductItem.getVariant().getMainImage())
.fit().centerInside()
.placeholder(R.drawable.placeholder_loading)
.error(R.drawable.placeholder_error)
.into(viewHolderProduct.cartProductImage);
} else if (holder instanceof ViewHolderDiscount) {
ViewHolderDiscount viewHolderDiscount = (ViewHolderDiscount) holder;
CartDiscountItem cartDiscountItem = getCartDiscountItem(position);
viewHolderDiscount.bindContent(cartDiscountItem);
viewHolderDiscount.cartDiscountName.setText(cartDiscountItem.getDiscount().getName());
viewHolderDiscount.cartDiscountValue.setText(cartDiscountItem.getDiscount().getValueFormatted());
} else {
Timber.e(new RuntimeException(), "Unknown ViewHolder in class: %s", this.getClass().getSimpleName());
}
}
public void refreshItems(Cart cart) {
if (cart != null) {
cartProductItems.clear();
cartDiscountItems.clear();
cartProductItems.addAll(cart.getItems());
cartDiscountItems.addAll(cart.getDiscounts());
notifyDataSetChanged();
} else {
Timber.e("Setting cart content with null cart");
}
}
public void cleatCart() {
cartProductItems.clear();
cartDiscountItems.clear();
notifyDataSetChanged();
}
// Provide a reference to the views for each data item
public static class ViewHolderDiscount extends RecyclerView.ViewHolder {
public TextView cartDiscountName;
public TextView cartDiscountValue;
private CartDiscountItem cartDiscountItem;
public ViewHolderDiscount(View itemView, final CartRecyclerInterface cartRecyclerInterface) {
super(itemView);
cartDiscountName = (TextView) itemView.findViewById(R.id.cart_discount_name);
cartDiscountValue = (TextView) itemView.findViewById(R.id.cart_discount_value);
View deleteDiscount = itemView.findViewById(R.id.cart_discount_delete);
deleteDiscount.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
cartRecyclerInterface.onDiscountDelete(cartDiscountItem);
}
});
}
public void bindContent(CartDiscountItem cartDiscountItem) {
this.cartDiscountItem = cartDiscountItem;
}
}
// Provide a reference to the views for each data item
public static class ViewHolderProduct extends RecyclerView.ViewHolder {
ResizableImageView cartProductImage;
TextView cartProductQuantity;
TextView cartProductName;
TextView cartProductPrice;
TextView cartProductDetails;
CartProductItem cartProductItem;
public ViewHolderProduct(View itemView, final CartRecyclerInterface cartRecyclerInterface) {
super(itemView);
cartProductImage = (ResizableImageView) itemView.findViewById(R.id.cart_product_image);
cartProductQuantity = (TextView) itemView.findViewById(R.id.cart_product_quantity);
cartProductName = (TextView) itemView.findViewById(R.id.cart_product_name);
cartProductPrice = (TextView) itemView.findViewById(R.id.cart_product_price);
cartProductDetails = (TextView) itemView.findViewById(R.id.cart_product_details);
View deleteProduct = itemView.findViewById(R.id.cart_product_delete);
deleteProduct.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
cartRecyclerInterface.onProductDelete(cartProductItem);
}
});
View updateProduct = itemView.findViewById(R.id.cart_product_update);
updateProduct.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
cartRecyclerInterface.onProductUpdate(cartProductItem);
}
});
itemView.setOnClickListener(new OnSingleClickListener() {
@Override
public void onSingleClick(View v) {
cartRecyclerInterface.onProductSelect(cartProductItem.getVariant().getProductId());
}
});
}
public void bindContent(CartProductItem cartProductItem) {
this.cartProductItem = cartProductItem;
}
}
}