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 = "" + TAG_ROOT + '>';
-
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