package com.mikepenz.unsplash.views.adapters;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.os.Build;
import android.support.v7.graphics.Palette;
import android.support.v7.widget.RecyclerView;
import android.util.DisplayMetrics;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.mikepenz.unsplash.OnItemClickListener;
import com.mikepenz.unsplash.R;
import com.mikepenz.unsplash.models.Image;
import com.mikepenz.unsplash.other.PaletteTransformation;
import com.mikepenz.unsplash.other.Utils;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import java.util.ArrayList;
public class ImageAdapter extends RecyclerView.Adapter<ImagesViewHolder> {
private Context mContext;
private ArrayList<Image> mImages;
private int mScreenWidth;
private int mDefaultTextColor;
private int mDefaultBackgroundColor;
private OnItemClickListener onItemClickListener;
public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
public ImageAdapter() {
}
public ImageAdapter(ArrayList<Image> images) {
this.mImages = images;
}
public void updateData(ArrayList<Image> images) {
this.mImages = images;
notifyDataSetChanged();
}
@Override
public ImagesViewHolder onCreateViewHolder(ViewGroup viewGroup, int position) {
View rowView = LayoutInflater.from(viewGroup.getContext())
.inflate(R.layout.item_image, viewGroup, false);
//set the mContext
this.mContext = viewGroup.getContext();
//get the colors
mDefaultTextColor = mContext.getResources().getColor(R.color.text_without_palette);
mDefaultBackgroundColor = mContext.getResources().getColor(R.color.image_without_palette);
//get the screenWidth :D optimize everything :D
mScreenWidth = mContext.getResources().getDisplayMetrics().widthPixels;
return new ImagesViewHolder(rowView, onItemClickListener);
}
@Override
public void onBindViewHolder(final ImagesViewHolder imagesViewHolder, final int position) {
final Image currentImage = mImages.get(position);
imagesViewHolder.imageAuthor.setText(currentImage.getAuthor());
imagesViewHolder.imageDate.setText(currentImage.getReadableModified_Date());
//imagesViewHolder.imageView.setDrawingCacheEnabled(true);
imagesViewHolder.imageView.setImageBitmap(null);
//reset colors so we prevent crazy flashes :D
imagesViewHolder.imageAuthor.setTextColor(mDefaultTextColor);
imagesViewHolder.imageDate.setTextColor(mDefaultTextColor);
imagesViewHolder.imageTextContainer.setBackgroundColor(mDefaultBackgroundColor);
//cancel any loading images on this view
Picasso.with(mContext).cancelRequest(imagesViewHolder.imageView);
//load the image
Picasso.with(mContext).load(mImages.get(position).getImageSrc(mScreenWidth)).transform(PaletteTransformation.instance()).into(imagesViewHolder.imageView, new Callback.EmptyCallback() {
@Override
public void onSuccess() {
Bitmap bitmap = ((BitmapDrawable) imagesViewHolder.imageView.getDrawable()).getBitmap(); // Ew!
if (bitmap != null && !bitmap.isRecycled()) {
Palette palette = PaletteTransformation.getPalette(bitmap);
if (palette != null) {
Palette.Swatch s = palette.getVibrantSwatch();
if (s == null) {
s = palette.getDarkVibrantSwatch();
}
if (s == null) {
s = palette.getLightVibrantSwatch();
}
if (s == null) {
s = palette.getMutedSwatch();
}
if (s != null && position >= 0 && position < mImages.size()) {
if (mImages.get(position) != null) {
mImages.get(position).setSwatch(s);
}
imagesViewHolder.imageAuthor.setTextColor(s.getTitleTextColor());
imagesViewHolder.imageDate.setTextColor(s.getTitleTextColor());
Utils.animateViewColor(imagesViewHolder.imageTextContainer, mDefaultBackgroundColor, s.getRgb());
}
}
}
// just delete the reference again.
bitmap = null;
if (Build.VERSION.SDK_INT >= 21) {
imagesViewHolder.imageView.setTransitionName("cover" + position);
}
imagesViewHolder.imageTextContainer.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onItemClickListener.onClick(v, position);
}
});
}
});
//calculate height of the list-item so we don't have jumps in the view
DisplayMetrics displaymetrics = mContext.getResources().getDisplayMetrics();
//image.width .... image.height
//device.width ... device
int finalHeight = (int) (displaymetrics.widthPixels / currentImage.getRatio());
imagesViewHolder.imageView.setMinimumHeight(finalHeight);
}
@Override
public int getItemCount() {
return mImages.size();
}
}
class ImagesViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
protected final FrameLayout imageTextContainer;
protected final ImageView imageView;
protected final TextView imageAuthor;
protected final TextView imageDate;
private final OnItemClickListener onItemClickListener;
public ImagesViewHolder(View itemView, OnItemClickListener onItemClickListener) {
super(itemView);
this.onItemClickListener = onItemClickListener;
imageTextContainer = (FrameLayout) itemView.findViewById(R.id.item_image_text_container);
imageView = (ImageView) itemView.findViewById(R.id.item_image_img);
imageAuthor = (TextView) itemView.findViewById(R.id.item_image_author);
imageDate = (TextView) itemView.findViewById(R.id.item_image_date);
imageView.setOnClickListener(this);
}
@Override
public void onClick(View v) {
onItemClickListener.onClick(v, getPosition());
}
}