From c9caa0be89641b264161aaebb160fe99d3c2954f Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sun, 4 Jul 2021 19:12:29 +0200 Subject: [PATCH] Integrate ItemStateChange table in Nextcloud News synchronisation --- .../app/repositories/ARepository.java | 10 ++-- .../app/repositories/NextNewsRepository.java | 52 ++++++++++++++----- .../java/com/readrops/db/dao/ItemDao.java | 14 ++--- 3 files changed, 49 insertions(+), 27 deletions(-) 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 a952574a..ea9da56e 100644 --- a/app/src/main/java/com/readrops/app/repositories/ARepository.java +++ b/app/src/main/java/com/readrops/app/repositories/ARepository.java @@ -121,8 +121,9 @@ public abstract class ARepository { item.isStarred(), item.getRemoteId(), account.getId()))); } else if (account.isLocal()) { return database.itemDao().setReadState(item.getId(), item.isRead()); - } else { // TODO nextcloud case, use only ItemStateChange table - return Completable.complete(); + } else { // nextcloud case + return database.itemStateChangesDao().upsertItemReadStateChange(item, account.getId()) + .andThen(database.itemDao().setReadState(item.getId(), item.isRead())); } } @@ -142,8 +143,9 @@ public abstract class ARepository { item.isStarred(), item.getRemoteId(), account.getId()))); } else if (account.isLocal()) { return database.itemDao().setStarState(item.getId(), item.isRead()); - } else { // TODO nextcloud case, use only ItemStateChange table - return Completable.complete(); + } else { // nextcloud case + return database.itemStateChangesDao().upsertItemReadStateChange(item, account.getId()) + .andThen(database.itemDao().setStarState(item.getId(), item.isRead())); } } 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 7da5c170..5a491cea 100644 --- a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java @@ -23,6 +23,7 @@ import com.readrops.db.entities.Feed; import com.readrops.db.entities.Folder; import com.readrops.db.entities.Item; import com.readrops.db.entities.account.Account; +import com.readrops.db.pojo.ItemReadStarState; import org.joda.time.LocalDateTime; import org.koin.java.KoinJavaComponent; @@ -31,6 +32,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; import io.reactivex.Completable; import io.reactivex.Observable; @@ -81,26 +83,55 @@ public class NextNewsRepository extends ARepository { @Override public Observable sync(List feeds) { + setCredentials(account); return Observable.create(emitter -> { try { long lastModified = LocalDateTime.now().toDateTime().getMillis(); SyncType syncType; - if (account.getLastModified() != 0) + if (account.getLastModified() != 0) { syncType = SyncType.CLASSIC_SYNC; - else + } else { syncType = SyncType.INITIAL_SYNC; + } NextNewsSyncData syncData = new NextNewsSyncData(); if (syncType == SyncType.CLASSIC_SYNC) { syncData.setLastModified(account.getLastModified() / 1000L); - syncData.setReadItems(database.itemDao().getReadChanges(account.getId())); - syncData.setUnreadItems(database.itemDao().getUnreadChanges(account.getId())); + List itemStateChanges = database + .itemStateChangesDao() + .getItemStateChanges(account.getId()); + + syncData.setReadItems(itemStateChanges.stream() + .filter(it -> it.getReadChange() && it.getRead()) + .map(ItemReadStarState::getRemoteId) + .collect(Collectors.toList())); + + syncData.setUnreadItems(itemStateChanges.stream() + .filter(it -> it.getReadChange() && !it.getRead()) + .map(ItemReadStarState::getRemoteId) + .collect(Collectors.toList())); + + List starredItemsIds = itemStateChanges.stream() + .filter(it -> it.getStarChange() && it.getStarred()) + .map(ItemReadStarState::getRemoteId) + .collect(Collectors.toList()); + + if (!starredItemsIds.isEmpty()) { + syncData.setStarredItems(database.itemDao().getStarChanges(starredItemsIds, account.getId())); + } + + List unstarredItemsIds = itemStateChanges.stream() + .filter(it -> it.getStarChange() && !it.getStarred()) + .map(ItemReadStarState::getRemoteId) + .collect(Collectors.toList()); + + if (!unstarredItemsIds.isEmpty()) { + syncData.setUnstarredItems(database.itemDao().getUnstarChanges(unstarredItemsIds, account.getId())); + } - syncData.setStarredItems(database.itemDao().getStarChanges(account.getId())); - syncData.setUnstarredItems(database.itemDao().getUnstarChanges(account.getId())); } TimingLogger timings = new TimingLogger(TAG, "nextcloud news " + syncType.name().toLowerCase()); @@ -123,13 +154,7 @@ public class NextNewsRepository extends ARepository { account.setLastModified(lastModified); database.accountDao().updateLastModified(account.getId(), lastModified); - if (!syncData.getReadItems().isEmpty() || !syncData.getUnreadItems().isEmpty()) { - - } - - if (!syncData.getStarredItems().isEmpty() || !syncData.getUnstarredItems().isEmpty()) { - - } + database.itemStateChangesDao().resetStateChanges(account.getId()); emitter.onComplete(); } else { @@ -145,6 +170,7 @@ public class NextNewsRepository extends ARepository { @Override public Single> addFeeds(List results) { + setCredentials(account); return Single.create(emitter -> { List feedInsertionResults = new ArrayList<>(); diff --git a/db/src/main/java/com/readrops/db/dao/ItemDao.java b/db/src/main/java/com/readrops/db/dao/ItemDao.java index 3e46a613..8f6c63be 100644 --- a/db/src/main/java/com/readrops/db/dao/ItemDao.java +++ b/db/src/main/java/com/readrops/db/dao/ItemDao.java @@ -58,17 +58,11 @@ public interface ItemDao extends BaseDao { @RawQuery(observedEntities = {Item.class, ItemState.class}) LiveData getItemById(SupportSQLiteQuery query); - @Query("Select Item.remoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where read = 1 And account_id = :accountId") - List getReadChanges(int accountId); + @Query("Select Item.guid, Feed.remoteId as feedRemoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where Item.remoteId In (:remoteIds) And account_id = :accountId") + List getStarChanges(List remoteIds, int accountId); - @Query("Select Item.remoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where read = 0 And account_id = :accountId") - List getUnreadChanges(int accountId); - - @Query("Select Item.guid, Feed.remoteId as feedRemoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where starred = 1 And account_id = :accountId") - List getStarChanges(int accountId); - - @Query("Select Item.guid, Feed.remoteId as feedRemoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where starred = 0 And account_id = :accountId") - List getUnstarChanges(int accountId); + @Query("Select Item.guid, Feed.remoteId as feedRemoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where Item.remoteId In (:remoteIds) And account_id = :accountId") + List getUnstarChanges(List remoteIds, int accountId); @Query("Update Item set read = :read, starred = :starred Where remoteId = :remoteId") void setReadAndStarState(String remoteId, boolean read, boolean starred);