Add new synchronization process for FreshRSS with read state and starred items sync
This commit is contained in:
parent
03c806b9a5
commit
0c9c601d41
@ -4,17 +4,10 @@ import com.readrops.db.entities.Feed
|
|||||||
import com.readrops.db.entities.Folder
|
import com.readrops.db.entities.Folder
|
||||||
import com.readrops.db.entities.Item
|
import com.readrops.db.entities.Item
|
||||||
|
|
||||||
class SyncResult {
|
class SyncResult(var items: List<Item> = mutableListOf(),
|
||||||
|
var starredItems: List<Item> = mutableListOf(),
|
||||||
var items: List<Item> = mutableListOf()
|
var feeds: List<Feed> = listOf(),
|
||||||
|
var folders: List<Folder> = listOf(),
|
||||||
var starredItems: List<Item> = mutableListOf()
|
var unreadIds: List<String>? = null,
|
||||||
|
var isError: Boolean = false
|
||||||
var feeds: List<Feed> = listOf()
|
)
|
||||||
|
|
||||||
var folders: List<Folder> = listOf()
|
|
||||||
|
|
||||||
var starredIds: List<String>? = null
|
|
||||||
|
|
||||||
var isError: Boolean = false
|
|
||||||
}
|
|
||||||
|
@ -24,7 +24,8 @@ import okhttp3.RequestBody;
|
|||||||
public class FreshRSSDataSource {
|
public class FreshRSSDataSource {
|
||||||
|
|
||||||
private static final int MAX_ITEMS = 5000;
|
private static final int MAX_ITEMS = 5000;
|
||||||
private static final int MAX_STARRED_ITEMS = 999;
|
private static final int MAX_UNREAD_ITEMS_IDS = 5000;
|
||||||
|
private static final int MAX_STARRED_ITEMS = 1000;
|
||||||
|
|
||||||
public static final String GOOGLE_READ = "user/-/state/com.google/read";
|
public static final String GOOGLE_READ = "user/-/state/com.google/read";
|
||||||
public static final String GOOGLE_STARRED = "user/-/state/com.google/starred";
|
public static final String GOOGLE_STARRED = "user/-/state/com.google/starred";
|
||||||
@ -111,14 +112,14 @@ public class FreshRSSDataSource {
|
|||||||
.flatMap(freshRSSItems -> {
|
.flatMap(freshRSSItems -> {
|
||||||
syncResult.setItems(freshRSSItems);
|
syncResult.setItems(freshRSSItems);
|
||||||
|
|
||||||
|
return getItemsIds(GOOGLE_READ, GOOGLE_READING_LIST, MAX_UNREAD_ITEMS_IDS);
|
||||||
|
}).flatMap(unreadItemsIds -> {
|
||||||
|
syncResult.setUnreadIds(unreadItemsIds);
|
||||||
|
|
||||||
return getStarredItems(MAX_STARRED_ITEMS);
|
return getStarredItems(MAX_STARRED_ITEMS);
|
||||||
}).flatMap(starredItems -> {
|
}).flatMap(starredItems -> {
|
||||||
syncResult.setStarredItems(starredItems);
|
syncResult.setStarredItems(starredItems);
|
||||||
|
|
||||||
return getItemsIds(null, GOOGLE_STARRED, MAX_STARRED_ITEMS);
|
|
||||||
}).flatMap(starredIds -> {
|
|
||||||
syncResult.setStarredIds(starredIds);
|
|
||||||
|
|
||||||
return Single.just(syncResult);
|
return Single.just(syncResult);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
@ -17,13 +17,18 @@ import com.readrops.db.Database;
|
|||||||
import com.readrops.db.entities.Feed;
|
import com.readrops.db.entities.Feed;
|
||||||
import com.readrops.db.entities.Folder;
|
import com.readrops.db.entities.Folder;
|
||||||
import com.readrops.db.entities.Item;
|
import com.readrops.db.entities.Item;
|
||||||
|
import com.readrops.db.entities.StarredItem;
|
||||||
|
import com.readrops.db.entities.UnreadItemsIds;
|
||||||
import com.readrops.db.entities.account.Account;
|
import com.readrops.db.entities.account.Account;
|
||||||
|
|
||||||
import org.joda.time.DateTime;
|
import org.joda.time.DateTime;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
import io.reactivex.Completable;
|
import io.reactivex.Completable;
|
||||||
import io.reactivex.Observable;
|
import io.reactivex.Observable;
|
||||||
@ -104,25 +109,18 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
insertFeeds(syncResult.getFeeds());
|
insertFeeds(syncResult.getFeeds());
|
||||||
logger.addSplit("feeds insertion");
|
logger.addSplit("feeds insertion");
|
||||||
|
|
||||||
insertItems(syncResult.getItems(), syncType == SyncType.INITIAL_SYNC);
|
insertItems(syncResult.getItems());
|
||||||
logger.addSplit("items insertion");
|
logger.addSplit("items insertion");
|
||||||
|
|
||||||
insertItems(syncResult.getStarredItems(), syncType == SyncType.INITIAL_SYNC);
|
insertStarredItems(syncResult.getStarredItems());
|
||||||
|
logger.addSplit("starred items insertion");
|
||||||
|
|
||||||
updateItemsStarState(syncResult.getStarredIds());
|
insertUnreadItemsIds(syncResult.getUnreadIds());
|
||||||
|
logger.addSplit("insert and update items ids");
|
||||||
|
|
||||||
account.setLastModified(newLastModified);
|
account.setLastModified(newLastModified);
|
||||||
database.accountDao().updateLastModified(account.getId(), newLastModified);
|
database.accountDao().updateLastModified(account.getId(), newLastModified);
|
||||||
|
|
||||||
if (!syncData.getReadItemsIds().isEmpty() || !syncData.getUnreadItemsIds().isEmpty()) {
|
|
||||||
database.itemDao().resetReadChanges(account.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!syncData.getStarredItemsIds().isEmpty() || !syncData.getUnstarredItemsIds().isEmpty()) {
|
|
||||||
database.itemDao().resetStarChanges(account.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.addSplit("reset read changes");
|
|
||||||
logger.dumpToLog();
|
logger.dumpToLog();
|
||||||
|
|
||||||
this.syncResult = syncResult;
|
this.syncResult = syncResult;
|
||||||
@ -199,9 +197,7 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void insertFeeds(List<Feed> freshRSSFeeds) {
|
private void insertFeeds(List<Feed> freshRSSFeeds) {
|
||||||
for (Feed feed : freshRSSFeeds) {
|
freshRSSFeeds.stream().forEach(feed -> feed.setAccountId(account.getId()));
|
||||||
feed.setAccountId(account.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
List<Long> insertedFeedsIds = database.feedDao().feedsUpsert(freshRSSFeeds, account);
|
List<Long> insertedFeedsIds = database.feedDao().feedsUpsert(freshRSSFeeds, account);
|
||||||
|
|
||||||
@ -212,22 +208,22 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void insertFolders(List<Folder> freshRSSFolders) {
|
private void insertFolders(List<Folder> freshRSSFolders) {
|
||||||
for (Folder folder : freshRSSFolders) {
|
freshRSSFolders.stream().forEach(folder -> folder.setAccountId(account.getId()));
|
||||||
folder.setAccountId(account.getId());
|
|
||||||
}
|
|
||||||
|
|
||||||
database.folderDao().foldersUpsert(freshRSSFolders, account);
|
database.folderDao().foldersUpsert(freshRSSFolders, account);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void insertItems(List<Item> items, boolean initialSync) {
|
private void insertItems(List<Item> items) {
|
||||||
List<Item> itemsToInsert = new ArrayList<>();
|
List<Item> itemsToInsert = new ArrayList<>();
|
||||||
|
Map<String, Integer> itemsFeedsIds = new HashMap<>();
|
||||||
|
|
||||||
for (Item item : items) {
|
for (Item item : items) {
|
||||||
int feedId = database.feedDao().getFeedIdByRemoteId(item.getFeedRemoteId(), account.getId());
|
Integer feedId;
|
||||||
|
if (itemsFeedsIds.containsKey(item.getFeedRemoteId())) {
|
||||||
if (!initialSync && feedId > 0 && database.itemDao().remoteItemExists(item.getRemoteId(), feedId)) {
|
feedId = itemsFeedsIds.get(item.getFeedRemoteId());
|
||||||
database.itemDao().setReadAndStarState(item.getRemoteId(), item.isRead(), item.isStarred());
|
} else {
|
||||||
continue;
|
feedId = database.feedDao().getFeedIdByRemoteId(item.getFeedRemoteId(), account.getId());
|
||||||
|
itemsFeedsIds.put(item.getFeedRemoteId(), feedId);
|
||||||
}
|
}
|
||||||
|
|
||||||
item.setFeedId(feedId);
|
item.setFeedId(feedId);
|
||||||
@ -241,12 +237,41 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateItemsStarState(List<String> itemsIds) {
|
private void insertStarredItems(List<Item> items) {
|
||||||
if (itemsIds != null && !itemsIds.isEmpty()) {
|
List<StarredItem> starredItems = items.stream().map(StarredItem::new).collect(Collectors.toList());
|
||||||
database.itemDao().unstarItems(itemsIds, account.getId());
|
|
||||||
database.itemDao().starItems(itemsIds, account.getId());
|
List<StarredItem> itemsToInsert = new ArrayList<>();
|
||||||
|
Map<String, Integer> itemsFeedsIds = new HashMap<>();
|
||||||
|
|
||||||
|
for (StarredItem item : starredItems) {
|
||||||
|
int feedId;
|
||||||
|
|
||||||
|
if (itemsFeedsIds.containsKey(item.getFeedRemoteId())) {
|
||||||
|
feedId = itemsFeedsIds.get(item.getFeedRemoteId());
|
||||||
|
} else {
|
||||||
|
feedId = database.feedDao().getFeedIdByRemoteId(item.getFeedRemoteId(), account.getId());
|
||||||
|
itemsFeedsIds.put(item.getFeedRemoteId(), feedId);
|
||||||
|
}
|
||||||
|
|
||||||
|
item.setFeedId(feedId);
|
||||||
|
item.setReadTime(Utils.readTimeFromString(item.getContent()));
|
||||||
|
itemsToInsert.add(item);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!itemsToInsert.isEmpty()) {
|
||||||
|
Collections.sort(itemsToInsert, Item::compareTo);
|
||||||
|
|
||||||
|
database.starredItemDao().deleteStarredItems(account.getId());
|
||||||
|
database.starredItemDao().insert(itemsToInsert);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void insertUnreadItemsIds(List<String> ids) {
|
||||||
|
database.itemsIdsDao().deleteUnreadItemsIds(account.getId());
|
||||||
|
database.itemsIdsDao().insertUnreadItemsIds(ids.stream().map(id ->
|
||||||
|
new UnreadItemsIds(0, id, account.getId())).collect(Collectors.toList()));
|
||||||
|
|
||||||
|
database.itemDao().updateUnreadState(account.getId());
|
||||||
|
database.itemDao().updateReadState(account.getId());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user