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 com.fastaccess.R;
import com.fastaccess.data.dao.GroupedReviewModel;
import com.fastaccess.data.dao.ReviewCommentModel;
import com.fastaccess.data.dao.TimelineModel;
import com.fastaccess.helper.ViewHelper;
import com.fastaccess.ui.adapter.ReviewCommentsAdapter;
import com.fastaccess.ui.adapter.callback.OnToggleView;
import com.fastaccess.ui.adapter.callback.ReactionsCallback;
import com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.timeline.timeline.PullRequestTimelineMvp;
import com.fastaccess.ui.widgets.DiffLineSpan;
import com.fastaccess.ui.widgets.FontTextView;
import com.fastaccess.ui.widgets.ForegroundImageView;
import com.fastaccess.ui.widgets.recyclerview.BaseRecyclerAdapter;
import com.fastaccess.ui.widgets.recyclerview.BaseViewHolder;
import com.fastaccess.ui.widgets.recyclerview.DynamicRecyclerView;
import butterknife.BindView;
/**
* Created by Kosh on 13 Dec 2016, 1:42 AM
*/
public class GroupedReviewsViewHolder extends BaseViewHolder<TimelineModel> implements BaseViewHolder.OnItemClickListener<ReviewCommentModel> {
@BindView(R.id.stateImage) ForegroundImageView stateImage;
@BindView(R.id.nestedRecyclerView) DynamicRecyclerView nestedRecyclerView;
@BindView(R.id.name) FontTextView name;
@BindView(R.id.toggle) ForegroundImageView toggle;
@BindView(R.id.patch) FontTextView patch;
@BindView(R.id.minimized) View minimized;
private final int patchAdditionColor;
private final int patchDeletionColor;
private final int patchRefColor;
private OnToggleView onToggleView;
private ReactionsCallback reactionsCallback;
private String pathText;
private PullRequestTimelineMvp.ReviewCommentCallback reviewCommentCallback;
private ViewGroup viewGroup;
@Override public void onClick(View v) {
int position = getAdapterPosition();
onToggleView.onToggle(position, !onToggleView.isCollapsed(position));
onToggle(onToggleView.isCollapsed(position), true);
}
private GroupedReviewsViewHolder(@NonNull View itemView, ViewGroup viewGroup, @Nullable BaseRecyclerAdapter adapter,
@NonNull OnToggleView onToggleView,
@NonNull ReactionsCallback reactionsCallback,
@NonNull PullRequestTimelineMvp.ReviewCommentCallback reviewCommentCallback) {
super(itemView, adapter);
this.onToggleView = onToggleView;
this.viewGroup = viewGroup;
this.reactionsCallback = reactionsCallback;
this.reviewCommentCallback = reviewCommentCallback;
patchAdditionColor = ViewHelper.getPatchAdditionColor(itemView.getContext());
patchDeletionColor = ViewHelper.getPatchDeletionColor(itemView.getContext());
patchRefColor = ViewHelper.getPatchRefColor(itemView.getContext());
this.onToggleView = onToggleView;
nestedRecyclerView.setNestedScrollingEnabled(false);
}
public static GroupedReviewsViewHolder newInstance(ViewGroup viewGroup, BaseRecyclerAdapter adapter,
@NonNull OnToggleView onToggleView,
@NonNull ReactionsCallback reactionsCallback,
@NonNull PullRequestTimelineMvp.ReviewCommentCallback reviewCommentCallback) {
return new GroupedReviewsViewHolder(getView(viewGroup, R.layout.grouped_review_timeline_row_item), viewGroup, adapter,
onToggleView, reactionsCallback, reviewCommentCallback);
}
@Override public void bind(@NonNull TimelineModel model) {
GroupedReviewModel groupedReviewModel = model.getGroupedReview();
this.pathText = groupedReviewModel.getDiffText();
name.setText(groupedReviewModel.getPath());
stateImage.setImageResource(R.drawable.ic_eye);
if (groupedReviewModel.getComments() == null || groupedReviewModel.getComments().isEmpty()) {
nestedRecyclerView.setVisibility(View.GONE);
nestedRecyclerView.setAdapter(null);
} else {
nestedRecyclerView.setVisibility(View.VISIBLE);
nestedRecyclerView.setAdapter(new ReviewCommentsAdapter(groupedReviewModel.getComments(), this, onToggleView, reactionsCallback));
nestedRecyclerView.addDivider();
}
onToggle(onToggleView.isCollapsed(getAdapterPosition()), false);
}
@Override public void onItemClick(int position, View v, ReviewCommentModel item) {
if (reviewCommentCallback != null) {
reviewCommentCallback.onClick(getAdapterPosition(), position, v, item);
}
}
@Override public void onItemLongClick(int position, View v, ReviewCommentModel item) {
if (reviewCommentCallback != null) {
reviewCommentCallback.onLongClick(getAdapterPosition(), position, v, item);
}
}
private void onToggle(boolean expanded, boolean animate) {
if (animate) {
TransitionManager.beginDelayedTransition(viewGroup, new ChangeBounds());
}
if (!expanded) {
minimized.setVisibility(View.GONE);
patch.setText("");
name.setMaxLines(2);
toggle.setRotation(0.0f);
} else {
minimized.setVisibility(View.VISIBLE);
name.setMaxLines(5);
setPatchText(pathText);
toggle.setRotation(180f);
}
}
private void setPatchText(@NonNull String text) {
patch.setText(DiffLineSpan.getSpannable(text, patchAdditionColor, patchDeletionColor, patchRefColor, true));
}
}