package com.fastaccess.ui.adapter.viewholder; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.transition.ChangeBounds; import android.support.transition.TransitionManager; import android.support.v7.widget.AppCompatImageView; import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.fastaccess.R; import com.fastaccess.data.dao.ReviewCommentModel; import com.fastaccess.data.dao.model.ReactionsModel; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.provider.timeline.CommentsHelper; import com.fastaccess.provider.timeline.HtmlHelper; import com.fastaccess.ui.adapter.callback.OnToggleView; import com.fastaccess.ui.adapter.callback.ReactionsCallback; import com.fastaccess.ui.widgets.AvatarLayout; import com.fastaccess.ui.widgets.FontTextView; import com.fastaccess.ui.widgets.SpannableBuilder; import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter; import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder; import butterknife.BindView; /** * Created by Kosh on 15 Feb 2017, 10:29 PM */ public class ReviewCommentsViewHolder extends BaseViewHolder<ReviewCommentModel> { @BindView(R.id.avatarView) AvatarLayout avatarView; @BindView(R.id.name) FontTextView name; @BindView(R.id.date) FontTextView date; @BindView(R.id.comment) FontTextView comment; @BindView(R.id.toggle) AppCompatImageView toggle; @BindView(R.id.toggleHolder) LinearLayout toggleHolder; @BindView(R.id.thumbsUp) FontTextView thumbsUp; @BindView(R.id.thumbsDown) FontTextView thumbsDown; @BindView(R.id.laugh) FontTextView laugh; @BindView(R.id.hurray) FontTextView hurray; @BindView(R.id.sad) FontTextView sad; @BindView(R.id.heart) FontTextView heart; @BindView(R.id.commentMenu) ImageView commentMenu; @BindView(R.id.commentOptions) RelativeLayout commentOptions; @BindView(R.id.reactionsText) FontTextView reactionsText; private OnToggleView onToggleView; private ReactionsCallback reactionsCallback; private ViewGroup viewGroup; @Override public void onClick(View v) { if (v.getId() == R.id.toggle || v.getId() == R.id.toggleHolder) { if (onToggleView != null) { int position = getAdapterPosition(); onToggleView.onToggle(position, !onToggleView.isCollapsed(position)); onToggle(onToggleView.isCollapsed(position), true); } } else { addReactionCount(v); super.onClick(v); } } private ReviewCommentsViewHolder(@NonNull View itemView, ViewGroup viewGroup, @Nullable BaseRecyclerAdapter adapter, @NonNull OnToggleView onToggleView, @NonNull ReactionsCallback reactionsCallback) { super(itemView, adapter); this.onToggleView = onToggleView; this.viewGroup = viewGroup; this.reactionsCallback = reactionsCallback; itemView.setOnClickListener(null); itemView.setOnLongClickListener(null); commentMenu.setOnClickListener(this); toggleHolder.setOnClickListener(this); laugh.setOnClickListener(this); sad.setOnClickListener(this); thumbsDown.setOnClickListener(this); thumbsUp.setOnClickListener(this); hurray.setOnClickListener(this); laugh.setOnLongClickListener(this); sad.setOnLongClickListener(this); thumbsDown.setOnLongClickListener(this); thumbsUp.setOnLongClickListener(this); hurray.setOnLongClickListener(this); heart.setOnLongClickListener(this); heart.setOnClickListener(this); } public static ReviewCommentsViewHolder newInstance(ViewGroup viewGroup, BaseRecyclerAdapter adapter, @NonNull OnToggleView onToggleView, @NonNull ReactionsCallback reactionsCallback) { return new ReviewCommentsViewHolder(getView(viewGroup, R.layout.review_comments_row_item), viewGroup, adapter, onToggleView, reactionsCallback); } @Override public void bind(@NonNull ReviewCommentModel commentModel) { avatarView.setUrl(commentModel.getUser().getAvatarUrl(), commentModel.getUser().getLogin(), commentModel.getUser().isOrganizationType()); name.setText(commentModel.getUser().getLogin()); date.setText(ParseDateFormat.getTimeAgo(commentModel.getCreatedAt())); if (!InputHelper.isEmpty(commentModel.getBodyHtml())) { HtmlHelper.htmlIntoTextView(comment, commentModel.getBodyHtml()); } else { comment.setText(""); } if (commentModel.getReactions() != null) { ReactionsModel reaction = commentModel.getReactions(); appendEmojies(reaction); } if (onToggleView != null) onToggle(onToggleView.isCollapsed(getAdapterPosition()), false); } private void addReactionCount(View v) { if (adapter != null) { ReviewCommentModel comment = (ReviewCommentModel) adapter.getItem(getAdapterPosition()); if (comment != null) { boolean isReacted = reactionsCallback == null || reactionsCallback.isPreviouslyReacted(comment.getId(), v.getId()); boolean isCallingApi = reactionsCallback != null && reactionsCallback.isCallingApi(comment.getId(), v.getId()); ReactionsModel reactionsModel = comment.getReactions() != null ? comment.getReactions() : new ReactionsModel(); switch (v.getId()) { case R.id.heart: reactionsModel.setHeart(!isReacted ? reactionsModel.getHeart() + 1 : reactionsModel.getHeart() - 1); break; case R.id.sad: reactionsModel.setConfused(!isReacted ? reactionsModel.getConfused() + 1 : reactionsModel.getConfused() - 1); break; case R.id.thumbsDown: reactionsModel.setMinusOne(!isReacted ? reactionsModel.getMinusOne() + 1 : reactionsModel.getMinusOne() - 1); break; case R.id.thumbsUp: reactionsModel.setPlusOne(!isReacted ? reactionsModel.getPlusOne() + 1 : reactionsModel.getPlusOne() - 1); break; case R.id.laugh: reactionsModel.setLaugh(!isReacted ? reactionsModel.getLaugh() + 1 : reactionsModel.getLaugh() - 1); break; case R.id.hurray: reactionsModel.setHooray(!isReacted ? reactionsModel.getHooray() + 1 : reactionsModel.getHooray() - 1); break; } comment.setReactions(reactionsModel); appendEmojies(reactionsModel); } } } private void appendEmojies(ReactionsModel reaction) { SpannableBuilder spannableBuilder = SpannableBuilder.builder(); reactionsText.setText(""); thumbsUp.setText(SpannableBuilder.builder() .append(CommentsHelper.getThumbsUp()).append(" ") .append(String.valueOf(reaction.getPlusOne())) .append(" ")); thumbsDown.setText(SpannableBuilder.builder() .append(CommentsHelper.getThumbsDown()).append(" ") .append(String.valueOf(reaction.getMinusOne())) .append(" ")); hurray.setText(SpannableBuilder.builder() .append(CommentsHelper.getHooray()).append(" ") .append(String.valueOf(reaction.getHooray())) .append(" ")); sad.setText(SpannableBuilder.builder() .append(CommentsHelper.getSad()).append(" ") .append(String.valueOf(reaction.getConfused())) .append(" ")); laugh.setText(SpannableBuilder.builder() .append(CommentsHelper.getLaugh()).append(" ") .append(String.valueOf(reaction.getLaugh())) .append(" ")); heart.setText(SpannableBuilder.builder() .append(CommentsHelper.getHeart()).append(" ") .append(String.valueOf(reaction.getHeart()))); if (reaction.getPlusOne() > 0) { spannableBuilder.append(CommentsHelper.getThumbsUp()) .append(" ") .append(String.valueOf(reaction.getPlusOne())) .append(" "); } if (reaction.getMinusOne() > 0) { spannableBuilder.append(CommentsHelper.getThumbsDown()) .append(" ") .append(String.valueOf(reaction.getMinusOne())) .append(" "); } if (reaction.getLaugh() > 0) { spannableBuilder.append(CommentsHelper.getLaugh()) .append(" ") .append(String.valueOf(reaction.getLaugh())) .append(" "); } if (reaction.getHooray() > 0) { spannableBuilder.append(CommentsHelper.getHooray()) .append(" ") .append(String.valueOf(reaction.getHooray())) .append(" "); } if (reaction.getConfused() > 0) { spannableBuilder.append(CommentsHelper.getSad()) .append(" ") .append(String.valueOf(reaction.getConfused())) .append(" "); } if (reaction.getHeart() > 0) { spannableBuilder.append(CommentsHelper.getHeart()) .append(" ") .append(String.valueOf(reaction.getHeart())); } if (spannableBuilder.length() > 0) { reactionsText.setText(spannableBuilder); if (!onToggleView.isCollapsed(getAdapterPosition())) { reactionsText.setVisibility(View.VISIBLE); } } else { reactionsText.setVisibility(View.GONE); } } private void onToggle(boolean expanded, boolean animate) { if (animate) { TransitionManager.beginDelayedTransition(viewGroup, new ChangeBounds()); } toggle.setRotation(!expanded ? 0.0F : 180F); commentOptions.setVisibility(!expanded ? View.GONE : View.VISIBLE); if (!InputHelper.isEmpty(reactionsText)) { reactionsText.setVisibility(!expanded ? View.VISIBLE : View.GONE); } } }