Wrap room insert id result into a single

This commit is contained in:
Shinokuni 2019-11-03 13:37:43 +01:00
parent dfb4c82c59
commit d4228ee953
7 changed files with 42 additions and 28 deletions

View File

@ -7,11 +7,17 @@ import androidx.room.Update;
import java.util.List;
import io.reactivex.Completable;
import io.reactivex.Single;
public interface BaseDao<T> {
@Insert
long insert(T entity); // can't turn return type to Single<Long> while some repositories can't use rxjava properly
Single<Long> insert(T entity); // can't turn return type to Single<Long> 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<Long> insert(List<T> entities);

View File

@ -59,11 +59,8 @@ public abstract class ARepository<T> {
return database.feedDao().delete(feed);
}
public Completable addFolder(Folder folder) {
return Completable.create(emitter -> {
database.folderDao().insert(folder);
emitter.onComplete();
});
public Single<Long> addFolder(Folder folder) {
return database.folderDao().insert(folder);
}
public Completable updateFolder(Folder folder) {

View File

@ -36,7 +36,7 @@ import io.reactivex.Single;
public class FreshRSSRepository extends ARepository<FreshRSSAPI> {
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<FreshRSSAPI> {
.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<FreshRSSAPI> {
}
@Override
public Completable addFolder(Folder folder) {
return api.createFolder(account.getWriteToken(), folder.getName());
public Single<Long> addFolder(Folder folder) {
return api.createFolder(account.getWriteToken(), folder.getName())
.andThen(super.addFolder(folder));
}
@Override

View File

@ -202,7 +202,7 @@ public class LocalFeedRepository extends ARepository<Void> {
dbFeed.setEtag(null);
dbFeed.setLastModified(null);
dbFeed.setId((int) (database.feedDao().insert(dbFeed)));
dbFeed.setId((int) (database.feedDao().compatInsert(dbFeed)));
return dbFeed;
}

View File

@ -58,7 +58,7 @@ public class NextNewsRepository extends ARepository<NextNewsAPI> {
@Override
public Single<Boolean> login(Account account, boolean insert) {
return Single.create(emitter -> {
return Single.<NextNewsUser>create(emitter -> {
if (api == null)
api = new NextNewsAPI(account.toCredentials());
else
@ -66,15 +66,23 @@ public class NextNewsRepository extends ARepository<NextNewsAPI> {
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<NextNewsAPI> {
}
@Override
public Completable addFolder(Folder folder) {
return Completable.create(emitter -> {
public Single<Long> addFolder(Folder folder) {
return Single.<Folder>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<NextNewsAPI> {
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

View File

@ -33,10 +33,7 @@ public class AccountViewModel extends AndroidViewModel {
}
public Single<Long> 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) {

View File

@ -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<Long> addFolder(Folder folder) {
return repository.addFolder(folder);
}