From 0e6448cb2c08fa8f0858746e2769c91baa9ee847 Mon Sep 17 00:00:00 2001 From: Kosh Date: Mon, 27 Mar 2017 21:48:35 +0800 Subject: [PATCH] this commit fixes #208 , fixes #206 , fixes #204 , fixes #203 , fixes #202 , fixes #201 (I guess) , fixes #199 and ready to release 1.4.1 with bug fixes and what better, anchor links now works 100% as its done from javascript instead of android. --- app/build.gradle | 4 +- app/proguard-rules.pro | 1 - app/src/main/assets/md/intercept-touch.js | 20 ++ .../data/dao/FragmentPagerAdapterModel.java | 3 +- .../data/dao/model/AbstractComment.java | 113 +++++----- .../data/dao/model/AbstractCommit.java | 56 ++--- .../data/dao/model/AbstractGist.java | 59 ++--- .../data/dao/model/AbstractIssue.java | 26 ++- .../data/dao/model/AbstractIssueEvent.java | 30 +-- .../data/dao/model/AbstractNotification.java | 8 +- .../data/dao/model/AbstractPullRequest.java | 63 +++--- .../data/dao/model/AbstractRelease.java | 24 +- .../data/dao/model/AbstractRepo.java | 44 ++-- .../data/dao/model/AbstractRepoFile.java | 26 ++- .../data/dao/model/AbstractSearchHistory.java | 5 + .../data/dao/model/AbstractUser.java | 66 +++--- .../java/com/fastaccess/helper/RxHelper.java | 4 + .../NotificationSchedulerJobTask.java | 22 +- .../adapter/viewholder/GistsViewHolder.java | 4 +- .../ui/modules/changelog/ChangelogView.java | 2 - .../ui/modules/editor/EditorView.java | 2 +- .../ui/modules/gists/gist/GistView.java | 2 +- .../modules/main/donation/DonationView.java | 6 +- .../main/issues/MyIssuesPresenter.java | 3 - .../pullrequests/MyPullRequestsPresenter.java | 3 - .../profile/overview/ProfileOverviewView.java | 19 +- .../ui/modules/repos/RepoPagerMvp.java | 2 + .../ui/modules/repos/RepoPagerPresenter.java | 25 +-- .../ui/modules/repos/RepoPagerView.java | 25 +-- .../details/comments/CommitCommentsView.java | 10 +- .../details/files/CommitFilesPresenter.java | 13 +- .../details/files/CommitFilesSingleton.java | 39 ++++ .../commit/details/files/CommitFilesView.java | 10 +- .../repos/issues/create/CreateIssueView.java | 4 +- .../issues/issue/RepoClosedIssuesView.java | 9 +- .../repos/issues/issue/RepoIssuesMvp.java | 4 +- .../issues/issue/RepoIssuesPresenter.java | 27 ++- .../issues/issue/RepoOpenedIssuesView.java | 19 +- .../details/events/IssueDetailsView.java | 2 +- .../pull_request/RepoPullRequestMvp.java | 4 +- .../RepoPullRequestPresenter.java | 28 ++- .../pull_request/RepoPullRequestView.java | 30 ++- .../events/PullRequestDetailsView.java | 2 +- .../prettifier/pretty/PrettifyWebView.java | 4 +- .../main_layouts/layout/editor_layout.xml | 6 +- .../layout/repo_header_icons_layout.xml | 210 +++++++++--------- app/src/main/res/raw/changelog.html | 57 +++++ app/src/main/res/raw/changelog.txt | 57 ----- app/src/main/res/values/strings.xml | 1 + 49 files changed, 675 insertions(+), 528 deletions(-) create mode 100644 app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesSingleton.java create mode 100644 app/src/main/res/raw/changelog.html delete mode 100644 app/src/main/res/raw/changelog.txt diff --git a/app/build.gradle b/app/build.gradle index 695fa481..e9bc5efd 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -27,8 +27,8 @@ android { applicationId "com.fastaccess.github" minSdkVersion 21 targetSdkVersion 25 - versionCode 140 - versionName "1.4.0" + versionCode 141 + versionName "1.4.1" signingConfig signingConfigs.signing buildConfigString "GITHUB_CLIENT_ID", (buildProperties.secrets['github_client_id'] | buildProperties.notThere['github_client_id']).string buildConfigString "GITHUB_SECRET", (buildProperties.secrets['github_secret'] | buildProperties.notThere['github_secret']).string diff --git a/app/proguard-rules.pro b/app/proguard-rules.pro index 39212d32..fa9a513a 100644 --- a/app/proguard-rules.pro +++ b/app/proguard-rules.pro @@ -1,4 +1,3 @@ --renamesourcefileattribute SourceFile -keepattributes SourceFile,LineNumberTable -dontpreverify -repackageclasses '' diff --git a/app/src/main/assets/md/intercept-touch.js b/app/src/main/assets/md/intercept-touch.js index 3f8844e6..991a74f6 100644 --- a/app/src/main/assets/md/intercept-touch.js +++ b/app/src/main/assets/md/intercept-touch.js @@ -7,6 +7,10 @@ document.addEventListener("DOMContentLoaded", function(event) { window.onload = function() { addTouchEvents(document.getElementsByTagName("pre")); addTouchEvents(document.getElementsByTagName("table")); + var hash = window.location.hash.substr(1); + if (hash != ""){ + scrollTo(hash); + } }; function addTouchEvents(elements) { @@ -23,3 +27,19 @@ function touchStart(event) { function touchEnd(event) { Android.stopIntercept(); } + +function scrollTo(hash) { + var element = document.getElementById("user-content-" + hash); + element.scrollIntoView(); +} + +window.onclick = function(e) { + if (e.target.localName == 'a') { + var href = e.target; + href = href.toString().replace("file:///android_asset/md/",""); + console.log(href); + if (href.indexOf("#") === 0) { + scrollTo(href.replace("#","")); + } + } +}; \ No newline at end of file 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 1d70a0a3..1bff88ed 100644 --- a/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java +++ b/app/src/main/java/com/fastaccess/data/dao/FragmentPagerAdapterModel.java @@ -133,7 +133,8 @@ public class FragmentPagerAdapterModel { String login = commitModel.getLogin(); String repoId = commitModel.getRepoId(); String sha = commitModel.getSha(); - return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.commits), CommitFilesView.newInstance(commitModel.getFiles())) + return Stream.of(new FragmentPagerAdapterModel(context.getString(R.string.commits), CommitFilesView.newInstance(commitModel.getSha(), + commitModel.getFiles())) , new FragmentPagerAdapterModel(context.getString(R.string.comments), CommitCommentsView.newInstance(login, repoId, sha))) .collect(Collectors.toList()); } diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractComment.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractComment.java index 8edf77e0..9fb80d23 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractComment.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractComment.java @@ -63,71 +63,78 @@ import static com.fastaccess.data.dao.model.Comment.UPDATED_AT; } public static Observable saveForGist(@NonNull List models, @NonNull String gistId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Comment.class) - .where(GIST_ID.equal(gistId)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(model -> { - model.setGistId(gistId); - model.save(model).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Comment.class) + .where(GIST_ID.equal(gistId)) + .get() + .value(); + Stream.of(models) + .forEach(model -> { + model.setGistId(gistId); + model.save(model).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable saveForCommits(@NonNull List models, @NonNull String repoId, @NonNull String login, @NonNull String commitId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Comment.class) - .where(COMMIT_ID.equal(commitId) - .and(REPO_ID.equal(repoId)) - .and(LOGIN.equal(login))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(model -> { - model.setLogin(login); - model.setRepoId(repoId); - model.setCommitId(commitId); - model.save(model).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Comment.class) + .where(COMMIT_ID.equal(commitId) + .and(REPO_ID.equal(repoId)) + .and(LOGIN.equal(login))) + .get() + .value(); + Stream.of(models) + .forEach(model -> { + model.setLogin(login); + model.setRepoId(repoId); + model.setCommitId(commitId); + model.save(model).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable saveForIssues(@NonNull List models, @NonNull String repoId, @NonNull String login, @NonNull String issueId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Comment.class) - .where(ISSUE_ID.equal(issueId) - .and(REPO_ID.equal(repoId)) - .and(LOGIN.equal(login))) - .get() - .value(); - - return Observable.create(subscriber -> Stream.of(models) - .forEach(model -> { - model.setLogin(login); - model.setRepoId(repoId); - model.setIssueId(issueId); - model.save(model).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Comment.class) + .where(ISSUE_ID.equal(issueId) + .and(REPO_ID.equal(repoId)) + .and(LOGIN.equal(login))) + .get() + .value(); + Stream.of(models) + .forEach(model -> { + model.setLogin(login); + model.setRepoId(repoId); + model.setIssueId(issueId); + model.save(model).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable saveForPullRequest(@NonNull List models, @NonNull String repoId, @NonNull String login, @NonNull String pullRequestId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Comment.class) - .where(PULL_REQUEST_ID.equal(pullRequestId) - .and(REPO_ID.equal(repoId)) - .and(LOGIN.equal(login))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(model -> { - model.setLogin(login); - model.setRepoId(repoId); - model.setPullRequestId(pullRequestId); - model.save(model).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Comment.class) + .where(PULL_REQUEST_ID.equal(pullRequestId) + .and(REPO_ID.equal(repoId)) + .and(LOGIN.equal(login))) + .get() + .value(); + Stream.of(models) + .forEach(model -> { + model.setLogin(login); + model.setRepoId(repoId); + model.setPullRequestId(pullRequestId); + model.save(model).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> getGistComments(@NonNull String gistId) { diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractCommit.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractCommit.java index 0dafe2ae..966c5a70 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractCommit.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractCommit.java @@ -65,35 +65,39 @@ public abstract class AbstractCommit implements Parcelable { } public static Observable save(@NonNull List models, @NonNull String repoId, @NonNull String login) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Commit.class) - .where(REPO_ID.eq(repoId) - .and(LOGIN.eq(login))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(commitModel -> { - commitModel.setRepoId(repoId); - commitModel.setLogin(login); - commitModel.save(commitModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Commit.class) + .where(REPO_ID.eq(repoId) + .and(LOGIN.eq(login))) + .get() + .value(); + Stream.of(models) + .forEach(commitModel -> { + commitModel.setRepoId(repoId); + commitModel.setLogin(login); + commitModel.save(commitModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable save(@NonNull List models, @NonNull String repoId, @NonNull String login, long number) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Commit.class) - .where(REPO_ID.eq(repoId) - .and(LOGIN.eq(login)) - .and(PULL_REQUEST_NUMBER.eq(number))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(commitModel -> { - commitModel.setRepoId(repoId); - commitModel.setLogin(login); - commitModel.setPullRequestNumber(number); - commitModel.save(commitModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Commit.class) + .where(REPO_ID.eq(repoId) + .and(LOGIN.eq(login)) + .and(PULL_REQUEST_NUMBER.eq(number))) + .get() + .value(); + Stream.of(models) + .forEach(commitModel -> { + commitModel.setRepoId(repoId); + commitModel.setLogin(login); + commitModel.setPullRequestNumber(number); + commitModel.save(commitModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> getCommits(@NonNull String repoId, @NonNull String login) { diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractGist.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractGist.java index 88dde969..3468ef3e 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractGist.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractGist.java @@ -67,28 +67,29 @@ import rx.Observable; } public static Completable save(@NonNull List gists) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - return singleEntityStore.delete(Gist.class) - .where(Gist.OWNER_NAME.isNull()) - .get() - .toSingle() - .toCompletable() - .andThen(Observable.from(gists) - .map(gist -> gist.save(gist))) - .toCompletable(); + return Completable.fromAction(() -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Gist.class) + .where(Gist.OWNER_NAME.isNull()) + .get() + .value(); + Stream.of(gists).forEach(gist -> gist.save(gist)); + }); } public static Observable save(@NonNull List gists, @NonNull String ownerName) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Gist.class) - .where(Gist.OWNER_NAME.equal(ownerName)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(gists) - .forEach(gistsModel -> { - gistsModel.setOwnerName(ownerName); - gistsModel.save(gistsModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Gist.class) + .where(Gist.OWNER_NAME.equal(ownerName)) + .get() + .value(); + Stream.of(gists) + .forEach(gistsModel -> { + gistsModel.setOwnerName(ownerName); + gistsModel.save(gistsModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } @NonNull public static Observable> getMyGists(@NonNull String ownerName) { @@ -140,6 +141,10 @@ import rx.Observable; } @NonNull public SpannableBuilder getDisplayTitle(boolean isFromProfile) { + return getDisplayTitle(isFromProfile, false); + } + + @NonNull public SpannableBuilder getDisplayTitle(boolean isFromProfile, boolean gistView) { SpannableBuilder spannableBuilder = SpannableBuilder.builder(); boolean addDescription = true; if (!isFromProfile) { @@ -150,13 +155,15 @@ import rx.Observable; } else { spannableBuilder.bold("Anonymous"); } - List files = getFilesAsList(); - if (!files.isEmpty()) { - FilesListModel filesListModel = files.get(0); - if (!InputHelper.isEmpty(filesListModel.getFilename()) && filesListModel.getFilename().trim().length() > 2) { - spannableBuilder.append(" ").append("/").append(" ") - .append(filesListModel.getFilename()); - addDescription = false; + if (!gistView) { + List files = getFilesAsList(); + if (!files.isEmpty()) { + FilesListModel filesListModel = files.get(0); + if (!InputHelper.isEmpty(filesListModel.getFilename()) && filesListModel.getFilename().trim().length() > 2) { + spannableBuilder.append(" ").append("/").append(" ") + .append(filesListModel.getFilename()); + addDescription = false; + } } } } diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssue.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssue.java index 7086ff54..44023d57 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssue.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssue.java @@ -79,18 +79,20 @@ import static com.fastaccess.data.dao.model.Issue.UPDATED_AT; } public static Observable save(@NonNull List models, @NonNull String repoId, @NonNull String login) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Issue.class) - .where(REPO_ID.equal(repoId) - .and(LOGIN.equal(login))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(issueModel -> { - issueModel.setRepoId(repoId); - issueModel.setLogin(login); - issueModel.save(issueModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Issue.class) + .where(REPO_ID.equal(repoId) + .and(LOGIN.equal(login))) + .get() + .value(); + Stream.of(models) + .forEach(issueModel -> { + issueModel.setRepoId(repoId); + issueModel.setLogin(login); + issueModel.save(issueModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> getIssues(@NonNull String repoId, @NonNull String login, @NonNull IssueState issueState) { diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssueEvent.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssueEvent.java index 812a6d7b..86427721 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssueEvent.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractIssueEvent.java @@ -71,20 +71,22 @@ import static com.fastaccess.data.dao.model.IssueEvent.REPO_ID; public static Observable save(@NonNull List models, @NonNull String repoId, @NonNull String login, @NonNull String issueId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(IssueEvent.class) - .where(LOGIN.equal(login) - .and(REPO_ID.equal(repoId)) - .and(ISSUE_ID.equal(issueId))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(issueEventModel -> { - issueEventModel.setIssueId(issueId); - issueEventModel.setLogin(login); - issueEventModel.setRepoId(repoId); - issueEventModel.save(issueEventModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(IssueEvent.class) + .where(LOGIN.equal(login) + .and(REPO_ID.equal(repoId)) + .and(ISSUE_ID.equal(issueId))) + .get() + .value(); + Stream.of(models) + .forEach(issueEventModel -> { + issueEventModel.setIssueId(issueId); + issueEventModel.setLogin(login); + issueEventModel.setRepoId(repoId); + issueEventModel.save(issueEventModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> get(@NonNull String repoId, @NonNull String login, diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotification.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotification.java index 347cca41..be382ebb 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotification.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractNotification.java @@ -50,11 +50,11 @@ import rx.Observable; } public static Observable save(@NonNull List models) { - SingleEntityStore dataSource = App.getInstance().getDataStore(); - dataSource.delete(Notification.class) - .get() - .value(); return Observable.create(subscriber -> { + SingleEntityStore dataSource = App.getInstance().getDataStore(); + dataSource.delete(Notification.class) + .get() + .value(); Stream.of(models).forEach(notification -> notification.save(notification).toObservable().toBlocking().singleOrDefault(null)); subscriber.onCompleted(); }); diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractPullRequest.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractPullRequest.java index 0f62a05a..b82b49c8 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractPullRequest.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractPullRequest.java @@ -18,6 +18,7 @@ import com.fastaccess.data.dao.converters.PullRequestConverter; import com.fastaccess.data.dao.converters.UserConverter; import com.fastaccess.data.dao.converters.UsersConverter; import com.fastaccess.data.dao.types.IssueState; +import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.ParseDateFormat; import com.fastaccess.ui.widgets.SpannableBuilder; @@ -98,18 +99,20 @@ import static com.fastaccess.data.dao.model.PullRequest.UPDATED_AT; } public static Observable save(@NonNull List models, @NonNull String repoId, @NonNull String login) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(PullRequest.class) - .where(REPO_ID.equal(repoId) - .and(LOGIN.equal(login))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(pulRequest -> { - pulRequest.setRepoId(repoId); - pulRequest.setLogin(login); - pulRequest.save(pulRequest).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(PullRequest.class) + .where(REPO_ID.equal(repoId) + .and(LOGIN.equal(login))) + .get() + .value(); + Stream.of(models) + .forEach(pulRequest -> { + pulRequest.setRepoId(repoId); + pulRequest.setLogin(login); + pulRequest.save(pulRequest).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> getPullRequests(@NonNull String repoId, @NonNull String login, @@ -144,24 +147,30 @@ import static com.fastaccess.data.dao.model.PullRequest.UPDATED_AT; } @NonNull public static SpannableBuilder getMergeBy(@NonNull PullRequest pullRequest, @NonNull Context context) { - boolean isMerge = pullRequest.isMerged(); - User merger = (isMerge && pullRequest.getMergedBy() != null) ? pullRequest.getMergedBy() : pullRequest.getUser(); - String status = !isMerge ? context.getString(pullRequest.getState().getStatus()) : context.getString(R.string.merged); - SpannableBuilder builder = SpannableBuilder.builder(); - builder.bold("#" + pullRequest.getNumber()) - .append(" ") - .append(merger.getLogin()) - .append(" ") - .append(status) - .append(" "); + boolean isMerge = pullRequest.isMerged() || !InputHelper.isEmpty(pullRequest.mergedAt); if (isMerge) { - builder.append(ParseDateFormat.getTimeAgo(pullRequest.getMergedAt())); + User merger = pullRequest.getMergedBy(); + return SpannableBuilder.builder() + .bold("#" + pullRequest.getNumber()) + .append(" ") + .append(merger != null ? merger.getLogin() + " " : "") + .bold(context.getString(R.string.merged)) + .append(" ") + .append(ParseDateFormat.getTimeAgo(pullRequest.getMergedAt())); } else { - builder.append(ParseDateFormat.getTimeAgo( - pullRequest.getState() == IssueState.closed - ? pullRequest.getClosedAt() : pullRequest.getCreatedAt())); + User user = pullRequest.getUser(); + String status = context.getString(pullRequest.getState().getStatus()); + return SpannableBuilder.builder() + .bold("#" + pullRequest.getNumber()) + .append(" ") + .append(user.getLogin()) + .append(" ") + .bold(status) + .append(" ") + .append(ParseDateFormat.getTimeAgo( + pullRequest.getState() == IssueState.closed + ? pullRequest.getClosedAt() : pullRequest.getCreatedAt())); } - return builder; } @Override public int describeContents() { return 0; } diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractRelease.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractRelease.java index 17c4402e..e463e3ea 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractRelease.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractRelease.java @@ -67,17 +67,19 @@ public abstract class AbstractRelease implements Parcelable { } public static Observable save(@NonNull List models, @NonNull String repoId, @NonNull String login) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Release.class) - .where(REPO_ID.eq(login)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(releasesModel -> { - releasesModel.setRepoId(repoId); - releasesModel.setLogin(login); - releasesModel.save(releasesModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Release.class) + .where(REPO_ID.eq(login)) + .get() + .value(); + Stream.of(models) + .forEach(releasesModel -> { + releasesModel.setRepoId(repoId); + releasesModel.setLogin(login); + releasesModel.save(releasesModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepo.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepo.java index 42e2aa0d..e28d8845 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepo.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepo.java @@ -141,29 +141,33 @@ import static com.fastaccess.data.dao.model.Repo.UPDATED_AT; } public static Observable saveStarred(@NonNull List models, @NonNull String starredUser) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Repo.class) - .where(STARRED_USER.eq(starredUser)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(repo -> { - repo.setStarredUser(starredUser); - repo.save(repo).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Repo.class) + .where(STARRED_USER.eq(starredUser)) + .get() + .value(); + Stream.of(models) + .forEach(repo -> { + repo.setStarredUser(starredUser); + repo.save(repo).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable saveMyRepos(@NonNull List models, @NonNull String reposOwner) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(Repo.class) - .where(REPOS_OWNER.eq(reposOwner)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(repo -> { - repo.setReposOwner(reposOwner); - repo.save(repo).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(Repo.class) + .where(REPOS_OWNER.eq(reposOwner)) + .get() + .value(); + Stream.of(models) + .forEach(repo -> { + repo.setReposOwner(reposOwner); + repo.save(repo).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> getStarred(@NonNull String starredUser) { diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepoFile.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepoFile.java index 4b3ddb64..cd4831f7 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepoFile.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractRepoFile.java @@ -50,18 +50,20 @@ import static com.fastaccess.data.dao.model.RepoFile.TYPE; } public static Observable save(@NonNull List models, @NonNull String login, @NonNull String repoId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(RepoFile.class) - .where(REPO_ID.eq(repoId) - .and(LOGIN.eq(login))) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(filesModel -> { - filesModel.setRepoId(repoId); - filesModel.setLogin(login); - filesModel.save(filesModel).toObservable().toBlocking().singleOrDefault(null); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(RepoFile.class) + .where(REPO_ID.eq(repoId) + .and(LOGIN.eq(login))) + .get() + .value(); + Stream.of(models) + .forEach(filesModel -> { + filesModel.setRepoId(repoId); + filesModel.setLogin(login); + filesModel.save(filesModel).toObservable().toBlocking().singleOrDefault(null); + }); + }); } public static Observable> getFiles(@NonNull String login, @NonNull String repoId) { diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractSearchHistory.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractSearchHistory.java index 31f846a3..34c95e85 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractSearchHistory.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractSearchHistory.java @@ -22,6 +22,11 @@ public abstract class AbstractSearchHistory implements Parcelable { @Column(unique = true) String text; public Completable save(SearchHistory entity) { + App.getInstance().getDataStore() + .delete(SearchHistory.class) + .where(SearchHistory.TEXT.eq(entity.getText())) + .get() + .value(); return App.getInstance().getDataStore() .insert(entity) .toCompletable(); diff --git a/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java b/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java index f393efb7..0ffb3a9f 100644 --- a/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java +++ b/app/src/main/java/com/fastaccess/data/dao/model/AbstractUser.java @@ -112,42 +112,48 @@ public abstract class AbstractUser implements Parcelable { } public static Observable saveUserFollowerList(@NonNull List models, @NonNull String followingName) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(User.class) - .where(FOLLOWING_NAME.eq(followingName)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(userModel -> { - userModel.setFollowingName(followingName); - userModel.save(userModel); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(User.class) + .where(FOLLOWING_NAME.eq(followingName)) + .get() + .value(); + Stream.of(models) + .forEach(userModel -> { + userModel.setFollowingName(followingName); + userModel.save(userModel); + }); + }); } public static Observable saveUserFollowingList(@NonNull List models, @NonNull String followerName) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(User.class) - .where(FOLLOWER_NAME.eq(followerName)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(userModel -> { - userModel.setFollowerName(followerName); - userModel.save(userModel); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(User.class) + .where(FOLLOWER_NAME.eq(followerName)) + .get() + .value(); + Stream.of(models) + .forEach(userModel -> { + userModel.setFollowerName(followerName); + userModel.save(userModel); + }); + }); } public static Observable saveUserContributorList(@NonNull List models, @NonNull String repoId) { - SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); - singleEntityStore.delete(User.class) - .where(REPO_ID.eq(repoId)) - .get() - .value(); - return Observable.create(subscriber -> Stream.of(models) - .forEach(userModel -> { - userModel.setRepoId(repoId); - userModel.save(userModel); - })); + return Observable.create(subscriber -> { + SingleEntityStore singleEntityStore = App.getInstance().getDataStore(); + singleEntityStore.delete(User.class) + .where(REPO_ID.eq(repoId)) + .get() + .value(); + Stream.of(models) + .forEach(userModel -> { + userModel.setRepoId(repoId); + userModel.save(userModel); + }); + }); } diff --git a/app/src/main/java/com/fastaccess/helper/RxHelper.java b/app/src/main/java/com/fastaccess/helper/RxHelper.java index cfc6c3b4..b3ed821f 100644 --- a/app/src/main/java/com/fastaccess/helper/RxHelper.java +++ b/app/src/main/java/com/fastaccess/helper/RxHelper.java @@ -22,4 +22,8 @@ public class RxHelper { .subscribeOn(Schedulers.computation()) .observeOn(AndroidSchedulers.mainThread()); } + + public static Observable saveObserable(@NonNull Observable observable) { + return getObserver(observable).onErrorReturn(throwable -> null); + } } diff --git a/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java b/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java index 8a15966e..5ff9e49b 100644 --- a/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java +++ b/app/src/main/java/com/fastaccess/provider/tasks/notification/NotificationSchedulerJobTask.java @@ -18,8 +18,10 @@ import com.fastaccess.helper.AppHelper; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.PrefGetter; +import com.fastaccess.helper.RxHelper; import com.fastaccess.helper.ViewHelper; import com.fastaccess.provider.rest.RestProvider; +import com.fastaccess.ui.modules.notification.NotificationActivityView; import com.firebase.jobdispatcher.Constraint; import com.firebase.jobdispatcher.FirebaseJobDispatcher; import com.firebase.jobdispatcher.GooglePlayDriver; @@ -49,10 +51,9 @@ public class NotificationSchedulerJobTask extends JobService { .getNotifications(0) .subscribeOn(Schedulers.io()) .subscribe(item -> { + AppHelper.cancelNotification(this, BundleConstant.REQUEST_CODE); if (item != null) { onSave(item.getItems()); - } else { - AppHelper.cancelNotification(this, BundleConstant.REQUEST_CODE); } }, Throwable::printStackTrace); } @@ -90,7 +91,7 @@ public class NotificationSchedulerJobTask extends JobService { private void onSave(@Nullable List notificationThreadModels) { if (notificationThreadModels != null) { - Notification.save(notificationThreadModels).subscribe(); + RxHelper.saveObserable(Notification.save(notificationThreadModels)).subscribe(); onNotifyUser(notificationThreadModels); } } @@ -106,17 +107,22 @@ public class NotificationSchedulerJobTask extends JobService { Context context = getApplicationContext(); Bitmap largeIcon = BitmapFactory.decodeResource(context.getResources(), R.mipmap.ic_launcher); - int primaryColor = ViewHelper.getPrimaryColor(context); - android.app.Notification grouped = getNotification(getString(R.string.notifications), getString(R.string.unread_notification)) + Intent intent = new Intent(this, NotificationActivityView.class); + PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, + PendingIntent.FLAG_UPDATE_CURRENT); + int accentColor = ViewHelper.getAccentColor(context); + android.app.Notification grouped = getNotification(getString(R.string.app_name), getString(R.string.notifications_hint)) .setLargeIcon(largeIcon) .setGroup(NOTIFICATION_GROUP_ID) .setGroupSummary(true) - .setColor(primaryColor) + .setColor(accentColor) + .setContentIntent(pendingIntent) .setAutoCancel(true) .build(); showNotification(BundleConstant.REQUEST_CODE, grouped); Stream.of(notificationThreadModels) .filter(Notification::isUnread) + .limit(10) .forEach(thread -> { if (!InputHelper.isEmpty(thread.getSubject().getLatestCommentUrl())) { RestProvider.getNotificationService().getComment(thread.getSubject().getLatestCommentUrl()) @@ -130,7 +136,7 @@ public class NotificationSchedulerJobTask extends JobService { .setLargeIcon(largeIcon) .setContentIntent(getPendingIntent(thread.getId(), thread.getSubject().getUrl())) .setGroup(NOTIFICATION_GROUP_ID) - .setColor(primaryColor) + .setColor(accentColor) .addAction(R.drawable.ic_github, context.getString(R.string.open), getPendingIntent(thread.getId(), thread.getSubject().getUrl())) .build(); @@ -142,7 +148,7 @@ public class NotificationSchedulerJobTask extends JobService { .setLargeIcon(largeIcon) .setContentIntent(getPendingIntent(thread.getId(), thread.getSubject().getUrl())) .setGroup(NOTIFICATION_GROUP_ID) - .setColor(primaryColor) + .setColor(accentColor) .addAction(R.drawable.ic_github, context.getString(R.string.open), getPendingIntent(thread.getId(), thread .getSubject().getUrl())) .build(); diff --git a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java index 9ca4b1b5..4cbbdcb6 100644 --- a/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java +++ b/app/src/main/java/com/fastaccess/ui/adapter/viewholder/GistsViewHolder.java @@ -43,9 +43,9 @@ public class GistsViewHolder extends BaseViewHolder { @Override public void bind(@NonNull Gist item) { if (!isFromProfile) { - String url = item.getOwner() != null ? item.getOwner().getAvatarUrl() : item.getUser() != null ? item.getUser().getAvatarUrl() : null; - String login = item.getOwner() != null ? item.getOwner().getLogin() : item.getUser() != null ? item.getUser().getLogin() : null; if (avatar != null) { + String url = item.getOwner() != null ? item.getOwner().getAvatarUrl() : item.getUser() != null ? item.getUser().getAvatarUrl() : null; + String login = item.getOwner() != null ? item.getOwner().getLogin() : item.getUser() != null ? item.getUser().getLogin() : null; avatar.setUrl(url, login); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/changelog/ChangelogView.java b/app/src/main/java/com/fastaccess/ui/modules/changelog/ChangelogView.java index 01645813..9258f272 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/changelog/ChangelogView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/changelog/ChangelogView.java @@ -1,6 +1,5 @@ package com.fastaccess.ui.modules.changelog; -import android.graphics.Color; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -47,7 +46,6 @@ public class ChangelogView extends BaseBottomSheetDialog { @Override public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - messageLayout.setBackgroundColor(Color.WHITE); if (savedInstanceState == null) { PrefGetter.setWhatsNewVersion(); } diff --git a/app/src/main/java/com/fastaccess/ui/modules/editor/EditorView.java b/app/src/main/java/com/fastaccess/ui/modules/editor/EditorView.java index b9ecddca..5b0b5f7b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/editor/EditorView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/editor/EditorView.java @@ -138,7 +138,7 @@ public class EditorView extends BaseActivity im hideProgress(); Intent intent = new Intent(); intent.putExtras(Bundler.start() - .put(BundleConstant.ITEM, commentModel) +// .put(BundleConstant.ITEM, commentModel) .put(BundleConstant.EXTRA, isNew) .end()); setResult(RESULT_OK, intent); diff --git a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java index 1f868a1c..aa7984dc 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/gists/gist/GistView.java @@ -200,7 +200,7 @@ public class GistView extends BaseActivity String login = gistsModel.getOwner() != null ? gistsModel.getOwner().getLogin() : gistsModel.getUser() != null ? gistsModel.getUser().getLogin() : ""; avatarLayout.setUrl(url, login); - title.setText(gistsModel.getDisplayTitle(false)); + title.setText(gistsModel.getDisplayTitle(false, true)); detailsIcon.setVisibility(InputHelper.isEmpty(gistsModel.getDescription()) || !ViewHelper.isEllipsed(title) ? View.GONE : View.VISIBLE); date.setText(ParseDateFormat.getTimeAgo(gistsModel.getCreatedAt())); size.setText(Formatter.formatFileSize(this, gistsModel.getSize())); diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonationView.java b/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonationView.java index ffb7b1bc..be59a290 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonationView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/donation/DonationView.java @@ -69,10 +69,8 @@ public class DonationView extends BaseDialogFragment { - showMessage(R.string.success, R.string.success_purchase_message); - dismiss(); - }, throwable -> showErrorMessage(throwable.getMessage())); + .subscribe(order -> showMessage(R.string.success, R.string.success_purchase_message), + throwable -> showErrorMessage(throwable.getMessage())); } @Override public void onItemLongClick(int position, View v, String item) { diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesPresenter.java index 23e00cdf..d21e74fa 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/issues/MyIssuesPresenter.java @@ -8,8 +8,6 @@ import com.fastaccess.data.dao.PullsIssuesParser; import com.fastaccess.data.dao.model.Issue; import com.fastaccess.data.dao.model.Login; import com.fastaccess.data.dao.types.IssueState; -import com.fastaccess.helper.Bundler; -import com.fastaccess.helper.Logger; import com.fastaccess.provider.rest.RepoQueryProvider; import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; @@ -29,7 +27,6 @@ public class MyIssuesPresenter extends BasePresenter implement private int lastPage = Integer.MAX_VALUE; @Override public void onItemClick(int position, View v, Issue item) { - Logger.e(Bundler.start().put("item", item).end().size()); PullsIssuesParser parser = PullsIssuesParser.getForIssue(item.getHtmlUrl()); if (parser != null) { v.getContext().startActivity(IssuePagerView.createIntent(v.getContext(), parser.getRepoId(), diff --git a/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java index 6687da9e..dce3b372 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/main/pullrequests/MyPullRequestsPresenter.java @@ -9,8 +9,6 @@ import com.fastaccess.data.dao.PullsIssuesParser; import com.fastaccess.data.dao.model.Login; import com.fastaccess.data.dao.model.PullRequest; import com.fastaccess.data.dao.types.IssueState; -import com.fastaccess.helper.Bundler; -import com.fastaccess.helper.Logger; import com.fastaccess.provider.rest.RepoQueryProvider; import com.fastaccess.provider.rest.RestProvider; import com.fastaccess.ui.base.mvp.presenter.BasePresenter; @@ -30,7 +28,6 @@ public class MyPullRequestsPresenter extends BasePresenter implements Rep private boolean isWatched; private boolean isStarred; private boolean isForked; - private final String login; - private final String repoId; + private String login; + private String repoId; private Repo repo; private int navTyp; - RepoPagerPresenter(final String repoId, final String login, @RepoPagerMvp.RepoNavigationType int navTyp) { - if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId())) { - throw new IllegalArgumentException("arguments cannot be empty"); - } - this.repoId = repoId; - this.login = login; - this.navTyp = navTyp; - } + RepoPagerPresenter() {} private void callApi(int navTyp) { if (InputHelper.isEmpty(login) || InputHelper.isEmpty(repoId)) return; @@ -64,12 +57,14 @@ class RepoPagerPresenter extends BasePresenter implements Rep super.onError(throwable); } - @Override protected void onAttachView(final @NonNull RepoPagerMvp.View view) { - super.onAttachView(view); - if (getRepo() != null) { - view.onInitRepo(); - } else { + @Override public void onActivityCreate(@NonNull String repoId, @NonNull String login, int navTyp) { + this.login = login; + this.repoId = repoId; + this.navTyp = navTyp; + if (getRepo() == null || !isApiCalled()) { callApi(navTyp); + } else { + sendToView(RepoPagerMvp.View::onInitRepo); } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerView.java index 53157105..f5e73f1f 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/RepoPagerView.java @@ -17,6 +17,7 @@ import android.view.View; import android.widget.LinearLayout; import com.fastaccess.R; +import com.fastaccess.data.dao.LicenseModel; import com.fastaccess.data.dao.NameParser; import com.fastaccess.data.dao.model.AbstractPinnedRepos; import com.fastaccess.data.dao.model.Repo; @@ -180,21 +181,18 @@ public class RepoPagerView extends BaseActivity implements private CommitFileListModel files = new CommitFileListModel(); @Override public void onItemClick(int position, View v, CommitFileModel item) { - + } @Override public void onItemLongClick(int position, View v, CommitFileModel item) { @@ -28,9 +29,13 @@ class CommitFilesPresenter extends BasePresenter implements @Override public void onFragmentCreated(@Nullable Bundle bundle) { if (bundle != null) { - CommitFileListModel files = (CommitFileListModel) bundle.get(BundleConstant.EXTRA); - if (files != null) { - this.files.addAll(files); + String sha = bundle.getString(BundleConstant.ID); + if (!InputHelper.isEmpty(sha)) { + CommitFileListModel commitFiles = CommitFilesSingleton.getInstance().getByCommitId(sha); + if (commitFiles != null) { + this.files.addAll(commitFiles); + CommitFilesSingleton.getInstance().clear(); + } } sendToView(CommitFilesMvp.View::onNotifyAdapter); } else { diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesSingleton.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesSingleton.java new file mode 100644 index 00000000..59ee4415 --- /dev/null +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesSingleton.java @@ -0,0 +1,39 @@ +package com.fastaccess.ui.modules.repos.code.commit.details.files; + +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; + +import com.fastaccess.data.dao.CommitFileListModel; + +import java.util.Hashtable; +import java.util.Map; + +/** + * Created by Kosh on 27 Mar 2017, 7:28 PM + */ + +class CommitFilesSingleton { + private static final CommitFilesSingleton ourInstance = new CommitFilesSingleton(); + + static CommitFilesSingleton getInstance() { + return ourInstance; + } + + private Map files = new Hashtable<>(); + + private CommitFilesSingleton() { + } + + void putFiles(@NonNull String id, @NonNull CommitFileListModel commitFiles) { + files.clear(); + files.put(id, commitFiles); + } + + @Nullable CommitFileListModel getByCommitId(@NonNull String id) { + return files.get(id); + } + + void clear() { + files.clear(); + } +} diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesView.java index 3f24a154..f7af92eb 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/code/commit/details/files/CommitFilesView.java @@ -33,11 +33,13 @@ public class CommitFilesView extends BaseFragment getLoadMore(); void onAddIssue(); + + void onUpdateCount(int totalCount); } interface Presenter extends BaseMvp.FAPresenter, diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java index 419e06cb..d8e5f09b 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoIssuesPresenter.java @@ -9,7 +9,6 @@ import com.fastaccess.data.dao.PullsIssuesParser; import com.fastaccess.data.dao.model.Issue; import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.helper.BundleConstant; -import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; import com.fastaccess.helper.Logger; import com.fastaccess.helper.RxHelper; @@ -57,6 +56,11 @@ class RepoIssuesPresenter extends BasePresenter implements R } @Override public void onCallApi(int page, @Nullable IssueState parameter) { + if (parameter == null) { + sendToView(RepoIssuesMvp.View::hideProgress); + return; + } + this.issueState = parameter; Logger.e(page, page, login, repoId); if (page == 1) { lastPage = Integer.MAX_VALUE; @@ -67,8 +71,7 @@ class RepoIssuesPresenter extends BasePresenter implements R return; } setCurrentPage(page); - makeRestCall(RestProvider.getIssueService().getIssuesWithCount(RepoQueryProvider - .getIssuesPullRequerQuery(login, repoId, issueState, false), page), + makeRestCall(RestProvider.getIssueService().getRepositoryIssues(login, repoId, parameter.name(), page), issues -> { lastPage = issues.getLast(); if (getCurrentPage() == 1) { @@ -76,16 +79,24 @@ class RepoIssuesPresenter extends BasePresenter implements R manageSubscription(Issue.save(issues.getItems(), repoId, login).subscribe()); } getIssues().addAll(issues.getItems()); - sendToView(view -> view.onNotifyAdapter(issues.getTotalCount())); + sendToView(RepoIssuesMvp.View::onNotifyAdapter); }); } + private void onCallCountApi(@NonNull IssueState issueState) { + manageSubscription(RxHelper.getObserver(RestProvider.getIssueService() + .getIssuesWithCount(RepoQueryProvider.getIssuesPullRequerQuery(login, repoId, issueState, false), 1)) + .subscribe(pullRequestPageable -> sendToView(view -> view.onUpdateCount(pullRequestPageable.getTotalCount())), + Throwable::printStackTrace)); + } + @Override public void onFragmentCreated(@NonNull Bundle bundle, @NonNull IssueState issueState) { repoId = bundle.getString(BundleConstant.ID); login = bundle.getString(BundleConstant.EXTRA); this.issueState = issueState; if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { - onCallApi(1, null); + onCallApi(1, issueState); + onCallCountApi(issueState); } } @@ -94,7 +105,10 @@ class RepoIssuesPresenter extends BasePresenter implements R manageSubscription(RxHelper.getObserver(Issue.getIssues(repoId, login, issueState)) .subscribe(issueModel -> { issues.addAll(issueModel); - sendToView(view -> view.onNotifyAdapter(issues.size())); + sendToView(view -> { + view.onNotifyAdapter(); + view.onUpdateCount(issues.size()); + }); })); } else { sendToView(BaseMvp.FAView::hideProgress); @@ -114,7 +128,6 @@ class RepoIssuesPresenter extends BasePresenter implements R } @Override public void onItemClick(int position, View v, Issue item) { - Logger.e(Bundler.start().put("item", item).end().size()); PullsIssuesParser parser = PullsIssuesParser.getForIssue(item.getHtmlUrl()); if (parser != null) { v.getContext().startActivity(IssuePagerView.createIntent(v.getContext(), parser.getRepoId(), diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java index 3947e40a..484a8546 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/issues/issue/RepoOpenedIssuesView.java @@ -67,8 +67,7 @@ public class RepoOpenedIssuesView extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter()); @@ -146,11 +140,20 @@ public class RepoOpenedIssuesView extends BaseFragment getLoadMore(); + + void onUpdateCount(int totalCount); } interface Presenter extends BaseMvp.FAPresenter, diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java index 4cc17299..cf8c5726 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestPresenter.java @@ -10,9 +10,7 @@ import com.fastaccess.data.dao.PullsIssuesParser; import com.fastaccess.data.dao.model.PullRequest; import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.helper.BundleConstant; -import com.fastaccess.helper.Bundler; import com.fastaccess.helper.InputHelper; -import com.fastaccess.helper.Logger; import com.fastaccess.helper.RxHelper; import com.fastaccess.provider.rest.RepoQueryProvider; import com.fastaccess.provider.rest.RestProvider; @@ -58,6 +56,11 @@ class RepoPullRequestPresenter extends BasePresenter im } @Override public void onCallApi(int page, @Nullable IssueState parameter) { + if (parameter == null) { + sendToView(RepoPullRequestMvp.View::hideProgress); + return; + } + this.issueState = parameter; if (page == 1) { lastPage = Integer.MAX_VALUE; sendToView(view -> view.getLoadMore().reset()); @@ -68,15 +71,14 @@ class RepoPullRequestPresenter extends BasePresenter im return; } if (repoId == null || login == null) return; - makeRestCall(RestProvider.getPullRequestSerice().getPullsWithCount(RepoQueryProvider.getIssuesPullRequerQuery(login, repoId, issueState, - true), page), response -> { + makeRestCall(RestProvider.getPullRequestSerice().getPullRequests(login, repoId, parameter.name(), page), response -> { lastPage = response.getLast(); if (getCurrentPage() == 1) { getPullRequests().clear(); manageSubscription(PullRequest.save(response.getItems(), login, repoId).subscribe()); } getPullRequests().addAll(response.getItems()); - sendToView(view -> view.onNotifyAdapter(response.getTotalCount())); + sendToView(RepoPullRequestMvp.View::onNotifyAdapter); }); } @@ -85,16 +87,27 @@ class RepoPullRequestPresenter extends BasePresenter im login = bundle.getString(BundleConstant.EXTRA); issueState = (IssueState) bundle.getSerializable(BundleConstant.EXTRA_TWO); if (!InputHelper.isEmpty(login) && !InputHelper.isEmpty(repoId)) { - onCallApi(1, null); + onCallApi(1, issueState); + onCallCountApi(issueState); } } + private void onCallCountApi(@NonNull IssueState issueState) { + manageSubscription(RxHelper.getObserver(RestProvider.getPullRequestSerice() + .getPullsWithCount(RepoQueryProvider.getIssuesPullRequerQuery(login, repoId, issueState, true), 0)) + .subscribe(pullRequestPageable -> sendToView(view -> view.onUpdateCount(pullRequestPageable.getTotalCount())), + Throwable::printStackTrace)); + } + @Override public void onWorkOffline() { if (pullRequests.isEmpty()) { manageSubscription(RxHelper.getObserver(PullRequest.getPullRequests(repoId, login, issueState)) .subscribe(pulls -> { pullRequests.addAll(pulls); - sendToView(view -> view.onNotifyAdapter(pullRequests.size())); + sendToView(view -> { + view.onNotifyAdapter(); + view.onUpdateCount(pullRequests.size()); + }); })); } else { sendToView(BaseMvp.FAView::hideProgress); @@ -110,7 +123,6 @@ class RepoPullRequestPresenter extends BasePresenter im } @Override public void onItemClick(int position, View v, PullRequest item) { - Logger.e(Bundler.start().put("item", item).end().size()); PullsIssuesParser parser = PullsIssuesParser.getForPullRequest(item.getHtmlUrl()); if (parser != null) { Intent intent = PullRequestPagerView.createIntent(v.getContext(), parser.getRepoId(), parser.getLogin(), parser.getNumber()); diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestView.java index 1f9b9d9a..701e56bf 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/RepoPullRequestView.java @@ -12,7 +12,6 @@ import com.fastaccess.R; import com.fastaccess.data.dao.types.IssueState; import com.fastaccess.helper.BundleConstant; import com.fastaccess.helper.Bundler; -import com.fastaccess.helper.Logger; import com.fastaccess.provider.rest.loadmore.OnLoadMore; import com.fastaccess.ui.adapter.PullRequestAdapter; import com.fastaccess.ui.base.BaseFragment; @@ -58,9 +57,7 @@ public class RepoPullRequestView extends BaseFragment getLoadMore() { if (onLoadMore == null) { onLoadMore = new OnLoadMore<>(getPresenter()); } + onLoadMore.setParameter(getIssueState()); return onLoadMore; } + @Override public void onUpdateCount(int totalCount) { + if (tabsBadgeListener != null) tabsBadgeListener.onSetBadge(getPresenter().getIssueState() == IssueState.open ? 0 : 1, totalCount); + } + @Override public void onRefresh() { - getPresenter().onCallApi(1, null); + getPresenter().onCallApi(1, getIssueState()); } @Override public void onClick(View view) { onRefresh(); } + + private IssueState getIssueState() { + return ((IssueState) getArguments().getSerializable(BundleConstant.EXTRA_TWO)); + } + + private void showReload() { + hideProgress(); + stateLayout.showReload(adapter.getItemCount()); + } } diff --git a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/events/PullRequestDetailsView.java b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/events/PullRequestDetailsView.java index 177e981b..3c7f3f4f 100644 --- a/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/events/PullRequestDetailsView.java +++ b/app/src/main/java/com/fastaccess/ui/modules/repos/pull_requests/pull_request/details/events/PullRequestDetailsView.java @@ -33,7 +33,7 @@ public class PullRequestDetailsView extends BaseFragment + android:clipToPadding="false" + android:fillViewport="true"> - + android:orientation="horizontal"> - - - + android:orientation="vertical"> - + - + - - - + + + android:orientation="vertical"> - + - + - - - + + + android:orientation="vertical"> - + - + - - - + + + android:orientation="vertical" + android:visibility="gone" + tools:visibility="visible"> - + - + - - - + + + android:orientation="vertical"> + + + + + - - - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/raw/changelog.html b/app/src/main/res/raw/changelog.html new file mode 100644 index 00000000..d0f8a996 --- /dev/null +++ b/app/src/main/res/raw/changelog.html @@ -0,0 +1,57 @@ + + + +

FastHub changelog

+

Version 1.4.0

+

New

+
    +
  • Introduction new enhanced FastHub Main Screen showing you what matters the most to you: +
      +
    • My Feeds
    • +
    • Pull Requests
    • +
    • Issues
    • +
    +
  • +
  • Notifications, the notifications in (notification panel) is now enhanced as: #111 +
      +
    • Grouped Notifications, all under one notification.
    • +
    • Showing comments within the notification. Yaay.
    • +
    • Opening the specific view from within the notification, no more extra clicks.
    • +
    • Upon clicking a notification, it will be auto-magically marked as read unless if you disable it from the settings screen.
    • +
    +
  • +
  • Pinned Repos, is a place that lives outside of GitHub and only exists in FastHub, you could pin any repo you like and access it faster from within the Pinned tab from MenuDrawer (works Offline). #184
  • +
  • Menu Drawer now has more options, and there will be more in the future: +
      +
    • Pinned
    • +
    • Public Gists (Previously in BottomBar)
    • +
    • Your own Gists
    • +
    • More items
    • +
    +
  • +
  • Issues & Pull Requests count, Please be aware that this rely on the Search API which mean it has API limit for more info please +
    visit. GitHub Developer Rate Limit #185
  • +
  • Now Downloaded files are going to be downloaded into your sdcard/FastHub folder which results in asking a new Permission.
  • +
+

Fixes

+
    +
  • Those who uses custom build.properties in their phone to modify the display density, now the app should behave like it should and show you the +
    right layout for your screen.#189
  • +
  • Files and Branches now should be downloaded in FastHub Folder. #188
  • +
  • Enable ads not saved upon restarting app.#176
  • +
  • Commit files font style. #187
  • +
  • And More fixed internally that I can’t really remember them.
  • +
+
+

Please notice: if you are using Android 7 & above, you might have a problem with the NightMode. its something out of FastHub league as its OS bug +
than FastHub due to this & as per request we will end up with a Themes Engine very soon.

+
+
+

Please notice: Organization is my highest priority for the next release, please stay tuned & patience.

+
+
+

FastHub in a month has closed 176 issues & feature requests, its a one man job, so please bare with me.

+
+

Thank you very much

+ + \ No newline at end of file diff --git a/app/src/main/res/raw/changelog.txt b/app/src/main/res/raw/changelog.txt deleted file mode 100644 index a9020748..00000000 --- a/app/src/main/res/raw/changelog.txt +++ /dev/null @@ -1,57 +0,0 @@ -Untitled Document.md -

FastHub changelog

-

Version 1.4.0

-

New

-
    -
  • Introduction new enhanced FastHub Main Screen showing you what matters the most to you: -
      -
    • My Feeds
    • -
    • Pull Requests
    • -
    • Issues
    • -
    -
  • -
  • Notifications, the notifications in (notification panel) is now enhanced as: #111 -
      -
    • Grouped Notifications, all under one notification.
    • -
    • Showing comments within the notification. Yaay.
    • -
    • Opening the specific view from within the notification, no more extra clicks.
    • -
    • Upon clicking a notification, it will be auto-magically marked as read unless if you disable it from the settings screen.
    • -
    -
  • -
  • Pinned Repos, is a place that lives outside of GitHub and only exists in FastHub, you could pin any repo you -like and access it faster from -within the Pinned tab from MenuDrawer (works Offline). #184
  • -
  • Menu Drawer now has more options, and there will be more in the future: -
      -
    • Pinned
    • -
    • Public Gists (Previously in BottomBar)
    • -
    • Your own Gists
    • -
    • More items
    • -
    -
  • -
  • Issues & Pull Requests count, Please be aware that this rely on the Search API which mean it has API limit for more info please
    -visit. GitHub Developer Rate Limit #185
  • -
  • Now Downloaded files are going to be downloaded into your sdcard/FastHub folder which results in asking a new Permission.
  • -
-

Fixes

-
    -
  • Those who uses custom build.properties in their phone to modify the display density, now the app should behave like it should and show you the
    -right layout for your screen.#189
  • -
  • Files and Branches now should be downloaded in FastHub Folder. #188
  • -
  • Enable ads not saved upon restarting app.#176
  • -
  • Commit files font style. #187
  • -
  • And More fixed internally that I can’t really remember them.
  • -
-
-

Please notice: if you are using Android 7 & above, you might have a problem with the NightMode. its something out of FastHub league as its OS bug
-than FastHub due to this & as per request we will end up with a Themes Engine very soon.

-
-
-

Please notice: Organization is my highest priority for the next release, please stay tuned & patience.

-
-
-

FastHub in a month has closed 176 issues & feature requests, its a one man job, so please bare with me.

-
-

Thank you very much

- - \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 18732c50..145ebbfa 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -320,4 +320,5 @@ No unread notifications. My Gists Changelog + Click to open notifications list or swipe to dismiss \ No newline at end of file