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.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.fastaccess.R;
import com.fastaccess.data.dao.TimelineModel;
import com.fastaccess.data.dao.model.Issue;
import com.fastaccess.data.dao.model.PullRequest;
import com.fastaccess.data.dao.model.ReactionsModel;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.Logger;
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 13 Dec 2016, 1:03 AM
*/
public class IssueDetailsViewHolder extends BaseViewHolder<TimelineModel> {
@BindView(R.id.avatarView) AvatarLayout avatar;
@BindView(R.id.date) FontTextView date;
@BindView(R.id.name) FontTextView name;
@BindView(R.id.comment) FontTextView comment;
@BindView(R.id.thumbsUp) FontTextView thumbsUp;
@BindView(R.id.thumbsDown) FontTextView thumbsDown;
@BindView(R.id.laugh) FontTextView laugh;
@BindView(R.id.sad) FontTextView sad;
@BindView(R.id.hurray) FontTextView hooray;
@BindView(R.id.heart) FontTextView heart;
@BindView(R.id.toggle) View toggle;
@BindView(R.id.commentMenu) View commentMenu;
@BindView(R.id.commentOptions) View commentOptions;
@BindView(R.id.toggleHolder) View toggleHolder;
@BindView(R.id.emojiesList) View emojiesList;
@BindView(R.id.reactionsText) TextView reactionsText;
private OnToggleView onToggleView;
private ReactionsCallback reactionsCallback;
private ViewGroup viewGroup;
private IssueDetailsViewHolder(@NonNull View itemView, @NonNull 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);
hooray.setOnClickListener(this);
laugh.setOnLongClickListener(this);
sad.setOnLongClickListener(this);
thumbsDown.setOnLongClickListener(this);
thumbsUp.setOnLongClickListener(this);
hooray.setOnLongClickListener(this);
heart.setOnLongClickListener(this);
heart.setOnClickListener(this);
}
public static IssueDetailsViewHolder newInstance(@NonNull ViewGroup viewGroup, @Nullable BaseRecyclerAdapter adapter,
@NonNull OnToggleView onToggleView, @NonNull ReactionsCallback reactionsCallback) {
return new IssueDetailsViewHolder(getView(viewGroup, R.layout.issue_detail_header_row_item), viewGroup,
adapter, onToggleView, reactionsCallback);
}
@Override public void bind(@NonNull TimelineModel timelineModel) {
if (timelineModel.getIssue() != null) {
bind(timelineModel.getIssue());
} else if (timelineModel.getPullRequest() != null) {
bind(timelineModel.getPullRequest());
}
if (onToggleView != null) onToggle(onToggleView.isCollapsed(getAdapterPosition()), false);
}
@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 void addReactionCount(View v) {
if (adapter != null) {
TimelineModel timelineModel = (TimelineModel) adapter.getItem(getAdapterPosition());
Logger.e(timelineModel);
if (timelineModel == null) return;
ReactionsModel reactionsModel = null;
PullRequest pullRequest = timelineModel.getPullRequest();
Issue issue = timelineModel.getIssue();
int number = 0;
if (pullRequest != null) {
reactionsModel = pullRequest.getReactions();
number = pullRequest.getNumber();
} else if (issue != null) {
reactionsModel = issue.getReactions();
number = issue.getNumber();
}
if (reactionsModel == null) reactionsModel = new ReactionsModel();
boolean isReacted = reactionsCallback == null || reactionsCallback.isPreviouslyReacted(number, v.getId());
boolean isCallingApi = reactionsCallback != null && reactionsCallback.isCallingApi(number, v.getId());
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;
}
if (pullRequest != null) {
pullRequest.setReactions(reactionsModel);
appendEmojies(reactionsModel);
timelineModel.setPullRequest(pullRequest);
} else if (issue != null) {
issue.setReactions(reactionsModel);
appendEmojies(reactionsModel);
timelineModel.setIssue(issue);
}
}
}
private void bind(@NonNull Issue issueModel) {
avatar.setUrl(issueModel.getUser().getAvatarUrl(), issueModel.getUser().getLogin());
name.setText(issueModel.getUser().getLogin());
date.setText(ParseDateFormat.getTimeAgo(issueModel.getCreatedAt()));
if (!InputHelper.isEmpty(issueModel.getBodyHtml())) {
HtmlHelper.htmlIntoTextView(comment, issueModel.getBodyHtml());
} else {
comment.setText(R.string.no_description_provided);
}
if (issueModel.getReactions() != null) {
appendEmojies(issueModel.getReactions());
}
}
private void bind(@NonNull PullRequest pullRequest) {
avatar.setUrl(pullRequest.getUser().getAvatarUrl(), pullRequest.getUser().getLogin());
name.setText(pullRequest.getUser().getLogin());
date.setText(ParseDateFormat.getTimeAgo(pullRequest.getCreatedAt()));
if (!InputHelper.isEmpty(pullRequest.getBodyHtml())) {
HtmlHelper.htmlIntoTextView(comment, pullRequest.getBodyHtml());
} else {
comment.setText(R.string.no_description_provided);
}
if (pullRequest.getReactions() != null) {
appendEmojies(pullRequest.getReactions());
}
}
private void appendEmojies(@NonNull 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(" "));
hooray.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);
}
}
}