From f8168cbf9bf6effcfded146af5c7442a8e552206 Mon Sep 17 00:00:00 2001 From: Danny Baumann Date: Fri, 11 Feb 2022 14:04:32 +0100 Subject: [PATCH] Add support for 'cross referenced' issue event. Switch issue/PR fragments to use the timeline API in order to get that event. --- .../adapter/timeline/EventViewHolder.java | 22 ++++++++++++++++++- .../java/com/gh4a/fragment/IssueFragment.java | 5 +++-- .../com/gh4a/fragment/IssueFragmentBase.java | 3 ++- .../PullRequestConversationFragment.java | 7 +++--- .../timeline_event_cross_referenced.xml | 18 +++++++++++++++ .../timeline_event_cross_referenced.xml | 18 +++++++++++++++ app/src/main/res/values/strings.xml | 2 ++ 7 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 app/src/main/res/drawable-night/timeline_event_cross_referenced.xml create mode 100644 app/src/main/res/drawable/timeline_event_cross_referenced.xml diff --git a/app/src/main/java/com/gh4a/adapter/timeline/EventViewHolder.java b/app/src/main/java/com/gh4a/adapter/timeline/EventViewHolder.java index 657c7d636..4e0a5ca17 100644 --- a/app/src/main/java/com/gh4a/adapter/timeline/EventViewHolder.java +++ b/app/src/main/java/com/gh4a/adapter/timeline/EventViewHolder.java @@ -11,6 +11,8 @@ import com.gh4a.R; import com.gh4a.activities.CommitActivity; +import com.gh4a.activities.IssueActivity; +import com.gh4a.activities.PullRequestActivity; import com.gh4a.activities.UserActivity; import com.gh4a.model.TimelineItem; import com.gh4a.utils.ApiHelpers; @@ -21,6 +23,7 @@ import com.gh4a.widget.StyleableTextView; import com.gh4a.widget.TimestampToastSpan; +import com.meisolsson.githubsdk.model.Issue; import com.meisolsson.githubsdk.model.IssueEvent; import com.meisolsson.githubsdk.model.IssueEventType; import com.meisolsson.githubsdk.model.Label; @@ -62,6 +65,7 @@ class EventViewHolder EVENT_ICONS.put(IssueEventType.ReviewRequestRemoved, R.drawable.timeline_event_review_request_removed); EVENT_ICONS.put(IssueEventType.ConvertToDraft, R.drawable.timeline_event_branch); EVENT_ICONS.put(IssueEventType.ReadyForReview, R.drawable.timeline_event_review); + EVENT_ICONS.put(IssueEventType.CrossReferenced, R.drawable.timeline_event_cross_referenced); } private final Context mContext; @@ -240,7 +244,11 @@ private CharSequence formatEvent(final IssueEvent event, final User user, int ty textResId = R.string.pull_request_event_convert_to_draft; break; case ReadyForReview: - textResId = R.string.pull_request_event_ready_for_review; + break; + case CrossReferenced: + textResId = mIsPullRequest + ? R.string.pull_request_event_mentioned + : R.string.issue_event_mentioned; break; default: return null; @@ -287,6 +295,18 @@ private CharSequence formatEvent(final IssueEvent event, final User user, int ty StringUtils.addUserTypeSpan(mContext, text, pos, mContext.getString(R.string.user_type_bot)); } + pos = text.toString().indexOf("[source]"); + if (pos >= 0) { + final Issue source = event.source().issue(); + String sourceLabel = "#" + source.number(); + text.replace(pos, pos + 8, sourceLabel); + text.setSpan(new IntentSpan(mContext, context -> { + return source.pullRequest() != null + ? PullRequestActivity.makeIntent(context, source) + : IssueActivity.makeIntent(context, source); + }), pos, pos + sourceLabel.length(), 0); + } + CharSequence time = event.createdAt() != null ? StringUtils.formatRelativeTime(mContext, event.createdAt(), true) : ""; diff --git a/app/src/main/java/com/gh4a/fragment/IssueFragment.java b/app/src/main/java/com/gh4a/fragment/IssueFragment.java index 46265cec7..5a443c4db 100644 --- a/app/src/main/java/com/gh4a/fragment/IssueFragment.java +++ b/app/src/main/java/com/gh4a/fragment/IssueFragment.java @@ -18,6 +18,7 @@ import com.meisolsson.githubsdk.model.IssueState; import com.meisolsson.githubsdk.service.issues.IssueCommentService; import com.meisolsson.githubsdk.service.issues.IssueEventService; +import com.meisolsson.githubsdk.service.issues.IssueTimelineService; import java.util.ArrayList; import java.util.Collections; @@ -74,7 +75,7 @@ public void onClick(View v) { @Override protected Single> onCreateDataSingle(boolean bypassCache) { final int issueNumber = mIssue.number(); - final IssueEventService eventService = ServiceFactory.get(IssueEventService.class, bypassCache); + final IssueTimelineService timelineService = ServiceFactory.get(IssueTimelineService.class, bypassCache); final IssueCommentService commentService = ServiceFactory.get(IssueCommentService.class, bypassCache); @@ -83,7 +84,7 @@ protected Single> onCreateDataSingle(boolean bypassCache) { .compose(RxUtils.mapList(TimelineItem.TimelineComment::new)) .subscribeOn(Schedulers.io()); Single> eventSingle = ApiHelpers.PageIterator - .toSingle(page -> eventService.getIssueEvents(mRepoOwner, mRepoName, issueNumber, page)) + .toSingle(page -> timelineService.getTimeline(mRepoOwner, mRepoName, issueNumber, page)) .compose(RxUtils.filter(event -> INTERESTING_EVENTS.contains(event.event()))) .compose((RxUtils.mapList(TimelineItem.TimelineEvent::new))) .subscribeOn(Schedulers.io()); diff --git a/app/src/main/java/com/gh4a/fragment/IssueFragmentBase.java b/app/src/main/java/com/gh4a/fragment/IssueFragmentBase.java index 22bae7af7..e97d4caa5 100644 --- a/app/src/main/java/com/gh4a/fragment/IssueFragmentBase.java +++ b/app/src/main/java/com/gh4a/fragment/IssueFragmentBase.java @@ -87,7 +87,8 @@ public abstract class IssueFragmentBase extends ListDataBaseFragment statuses) { @Override protected Single> onCreateDataSingle(boolean bypassCache) { final int issueNumber = mIssue.number(); - final IssueEventService eventService = - ServiceFactory.get(IssueEventService.class, bypassCache); + final IssueTimelineService timelineService = + ServiceFactory.get(IssueTimelineService.class, bypassCache); final IssueCommentService commentService = ServiceFactory.get(IssueCommentService.class, bypassCache); final PullRequestReviewService reviewService = @@ -207,7 +208,7 @@ protected Single> onCreateDataSingle(boolean bypassCache) { .toSingle(page -> commentService.getIssueComments(mRepoOwner, mRepoName, issueNumber, page)) .compose(RxUtils.mapList(TimelineItem.TimelineComment::new)); Single> eventsSingle = ApiHelpers.PageIterator - .toSingle(page -> eventService.getIssueEvents(mRepoOwner, mRepoName, issueNumber, page)) + .toSingle(page -> timelineService.getTimeline(mRepoOwner, mRepoName, issueNumber, page)) .compose(RxUtils.filter(event -> INTERESTING_EVENTS.contains(event.event()))) .compose(RxUtils.mapList(TimelineItem.TimelineEvent::new)); diff --git a/app/src/main/res/drawable-night/timeline_event_cross_referenced.xml b/app/src/main/res/drawable-night/timeline_event_cross_referenced.xml new file mode 100644 index 000000000..a14474f5a --- /dev/null +++ b/app/src/main/res/drawable-night/timeline_event_cross_referenced.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/timeline_event_cross_referenced.xml b/app/src/main/res/drawable/timeline_event_cross_referenced.xml new file mode 100644 index 000000000..0c1915947 --- /dev/null +++ b/app/src/main/res/drawable/timeline_event_cross_referenced.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 460ef1727..b1c69c4cb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -301,6 +301,7 @@ [b]%1$s[/b] changed the title from [b]%2$s[/b] to [b]%3$s[/b] [time] [b]%1$s[/b] locked and limited conversation to collaborators [time] [b]%1$s[/b] unlocked this conversation [time] + [b]%1$s[/b] mentioned this issue in [b][source][/b] [time] [b]%1$s[/b] closed this pull request [time] @@ -325,6 +326,7 @@ [b]%1$s[/b] deleted a comment [time] [b]%1$s[/b] marked this pull request as draft [time] [b]%1$s[/b] marked this pull request as ready for review [time] + [b]%1$s[/b] mentioned this pull request in [b][source][/b] [time] Commit %1$s