diff --git a/README.md b/README.md index ebcf5523..46454a2a 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,7 @@ grab **FastHub** from [Here](https://github.com/thermatk/FastHub-Libre) maintain - Notifications overview and "Mark all as read" - Search users/orgs, repos, issues/prs & code. - Pinned Repos + - Trending - **Repositories** - Search Repos - Browse and search Repos @@ -81,6 +82,7 @@ Ads are no longer available until further notice # Specs / Open-source libraries: - Minimum **SDK 21**, _but AppCompat is used all the way ;-)_ +- **Kotlin** all new modules starting from 2.5.3 will be written in **#Kotlin**. - **MVP**-architecture: [**ThirtyInch**](https://github.com/grandcentrix/ThirtyInch) because its ThirtyInch. - [**RxJava2**](https://github.com/ReactiveX/RxJava) & [**RxAndroid**](https://github.com/ReactiveX/RxAndroid) for Retrofit & background threads - [**Retrofit**](https://github.com/square/retrofit) for constructing the REST API diff --git a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java index 32a1985a..4412f896 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -9,7 +9,6 @@ import com.annimon.stream.Stream; import com.fastaccess.R; import com.fastaccess.data.dao.model.Commit; import com.fastaccess.data.dao.model.Gist; -import com.fastaccess.data.dao.model.Issue; import com.fastaccess.data.dao.model.Login; import com.fastaccess.data.dao.model.PullRequest; import com.fastaccess.data.dao.types.IssueState; @@ -101,8 +100,8 @@ import lombok.Setter; .collect(Collectors.toList()); } - @NonNull public static List buildForIssues(@NonNull Context context, @NonNull Issue issueModel) { - return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.details), IssueTimelineFragment.newInstance(issueModel))) + @NonNull public static List buildForIssues(@NonNull Context context) { + return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.details), IssueTimelineFragment.newInstance())) .collect(Collectors.toList()); } @@ -111,7 +110,7 @@ import lombok.Setter; String login = pullRequest.getLogin(); String repoId = pullRequest.getRepoId(); int number = pullRequest.getNumber(); - return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.details), PullRequestTimelineFragment.newInstance(pullRequest)), + return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.details), PullRequestTimelineFragment.newInstance()), new FragmentPagerAdapterModel(context.getString(R.string.commits), PullRequestCommitsFragment.newInstance(repoId, login, number)), new FragmentPagerAdapterModel(context.getString(R.string.files), PullRequestFilesFragment.newInstance(repoId, login, number))) .collect(Collectors.toList()); diff --git a/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java b/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java index 9b9f2dfc..98b15d70 100644 --- a/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/TimelineModel.java @@ -280,6 +280,7 @@ import static com.annimon.stream.Collectors.toList; return comment != null ? (int) comment.getId() : 0; } + @Override public int describeContents() { return 0; } @Override public void writeToParcel(Parcel dest, int flags) { @@ -290,6 +291,8 @@ import static com.annimon.stream.Collectors.toList; dest.writeParcelable(this.pullRequest, flags); dest.writeParcelable(this.status, flags); dest.writeParcelable(this.review, flags); + dest.writeParcelable(this.groupedReview, flags); + dest.writeParcelable(this.reviewComment, flags); dest.writeLong(this.sortedDate != null ? this.sortedDate.getTime() : -1); } @@ -301,6 +304,8 @@ import static com.annimon.stream.Collectors.toList; this.pullRequest = in.readParcelable(PullRequest.class.getClassLoader()); this.status = in.readParcelable(PullRequestStatusModel.class.getClassLoader()); this.review = in.readParcelable(ReviewModel.class.getClassLoader()); + this.groupedReview = in.readParcelable(GroupedReviewModel.class.getClassLoader()); + this.reviewComment = in.readParcelable(ReviewCommentModel.class.getClassLoader()); long tmpSortedDate = in.readLong(); this.sortedDate = tmpSortedDate == -1 ? null : new Date(tmpSortedDate); } diff --git a/app/src/main/java/com/fastaccess/data/service/TrendingService.java b/app/src/main/java/com/fastaccess/data/service/TrendingService.java index 5f39e54c..9e625e7a 100644 --- a/app/src/main/java/com/fastaccess/data/service/TrendingService.java +++ b/app/src/main/java/com/fastaccess/data/service/TrendingService.java @@ -1,5 +1,6 @@ package com.fastaccess.data.service; + import com.fastaccess.data.dao.TrendingResponse; import com.github.florent37.retrojsoup.annotations.Select; diff --git a/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java b/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java index 8490b5ea..d8127261 100644 --- a/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java +++ b/app/src/main/java/com/fastaccess/provider/colors/ColorsProvider.java @@ -23,6 +23,7 @@ import java.io.InputStreamReader; import java.lang.reflect.Type; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import io.reactivex.Observable; @@ -33,6 +34,9 @@ import io.reactivex.Observable; public class ColorsProvider { + private static List popularLanguages = Stream.of("Java", "Kotlin", "Javascript", "Python", "CSS", "PHP", + "Ruby", "C++", "C", "GO", "Swift").toList();//predefined languages. + private static Map colors = new LinkedHashMap<>(); public static void load() { @@ -60,6 +64,7 @@ public class ColorsProvider { return Stream.of(colors) .filter(value -> value != null && !InputHelper.isEmpty(value.getKey())) .map(Map.Entry::getKey) + .sortBy(s -> !popularLanguages.contains(s)) .collect(Collectors.toCollection(ArrayList::new)); } diff --git a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java index 467b0e3d..13645339 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java +++ b/app/src/main/java/com/fastaccess/provider/rest/RestProvider.java @@ -60,7 +60,7 @@ public class RestProvider { .setPrettyPrinting() .create(); - public static OkHttpClient provideOkHttpClient(boolean isRawString) { + private static OkHttpClient provideOkHttpClient(boolean isRawString) { if (okHttpClient == null) { OkHttpClient.Builder client = new OkHttpClient.Builder(); if (BuildConfig.DEBUG) { diff --git a/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.java b/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.java index 273d6acb..70c15ffe 100644 --- a/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.java +++ b/app/src/main/java/com/fastaccess/provider/rest/interceptors/AuthenticationInterceptor.java @@ -1,5 +1,7 @@ package com.fastaccess.provider.rest.interceptors; +import android.support.annotation.NonNull; + import com.fastaccess.data.service.NotificationService; import com.fastaccess.helper.InputHelper; @@ -18,7 +20,7 @@ public class AuthenticationInterceptor implements Interceptor { private String authToken; private String otp; - @Override public Response intercept(Chain chain) throws IOException { + @Override public Response intercept(@NonNull Chain chain) throws IOException { Request original = chain.request(); if (original.url() != HttpUrl.get(URI.create(NotificationService.SUBSCRIPTION_URL))) { Request.Builder builder = original.newBuilder(); @@ -28,6 +30,7 @@ public class AuthenticationInterceptor implements Interceptor { if (!InputHelper.isEmpty(otp)) { builder.addHeader("X-GitHub-OTP", otp.trim()); } + builder.addHeader("User-Agent", "FastHub"); Request request = builder.build(); return chain.proceed(request); } diff --git a/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java b/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java index ddc64214..a30d215b 100644 --- a/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java +++ b/app/src/main/java/com/fastaccess/provider/timeline/HtmlHelper.java @@ -90,12 +90,6 @@ public class HtmlHelper { return mySpanner; } - private static final String TAG_ROOT = "githubroot"; - - private static final String ROOT_START = '<' + TAG_ROOT + '>'; - - private static final String ROOT_END = "'; - private static final String TOGGLE_START = ""; private static final String TOGGLE_END = ""; @@ -122,23 +116,16 @@ public class HtmlHelper { private static final String PARAGRAPH_END = "

"; - private static final String BLOCKQUOTE_START = "
"; - - private static final String BLOCKQUOTE_END = "
"; - //https://github.com/k0shk0sh/GitHubSdk/blob/master/library/src/main/java/com/meisolsson/githubsdk/core/HtmlUtils.java @NonNull public static CharSequence format(final String html) { if (html == null || html.length() == 0) return ""; StringBuilder formatted = new StringBuilder(html); strip(formatted, TOGGLE_START, TOGGLE_END); strip(formatted, SIGNATURE_START, SIGNATURE_END); - replace(formatted, REPLY_START, REPLY_END, BLOCKQUOTE_START, BLOCKQUOTE_END); + strip(formatted, REPLY_START, REPLY_END); strip(formatted, HIDDEN_REPLY_START, HIDDEN_REPLY_END); if (replace(formatted, PARAGRAPH_START, BREAK)) replace(formatted, PARAGRAPH_END, BREAK); - formatEmailFragments(formatted); trim(formatted); - formatted.insert(0, ROOT_START); - formatted.append(ROOT_END); return formatted; } @@ -165,65 +152,15 @@ public class HtmlHelper { return true; } - private static void replace(final StringBuilder input, final String fromStart, final String fromEnd, - final String toStart, final String toEnd) { - int start = input.indexOf(fromStart); - if (start == -1) - return; - final int fromStartLength = fromStart.length(); - final int fromEndLength = fromEnd.length(); - final int toStartLength = toStart.length(); - while (start != -1) { - input.replace(start, start + fromStartLength, toStart); - int end = input.indexOf(fromEnd, start + toStartLength); - if (end != -1) - input.replace(end, end + fromEndLength, toEnd); - - start = input.indexOf(fromStart); - } - } - - private static void formatEmailFragments(final StringBuilder input) { - int emailStart = input.indexOf(EMAIL_START); - int breakAdvance = BREAK.length() - 1; - while (emailStart != -1) { - int startLength = EMAIL_START.length(); - int emailEnd = input.indexOf(EMAIL_END, emailStart + startLength); - if (emailEnd == -1) - break; - - input.delete(emailEnd, emailEnd + EMAIL_END.length()); - input.delete(emailStart, emailStart + startLength); - - int fullEmail = emailEnd - startLength; - for (int i = emailStart; i < fullEmail; i++) - if (input.charAt(i) == '\n') { - input.deleteCharAt(i); - input.insert(i, BREAK); - i += breakAdvance; - fullEmail += breakAdvance; - } - - emailStart = input.indexOf(EMAIL_START, fullEmail); - } - } - private static void trim(final StringBuilder input) { int length = input.length(); int breakLength = BREAK.length(); - while (length > 0) { - if (input.indexOf(BREAK) == 0) - input.delete(0, breakLength); - else if (length >= breakLength - && input.lastIndexOf(BREAK) == length - breakLength) - input.delete(length - breakLength, length); - else if (Character.isWhitespace(input.charAt(0))) - input.deleteCharAt(0); - else if (Character.isWhitespace(input.charAt(length - 1))) - input.deleteCharAt(length - 1); - else - break; + if (input.indexOf(BREAK) == 0) input.delete(0, breakLength); + else if (length >= breakLength && input.lastIndexOf(BREAK) == length - breakLength) input.delete(length - breakLength, length); + else if (Character.isWhitespace(input.charAt(0))) input.deleteCharAt(0); + else if (Character.isWhitespace(input.charAt(length - 1))) input.deleteCharAt(length - 1); + else break; length = input.length(); } } diff --git a/app/src/main/java/com/fastaccess/ui/adapter/IssuePullsTimelineAdapter.java b/app/src/main/java/com/fastaccess/ui/adapter/IssuePullsTimelineAdapter.java index 69fae96a..6ba0b835 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/IssuePullsTimelineAdapter.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/IssuePullsTimelineAdapter.java @@ -66,11 +66,7 @@ public class IssuePullsTimelineAdapter extends BaseRecyclerAdapter { } private void bind(@NonNull Issue issueModel) { - avatar.setUrl(issueModel.getUser().getAvatarUrl(), issueModel.getUser().getLogin()); - name.setText(issueModel.getUser().getLogin()); - date.setText(ParseDateFormat.getTimeAgo(issueModel.getCreatedAt())); - if (!InputHelper.isEmpty(issueModel.getBodyHtml())) { - HtmlHelper.htmlIntoTextView(comment, issueModel.getBodyHtml()); - } else { - comment.setText(R.string.no_description_provided); - } - if (issueModel.getReactions() != null) { - appendEmojies(issueModel.getReactions()); - } + setup(issueModel.getUser(), issueModel.getBodyHtml(), issueModel.getReactions()); + setupDate(issueModel.getCreatedAt(), issueModel.getUpdatedAt()); } private void bind(@NonNull PullRequest pullRequest) { - avatar.setUrl(pullRequest.getUser().getAvatarUrl(), pullRequest.getUser().getLogin()); - name.setText(pullRequest.getUser().getLogin()); - date.setText(ParseDateFormat.getTimeAgo(pullRequest.getCreatedAt())); - if (!InputHelper.isEmpty(pullRequest.getBodyHtml())) { - HtmlHelper.htmlIntoTextView(comment, pullRequest.getBodyHtml()); + setup(pullRequest.getUser(), pullRequest.getBodyHtml(), pullRequest.getReactions()); + setupDate(pullRequest.getCreatedAt(), pullRequest.getUpdatedAt()); + } + + private void setup(User user, String description, ReactionsModel reactionsModel) { + avatar.setUrl(user.getAvatarUrl(), user.getLogin(), user.isOrganizationType()); + name.setText(user.getLogin()); + if (reactionsModel != null) { + appendEmojies(reactionsModel); + } + if (!InputHelper.isEmpty(description)) { + HtmlHelper.htmlIntoTextView(comment, description); } else { comment.setText(R.string.no_description_provided); } - if (pullRequest.getReactions() != null) { - appendEmojies(pullRequest.getReactions()); + } + + private void setupDate(@NonNull Date createdDate, @NonNull Date updated) { + if (createdDate.before(updated)) { + date.setText(String.format("%s %s", ParseDateFormat.getTimeAgo(updated), + date.getResources().getString(R.string.edited))); + } else { + date.setText(ParseDateFormat.getTimeAgo(createdDate)); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/editor/EditorActivity.java b/app/src/main/java/com/fastaccess/ui/modules/editor/EditorActivity.java index 5c209f5e..ac0dfb02 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/editor/EditorActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/editor/EditorActivity.java @@ -18,6 +18,7 @@ import android.widget.CheckBox; import android.widget.LinearLayout; import android.widget.ListView; +import com.evernote.android.state.State; import com.fastaccess.BuildConfig; import com.fastaccess.R; import com.fastaccess.data.dao.EditReviewCommentModel; @@ -46,7 +47,6 @@ import butterknife.OnClick; import butterknife.OnItemClick; import butterknife.OnTextChanged; import es.dmoral.toasty.Toasty; -import com.evernote.android.state.State; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; import static android.view.View.GONE; @@ -70,16 +70,15 @@ public class EditorActivity extends BaseActivity mentions = new ArrayList<>(); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java index 97211b97..dd44fcda 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerActivity.java @@ -20,6 +20,7 @@ import android.view.MotionEvent; import android.view.View; import android.widget.CheckBox; +import com.evernote.android.state.State; import com.fastaccess.R; import com.fastaccess.data.dao.LicenseModel; import com.fastaccess.data.dao.NameParser; @@ -58,7 +59,6 @@ import butterknife.BindView; import butterknife.OnCheckedChanged; import butterknife.OnClick; import butterknife.OnLongClick; -import com.evernote.android.state.State; import it.sephiroth.android.library.bottomnavigation.BottomNavigation; import uk.co.samuelwall.materialtaptargetprompt.MaterialTapTargetPrompt; @@ -313,7 +313,7 @@ public class RepoPagerActivity extends BaseActivity imp if (intent != null && intent.getExtras() != null) { CharSequence charSequence = intent.getExtras().getCharSequence(BundleConstant.EXTRA); if (!InputHelper.isEmpty(charSequence)) { + Logger.e(charSequence); sendToView(view -> view.onSetCode(charSequence)); } } @@ -61,6 +63,7 @@ public class CreateIssuePresenter extends BasePresenter imp makeRestCall(RestProvider.getIssueService().editIssue(login, repo, number, requestModel), issueModel -> { if (issueModel != null) { + Logger.e(issueModel.getBodyHtml()); sendToView(view -> view.onSuccessSubmission(issueModel)); } else { sendToView(view -> view.showMessage(R.string.error, R.string.error_creating_issue)); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerActivity.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerActivity.java index 5310ee01..b1bc6d07 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerActivity.java @@ -13,6 +13,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.evernote.android.state.State; import com.fastaccess.R; import com.fastaccess.data.dao.FragmentPagerAdapterModel; import com.fastaccess.data.dao.LabelModel; @@ -47,7 +48,6 @@ import java.util.List; import butterknife.BindView; import butterknife.OnClick; -import com.evernote.android.state.State; /** * Created by Kosh on 10 Dec 2016, 9:23 AM @@ -126,7 +126,7 @@ public class IssuePagerActivity extends BaseActivity { + void onSetupIssue(boolean isUpdate); void showSuccessIssueActionMsg(boolean isClose); @@ -39,6 +39,7 @@ public interface IssuePagerMvp { void onMileStoneSelected(@NonNull MilestoneModel milestoneModel); void onFinishActivity(); + } interface Presenter extends BaseMvp.FAPresenter { @@ -82,4 +83,8 @@ public interface IssuePagerMvp { void onSubscribeOrMute(boolean mute); } + interface IssuePrCallback { + @Nullable T getData(); + } + } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java index 13540a67..bcd1fd7c 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/IssuePagerPresenter.java @@ -70,31 +70,14 @@ class IssuePagerPresenter extends BasePresenter implements I showToRepoBtn = intent.getExtras().getBoolean(BundleConstant.EXTRA_THREE); if (issueModel != null) { issueNumber = issueModel.getNumber(); - sendToView(IssuePagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); return; } else if (issueNumber > 0 && !InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { getIssueFromApi(); return; } } - sendToView(IssuePagerMvp.View::onSetupIssue); - } - - private void getIssueFromApi() { - Observable observable = RestProvider.getIssueService().getIssue(login, repoId, issueNumber) - .flatMap(issue -> RestProvider.getRepoService().isCollaborator(login, repoId, Login.getUser().getLogin()), - (issue, booleanResponse) -> { - isCollaborator = booleanResponse.code() == 204; - return issue; - }); - makeRestCall(observable, this::setupIssue); - } - - private void setupIssue(Issue issue) { - issueModel = issue; - issueModel.setRepoId(repoId); - issueModel.setLogin(login); - sendToView(IssuePagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); } @Override public void onWorkOffline(long issueNumber, @NonNull String repoId, @NonNull String login) { @@ -103,7 +86,7 @@ class IssuePagerPresenter extends BasePresenter implements I .subscribe(issueModel1 -> { if (issueModel1 != null) { issueModel = issueModel1; - sendToView(IssuePagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); } })); } else { @@ -163,7 +146,7 @@ class IssuePagerPresenter extends BasePresenter implements I issue.setRepoId(issueModel.getRepoId()); issue.setLogin(issueModel.getLogin()); issueModel = issue; - sendToView(IssuePagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(true)); } }) .subscribe(issue -> {/**/}, @@ -184,7 +167,7 @@ class IssuePagerPresenter extends BasePresenter implements I int code = booleanResponse.code(); if (code == 204) { issueModel.setLocked(!isLocked()); - sendToView(IssuePagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(true)); } sendToView(IssuePagerMvp.View::hideProgress); }); @@ -217,7 +200,7 @@ class IssuePagerPresenter extends BasePresenter implements I issueModel.setLogin(login); issueModel.setRepoId(repoId); manageObservable(issue.save(issueModel).toObservable()); - sendToView(IssuePagerMvp.View::onUpdateTimeline); + sendToView(view -> updateTimeline(view, R.string.labels_added_successfully)); }); } @@ -227,7 +210,7 @@ class IssuePagerPresenter extends BasePresenter implements I Stream.of(labels).filter(value -> value != null && value.getName() != null) .map(LabelModel::getName).collect(Collectors.toList())), labelModels -> { - sendToView(IssuePagerMvp.View::onUpdateTimeline); + sendToView(view -> updateTimeline(view, R.string.labels_added_successfully)); LabelListModel listModel = new LabelListModel(); listModel.addAll(labels); issueModel.setLabels(listModel); @@ -249,7 +232,7 @@ class IssuePagerPresenter extends BasePresenter implements I assignee.addAll(users); issueModel.setAssignees(assignee); manageObservable(issueModel.save(issueModel).toObservable()); - sendToView(IssuePagerMvp.View::onUpdateTimeline); + sendToView(view -> updateTimeline(view, R.string.assignee_added)); } ); } @@ -267,7 +250,7 @@ class IssuePagerPresenter extends BasePresenter implements I this.issueModel.setLogin(login); this.issueModel.setRepoId(repoId); manageObservable(issueModel.save(issueModel).toObservable()); - sendToView(IssuePagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(true)); } @Override public void onSubscribeOrMute(boolean mute) { @@ -288,4 +271,25 @@ class IssuePagerPresenter extends BasePresenter implements I } }); } + + private void getIssueFromApi() { + makeRestCall(RxHelper.getObserver(Observable.zip(RestProvider.getIssueService().getIssue(login, repoId, issueNumber), + RestProvider.getRepoService().isCollaborator(login, repoId, Login.getUser().getLogin()), + (issue, booleanResponse) -> { + isCollaborator = booleanResponse.code() == 204; + return issue; + })), this::setupIssue); + } + + private void setupIssue(Issue issue) { + issueModel = issue; + issueModel.setRepoId(repoId); + issueModel.setLogin(login); + sendToView(view -> view.onSetupIssue(false)); + } + + private void updateTimeline(IssuePagerMvp.View view, int assignee_added) { + view.showMessage(R.string.success, assignee_added); + view.onUpdateTimeline(); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelineFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelineFragment.java index 2a73a6d6..faa30889 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelineFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelineFragment.java @@ -1,6 +1,7 @@ package com.fastaccess.ui.modules.repos.issues.issue.details.timeline; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; @@ -8,6 +9,7 @@ import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.view.View; +import com.evernote.android.state.State; import com.fastaccess.R; import com.fastaccess.data.dao.TimelineModel; import com.fastaccess.data.dao.model.Comment; @@ -24,6 +26,7 @@ import com.fastaccess.ui.adapter.IssuePullsTimelineAdapter; import com.fastaccess.ui.adapter.viewholder.TimelineCommentsViewHolder; import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.modules.editor.EditorActivity; +import com.fastaccess.ui.modules.repos.issues.issue.details.IssuePagerMvp; import com.fastaccess.ui.modules.repos.reactions.ReactionsDialogFragment; import com.fastaccess.ui.widgets.AppbarRefreshLayout; import com.fastaccess.ui.widgets.StateLayout; @@ -36,7 +39,6 @@ import java.util.LinkedHashMap; import java.util.List; import butterknife.BindView; -import com.evernote.android.state.State; /** * Created by Kosh on 31 Mar 2017, 7:35 PM @@ -50,16 +52,32 @@ public class IssueTimelineFragment extends BaseFragment toggleMap = new LinkedHashMap<>(); private IssuePullsTimelineAdapter adapter; - private OnLoadMore onLoadMore; + private OnLoadMore onLoadMore; + private IssuePagerMvp.IssuePrCallback issueCallback; - public static IssueTimelineFragment newInstance(@NonNull Issue issueModel) { - IssueTimelineFragment view = new IssueTimelineFragment(); - view.setArguments(Bundler.start().put(BundleConstant.ITEM, issueModel).end());//TODO fix this - return view; + @NonNull public static IssueTimelineFragment newInstance() { + return new IssueTimelineFragment(); + } + + @SuppressWarnings("unchecked") @Override public void onAttach(Context context) { + super.onAttach(context); + if (getParentFragment() instanceof IssuePagerMvp.IssuePrCallback) { + issueCallback = (IssuePagerMvp.IssuePrCallback) getParentFragment(); + } else if (context instanceof IssuePagerMvp.IssuePrCallback) { + issueCallback = (IssuePagerMvp.IssuePrCallback) context; + } else { + throw new IllegalArgumentException(String.format("%s or parent fragment must implement IssuePagerMvp.IssuePrCallback", context.getClass() + .getSimpleName())); + } + } + + @Override public void onDetach() { + issueCallback = null; + super.onDetach(); } @Override public void onRefresh() { - getPresenter().onCallApi(1, null); + getPresenter().onCallApi(1, getIssue()); } @Override public void onNotifyAdapter(@Nullable List items, int page) { @@ -69,17 +87,16 @@ public class IssueTimelineFragment extends BaseFragment getLoadMore() { if (onLoadMore == null) { - onLoadMore = new OnLoadMore(getPresenter()); + onLoadMore = new OnLoadMore<>(getPresenter()); } + onLoadMore.setParameter(getIssue()); return onLoadMore; } @@ -88,12 +105,15 @@ public class IssueTimelineFragment extends BaseFragment items, int page); - @NonNull OnLoadMore getLoadMore(); + @NonNull OnLoadMore getLoadMore(); void onEditComment(@NonNull Comment item); @@ -50,32 +50,24 @@ public interface IssueTimelineMvp { void onSetHeader(@NonNull TimelineModel timelineModel); - void onRefresh(@NonNull Issue issue); + @Nullable Issue getIssue(); + + void onUpdateHeader(); } interface Presenter extends BaseMvp.FAPresenter, BaseViewHolder.OnItemClickListener, - BaseMvp.PaginationListener { + BaseMvp.PaginationListener { boolean isPreviouslyReacted(long commentId, int vId); @NonNull ArrayList getEvents(); - void onFragmentCreated(@Nullable Bundle bundle); - void onWorkOffline(); void onHandleDeletion(@Nullable Bundle bundle); - @Nullable String repoId(); - - @Nullable String login(); - - int number(); - void onHandleReaction(@IdRes int viewId, long id, @ReactionsProvider.ReactionType int reactionType); boolean isCallingApi(long id, int vId); - - void onUpdateIssue(@NonNull Issue issue); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelinePresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelinePresenter.java index f8c0e5da..513e73a7 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelinePresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/details/timeline/IssueTimelinePresenter.java @@ -37,7 +37,6 @@ import lombok.Getter; */ @Getter public class IssueTimelinePresenter extends BasePresenter implements IssueTimelineMvp.Presenter { - @com.evernote.android.state.State Issue issue; private ArrayList timeline = new ArrayList<>(); private ReactionsProvider reactionsProvider; private int page; @@ -51,12 +50,13 @@ import lombok.Getter; @Override public void onItemClick(int position, View v, TimelineModel item) { if (getView() != null) { if (item.getType() == TimelineModel.COMMENT) { - if (getHeader() == null) return; + if (getView().getIssue() == null) return; + Issue issue = getView().getIssue(); if (v.getId() == R.id.commentMenu) { PopupMenu popupMenu = new PopupMenu(v.getContext(), v); popupMenu.inflate(R.menu.comments_menu); String username = Login.getUser().getLogin(); - boolean isOwner = CommentsHelper.isOwner(username, getHeader().getLogin(), item.getComment().getUser().getLogin()); + boolean isOwner = CommentsHelper.isOwner(username, issue.getLogin(), item.getComment().getUser().getLogin()); popupMenu.getMenu().findItem(R.id.delete).setVisible(isOwner); popupMenu.getMenu().findItem(R.id.edit).setVisible(isOwner); popupMenu.setOnMenuItemClickListener(item1 -> { @@ -113,8 +113,10 @@ import lombok.Getter; @Override public void onItemLongClick(int position, View v, TimelineModel item) { if (getView() == null) return; if (item.getType() == TimelineModel.COMMENT || item.getType() == TimelineModel.HEADER) { - String login = login(); - String repoId = repoId(); + if (getView().getIssue() == null) return; + Issue issue = getView().getIssue(); + String login = issue.getLogin(); + String repoId = issue.getRepoId(); if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { ReactionTypes type = ReactionTypes.get(v.getId()); if (type != null) { @@ -136,23 +138,6 @@ import lombok.Getter; return timeline; } - @Override protected void onCreate() { - super.onCreate(); - if (issue != null && timeline.isEmpty()) { - sendToView(view -> view.onSetHeader(TimelineModel.constructHeader(issue))); - onCallApi(1, null); - } - } - - @Override public void onFragmentCreated(@Nullable Bundle bundle) { - if (bundle == null) throw new NullPointerException("Bundle is null?"); - issue = bundle.getParcelable(BundleConstant.ITEM); - if (timeline.isEmpty() && issue != null) { - sendToView(view -> view.onSetHeader(TimelineModel.constructHeader(issue))); - onCallApi(1, null); - } - } - @Override public void onWorkOffline() { //TODO } @@ -161,7 +146,9 @@ import lombok.Getter; if (bundle != null) { long commId = bundle.getLong(BundleConstant.EXTRA, 0); if (commId != 0) { - makeRestCall(RestProvider.getIssueService().deleteIssueComment(login(), repoId(), commId), + if (getView() == null || getView().getIssue() == null) return; + Issue issue = getView().getIssue(); + makeRestCall(RestProvider.getIssueService().deleteIssueComment(issue.getLogin(), issue.getRepoId(), commId), booleanResponse -> sendToView(view -> { if (booleanResponse.code() == 204) { Comment comment = new Comment(); @@ -175,25 +162,11 @@ import lombok.Getter; } } - @Nullable @Override public String repoId() { - return getHeader() != null ? getHeader().getRepoId() : null; - } - - @Nullable @Override public String login() { - return getHeader() != null ? getHeader().getLogin() : null; - } - - @Override public int number() { - return getHeader() != null ? getHeader().getNumber() : -1; - } - - @Nullable private Issue getHeader() { - return issue; - } - @Override public void onHandleReaction(int viewId, long id, @ReactionsProvider.ReactionType int reactionType) { - String login = login(); - String repoId = repoId(); + if (getView() == null || getView().getIssue() == null) return; + Issue issue = getView().getIssue(); + String login = issue.getLogin(); + String repoId = issue.getRepoId(); Observable observable = getReactionsProvider().onHandleReaction(viewId, id, login, repoId, reactionType); if (observable != null) manageObservable(observable); } @@ -202,10 +175,6 @@ import lombok.Getter; return getReactionsProvider().isCallingApi(id, vId); } - @Override public void onUpdateIssue(@NonNull Issue issue) { - this.issue = issue; - } - @NonNull private ReactionsProvider getReactionsProvider() { if (reactionsProvider == null) { reactionsProvider = new ReactionsProvider(); @@ -229,8 +198,8 @@ import lombok.Getter; this.previousTotal = previousTotal; } - @Override public void onCallApi(int page, @Nullable Object parameter) { - if (getHeader() == null) { + @Override public void onCallApi(int page, @Nullable Issue parameter) { + if (parameter == null) { sendToView(BaseMvp.FAView::hideProgress); return; } @@ -243,19 +212,19 @@ import lombok.Getter; return; } setCurrentPage(page); - String login = getHeader().getLogin(); - String repoID = getHeader().getRepoId(); - int number = getHeader().getNumber(); + String login = parameter.getLogin(); + String repoId = parameter.getRepoId(); + int number = parameter.getNumber(); Observable> observable; if (page > 1) { - observable = RestProvider.getIssueService().getIssueComments(login, repoID, number, page) + observable = RestProvider.getIssueService().getIssueComments(login, repoId, number, page) .map(comments -> { lastPage = comments != null ? comments.getLast() : 0; return TimelineModel.construct(comments != null ? comments.getItems() : null); }); } else { - observable = Observable.zip(RestProvider.getIssueService().getTimeline(login, repoID, number), - RestProvider.getIssueService().getIssueComments(login, repoID, number, page), + observable = Observable.zip(RestProvider.getIssueService().getTimeline(login, repoId, number), + RestProvider.getIssueService().getIssueComments(login, repoId, number, page), (issueEventPageable, commentPageable) -> { lastPage = commentPageable != null ? commentPageable.getLast() : 0; return TimelineModel.construct(commentPageable != null ? commentPageable.getItems() : null, diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerActivity.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerActivity.java index b49a550b..8d2cf11a 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerActivity.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerActivity.java @@ -13,6 +13,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import com.evernote.android.state.State; import com.fastaccess.R; import com.fastaccess.data.dao.FragmentPagerAdapterModel; import com.fastaccess.data.dao.LabelModel; @@ -49,7 +50,6 @@ import java.util.List; import butterknife.BindView; import butterknife.OnClick; -import com.evernote.android.state.State; /** * Created by Kosh on 10 Dec 2016, 9:23 AM @@ -127,7 +127,7 @@ public class PullRequestPagerActivity extends BaseActivity labels) { Logger.e(labels, labels.size()); getPresenter().onPutLabels(labels); @@ -364,10 +336,9 @@ public class PullRequestPagerActivity extends BaseActivity { - void onSetupIssue(); + void onSetupIssue(boolean update); void onLabelsRetrieved(@NonNull List items); - void onUpdateMenu(); - void showSuccessIssueActionMsg(boolean isClose); void showErrorIssueActionMsg(boolean isClose); @@ -88,6 +88,8 @@ public interface PullRequestPagerMvp { boolean isCollaborator(); void onUpdatePullRequest(@NonNull PullRequest pullRequestModel); + + void onRefresh(); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java index 5fe17e59..696478de 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/PullRequestPagerPresenter.java @@ -67,33 +67,14 @@ class PullRequestPagerPresenter extends BasePresenter repoId = intent.getExtras().getString(BundleConstant.EXTRA_TWO); showToRepoBtn = intent.getExtras().getBoolean(BundleConstant.EXTRA_THREE); if (pullRequest != null) { - sendToView(PullRequestPagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); return; } else if (issueNumber > 0 && !InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { - makeRestCall(RestProvider.getPullRequestService() - .getPullRequest(login, repoId, issueNumber) - .flatMap(pullRequest1 -> RestProvider.getRepoService().isCollaborator(login, repoId, Login.getUser().getLogin()), - (pullRequest1, booleanResponse) -> { - isCollaborator = booleanResponse.code() == 204; - return pullRequest1; - }) - .flatMap(pullRequest1 -> RestProvider.getIssueService().getIssue(login, repoId, issueNumber), - (pullRequest1, issue) -> {//hack to get reactions from issue api - if (issue != null) { - pullRequest1.setReactions(issue.getReactions()); - } - return pullRequest1; - }), pullRequestModelResponse -> { - pullRequest = pullRequestModelResponse; - pullRequest.setRepoId(repoId); - pullRequest.setLogin(login); - sendToView(PullRequestPagerMvp.View::onSetupIssue); - manageObservable(pullRequest.save(pullRequest).toObservable()); - }); + callApi(); return; } } - sendToView(PullRequestPagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); } @Override public void onWorkOffline() { @@ -102,7 +83,7 @@ class PullRequestPagerPresenter extends BasePresenter .subscribe(pullRequestModel -> { if (pullRequestModel != null) { pullRequest = pullRequestModel; - sendToView(PullRequestPagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); } })); } @@ -158,7 +139,7 @@ class PullRequestPagerPresenter extends BasePresenter int code = booleanResponse.code(); if (code == 204) { pullRequest.setLocked(!isLocked()); - sendToView(PullRequestPagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); } }); } @@ -175,7 +156,7 @@ class PullRequestPagerPresenter extends BasePresenter issue.setRepoId(getPullRequest().getRepoId()); issue.setLogin(getPullRequest().getLogin()); pullRequest = issue; - sendToView(PullRequestPagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(false)); } }, throwable -> sendToView(view -> view.showErrorIssueActionMsg(getPullRequest().getState() == IssueState.open)))); } @@ -195,9 +176,7 @@ class PullRequestPagerPresenter extends BasePresenter } else { sendToView(view -> view.showMessage(R.string.error, R.string.no_labels)); } - }, throwable -> { - sendToView(view -> view.showMessage(R.string.error, R.string.no_labels)); - }) + }, throwable -> sendToView(view -> view.showMessage(R.string.error, R.string.no_labels))) ); } @@ -206,7 +185,7 @@ class PullRequestPagerPresenter extends BasePresenter Stream.of(labels).filter(value -> value != null && value.getName() != null) .map(LabelModel::getName).collect(Collectors.toList())), labelModels -> { - sendToView(PullRequestPagerMvp.View::onUpdateTimeline); + sendToView(view -> updateTimeline(view, R.string.labels_added_successfully)); LabelListModel listModel = new LabelListModel(); listModel.addAll(labels); pullRequest.setLabels(listModel); @@ -223,7 +202,7 @@ class PullRequestPagerPresenter extends BasePresenter pullRequest.setLogin(login); pullRequest.setRepoId(repoId); manageObservable(pr.save(pullRequest).toObservable()); - sendToView(PullRequestPagerMvp.View::onUpdateTimeline); + sendToView(view -> updateTimeline(view, R.string.labels_added_successfully)); }); } @@ -244,13 +223,13 @@ class PullRequestPagerPresenter extends BasePresenter assignee.addAll(users); pullRequest.setAssignees(assignee); manageObservable(pullRequest.save(pullRequest).toObservable()); - sendToView(PullRequestPagerMvp.View::onUpdateTimeline); + sendToView(view -> updateTimeline(view, R.string.assignee_added)); } ); } else { assigneesRequestModel.setReviewers(assignees); makeRestCall(RestProvider.getPullRequestService().putReviewers(login, repoId, issueNumber, assigneesRequestModel), - pullRequestResponse -> sendToView(PullRequestPagerMvp.View::onUpdateTimeline) + pullRequestResponse -> sendToView(view -> updateTimeline(view, R.string.reviewer_added)) ); } } @@ -266,10 +245,7 @@ class PullRequestPagerPresenter extends BasePresenter .doOnSubscribe(disposable -> sendToView(view -> view.showProgress(0))) .subscribe(mergeResponseModel -> { if (mergeResponseModel.isMerged()) { - sendToView(view -> { - view.showMessage(R.string.success, R.string.success_merge); - view.onUpdateTimeline(); - }); + sendToView(view -> updateTimeline(view, R.string.success_merge)); } else { sendToView(view -> view.showErrorMessage(mergeResponseModel.getMessage())); } @@ -291,10 +267,44 @@ class PullRequestPagerPresenter extends BasePresenter } @Override public void onUpdatePullRequest(@NonNull PullRequest pullRequestModel) { - this.pullRequest = pullRequestModel; + this.pullRequest.setTitle(pullRequestModel.getTitle()); + this.pullRequest.setBody(pullRequestModel.getBody()); + this.pullRequest.setBodyHtml(pullRequestModel.getBodyHtml()); this.pullRequest.setLogin(login); this.pullRequest.setRepoId(repoId); manageObservable(pullRequest.save(pullRequest).toObservable()); - sendToView(PullRequestPagerMvp.View::onSetupIssue); + sendToView(view -> view.onSetupIssue(true)); + } + + @Override public void onRefresh() { + callApi(); + } + + private void callApi() { + makeRestCall(RxHelper.getObserver(Observable.zip(RestProvider.getPullRequestService() + .getPullRequest(login, repoId, issueNumber), + RestProvider.getRepoService().isCollaborator(login, repoId, Login.getUser().getLogin()), + RestProvider.getIssueService().getIssue(login, repoId, issueNumber), + (pullRequestModel, booleanResponse, issue) -> { + this.pullRequest = pullRequestModel; + if (issue != null) { + this.pullRequest.setReactions(issue.getReactions()); + this.pullRequest.setTitle(issue.getTitle()); + this.pullRequest.setBody(issue.getBody()); + this.pullRequest.setBodyHtml(issue.getBodyHtml()); + } + this.pullRequest.setLogin(login); + this.pullRequest.setRepoId(repoId); + isCollaborator = booleanResponse.code() == 204; + return pullRequest; + })), pullRequest -> { + sendToView(view -> view.onSetupIssue(false)); + manageObservable(pullRequest.save(pullRequest).toObservable()); + }); + } + + private void updateTimeline(PullRequestPagerMvp.View view, int assignee_added) { + view.showMessage(R.string.success, assignee_added); + view.onUpdateTimeline(); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelineFragment.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelineFragment.java index cd27b7af..ce80b9ec 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelineFragment.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelineFragment.java @@ -1,6 +1,7 @@ package com.fastaccess.ui.modules.repos.pull_requests.pull_request.details.timeline.timeline; import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.os.Bundle; import android.support.annotation.NonNull; @@ -8,6 +9,7 @@ import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.view.View; +import com.evernote.android.state.State; import com.fastaccess.R; import com.fastaccess.data.dao.EditReviewCommentModel; import com.fastaccess.data.dao.ReviewCommentModel; @@ -25,6 +27,7 @@ import com.fastaccess.ui.adapter.IssuePullsTimelineAdapter; import com.fastaccess.ui.adapter.viewholder.TimelineCommentsViewHolder; import com.fastaccess.ui.base.BaseFragment; import com.fastaccess.ui.modules.editor.EditorActivity; +import com.fastaccess.ui.modules.repos.issues.issue.details.IssuePagerMvp; import com.fastaccess.ui.modules.repos.reactions.ReactionsDialogFragment; import com.fastaccess.ui.widgets.AppbarRefreshLayout; import com.fastaccess.ui.widgets.StateLayout; @@ -37,7 +40,6 @@ import java.util.LinkedHashMap; import java.util.List; import butterknife.BindView; -import com.evernote.android.state.State; /** * Created by Kosh on 31 Mar 2017, 7:35 PM @@ -52,16 +54,33 @@ public class PullRequestTimelineFragment extends BaseFragment toggleMap = new LinkedHashMap<>(); private IssuePullsTimelineAdapter adapter; - private OnLoadMore onLoadMore; + private OnLoadMore onLoadMore; - public static PullRequestTimelineFragment newInstance(@NonNull PullRequest pullRequest) { - PullRequestTimelineFragment view = new PullRequestTimelineFragment(); - view.setArguments(Bundler.start().put(BundleConstant.ITEM, pullRequest).end());//TODO fix this - return view; + private IssuePagerMvp.IssuePrCallback issueCallback; + + @NonNull public static PullRequestTimelineFragment newInstance() { + return new PullRequestTimelineFragment(); + } + + @SuppressWarnings("unchecked") @Override public void onAttach(Context context) { + super.onAttach(context); + if (getParentFragment() instanceof IssuePagerMvp.IssuePrCallback) { + issueCallback = (IssuePagerMvp.IssuePrCallback) getParentFragment(); + } else if (context instanceof IssuePagerMvp.IssuePrCallback) { + issueCallback = (IssuePagerMvp.IssuePrCallback) context; + } else { + throw new IllegalArgumentException(String.format("%s or parent fragment must implement IssuePagerMvp.IssuePrCallback", context.getClass() + .getSimpleName())); + } + } + + @Override public void onDetach() { + issueCallback = null; + super.onDetach(); } @Override public void onRefresh() { - getPresenter().onCallApi(1, null); + getPresenter().onCallApi(1, getPullRequest()); } @Override protected int fragmentLayout() { @@ -69,24 +88,27 @@ public class PullRequestTimelineFragment extends BaseFragment getLoadMore() { if (onLoadMore == null) { - onLoadMore = new OnLoadMore(getPresenter()); + onLoadMore = new OnLoadMore<>(getPresenter()); } + onLoadMore.setParameter(getPullRequest()); return onLoadMore; } @Override public void onEditComment(@NonNull Comment item) { Intent intent = new Intent(getContext(), EditorActivity.class); + if (getPullRequest() == null) return; intent.putExtras(Bundler .start() - .put(BundleConstant.ID, getPresenter().repoId()) - .put(BundleConstant.EXTRA_TWO, getPresenter().login()) - .put(BundleConstant.EXTRA_THREE, getPresenter().number()) + .put(BundleConstant.ID, getPullRequest().getRepoId()) + .put(BundleConstant.EXTRA_TWO, getPullRequest().getLogin()) + .put(BundleConstant.EXTRA_THREE, getPullRequest().getNumber()) .put(BundleConstant.EXTRA_FOUR, item.getId()) .put(BundleConstant.EXTRA, item.getBody()) .put(BundleConstant.EXTRA_TYPE, BundleConstant.ExtraTYpe.EDIT_ISSUE_COMMENT_EXTRA) @@ -170,11 +192,12 @@ public class PullRequestTimelineFragment extends BaseFragment items, int page); - @NonNull OnLoadMore getLoadMore(); + @NonNull OnLoadMore getLoadMore(); void onEditComment(@NonNull Comment item); @@ -66,34 +66,26 @@ public interface PullRequestTimelineMvp { void onSetHeader(@NonNull TimelineModel timelineModel); - void onRefresh(@NonNull PullRequest pullRequest); + @Nullable PullRequest getPullRequest(); + + void onUpdateHeader(); } interface Presenter extends BaseMvp.FAPresenter, BaseViewHolder.OnItemClickListener, - ReviewCommentCallback, BaseMvp.PaginationListener { + ReviewCommentCallback, BaseMvp.PaginationListener { @NonNull ArrayList getEvents(); - void onFragmentCreated(@Nullable Bundle bundle); - void onWorkOffline(); void onHandleDeletion(@Nullable Bundle bundle); - @Nullable String repoId(); - - @Nullable String login(); - - int number(); - boolean isPreviouslyReacted(long commentId, int vId); void onHandleReaction(@IdRes int vId, long idOrNumber, @ReactionsProvider.ReactionType int reactionType); - boolean isMerged(); + boolean isMerged(PullRequest pullRequest); boolean isCallingApi(long id, int vId); - - void onUpdatePullRequest(@NonNull PullRequest pullRequest); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java index 1a03c564..ca89fca3 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/timeline/timeline/PullRequestTimelinePresenter.java @@ -41,20 +41,19 @@ import io.reactivex.Observable; public class PullRequestTimelinePresenter extends BasePresenter implements PullRequestTimelineMvp.Presenter { private ArrayList timeline = new ArrayList<>(); private ReactionsProvider reactionsProvider; - @com.evernote.android.state.State PullRequest pullRequest; private int page; private int previousTotal; private int lastPage = Integer.MAX_VALUE; @Override public void onItemClick(int position, View v, TimelineModel item) { - if (getView() != null) { + if (getView() != null && getView().getPullRequest() != null) { if (item.getType() == TimelineModel.COMMENT) { - if (getHeader() == null) return; + PullRequest pullRequest = getView().getPullRequest(); if (v.getId() == R.id.commentMenu) { PopupMenu popupMenu = new PopupMenu(v.getContext(), v); popupMenu.inflate(R.menu.comments_menu); String username = Login.getUser().getLogin(); - boolean isOwner = CommentsHelper.isOwner(username, getHeader().getLogin(), item.getComment().getUser().getLogin()); + boolean isOwner = CommentsHelper.isOwner(username, pullRequest.getLogin(), item.getComment().getUser().getLogin()); popupMenu.getMenu().findItem(R.id.delete).setVisible(isOwner); popupMenu.getMenu().findItem(R.id.edit).setVisible(isOwner); popupMenu.setOnMenuItemClickListener(item1 -> { @@ -119,10 +118,11 @@ public class PullRequestTimelinePresenter extends BasePresenter view.onSetHeader(TimelineModel.constructHeader(pullRequest))); - onCallApi(1, null); - } - } - - @Override public void onFragmentCreated(@Nullable Bundle bundle) { - if (bundle == null) throw new NullPointerException("Bundle is null?"); - pullRequest = bundle.getParcelable(BundleConstant.ITEM); - if (timeline.isEmpty() && pullRequest != null) { - sendToView(view -> view.onSetHeader(TimelineModel.constructHeader(pullRequest))); - onCallApi(1, null); - } - } - @Override public void onWorkOffline() { //TODO } - @Nullable private PullRequest getHeader() { - return pullRequest; - } - @Override public void onHandleDeletion(@Nullable Bundle bundle) { + if (getView() == null || getView().getPullRequest() == null) return; if (bundle != null) { + PullRequest pullRequest = getView().getPullRequest(); + String login = pullRequest.getLogin(); + String repoId = pullRequest.getRepoId(); long commId = bundle.getLong(BundleConstant.EXTRA, 0); boolean isReviewComment = bundle.getBoolean(BundleConstant.YES_NO_EXTRA); if (commId != 0 && !isReviewComment) { - makeRestCall(RestProvider.getIssueService().deleteIssueComment(login(), repoId(), commId), + makeRestCall(RestProvider.getIssueService().deleteIssueComment(login, repoId, commId), booleanResponse -> sendToView(view -> { if (booleanResponse.code() == 204) { Comment comment = new Comment(); @@ -187,7 +170,7 @@ public class PullRequestTimelinePresenter extends BasePresenter sendToView(view -> { if (booleanResponse.code() == 204) { view.onRemoveReviewComment(groupPosition, commentPosition); @@ -199,38 +182,24 @@ public class PullRequestTimelinePresenter extends BasePresenter { @@ -275,9 +244,10 @@ public class PullRequestTimelinePresenter extends BasePresenter view.getLoadMore().reset()); @@ -321,7 +291,7 @@ public class PullRequestTimelinePresenter extends BasePresenter(), Tr @State var selectedTitle: String = "" fun onDailyClicked() { - Toasty.info(applicationContext, "Hello").show() Logger.e() daily.isSelected = true weekly.isSelected = false @@ -40,7 +38,6 @@ class TrendingActivity : BaseActivity(), Tr } fun onWeeklyClicked() { - Toasty.info(applicationContext, "Hello").show() weekly.isSelected = true daily.isSelected = false monthly.isSelected = false @@ -48,7 +45,6 @@ class TrendingActivity : BaseActivity(), Tr } fun onMonthlyClicked() { - Toasty.info(applicationContext, "Hello").show() monthly.isSelected = true weekly.isSelected = false daily.isSelected = false @@ -137,4 +133,4 @@ class TrendingActivity : BaseActivity(), Tr else -> return "daily" } } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt index c4d46a99..50759383 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt +++ b/app/src/main/java/com/fastaccess/ui/modules/trending/TrendingPresenter.kt @@ -10,9 +10,7 @@ import io.reactivex.Observable class TrendingPresenter : BasePresenter(), TrendingMvp.Presenter { override fun onLoadLanguage() { - manageObservable(Observable.create { - ColorsProvider.languages().forEach({ t: String? -> it.onNext(t) }) - it.onComplete() - }.doOnNext({ t: String -> sendToView({ it.onAppend(t) }) })) + manageObservable(Observable.fromIterable(ColorsProvider.languages()) + .doOnNext({ t: String -> sendToView({ it.onAppend(t) }) })) } } diff --git a/app/src/main/java/com/fastaccess/ui/widgets/DiffLineSpan.java b/app/src/main/java/com/fastaccess/ui/widgets/DiffLineSpan.java index 0d654c91..5011658e 100644 --- a/app/src/main/java/com/fastaccess/ui/widgets/DiffLineSpan.java +++ b/app/src/main/java/com/fastaccess/ui/widgets/DiffLineSpan.java @@ -20,7 +20,6 @@ import android.text.style.TypefaceSpan; import com.fastaccess.App; import com.fastaccess.R; import com.fastaccess.helper.InputHelper; -import com.fastaccess.helper.Logger; public class DiffLineSpan extends MetricAffectingSpan implements LineBackgroundSpan { private Rect rect = new Rect(); @@ -68,8 +67,8 @@ public class DiffLineSpan extends MetricAffectingSpan implements LineBackgroundS String[] split = text.split("\\r?\\n|\\r"); if (split.length > 0) { int lines = split.length; + int index = -1; for (int i = 0; i < lines; i++) { - Logger.e(lines, i, lines + i, lines - i); if (truncate && (lines - i) > 3) continue; String token = split[i]; if (i < (lines - 1)) { @@ -85,7 +84,7 @@ public class DiffLineSpan extends MetricAffectingSpan implements LineBackgroundS color = patchRefColor; } else if (firstChar == '\\') { token = token.replace("\\ No newline at end of file", ""); - noNewlineRemoved = true; + index = i; } SpannableString spannableDiff = new SpannableString(token); if (color != Color.TRANSPARENT) { @@ -94,12 +93,12 @@ public class DiffLineSpan extends MetricAffectingSpan implements LineBackgroundS } builder.append(spannableDiff); } + if (index != -1) { + builder.insert(index, SpannableBuilder.builder() + .append(ContextCompat.getDrawable(App.getInstance(), R.drawable.ic_newline))); + } } } - if (noNewlineRemoved) { - builder.insert(builder.length() - 1, SpannableBuilder.builder() - .append(ContextCompat.getDrawable(App.getInstance(), R.drawable.ic_newline))); - } builder.setSpan(new TypefaceSpan("monospace"), 0, builder.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return builder; } diff --git a/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml index 932e4888..69b187a3 100644 --- a/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/comments_row_item.xml @@ -82,10 +82,10 @@ android:id="@+id/comment" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_micro" android:layout_marginEnd="@dimen/spacing_xs_large" - android:layout_marginStart="@dimen/avatar_margin" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginStart="@dimen/spacing_xs_large" + android:layout_marginTop="@dimen/spacing_micro" android:textIsSelectable="true"/> diff --git a/app/src/main/res/layouts/row_layouts/layout/review_comments_row_item.xml b/app/src/main/res/layouts/row_layouts/layout/review_comments_row_item.xml index f46318e2..1bb0da7a 100644 --- a/app/src/main/res/layouts/row_layouts/layout/review_comments_row_item.xml +++ b/app/src/main/res/layouts/row_layouts/layout/review_comments_row_item.xml @@ -80,10 +80,10 @@ android:id="@+id/comment" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="@dimen/spacing_normal" + android:layout_marginBottom="@dimen/spacing_micro" android:layout_marginEnd="@dimen/spacing_xs_large" - android:layout_marginStart="@dimen/avatar_margin" - android:layout_marginTop="@dimen/spacing_normal" + android:layout_marginStart="@dimen/spacing_xs_large" + android:layout_marginTop="@dimen/spacing_micro" android:textIsSelectable="true" tools:text="Hello World"/> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index e49e7275..631892e6 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -475,4 +475,7 @@ Type Sort Sort direction + Assignee added successfully + Reviewer added successfully + Milestone added successfully diff --git a/debug_gradle.properties b/debug_gradle.properties index 95f8cf7a..d0ba5760 100644 --- a/debug_gradle.properties +++ b/debug_gradle.properties @@ -5,4 +5,5 @@ android_key_alias=ALIAS github_client_id=GITHUB_CLIENT_ID github_secret=GITHUB_SECRET imgur_client_id=imgur_client_id -imgur_secret=imgur_secret \ No newline at end of file +imgur_secret=imgur_secret +redirect_url=fasthub://login \ No newline at end of file