package com.alorma.github.ui.view.issue; import android.annotation.TargetApi; import android.content.Context; import android.content.Intent; import android.os.Build; import android.text.SpannableStringBuilder; import android.util.AttributeSet; import android.util.Log; import android.util.Pair; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; import com.alorma.github.R; import com.alorma.github.sdk.bean.dto.response.ReviewComment; import com.alorma.github.sdk.bean.info.FileInfo; import com.alorma.github.sdk.bean.info.RepoInfo; import com.alorma.github.sdk.bean.issue.IssueStoryReviewComment; import com.alorma.github.sdk.bean.issue.IssueStoryReviewComments; import com.alorma.github.ui.activity.FileActivity; import com.alorma.github.ui.view.DiffTextView; import com.alorma.github.ui.view.UserAvatarView; import com.gh4a.utils.UiUtils; import com.github.mobile.util.HtmlUtils; import com.github.mobile.util.HttpImageGetter; import com.mikepenz.iconics.IconicsDrawable; import com.mikepenz.iconics.typeface.IIcon; import com.mikepenz.materialize.color.Material; import com.mikepenz.octicons_typeface_library.Octicons; import java.util.Arrays; import java.util.List; import tk.zielony.naturaldateformat.NaturalDateFormat; import tk.zielony.naturaldateformat.RelativeDateFormat; public class ReviewCommentView extends LinearLayout { private static final int ICON_ROUNDED_CORNER_DP = 16; private static final int ICON_SIZE = 30; private static final int ICON_PADDING = 6; private static final int MAX_LINES = 7; private ViewGroup parent; private UserAvatarView profileIcon; private TextView userLogin; private TextView createdAt; private TextView bodyText; private TextView textDiffFileTitle; private DiffTextView textDiff; public ReviewCommentView(Context context, ViewGroup parent) { super(context); this.parent = parent; init(); } public ReviewCommentView(Context context, AttributeSet attrs) { super(context, attrs); init(); } public ReviewCommentView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); init(); } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public ReviewCommentView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { super(context, attrs, defStyleAttr, defStyleRes); init(); } private void init() { inflate(getContext(), R.layout.issue_detail_issue_timeline_review_secondary_view, this); profileIcon = (UserAvatarView) findViewById(R.id.profileIcon); userLogin = (TextView) findViewById(R.id.userLogin); createdAt = (TextView) findViewById(R.id.createdAt); bodyText = (TextView) findViewById(R.id.bodyText); textDiffFileTitle = (TextView) findViewById(R.id.textDiffFileTitle); textDiff = (DiffTextView) findViewById(R.id.textDiff); setOrientation(HORIZONTAL); } public void setReviewComment(IssueStoryReviewComment reviewComment, RepoInfo repoInfo) { long time = System.currentTimeMillis(); ReviewComment event = reviewComment.event; String htmlCode = HtmlUtils.format(event.body).toString(); HttpImageGetter imageGetter = new HttpImageGetter(getContext()); imageGetter.repoInfo(repoInfo); imageGetter.bind(bodyText, htmlCode, reviewComment.hashCode()); bodyText.setMovementMethod(UiUtils.CHECKING_LINK_METHOD); textDiff.setText(splitDiffHunk(event.diff_hunk)); textDiffFileTitle.setText(event.path); setIcon(Octicons.Icon.oct_code); userLogin.setText(reviewComment.user().getLogin()); createdAt.setText(getTime(reviewComment.created_at)); textDiff.setOnClickListener(v -> { FileInfo info = new FileInfo(); info.content = event.diff_hunk; info.name = event.path; Intent launcherIntent = FileActivity.createLauncherIntent(getContext(), info); getContext().startActivity(launcherIntent); }); Log.i("PR_time_review", (System.currentTimeMillis() - time) + "ms"); } public void setReviewComments(IssueStoryReviewComments reviewComments, RepoInfo repoInfo) { long time = System.currentTimeMillis(); Pair<String, List<ReviewComment>> event = reviewComments.event; userLogin.setText(reviewComments.user().getLogin()); createdAt.setText(getTime(reviewComments.createdAt())); textDiff.setText(splitDiffHunk(event.first)); textDiffFileTitle.setText(event.second.get(0).path); setIcon(Octicons.Icon.oct_code); textDiff.setOnClickListener(v -> { FileInfo info = new FileInfo(); info.content = event.second.get(0).diff_hunk; info.name = event.second.get(0).path; Intent launcherIntent = FileActivity.createLauncherIntent(getContext(), info); getContext().startActivity(launcherIntent); }); StringBuilder builder = new StringBuilder(); for (ReviewComment reviewComment : event.second) { builder.append("<b>"); builder.append(reviewComment.user.getLogin()); builder.append(":"); builder.append("</b>"); builder.append("<br />"); builder.append(reviewComment.body); builder.append("<br />"); builder.append("<br />"); } String htmlCode = HtmlUtils.format(builder.toString()).toString(); HttpImageGetter imageGetter = new HttpImageGetter(getContext()); imageGetter.repoInfo(repoInfo); imageGetter.bind(bodyText, htmlCode, event.first.hashCode()); bodyText.setMovementMethod(UiUtils.CHECKING_LINK_METHOD); Log.i("PR_time_reviews", (System.currentTimeMillis() - time) + "ms"); } private String splitDiffHunk(String hunk) { List<String> lines = Arrays.asList(hunk.split("\\r?\\n|\\r")); int min = Math.min(MAX_LINES, lines.size()); min = Math.max(0, lines.size() - 1 - min); List<String> splitLines = lines.subList(min, lines.size()); SpannableStringBuilder builder = new SpannableStringBuilder(); for (String splitLine : splitLines) { builder.append(splitLine); builder.append("\n"); } return builder.toString(); } private void setIcon(IIcon icon) { IconicsDrawable drawable = new IconicsDrawable(getContext()); drawable.backgroundColor(Material.Grey._300.getAsColor()); drawable.color(Material.Grey._700.getAsColor()); drawable.roundedCornersDp(ICON_ROUNDED_CORNER_DP); drawable.sizeDp(ICON_SIZE); drawable.paddingDp(ICON_PADDING); profileIcon.setImageDrawable(drawable.icon(icon)); } private String getTime(long time) { RelativeDateFormat relFormat = new RelativeDateFormat(getContext(), NaturalDateFormat.DATE); return relFormat.format(time); } }