improving offline module and reading for 1.2.0

This commit is contained in:
Kosh 2017-03-19 22:02:41 +08:00
parent 247a803e68
commit 11ddea1fd0
14 changed files with 176 additions and 204 deletions

View File

@ -27,8 +27,8 @@ android {
applicationId "com.fastaccess.github"
minSdkVersion 21
targetSdkVersion 25
versionCode 111
versionName "1.1.1"
versionCode 120
versionName "1.2.0"
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

View File

@ -15,7 +15,6 @@ import io.requery.meta.EntityModel;
import io.requery.rx.RxSupport;
import io.requery.rx.SingleEntityStore;
import io.requery.sql.Configuration;
import io.requery.sql.ConfigurationBuilder;
import io.requery.sql.EntityDataStore;
import io.requery.sql.TableCreationMode;
@ -46,9 +45,7 @@ public class App extends MultiDexApplication {
if (dataStore == null) {
EntityModel model = Models.DEFAULT;
DatabaseSource source = new DatabaseSource(this, model, "FastHub-DB", 1);
Configuration configuration = new ConfigurationBuilder(source, model)
.useDefaultLogging()
.build();
Configuration configuration = source.getConfiguration();
if (BuildConfig.DEBUG) {
source.setTableCreationMode(TableCreationMode.DROP_CREATE);
}

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.converters.UserConverter;
@ -61,79 +62,72 @@ import static com.fastaccess.data.dao.model.Comment.UPDATED_AT;
.andThen(App.getInstance().getDataStore().insert(modelEntity).toCompletable());
}
public static Completable saveForGist(@NonNull List<Comment> models, @NonNull String gistId) {
public static Observable saveForGist(@NonNull List<Comment> models, @NonNull String gistId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Comment.class)
singleEntityStore.delete(Comment.class)
.where(GIST_ID.equal(gistId))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(model -> {
model.setGistId(gistId);
return model.save(model);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(model -> {
model.setGistId(gistId);
model.save(model).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Completable saveForCommits(@NonNull List<Comment> models, @NonNull String repoId,
@NonNull String login, @NonNull String commitId) {
public static Observable saveForCommits(@NonNull List<Comment> models, @NonNull String repoId,
@NonNull String login, @NonNull String commitId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Comment.class)
singleEntityStore.delete(Comment.class)
.where(COMMIT_ID.equal(commitId)
.and(REPO_ID.equal(repoId))
.and(LOGIN.equal(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(model -> {
model.setLogin(login);
model.setRepoId(repoId);
model.setCommitId(commitId);
return model.save(model);
}))
.toCompletable();
.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);
}));
}
public static Completable saveForIssues(@NonNull List<Comment> models, @NonNull String repoId,
@NonNull String login, @NonNull String issueId) {
public static Observable saveForIssues(@NonNull List<Comment> models, @NonNull String repoId,
@NonNull String login, @NonNull String issueId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Comment.class)
singleEntityStore.delete(Comment.class)
.where(ISSUE_ID.equal(issueId)
.and(REPO_ID.equal(repoId))
.and(LOGIN.equal(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(model -> {
model.setLogin(login);
model.setRepoId(repoId);
model.setIssueId(issueId);
return model.save(model);
}))
.toCompletable();
.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);
}));
}
public static Completable saveForPullRequest(@NonNull List<Comment> models, @NonNull String repoId,
@NonNull String login, @NonNull String pullRequestId) {
public static Observable saveForPullRequest(@NonNull List<Comment> models, @NonNull String repoId,
@NonNull String login, @NonNull String pullRequestId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Comment.class)
singleEntityStore.delete(Comment.class)
.where(PULL_REQUEST_ID.equal(pullRequestId)
.and(REPO_ID.equal(repoId))
.and(LOGIN.equal(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(model -> {
model.setLogin(login);
model.setRepoId(repoId);
model.setPullRequestId(pullRequestId);
return model.save(model);
}))
.toCompletable();
.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);
}));
}
public static Observable<List<Comment>> getGistComments(@NonNull String gistId) {

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.CommitFileListModel;
import com.fastaccess.data.dao.CommitListModel;
@ -63,40 +64,36 @@ public abstract class AbstractCommit implements Parcelable {
.toCompletable();
}
public static Completable save(@NonNull List<Commit> models, @NonNull String repoId, @NonNull String login) {
public static Observable save(@NonNull List<Commit> models, @NonNull String repoId, @NonNull String login) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Commit.class)
singleEntityStore.delete(Commit.class)
.where(REPO_ID.eq(repoId)
.and(LOGIN.eq(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(commitModel -> {
commitModel.setRepoId(repoId);
commitModel.setLogin(login);
return commitModel.save(commitModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(commitModel -> {
commitModel.setRepoId(repoId);
commitModel.setLogin(login);
commitModel.save(commitModel).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Completable save(@NonNull List<Commit> models, @NonNull String repoId, @NonNull String login, long number) {
public static Observable save(@NonNull List<Commit> models, @NonNull String repoId, @NonNull String login, long number) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Commit.class)
singleEntityStore.delete(Commit.class)
.where(REPO_ID.eq(repoId)
.and(LOGIN.eq(login))
.and(PULL_REQUEST_NUMBER.eq(number)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(commitModel -> {
commitModel.setRepoId(repoId);
commitModel.setLogin(login);
commitModel.setPullRequestNumber(number);
return commitModel.save(commitModel);
}))
.toCompletable();
.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);
}));
}
public static Observable<List<Commit>> getCommits(@NonNull String repoId, @NonNull String login) {

View File

@ -70,6 +70,7 @@ import rx.Observable;
public static Completable save(@NonNull List<Gist> gists) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Gist.class)
.where(Gist.OWNER_NAME.isNull())
.get()
.toSingle()
.toCompletable()
@ -78,19 +79,17 @@ import rx.Observable;
.toCompletable();
}
public static Completable save(@NonNull List<Gist> gists, @NonNull String ownerName) {
public static Observable save(@NonNull List<Gist> gists, @NonNull String ownerName) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Gist.class)
singleEntityStore.delete(Gist.class)
.where(Gist.OWNER_NAME.equal(ownerName))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(gists)
.map(gistsModel -> {
gistsModel.setOwnerName(ownerName);
return gistsModel.save(gistsModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(gists)
.forEach(gistsModel -> {
gistsModel.setOwnerName(ownerName);
gistsModel.save(gistsModel).toObservable().toBlocking().singleOrDefault(null);
}));
}
@NonNull public static Observable<List<Gist>> getMyGists(@NonNull String ownerName) {

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.LabelListModel;
import com.fastaccess.data.dao.MilestoneModel;
@ -77,22 +78,19 @@ import static com.fastaccess.data.dao.model.Issue.UPDATED_AT;
.toCompletable());
}
public static Completable save(@NonNull List<Issue> models, @NonNull String repoId, @NonNull String login) {
public static Observable save(@NonNull List<Issue> models, @NonNull String repoId, @NonNull String login) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Issue.class)
singleEntityStore.delete(Issue.class)
.where(REPO_ID.equal(repoId)
.and(LOGIN.equal(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(issueModel -> {
issueModel.setRepoId(repoId);
issueModel.setLogin(login);
return issueModel.save(issueModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(issueModel -> {
issueModel.setRepoId(repoId);
issueModel.setLogin(login);
issueModel.save(issueModel).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Observable<List<Issue>> getIssues(@NonNull String repoId, @NonNull String login, @NonNull IssueState issueState) {

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.LabelModel;
import com.fastaccess.data.dao.MilestoneModel;
@ -68,24 +69,22 @@ import static com.fastaccess.data.dao.model.IssueEvent.REPO_ID;
.toCompletable());
}
public static Completable save(@NonNull List<IssueEvent> models, @NonNull String repoId,
@NonNull String login, @NonNull String issueId) {
public static Observable save(@NonNull List<IssueEvent> models, @NonNull String repoId,
@NonNull String login, @NonNull String issueId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(IssueEvent.class)
singleEntityStore.delete(IssueEvent.class)
.where(LOGIN.equal(login)
.and(REPO_ID.equal(repoId))
.and(ISSUE_ID.equal(issueId)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(issueEventModel -> {
issueEventModel.setIssueId(issueId);
issueEventModel.setLogin(login);
issueEventModel.setRepoId(repoId);
return issueEventModel.save(issueEventModel);
}))
.toCompletable();
.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);
}));
}
public static Observable<List<IssueEvent>> get(@NonNull String repoId, @NonNull String login,

View File

@ -3,6 +3,7 @@ package com.fastaccess.data.dao.model;
import android.os.Parcel;
import android.os.Parcelable;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.NotificationSubjectModel;
import com.fastaccess.data.dao.converters.NotificationSubjectConverter;
@ -48,15 +49,13 @@ import rx.Observable;
.toCompletable());
}
public static Completable save(@NonNull List<Notification> models) {
public static Observable<Object> save(@NonNull List<Notification> models) {
SingleEntityStore<Persistable> dataSource = App.getInstance().getDataStore();
return dataSource.delete(Notification.class)
dataSource.delete(Notification.class)
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(notification -> notification.save(notification)))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(notification -> notification.save(notification).toObservable().toBlocking().singleOrDefault(null)));
}
public static Observable<List<Notification>> getNotifications() {

View File

@ -5,6 +5,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.R;
import com.fastaccess.data.dao.LabelListModel;
@ -96,21 +97,19 @@ import static com.fastaccess.data.dao.model.PullRequest.UPDATED_AT;
.toCompletable());
}
public static Completable save(@NonNull List<PullRequest> models, @NonNull String repoId, @NonNull String login) {
public static Observable save(@NonNull List<PullRequest> models, @NonNull String repoId, @NonNull String login) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(PullRequest.class)
singleEntityStore.delete(PullRequest.class)
.where(REPO_ID.equal(repoId)
.and(LOGIN.equal(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(pulRequest -> {
pulRequest.setRepoId(repoId);
pulRequest.setLogin(login);
return pulRequest.save(pulRequest);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(pulRequest -> {
pulRequest.setRepoId(repoId);
pulRequest.setLogin(login);
pulRequest.save(pulRequest).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Observable<List<PullRequest>> getPullRequests(@NonNull String repoId, @NonNull String login,

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.ReleasesAssetsListModel;
import com.fastaccess.data.dao.converters.ReleasesAssetsConverter;
@ -65,20 +66,18 @@ public abstract class AbstractRelease implements Parcelable {
.toCompletable());
}
public static Completable save(@NonNull List<Release> models, @NonNull String repoId, @NonNull String login) {
public static Observable save(@NonNull List<Release> models, @NonNull String repoId, @NonNull String login) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Release.class)
singleEntityStore.delete(Release.class)
.where(REPO_ID.eq(login))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(releasesModel -> {
releasesModel.setRepoId(repoId);
releasesModel.setLogin(login);
return releasesModel.save(releasesModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(releasesModel -> {
releasesModel.setRepoId(repoId);
releasesModel.setLogin(login);
releasesModel.save(releasesModel).toObservable().toBlocking().singleOrDefault(null);
}));
}

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.LicenseModel;
import com.fastaccess.data.dao.RepoPermissionsModel;
@ -139,34 +140,30 @@ import static com.fastaccess.data.dao.model.Repo.UPDATED_AT;
.firstOrNull();
}
public static Completable saveStarred(@NonNull List<Repo> models, @NonNull String starredUser) {
public static Observable saveStarred(@NonNull List<Repo> models, @NonNull String starredUser) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Repo.class)
singleEntityStore.delete(Repo.class)
.where(STARRED_USER.eq(starredUser))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(repoModel -> {
repoModel.setStarredUser(starredUser);
return repoModel.save(repoModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(repo -> {
repo.setStarredUser(starredUser);
repo.save(repo).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Completable saveMyRepos(@NonNull List<Repo> models, @NonNull String reposOwner) {
public static Observable saveMyRepos(@NonNull List<Repo> models, @NonNull String reposOwner) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(Repo.class)
singleEntityStore.delete(Repo.class)
.where(REPOS_OWNER.eq(reposOwner))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(repoModel -> {
repoModel.setReposOwner(reposOwner);
return repoModel.save(repoModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(repo -> {
repo.setReposOwner(reposOwner);
repo.save(repo).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Observable<List<Repo>> getStarred(@NonNull String starredUser) {

View File

@ -4,6 +4,7 @@ import android.os.Parcel;
import android.os.Parcelable;
import android.support.annotation.NonNull;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import com.fastaccess.data.dao.types.FilesType;
@ -48,21 +49,19 @@ import static com.fastaccess.data.dao.model.RepoFile.TYPE;
.toCompletable();
}
public static Completable save(@NonNull List<RepoFile> models, @NonNull String login, @NonNull String repoId) {
public static Observable save(@NonNull List<RepoFile> models, @NonNull String login, @NonNull String repoId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(RepoFile.class)
singleEntityStore.delete(RepoFile.class)
.where(REPO_ID.eq(repoId)
.and(LOGIN.eq(login)))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(filesModel -> {
filesModel.setRepoId(repoId);
filesModel.setLogin(login);
return filesModel.save(filesModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(filesModel -> {
filesModel.setRepoId(repoId);
filesModel.setLogin(login);
filesModel.save(filesModel).toObservable().toBlocking().singleOrDefault(null);
}));
}
public static Observable<List<RepoFile>> getFiles(@NonNull String login, @NonNull String repoId) {

View File

@ -5,6 +5,7 @@ import android.os.Parcelable;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import com.annimon.stream.Stream;
import com.fastaccess.App;
import java.util.Date;
@ -110,49 +111,43 @@ public abstract class AbstractUser implements Parcelable {
.firstOrNull();
}
public static Completable saveUserFollowerList(@NonNull List<User> models, @NonNull String followingName) {
public static Observable saveUserFollowerList(@NonNull List<User> models, @NonNull String followingName) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(User.class)
singleEntityStore.delete(User.class)
.where(FOLLOWING_NAME.eq(followingName))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(userModel -> {
userModel.setFollowingName(followingName);
return userModel.saveToCompletable(userModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(userModel -> {
userModel.setFollowingName(followingName);
userModel.save(userModel);
}));
}
public static Completable saveUserFollowingList(@NonNull List<User> models, @NonNull String followerName) {
public static Observable saveUserFollowingList(@NonNull List<User> models, @NonNull String followerName) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(User.class)
singleEntityStore.delete(User.class)
.where(FOLLOWER_NAME.eq(followerName))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(userModel -> {
userModel.setFollowerName(followerName);
return userModel.saveToCompletable(userModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(userModel -> {
userModel.setFollowerName(followerName);
userModel.save(userModel);
}));
}
public static Completable saveUserContributorList(@NonNull List<User> models, @NonNull String repoId) {
public static Observable saveUserContributorList(@NonNull List<User> models, @NonNull String repoId) {
SingleEntityStore<Persistable> singleEntityStore = App.getInstance().getDataStore();
return singleEntityStore.delete(User.class)
singleEntityStore.delete(User.class)
.where(REPO_ID.eq(repoId))
.get()
.toSingle()
.toCompletable()
.andThen(Observable.from(models)
.map(userModel -> {
userModel.setRepoId(repoId);
return userModel.saveToCompletable(userModel);
}))
.toCompletable();
.value();
return Observable.create(subscriber -> Stream.of(models)
.forEach(userModel -> {
userModel.setRepoId(repoId);
userModel.save(userModel);
}));
}

View File

@ -82,7 +82,7 @@ public class NotificationSchedulerJobTask extends JobService {
private void onSave(@Nullable List<Notification> notificationThreadModels) {
if (notificationThreadModels != null) {
Notification.save(notificationThreadModels)
.subscribe(() -> onNotifyUser(notificationThreadModels));
.subscribe(o -> onNotifyUser(notificationThreadModels));
}
}