package com.alorma.github.ui.adapter.commit;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import com.alorma.github.R;
import com.alorma.github.sdk.bean.dto.response.GitCommitVerification;
import com.alorma.github.sdk.bean.info.CommitInfo;
import com.alorma.github.sdk.bean.info.RepoInfo;
import com.alorma.github.sdk.bean.issue.IssueStoryDetail;
import com.alorma.github.sdk.bean.issue.IssueStoryReviewComment;
import com.alorma.github.sdk.bean.issue.IssueStoryReviewComments;
import com.alorma.github.sdk.bean.issue.PullRequestStoryCommit;
import com.alorma.github.ui.activity.CommitDetailActivity;
import com.alorma.github.ui.adapter.base.RecyclerArrayAdapter;
import com.alorma.github.ui.view.UserAvatarView;
import com.alorma.github.ui.view.issue.ReviewCommentView;
import com.alorma.github.utils.TextUtils;
import com.mikepenz.iconics.IconicsDrawable;
import com.mikepenz.octicons_typeface_library.Octicons;
import core.User;
import core.repositories.Commit;
import java.io.IOException;
public class PullRequestCommitsReviewCommentsAdapter
extends RecyclerArrayAdapter<IssueStoryDetail, PullRequestCommitsReviewCommentsAdapter.Holder> {
private static final int VIEW_INVALID = -1;
private static final int VIEW_COMMIT = 0;
private static final int VIEW_REVIEW = 1;
private boolean shortMessage;
private RepoInfo repoInfo;
public PullRequestCommitsReviewCommentsAdapter(LayoutInflater inflater, boolean shortMessage, RepoInfo repoInfo) {
super(inflater);
this.shortMessage = shortMessage;
this.repoInfo = repoInfo;
}
@Override
public PullRequestCommitsReviewCommentsAdapter.Holder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == VIEW_COMMIT) {
return new CommitViewHolder(getInflater().inflate(R.layout.row_commit, parent, false));
} else if (viewType == VIEW_REVIEW) {
return new ReviewCommentHolder(getInflater().inflate(R.layout.timeline_review_comment, parent, false));
} else {
return new Holder(getInflater().inflate(android.R.layout.simple_list_item_1, parent, false));
}
}
@Override
public void onBindViewHolder(PullRequestCommitsReviewCommentsAdapter.Holder holder, IssueStoryDetail detail) {
if (detail instanceof PullRequestStoryCommit) {
Commit commit = ((PullRequestStoryCommit) detail).commit;
handleCommit((CommitViewHolder) holder, commit);
} else if (detail instanceof IssueStoryReviewComment) {
handleReviewComment((ReviewCommentHolder) holder, (IssueStoryReviewComment) detail);
} else if (detail instanceof IssueStoryReviewComments) {
handleReviewComments((ReviewCommentHolder) holder, (IssueStoryReviewComments) detail);
}
}
private void handleCommit(CommitViewHolder holder, Commit commit) {
User author = commit.author;
if (author == null) {
author = commit.commit.author;
}
if (author == null) {
author = commit.commit.committer;
}
if (author != null) {
holder.avatar.setUser(author);
if (author.getLogin() != null) {
holder.user.setText(author.getLogin());
} else if (author.getName() != null) {
holder.user.setText(author.getName());
} else if (author.getEmail() != null) {
holder.user.setText(author.getEmail());
}
}
String message = commit.shortMessage();
if (commit.commit != null && commit.commit.shortMessage() != null) {
message = commit.commit.shortMessage();
}
if (shortMessage) {
try {
holder.title.setText(TextUtils.splitLines(message, 2));
} catch (IOException e) {
e.printStackTrace();
}
} else {
holder.title.setText(message);
}
if (commit.sha != null) {
holder.sha.setText(commit.shortSha());
}
if (commit.files != null && commit.files.size() > 0) {
holder.numFiles.setVisibility(View.VISIBLE);
holder.numFiles.setText(holder.itemView.getContext().getString(R.string.num_of_files, commit.files.size()));
} else {
holder.numFiles.setVisibility(View.GONE);
}
holder.comments_count.setText(String.valueOf(commit.comment_count));
applyIcon(holder.comments_count, Octicons.Icon.oct_comment_discussion);
bindVerification(holder, commit);
}
private void bindVerification(CommitViewHolder holder, Commit commit) {
boolean verifiedCommit = commit.isCommitVerified();
holder.verifiedCommit.setVisibility(verifiedCommit ? View.VISIBLE : View.GONE);
}
private boolean isCommitVerified(Commit commit) {
GitCommitVerification verification = commit.commit.verification;
return verification != null && verification.verified;
}
private void applyIcon(TextView textView, Octicons.Icon value) {
IconicsDrawable drawableForks = new IconicsDrawable(textView.getContext(), value);
drawableForks.sizeRes(R.dimen.textSizeSmall);
drawableForks.colorRes(R.color.icons);
textView.setCompoundDrawables(null, null, drawableForks, null);
int offset = textView.getResources().getDimensionPixelOffset(R.dimen.textSizeSmall);
textView.setCompoundDrawablePadding(offset);
}
private void handleReviewComment(ReviewCommentHolder holder, IssueStoryReviewComment comment) {
holder.reviewCommentView.setReviewComment(comment, repoInfo);
}
private void handleReviewComments(ReviewCommentHolder holder, IssueStoryReviewComments comments) {
holder.reviewCommentView.setReviewComments(comments, repoInfo);
}
@Override
public int getItemViewType(int position) {
super.getItemViewType(position);
if (getItem(position) instanceof PullRequestStoryCommit) {
return VIEW_COMMIT;
} else if (getItem(position) instanceof IssueStoryReviewComment) {
return VIEW_REVIEW;
}
return VIEW_INVALID;
}
public class CommitViewHolder extends Holder {
private final TextView title;
private final TextView user;
private final TextView sha;
private final TextView numFiles;
private final UserAvatarView avatar;
private final TextView comments_count;
private final ImageView verifiedCommit;
public CommitViewHolder(final View itemView) {
super(itemView);
title = (TextView) itemView.findViewById(R.id.title);
user = (TextView) itemView.findViewById(R.id.user);
sha = (TextView) itemView.findViewById(R.id.sha);
numFiles = (TextView) itemView.findViewById(R.id.numFiles);
comments_count = (TextView) itemView.findViewById(R.id.comments_count);
avatar = (UserAvatarView) itemView.findViewById(R.id.avatarAuthor);
verifiedCommit = (ImageView) itemView.findViewById(R.id.verifiedCommit);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (getItem(getAdapterPosition()) instanceof PullRequestStoryCommit) {
Commit commit = ((PullRequestStoryCommit) getItem(getAdapterPosition())).commit;
CommitInfo info = new CommitInfo();
info.repoInfo = repoInfo;
info.sha = commit.sha;
Intent intent = CommitDetailActivity.launchIntent(v.getContext(), info);
v.getContext().startActivity(intent);
}
}
});
itemView.setOnLongClickListener(v -> {
if (getItem(getAdapterPosition()) instanceof PullRequestStoryCommit) {
Commit item = ((PullRequestStoryCommit) getItem(getAdapterPosition())).commit;
copy(item.shortSha());
Toast.makeText(itemView.getContext(), itemView.getContext().getString(R.string.sha_copied, item.shortSha()), Toast.LENGTH_SHORT)
.show();
}
return true;
});
}
public void copy(String text) {
ClipboardManager clipboard = (ClipboardManager) itemView.getContext().getSystemService(Context.CLIPBOARD_SERVICE);
ClipData clip = ClipData.newPlainText("Gitskarios", text);
clipboard.setPrimaryClip(clip);
}
}
private class ReviewCommentHolder extends Holder {
private ReviewCommentView reviewCommentView;
public ReviewCommentHolder(View itemView) {
super(itemView);
reviewCommentView = (ReviewCommentView) itemView.findViewById(R.id.review);
}
}
public class Holder extends RecyclerView.ViewHolder {
public Holder(View itemView) {
super(itemView);
}
}
}