/*
* Moments - To the best Instagram client
* Copyright (C) 2015 XiNGRZ <xxx@oxo.ooo>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, see <http://www.gnu.org/licenses/>.
*/
package ooo.oxo.moments.feed;
import android.content.Context;
import android.support.v4.view.ViewCompat;
import android.support.v7.widget.RecyclerView;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Locale;
import butterknife.Bind;
import butterknife.ButterKnife;
import butterknife.OnClick;
import jp.wasabeef.glide.transformations.CropCircleTransformation;
import ooo.oxo.moments.R;
import ooo.oxo.moments.model.Comment;
import ooo.oxo.moments.model.Media;
import ooo.oxo.moments.text.CommentTextUtils;
import ooo.oxo.moments.widget.RatioImageView;
public class FeedAdapter extends RecyclerView.Adapter<FeedAdapter.ViewHolder> {
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy/MM/dd", Locale.getDefault());
private final Context context;
private final LayoutInflater inflater;
private final FeedListener listener;
private List<Media> feed;
public FeedAdapter(Context context, FeedListener listener) {
this.context = context;
this.inflater = LayoutInflater.from(context);
this.listener = listener;
}
public List<Media> getFeed() {
return feed;
}
public void setFeed(List<Media> feed) {
this.feed = feed;
notifyDataSetChanged();
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(inflater.inflate(R.layout.feed_item, parent, false));
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Media item = feed.get(position);
Glide.with(context)
.load(item.user.profilePicture)
.bitmapTransform(new CropCircleTransformation(context))
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(holder.avatar);
ViewCompat.setTransitionName(holder.avatar, item.user.id + "_" + item.id + "_avatar");
holder.user.setText(item.user.username);
holder.time.setText(DATE_FORMAT.format(item.createdTime));
Media.Resources.Resource image = item.images.standardResolution;
holder.image.setOriginalSize(image.width, image.height);
Glide.with(context)
.load(image.url)
.into(holder.image);
if (item.likes.count > 0) {
holder.likes.setText(context.getString(R.string.n_likes, item.likes.count));
holder.likes.setVisibility(View.VISIBLE);
} else {
holder.likes.setVisibility(View.GONE);
}
holder.comments.removeAllViews();
holder.comments.setVisibility(
item.caption != null || item.comments.count > 0 ? View.VISIBLE : View.GONE);
if (item.caption != null) {
TextView caption = (TextView) inflater.inflate(
R.layout.feed_comment_item, holder.comments, false);
CharSequence text = CommentTextUtils.format(
item.user.username, item.caption.text, item.tags,
() -> listener.onUserClick(item.user.id), null);
caption.setText(text, TextView.BufferType.SPANNABLE);
caption.setMovementMethod(LinkMovementMethod.getInstance());
holder.comments.addView(caption);
}
for (Comment comment : item.comments.data) {
TextView child = (TextView) inflater.inflate(
R.layout.feed_comment_item, holder.comments, false);
CharSequence text = CommentTextUtils.format(
comment.from.username, comment.text,
() -> listener.onUserClick(comment.from.id));
child.setText(text, TextView.BufferType.SPANNABLE);
child.setMovementMethod(LinkMovementMethod.getInstance());
holder.comments.addView(child);
}
}
@Override
public int getItemCount() {
return feed == null ? 0 : feed.size();
}
public interface FeedListener {
void onUserClick(ViewHolder holder);
void onUserClick(String id);
void onImageClick(ViewHolder holder);
void onLikesClick(ViewHolder holder);
void onLike(ViewHolder holder);
void onComment(ViewHolder holder);
}
public class ViewHolder extends RecyclerView.ViewHolder {
@Bind(R.id.avatar)
ImageView avatar;
@Bind(R.id.user)
TextView user;
@Bind(R.id.time)
TextView time;
@Bind(R.id.image)
RatioImageView image;
@Bind(R.id.likes)
TextView likes;
@Bind(R.id.comments)
ViewGroup comments;
public ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this, itemView);
}
@OnClick(R.id.user_container)
void clickUser(View v) {
listener.onUserClick(this);
}
@OnClick(R.id.image_container)
void clickImage(View v) {
listener.onImageClick(this);
}
@OnClick(R.id.likes)
void clickLikes(View v) {
listener.onLikesClick(this);
}
@OnClick(R.id.like)
void like(View v) {
listener.onLike(this);
}
@OnClick(R.id.comment)
void comment(View v) {
listener.onComment(this);
}
}
}