package com.photo.photogallery.photos;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v7.widget.CardView;
import android.support.v7.widget.RecyclerView;
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.photo.photogallery.R;
import com.photo.photogallery.api.entities.Photo;
import com.photo.photogallery.network.AppImageLoader;
import com.photo.photogallery.other.Utils;
import java.util.List;
import de.hdodenhof.circleimageview.CircleImageView;
import static java.util.Collections.emptyList;
import static java.util.Collections.unmodifiableList;
class PhotosAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
// A grid item view type.
static final int GRID_VIEW_MODE = 0;
// A list item view type.
static final int LIST_VIEW_MODE = 1;
private static boolean isGridMode;
@NonNull
private final Listener listener;
@NonNull
private final LayoutInflater layoutInflater;
@NonNull
private final AppImageLoader imageLoader;
@NonNull
private PhotosFragment photosFragment;
@NonNull
private RecyclerView recyclerView;
private float density;
@NonNull
private List<Photo> photos = emptyList();
PhotosAdapter(@NonNull Fragment fragment, @NonNull LayoutInflater layoutInflater, @NonNull RecyclerView recyclerView, @NonNull AppImageLoader imageLoader) {
this.photosFragment = (PhotosFragment) fragment;
this.listener = (Listener) fragment;
this.layoutInflater = layoutInflater;
this.recyclerView = recyclerView;
this.imageLoader = imageLoader;
this.density = photosFragment.getResources().getDisplayMetrics().density;
}
@Override
public int getItemCount() {
return photos.size();
}
public void setData(@NonNull List<Photo> photos) {
this.photos = unmodifiableList(Utils.filterPublicPhotos(photos));
notifyDataSetChanged();
}
public void setLayoutMode(int layoutMode) {
isGridMode = (layoutMode == GRID_VIEW_MODE);
}
@Override
public int getItemViewType(int position) {
return (isGridMode) ? GRID_VIEW_MODE : LIST_VIEW_MODE;
}
@Override
@NonNull
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
switch (viewType) {
case GRID_VIEW_MODE:
return new PhotoGridViewHolder(layoutInflater.inflate(R.layout.photo_grid_item, parent, false));
case LIST_VIEW_MODE:
// fall through
default:
return new PhotoListViewHolder(layoutInflater.inflate(R.layout.photo_list_item, parent, false));
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
int viewType = getItemViewType(position);
switch (viewType) {
case GRID_VIEW_MODE:
PhotoGridViewHolder photoGridViewHolder = (PhotoGridViewHolder) viewHolder;
photoGridViewHolder.bind(photos.get(position));
break;
case LIST_VIEW_MODE:
// fall through
default:
PhotoListViewHolder photoListViewHolder = (PhotoListViewHolder) viewHolder;
photoListViewHolder.bind(photos.get(position));
break;
}
}
private class PhotoGridViewHolder extends RecyclerView.ViewHolder {
private final ImageView imageView;
private final CardView cardView;
PhotoGridViewHolder(@NonNull View itemView) {
super(itemView);
cardView = (CardView) itemView.findViewById(R.id.card_view_photo);
imageView = (ImageView) itemView.findViewById(R.id.grid_photo_image_view);
}
private void bind(@NonNull Photo photo) {
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.OnPhotoSelected(photo);
}
});
int imageWidth = (int) (recyclerView.getWidth() / density / 1.5);
FrameLayout.LayoutParams layoutParams = new FrameLayout.LayoutParams(imageWidth, imageWidth);
imageView.setLayoutParams(layoutParams);
imageLoader.downloadInto(Utils.getImageUrl(photo, imageWidth), imageView);
}
}
private class PhotoListViewHolder extends RecyclerView.ViewHolder {
private final CardView cardView;
private final ImageView mainImageView;
private final CircleImageView ownerImageView;
private final TextView ownerNameTextView;
private final TextView titleTextView;
private final TextView dateTextView;
PhotoListViewHolder(@NonNull View itemView) {
super(itemView);
cardView = (CardView) itemView.findViewById(R.id.card_view_photo);
mainImageView = (ImageView) itemView.findViewById(R.id.card_photo_image_view);
ownerImageView = (CircleImageView) itemView.findViewById(R.id.card_photo_icon_image_view);
ownerNameTextView = (TextView) itemView.findViewById(R.id.card_photo_owner_name_text_view);
titleTextView = (TextView) itemView.findViewById(R.id.card_photo_title_text_view);
dateTextView = (TextView) itemView.findViewById(R.id.card_photo_date_text_view);
}
private void bind(@NonNull Photo photo) {
cardView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
listener.OnPhotoSelected(photo);
}
});
int imageWidth = (int) (recyclerView.getWidth() / density);
imageLoader.downloadInto(Utils.getImageUrl(photo, imageWidth), mainImageView);
imageLoader.downloadInto(Utils.getBuddyIconUrl(photo), ownerImageView);
ownerNameTextView.setText(photo.ownerName());
titleTextView.setText(Utils.getShortTitle(photo.title()));
dateTextView.setText(Utils.getDateTaken(photo.dateTaken()));
}
}
interface Listener {
void OnPhotoSelected(@NonNull Photo photo);
}
}