package com.xda.one.ui;
import com.dd.xda.CircularProgressButton;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
import com.xda.one.R;
import com.xda.one.api.model.response.ResponseAttachment;
import com.xda.one.auth.XDAAccount;
import com.xda.one.model.augmented.AugmentedPost;
import com.xda.one.parser.TextDataStructure;
import com.xda.one.ui.helper.ActionModeHelper;
import com.xda.one.util.AccountUtils;
import com.xda.one.util.SectionUtils;
import com.xda.one.util.Utils;
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.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class PostAdapter extends RecyclerView.Adapter<PostAdapter.PostViewHolder> {
private final Context mContext;
private final GoToQuoteListener mQuoteListener;
private final View.OnClickListener mMultiQuoteClickListener;
private final ActionModeHelper mModeHelper;
private final LayoutInflater mLayoutInflater;
private final View.OnClickListener mDownloadClickListener;
private final View.OnClickListener mImageClickListener;
private final View.OnClickListener mAvatarClickListener;
private final View.OnClickListener mThanksClickListener;
private final View.OnClickListener mQuoteClickListener;
private List<AugmentedPost> mPosts;
public PostAdapter(final Context context, final ActionModeHelper modeHelper,
final View.OnClickListener downloadClickListener,
final View.OnClickListener imageClickListener,
final View.OnClickListener avatarClickListener,
final View.OnClickListener thanksClickListener,
final View.OnClickListener quoteClickListener,
final View.OnClickListener multiQuoteClickListener,
final GoToQuoteListener quoteListener) {
mContext = context;
mLayoutInflater = LayoutInflater.from(context);
mModeHelper = modeHelper;
mDownloadClickListener = downloadClickListener;
mImageClickListener = imageClickListener;
mAvatarClickListener = avatarClickListener;
mThanksClickListener = new View.OnClickListener() {
@Override
public void onClick(final View v) {
final CircularProgressButton button = (CircularProgressButton) v;
button.setProgress(50);
thanksClickListener.onClick(v);
}
};
mQuoteClickListener = quoteClickListener;
mMultiQuoteClickListener = multiQuoteClickListener;
mQuoteListener = quoteListener;
mPosts = new ArrayList<>();
}
@Override
public PostViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
final View view = mLayoutInflater.inflate(R.layout.post_list_item, parent, false);
return new PostViewHolder(view);
}
@Override
public void onBindViewHolder(PostViewHolder holder, int position) {
final AugmentedPost post = getPost(position);
holder.itemView.setOnClickListener(mModeHelper);
holder.itemView.setOnLongClickListener(mModeHelper);
mModeHelper.updateActivatedState(holder.itemView, position);
holder.userNameView.setText(post.getUserName());
// TODO - make this more efficient
holder.postLayout.removeAllViews();
final TextDataStructure structure = post.getTextDataStructure();
SectionUtils.setupSections(mContext, mLayoutInflater, holder.postLayout, structure,
mQuoteListener);
// Load the avatar into the image view
Picasso.with(mContext)
.load(post.getAvatarUrl())
.placeholder(R.drawable.account_circle)
.error(R.drawable.account_circle)
.into(holder.avatarView);
holder.avatarView.setOnClickListener(mAvatarClickListener);
holder.avatarView.setTag(post.getUserId());
holder.attachments.removeAllViews();
if (post.getAttachments() != null) {
for (final ResponseAttachment responseAttachment : post.getAttachments()) {
if (responseAttachment.hasThumbnail()) {
attachImagesThumbnail(holder, responseAttachment);
} else {
attachFiles(holder, responseAttachment);
}
}
}
holder.dateView.setText(Utils.getRelativeDate(mContext, post.getDateline()));
final XDAAccount account = AccountUtils.getAccount(mContext);
if (account == null) {
holder.actionsLayout.setVisibility(View.GONE);
} else {
holder.quoteButton.setOnClickListener(mQuoteClickListener);
holder.quoteButton.setTag(position);
holder.multiQuoteButton.setOnClickListener(mMultiQuoteClickListener);
holder.multiQuoteButton.setTag(holder.itemView);
if (account.getUserName().equals(post.getUserName())) {
holder.thanksButton.setVisibility(View.GONE);
holder.thanksCount.setVisibility(View.GONE);
} else {
holder.thanksButton.setVisibility(View.VISIBLE);
holder.thanksButton.setOnClickListener(mThanksClickListener);
holder.thanksButton.setProgress(0);
final int drawableRes = post.isThanked()
? R.drawable.ic_thumb_up_dark_outline
: R.drawable.ic_thumb_up_dark;
holder.thanksButton.setImageResource(drawableRes);
holder.thanksButton.setTag(position);
holder.thanksCount.setVisibility(View.VISIBLE);
holder.thanksCount.setText(String.valueOf(post.getThanksCount()));
}
}
}
@Override
public int getItemCount() {
return mPosts.size();
}
private void attachImagesThumbnail(final PostViewHolder holder,
final ResponseAttachment responseAttachment) {
final ViewGroup group = (ViewGroup) mLayoutInflater.inflate(R.layout.attachment_image_view,
holder.attachments, false);
holder.attachments.addView(group);
final ImageView imageView = (ImageView) group.findViewById(R.id.img);
imageView.setOnClickListener(mImageClickListener);
Picasso.with(mContext)
.load(responseAttachment.getAttachmentUrl())
.into(imageView, new Callback() {
@Override
public void onSuccess() {
group.getChildAt(1).setVisibility(View.GONE);
imageView.setOnClickListener(mImageClickListener);
}
@Override
public void onError() {
group.getChildAt(1).setVisibility(View.GONE);
}
});
}
public AugmentedPost getPost(final int position) {
return mPosts.get(position);
}
public void addAll(final List<AugmentedPost> forums) {
if (Utils.isCollectionEmpty(forums)) {
return;
}
final int count = mPosts.size();
mPosts.addAll(forums);
notifyItemRangeInserted(count, forums.size());
}
public void remove(final int position) {
if (position < 0 || position >= mPosts.size()) {
// TODO - maybe throw an exception?
return;
}
mPosts.remove(position);
notifyItemRemoved(position);
}
public void clear() {
final int count = mPosts.size();
mPosts.clear();
notifyItemRangeRemoved(0, count);
}
private void attachFiles(PostViewHolder holder, ResponseAttachment a) {
View group = mLayoutInflater.inflate(R.layout.attachment_file_view, holder.attachments,
false);
holder.attachments.addView(group);
final TextView nameView = (TextView) group.findViewById(R.id.file_name);
final TextView sizeView = (TextView) group.findViewById(R.id.file_size);
Button downloadButton = (Button) group
.findViewById(R.id.download_button);
downloadButton.setOnClickListener(mDownloadClickListener);
downloadButton.setTag(a);
nameView.setText(a.getFileName());
sizeView.setText(a.getFileSize() + " Kb");
}
public List<AugmentedPost> getPosts() {
return Collections.unmodifiableList(mPosts);
}
public AugmentedPost[] getPosts(final Collection<Integer> positions) {
final List<Integer> positionList = new ArrayList<>(positions);
Collections.sort(positionList);
final AugmentedPost[] posts = new AugmentedPost[positionList.size()];
for (int i = 0, positionListSize = positionList.size(); i < positionListSize; i++) {
int position = positionList.get(i);
posts[i] = getPost(position);
}
return posts;
}
public static interface GoToQuoteListener {
public void onClick(final String postId);
}
public static class PostViewHolder extends RecyclerView.ViewHolder {
public final ImageView avatarView;
public final TextView userNameView;
public final TextView dateView;
public final LinearLayout postLayout;
public final ViewGroup attachments;
public final View actionsLayout;
public final CircularProgressButton thanksButton;
public final TextView thanksCount;
private final ImageView quoteButton;
private final ImageView multiQuoteButton;
public PostViewHolder(final View itemView) {
super(itemView);
avatarView = (ImageView) itemView.findViewById(R.id.avatar);
userNameView = (TextView) itemView.findViewById(R.id.user_name);
dateView = (TextView) itemView.findViewById(R.id.date);
attachments = (ViewGroup) itemView.findViewById(R.id.attachments);
postLayout = (LinearLayout) itemView.findViewById(R.id.post_layout);
actionsLayout = itemView.findViewById(R.id.post_list_item_actions_bar);
quoteButton = (ImageView) itemView.findViewById(R.id.post_list_item_quote);
multiQuoteButton = (ImageView) itemView.findViewById(R.id.post_list_item_multi_quote);
thanksButton = (CircularProgressButton) itemView
.findViewById(R.id.post_list_item_thanks);
thanksCount = (TextView) itemView.findViewById(R.id.post_list_item_thanks_count);
}
}
}