package com.alorma.github.ui.adapter.commit;
import android.content.ClipData;
import android.content.ClipboardManager;
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.ImageView;
import android.widget.TextView;
import com.alorma.github.R;
import com.alorma.github.emoji.EmojiBitmapLoader;
import com.alorma.github.ui.adapter.base.RecyclerArrayAdapter;
import com.alorma.github.ui.view.UserAvatarView;
import com.alorma.github.utils.TextUtils;
import com.mikepenz.octicons_typeface_library.Octicons;
import com.timehop.stickyheadersrecyclerview.StickyRecyclerHeadersAdapter;
import core.User;
import core.repositories.Commit;
import java.io.IOException;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
public class CommitsAdapter extends RecyclerArrayAdapter<Commit, CommitsAdapter.ViewHolder>
implements StickyRecyclerHeadersAdapter<CommitsAdapter.HeaderViewHolder> {
private boolean shortMessage;
private CommitsAdapterListener commitsAdapterListener;
private EmojiBitmapLoader emojiBitmapLoader;
public CommitsAdapter(LayoutInflater inflater, boolean shortMessage) {
super(inflater);
this.shortMessage = shortMessage;
emojiBitmapLoader = new EmojiBitmapLoader();
}
@Override
public CommitsAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ViewHolder(getInflater().inflate(R.layout.row_commit, parent, false));
}
@Override
public void onBindViewHolder(CommitsAdapter.ViewHolder holder, Commit commit) {
bindUser(holder, commit);
bindMessage(holder, commit);
bindSha(holder, commit);
bindFiles(holder, commit);
bindVerification(holder, commit);
bindComments(holder, commit);
}
private void bindComments(ViewHolder holder, Commit commit) {
TextUtils.applyNumToTextView(holder.comments_count, Octicons.Icon.oct_comment_discussion, commit.comment_count);
}
private void bindVerification(ViewHolder holder, Commit commit) {
boolean verifiedCommit = commit.isCommitVerified();
holder.verifiedCommit.setVisibility(verifiedCommit ? View.VISIBLE : View.GONE);
}
private void bindFiles(ViewHolder holder, Commit commit) {
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);
}
}
private void bindSha(ViewHolder holder, Commit commit) {
if (commit.sha != null) {
holder.sha.setText(commit.shortSha());
}
}
private void bindMessage(ViewHolder holder, Commit commit) {
String message = commit.shortMessage();
if (commit.commit != null && commit.commit.getMessage() != null) {
message = commit.commit.getMessage();
}
if (shortMessage) {
try {
holder.title.setText(TextUtils.splitLines(message, 2));
} catch (IOException e) {
e.printStackTrace();
}
} else {
holder.title.setText(message);
}
emojiBitmapLoader.parseTextView(holder.title);
}
private void bindUser(ViewHolder holder, Commit commit) {
User author = getUser(commit);
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());
}
}
}
private User getUser(Commit commit) {
User author = commit.author;
if (author == null) {
author = commit.commit.author;
}
if (author == null) {
author = commit.commit.committer;
}
return author;
}
@Override
public long getHeaderId(int i) {
return getItem(i).days;
}
@Override
public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup viewGroup) {
return new HeaderViewHolder(getInflater().inflate(R.layout.row_header_commit, viewGroup, false));
}
@Override
public void onBindHeaderViewHolder(HeaderViewHolder headerViewHolder, int i) {
Commit commit = getItem(i);
if (commit.commit != null && commit.commit.author != null && commit.commit.author.date != null) {
DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss'Z'");
DateTime dt = formatter.parseDateTime(commit.commit.author.date);
String text = dt.toString("dd MMM yyyy");
headerViewHolder.tv.setText(text);
}
}
public void setCommitsAdapterListener(CommitsAdapterListener commitsAdapterListener) {
this.commitsAdapterListener = commitsAdapterListener;
}
public interface CommitsAdapterListener {
boolean onCommitLongClick(Commit commit);
}
public class ViewHolder extends RecyclerView.ViewHolder {
private final TextView title;
private final TextView user;
private final TextView sha;
private final TextView numFiles;
private final TextView comments_count;
private final UserAvatarView avatar;
private final ImageView verifiedCommit;
public ViewHolder(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(v -> {
if (getCallback() != null) {
Commit commit = getItem(getAdapterPosition());
getCallback().onItemSelected(commit);
}
});
itemView.setOnLongClickListener(v -> {
if (commitsAdapterListener != null) {
Commit commit = getItem(getAdapterPosition());
return commitsAdapterListener.onCommitLongClick(commit);
}
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);
}
}
public class HeaderViewHolder extends RecyclerView.ViewHolder {
private final TextView tv;
public HeaderViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(android.R.id.text1);
}
}
}