mirror of
https://github.com/k0shk0sh/FastHub.git
synced 2025-12-08 19:05:54 +00:00
203 lines
11 KiB
Java
203 lines
11 KiB
Java
package com.fastaccess.provider.timeline;
|
|
|
|
import android.content.Context;
|
|
import android.graphics.Color;
|
|
import android.support.annotation.NonNull;
|
|
import android.support.annotation.Nullable;
|
|
import android.text.style.BackgroundColorSpan;
|
|
|
|
import com.fastaccess.R;
|
|
import com.fastaccess.data.dao.LabelModel;
|
|
import com.fastaccess.data.dao.model.User;
|
|
import com.fastaccess.data.dao.timeline.GenericEvent;
|
|
import com.fastaccess.data.dao.timeline.SourceModel;
|
|
import com.fastaccess.data.dao.types.IssueEventType;
|
|
import com.fastaccess.helper.InputHelper;
|
|
import com.fastaccess.helper.ParseDateFormat;
|
|
import com.fastaccess.helper.PrefGetter;
|
|
import com.fastaccess.helper.ViewHelper;
|
|
import com.fastaccess.ui.widgets.SpannableBuilder;
|
|
import com.zzhoujay.markdown.style.CodeSpan;
|
|
|
|
import java.util.Date;
|
|
|
|
/**
|
|
* Created by Kosh on 20 Apr 2017, 7:18 PM
|
|
*/
|
|
|
|
public class TimelineProvider {
|
|
|
|
@NonNull public static SpannableBuilder getStyledEvents(@NonNull GenericEvent issueEventModel,
|
|
@NonNull Context context, boolean isMerged) {
|
|
IssueEventType event = issueEventModel.getEvent();
|
|
SpannableBuilder spannableBuilder = SpannableBuilder.builder();
|
|
Date date = issueEventModel.getCreatedAt() != null
|
|
? issueEventModel.getCreatedAt()
|
|
: issueEventModel.getAuthor() != null
|
|
? issueEventModel.getAuthor().getDate() : null;
|
|
if (event != null) {
|
|
String to = context.getString(R.string.to);
|
|
String from = context.getString(R.string.from);
|
|
String thisString = context.getString(R.string.this_value);
|
|
String in = context.getString(R.string.in_value);
|
|
if (event == IssueEventType.labeled || event == IssueEventType.unlabeled) {
|
|
if (issueEventModel.getAssignee() != null && issueEventModel.getAssigner() != null) {
|
|
spannableBuilder.bold(issueEventModel.getAssigner().getLogin());
|
|
} else if (issueEventModel.getActor() != null) {
|
|
spannableBuilder.bold(issueEventModel.getActor().getLogin());
|
|
}
|
|
spannableBuilder.append(" ").append(event.name().replaceAll("_", " "));
|
|
LabelModel labelModel = issueEventModel.getLabel();
|
|
int color = Color.parseColor("#" + labelModel.getColor());
|
|
spannableBuilder.append(" ").append(" " + labelModel.getName() + " ", new CodeSpan(color, ViewHelper.generateTextColor(color), 5));
|
|
spannableBuilder.append(" ").append(getDate(issueEventModel.getCreatedAt()));
|
|
} else if (event == IssueEventType.committed) {
|
|
spannableBuilder.append(issueEventModel.getMessage().replaceAll("\n", " "))
|
|
.append(" ")
|
|
.url(substring(issueEventModel.getSha()));
|
|
} else {
|
|
User user = null;
|
|
if (issueEventModel.getAssignee() != null && issueEventModel.getAssigner() != null) {
|
|
user = issueEventModel.getAssigner();
|
|
} else if (issueEventModel.getActor() != null) {
|
|
user = issueEventModel.getActor();
|
|
} else if (issueEventModel.getAuthor() != null) {
|
|
user = issueEventModel.getAuthor();
|
|
}
|
|
if (user != null) {
|
|
spannableBuilder.bold(user.getLogin());
|
|
}
|
|
if ((event == IssueEventType.review_requested || (event == IssueEventType.review_dismissed ||
|
|
event == IssueEventType.review_request_removed)) && user != null) {
|
|
appendReviews(issueEventModel, event, spannableBuilder, from, issueEventModel.getReviewRequester());
|
|
} else if (event == IssueEventType.closed || event == IssueEventType.reopened) {
|
|
if (isMerged) {
|
|
spannableBuilder.append(" ").append(IssueEventType.merged.name());
|
|
} else {
|
|
spannableBuilder
|
|
.append(" ")
|
|
.append(event.name().replaceAll("_", " "))
|
|
.append(" ")
|
|
.append(thisString);
|
|
}
|
|
if (issueEventModel.getCommitId() != null) {
|
|
spannableBuilder
|
|
.append(" ")
|
|
.append(in)
|
|
.append(" ")
|
|
.url(substring(issueEventModel.getCommitId()));
|
|
}
|
|
} else if (event == IssueEventType.assigned || event == IssueEventType.unassigned) {
|
|
spannableBuilder
|
|
.append(" ");
|
|
if (user != null && user.getLogin().equalsIgnoreCase(issueEventModel.getAssignee().getLogin())) {
|
|
spannableBuilder
|
|
.append(event == IssueEventType.assigned ? "self-assigned this" : "removed their assignment");
|
|
} else {
|
|
spannableBuilder
|
|
.append(event == IssueEventType.assigned ? "assigned" : "unassigned");
|
|
spannableBuilder
|
|
.append(" ")
|
|
.bold(issueEventModel.getAssignee().getLogin());
|
|
}
|
|
} else if (event == IssueEventType.locked || event == IssueEventType.unlocked) {
|
|
spannableBuilder
|
|
.append(" ")
|
|
.append(event == IssueEventType.locked ? "locked and limited conversation to collaborators" : "unlocked this " +
|
|
"conversation");
|
|
} else if (event == IssueEventType.head_ref_deleted || event == IssueEventType.head_ref_restored) {
|
|
spannableBuilder.append(" ").append(event.name().replaceAll("_", " "),
|
|
new BackgroundColorSpan(HtmlHelper.getWindowBackground(PrefGetter.getThemeType())));
|
|
} else {
|
|
spannableBuilder.append(" ").append(event.name().replaceAll("_", " "));
|
|
}
|
|
if (event == IssueEventType.milestoned || event == IssueEventType.demilestoned) {
|
|
spannableBuilder.append(" ")
|
|
.append(event == IssueEventType.milestoned ? to : from)
|
|
.append(" ")
|
|
.bold(issueEventModel.getMilestone().getTitle());
|
|
} else if (event == IssueEventType.renamed) {
|
|
spannableBuilder
|
|
.append(" ")
|
|
.append(from)
|
|
.append(" ")
|
|
.bold(issueEventModel.getRename().getFromValue())
|
|
.append(" ")
|
|
.append(to)
|
|
.append(" ")
|
|
.bold(issueEventModel.getRename().getToValue());
|
|
} else if (event == IssueEventType.referenced || event == IssueEventType.merged) {
|
|
spannableBuilder
|
|
.append(" ")
|
|
.append("commit")
|
|
.append(" ")
|
|
.url(substring(issueEventModel.getCommitId()));
|
|
} else if (event == IssueEventType.cross_referenced) {
|
|
SourceModel sourceModel = issueEventModel.getSource();
|
|
if (sourceModel != null) {
|
|
SpannableBuilder title = SpannableBuilder.builder();
|
|
if (sourceModel.getIssue() != null) {
|
|
title.url("#" + sourceModel.getIssue().getNumber());
|
|
} else if (sourceModel.getPullRequest() != null) {
|
|
title.url("#" + sourceModel.getPullRequest().getNumber());
|
|
} else if (sourceModel.getCommit() != null) {
|
|
title.url(substring(sourceModel.getCommit().getSha()));
|
|
}
|
|
if (!InputHelper.isEmpty(title)) {
|
|
spannableBuilder.append(" ")
|
|
.append(thisString)
|
|
.append(" in ")
|
|
.append(sourceModel.getType())
|
|
.append(" ")
|
|
.append(title);
|
|
}
|
|
}
|
|
}
|
|
spannableBuilder.append(" ").append(getDate(date));
|
|
}
|
|
}
|
|
return spannableBuilder;
|
|
}
|
|
|
|
private static void appendReviews(@NonNull GenericEvent issueEventModel, @NonNull IssueEventType event,
|
|
@NonNull SpannableBuilder spannableBuilder, @NonNull String from,
|
|
@NonNull User user) {
|
|
spannableBuilder.append(" ");
|
|
User reviewer = issueEventModel.getRequestedReviewer();
|
|
if (reviewer != null && user.getLogin().equalsIgnoreCase(reviewer.getLogin())) {
|
|
spannableBuilder
|
|
.append(event == IssueEventType.review_requested
|
|
? "self-requested a review" : "removed their request for review");
|
|
} else {
|
|
spannableBuilder
|
|
.append(event == IssueEventType.review_requested ? "Requested a review" : "dismissed the review")
|
|
.append(" ")
|
|
.append(reviewer != null && !reviewer.getLogin().equalsIgnoreCase(user.getLogin()) ? from : " ")
|
|
.append(reviewer != null && !reviewer.getLogin().equalsIgnoreCase(user.getLogin()) ? " " : "");
|
|
}
|
|
if (issueEventModel.getRequestedTeam() != null) {
|
|
String name = !InputHelper.isEmpty(issueEventModel.getRequestedTeam().getName())
|
|
? issueEventModel.getRequestedTeam().getName() : issueEventModel.getRequestedTeam().getSlug();
|
|
spannableBuilder
|
|
.bold(name)
|
|
.append(" ")
|
|
.append("team");
|
|
} else if (reviewer != null && !user.getLogin().equalsIgnoreCase(reviewer.getLogin())) {
|
|
spannableBuilder.bold(issueEventModel.getRequestedReviewer().getLogin());
|
|
}
|
|
}
|
|
|
|
@NonNull private static CharSequence getDate(@Nullable Date date) {
|
|
return ParseDateFormat.getTimeAgo(date);
|
|
}
|
|
|
|
@NonNull private static String substring(@Nullable String value) {
|
|
if (value == null) {
|
|
return "";
|
|
}
|
|
if (value.length() <= 7) return value;
|
|
else return value.substring(0, 7);
|
|
}
|
|
|
|
}
|