From d4228ee9533c0149a2ccbefd8d446d0df53fe213 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sun, 3 Nov 2019 13:37:43 +0100 Subject: [PATCH] Wrap room insert id result into a single --- .../readrops/app/database/dao/BaseDao.java | 8 +++++- .../app/repositories/ARepository.java | 7 ++--- .../app/repositories/FreshRSSRepository.java | 17 +++++++---- .../app/repositories/LocalFeedRepository.java | 2 +- .../app/repositories/NextNewsRepository.java | 28 +++++++++++-------- .../app/viewmodels/AccountViewModel.java | 5 +--- .../ManageFeedsFoldersViewModel.java | 3 +- 7 files changed, 42 insertions(+), 28 deletions(-) diff --git a/app/src/main/java/com/readrops/app/database/dao/BaseDao.java b/app/src/main/java/com/readrops/app/database/dao/BaseDao.java index 148adfb3..bd0fbbb0 100644 --- a/app/src/main/java/com/readrops/app/database/dao/BaseDao.java +++ b/app/src/main/java/com/readrops/app/database/dao/BaseDao.java @@ -7,11 +7,17 @@ import androidx.room.Update; import java.util.List; import io.reactivex.Completable; +import io.reactivex.Single; public interface BaseDao { @Insert - long insert(T entity); // can't turn return type to Single while some repositories can't use rxjava properly + Single insert(T entity); // can't turn return type to Single while some repositories can't use rxjava properly + + // only here for compatibility with LocalFeedRepository + // which hasn't been written with rxjava usage in mind + @Insert + long compatInsert(T entity); @Insert List insert(List entities); diff --git a/app/src/main/java/com/readrops/app/repositories/ARepository.java b/app/src/main/java/com/readrops/app/repositories/ARepository.java index 80346695..c188711e 100644 --- a/app/src/main/java/com/readrops/app/repositories/ARepository.java +++ b/app/src/main/java/com/readrops/app/repositories/ARepository.java @@ -59,11 +59,8 @@ public abstract class ARepository { return database.feedDao().delete(feed); } - public Completable addFolder(Folder folder) { - return Completable.create(emitter -> { - database.folderDao().insert(folder); - emitter.onComplete(); - }); + public Single addFolder(Folder folder) { + return database.folderDao().insert(folder); } public Completable updateFolder(Folder folder) { diff --git a/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java b/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java index 70bde218..653fad70 100644 --- a/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java @@ -36,7 +36,7 @@ import io.reactivex.Single; public class FreshRSSRepository extends ARepository { private static final String TAG = FreshRSSRepository.class.getSimpleName(); - + public FreshRSSRepository(@NonNull Application application, @Nullable Account account) { super(application, account); } @@ -71,8 +71,14 @@ public class FreshRSSRepository extends ARepository { .flatMap(userInfo -> { account.setDisplayedName(userInfo.getUserName()); - if (insert) - account.setId((int) database.accountDao().insert(account)); + if (insert) { + return database.accountDao().insert(account) + .flatMap(id -> { + account.setId(id.intValue()); + + return Single.just(true); + }); + } return Single.just(true); }); @@ -164,8 +170,9 @@ public class FreshRSSRepository extends ARepository { } @Override - public Completable addFolder(Folder folder) { - return api.createFolder(account.getWriteToken(), folder.getName()); + public Single addFolder(Folder folder) { + return api.createFolder(account.getWriteToken(), folder.getName()) + .andThen(super.addFolder(folder)); } @Override diff --git a/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java b/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java index f2d41476..f55eb7fd 100644 --- a/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java @@ -202,7 +202,7 @@ public class LocalFeedRepository extends ARepository { dbFeed.setEtag(null); dbFeed.setLastModified(null); - dbFeed.setId((int) (database.feedDao().insert(dbFeed))); + dbFeed.setId((int) (database.feedDao().compatInsert(dbFeed))); return dbFeed; } diff --git a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java index 987e53e7..e3a31e78 100644 --- a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java @@ -58,7 +58,7 @@ public class NextNewsRepository extends ARepository { @Override public Single login(Account account, boolean insert) { - return Single.create(emitter -> { + return Single.create(emitter -> { if (api == null) api = new NextNewsAPI(account.toCredentials()); else @@ -66,15 +66,23 @@ public class NextNewsRepository extends ARepository { NextNewsUser user = api.login(); + emitter.onSuccess(user); + }).flatMap(user -> { if (user != null) { account.setDisplayedName(user.getDisplayName()); account.setCurrentAccount(true); - if (insert) - account.setId((int) database.accountDao().insert(account)); - emitter.onSuccess(true); + if (insert) { + return database.accountDao().insert(account) + .flatMap(id -> { + account.setId(id.intValue()); + return Single.just(true); + }); + } + + return Single.just(true); } else - emitter.onSuccess(false); + return Single.just(false); }); } @@ -206,8 +214,8 @@ public class NextNewsRepository extends ARepository { } @Override - public Completable addFolder(Folder folder) { - return Completable.create(emitter -> { + public Single addFolder(Folder folder) { + return Single.create(emitter -> { try { int folderRemoteId = folder.getRemoteId() == null ? 0 : Integer.parseInt(folder.getRemoteId()); NextNewsFolders folders = api.createFolder(new NextNewsFolder(folderRemoteId, folder.getName())); @@ -217,15 +225,13 @@ public class NextNewsRepository extends ARepository { folder.setName(nextNewsFolder.getName()); folder.setRemoteId(String.valueOf(nextNewsFolder.getId())); - database.folderDao().insert(folder); + emitter.onSuccess(folder); } else emitter.onError(new Exception("Unknown error")); } catch (Exception e) { emitter.onError(e); } - - emitter.onComplete(); - }); + }).flatMap(folder1 -> database.folderDao().insert(folder)); } @Override diff --git a/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java index a8de95bf..1519c52f 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/AccountViewModel.java @@ -33,10 +33,7 @@ public class AccountViewModel extends AndroidViewModel { } public Single insert(Account account) { - return Single.create(emitter -> { - long id = database.accountDao().insert(account); - emitter.onSuccess(id); - }); + return database.accountDao().insert(account); } public Completable update(Account account) { diff --git a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java index 3d4e0ee2..4fe9f790 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java @@ -17,6 +17,7 @@ import com.readrops.app.repositories.ARepository; import java.util.List; import io.reactivex.Completable; +import io.reactivex.Single; public class ManageFeedsFoldersViewModel extends AndroidViewModel { @@ -69,7 +70,7 @@ public class ManageFeedsFoldersViewModel extends AndroidViewModel { return db.folderDao().getFoldersWithFeedCount(account.getId()); } - public Completable addFolder(Folder folder) { + public Single addFolder(Folder folder) { return repository.addFolder(folder); }