Support read state for FreshRSS API new items

When new items will be fetched, they will be now set as read or unread. This doesn't apply to already existing in local items
This commit is contained in:
Shinokuni 2019-10-14 21:48:35 +02:00
parent 4c82c4f913
commit efe54deb9a
6 changed files with 28 additions and 17 deletions

View File

@ -64,4 +64,7 @@ public abstract class ItemDao implements BaseDao<Item> {
@Query("Update Item set read_changed = 0 Where feed_id in (Select id From Feed Where account_id = :accountId)") @Query("Update Item set read_changed = 0 Where feed_id in (Select id From Feed Where account_id = :accountId)")
public abstract void resetReadChanges(int accountId); public abstract void resetReadChanges(int accountId);
@Query("Update Item set read = :read Where remoteId = :remoteId")
public abstract void setReadState(String remoteId, boolean read);
} }

View File

@ -90,9 +90,9 @@ public class FreshRSSRepository extends ARepository<FreshRSSAPI> {
emitter.onSuccess(syncData); emitter.onSuccess(syncData);
}).flatMap(syncData1 -> api.sync(syncType, syncData1, account.getWriteToken())) }).flatMap(syncData1 -> api.sync(syncType, syncData1, account.getWriteToken()))
.flatMapObservable(syncResult -> { .flatMapObservable(syncResult -> {
insertFolders(syncResult.getFolders(), account); insertFolders(syncResult.getFolders());
insertFeeds(syncResult.getFeeds(), account); insertFeeds(syncResult.getFeeds());
insertItems(syncResult.getItems(), account, syncType == SyncType.INITIAL_SYNC); insertItems(syncResult.getItems(), syncType == SyncType.INITIAL_SYNC);
account.setLastModified(syncResult.getLastUpdated()); account.setLastModified(syncResult.getLastUpdated());
database.accountDao().updateLastModified(account.getId(), syncResult.getLastUpdated()); database.accountDao().updateLastModified(account.getId(), syncResult.getLastUpdated());
@ -169,7 +169,7 @@ public class FreshRSSRepository extends ARepository<FreshRSSAPI> {
.andThen(super.deleteFolder(folder)); .andThen(super.deleteFolder(folder));
} }
private List<Feed> insertFeeds(List<FreshRSSFeed> freshRSSFeeds, Account account) { private void insertFeeds(List<FreshRSSFeed> freshRSSFeeds) {
List<Feed> feeds = new ArrayList<>(); List<Feed> feeds = new ArrayList<>();
for (FreshRSSFeed freshRSSFeed : freshRSSFeeds) { for (FreshRSSFeed freshRSSFeed : freshRSSFeeds) {
@ -184,10 +184,9 @@ public class FreshRSSRepository extends ARepository<FreshRSSAPI> {
setFaviconUtils(insertedFeeds); setFaviconUtils(insertedFeeds);
} }
return insertedFeeds;
} }
private void insertFolders(List<FreshRSSFolder> freshRSSFolders, Account account) { private void insertFolders(List<FreshRSSFolder> freshRSSFolders) {
List<Folder> folders = new ArrayList<>(); List<Folder> folders = new ArrayList<>();
for (FreshRSSFolder freshRSSFolder : freshRSSFolders) { for (FreshRSSFolder freshRSSFolder : freshRSSFolders) {
@ -205,14 +204,14 @@ public class FreshRSSRepository extends ARepository<FreshRSSAPI> {
database.folderDao().foldersUpsert(folders, account); database.folderDao().foldersUpsert(folders, account);
} }
private void insertItems(List<FreshRSSItem> items, Account account, boolean initialSync) { private void insertItems(List<FreshRSSItem> items, boolean initialSync) {
List<Item> newItems = new ArrayList<>(); List<Item> newItems = new ArrayList<>();
for (FreshRSSItem freshRSSItem : items) { for (FreshRSSItem freshRSSItem : items) {
int feedId = database.feedDao().getFeedIdByRemoteId(String.valueOf(freshRSSItem.getOrigin().getStreamId()), account.getId()); int feedId = database.feedDao().getFeedIdByRemoteId(String.valueOf(freshRSSItem.getOrigin().getStreamId()), account.getId());
if (!initialSync && feedId > 0) { if (!initialSync && feedId > 0 && database.itemDao().remoteItemExists(freshRSSItem.getId(), feedId)) {
if (database.itemDao().remoteItemExists(freshRSSItem.getId(), feedId)) database.itemDao().setReadState(freshRSSItem.getId(), freshRSSItem.isRead());
break; break;
} }

View File

@ -57,6 +57,7 @@ public final class ItemMatcher {
newItem.setLink(item.getAlternate().get(0).getHref()); newItem.setLink(item.getAlternate().get(0).getHref());
newItem.setFeedId(feedId); newItem.setFeedId(feedId);
newItem.setRemoteId(item.getId()); newItem.setRemoteId(item.getId());
newItem.setRead(item.isRead());
return newItem; return newItem;
} }

View File

@ -22,7 +22,9 @@ import okhttp3.RequestBody;
public class FreshRSSAPI extends API<FreshRSSService> { public class FreshRSSAPI extends API<FreshRSSService> {
private static final String GOOGLE_READ = "user/-/state/com.google/read"; public static final String GOOGLE_READ = "user/-/state/com.google/read";
private static final String FEED_PREFIX = "feed/";
public FreshRSSAPI(Credentials credentials) { public FreshRSSAPI(Credentials credentials) {
super(credentials, FreshRSSService.class, FreshRSSService.END_POINT); super(credentials, FreshRSSService.class, FreshRSSService.END_POINT);
@ -134,7 +136,7 @@ public class FreshRSSAPI extends API<FreshRSSService> {
* @param lastModified fetch only items created after this timestamp * @param lastModified fetch only items created after this timestamp
* @return the items * @return the items
*/ */
public Single<FreshRSSItems> getItems(@NonNull String excludeTarget, @NonNull Integer max, @Nullable Long lastModified) { public Single<FreshRSSItems> getItems(@Nullable String excludeTarget, int max, @Nullable Long lastModified) {
return api.getItems(excludeTarget, max, lastModified); return api.getItems(excludeTarget, max, lastModified);
} }
@ -147,7 +149,7 @@ public class FreshRSSAPI extends API<FreshRSSService> {
* @param token token for modifications * @param token token for modifications
* @return Completable * @return Completable
*/ */
public Completable markItemsReadUnread(@NonNull Boolean read, @NonNull List<String> itemIds, @NonNull String token) { public Completable markItemsReadUnread(boolean read, @NonNull List<String> itemIds, @NonNull String token) {
if (read) if (read)
return api.setItemsReadState(token, GOOGLE_READ, null, itemIds); return api.setItemsReadState(token, GOOGLE_READ, null, itemIds);
else else
@ -162,7 +164,7 @@ public class FreshRSSAPI extends API<FreshRSSService> {
* @return Completable * @return Completable
*/ */
public Completable createFeed(@NonNull String token, @NonNull String feedUrl) { public Completable createFeed(@NonNull String token, @NonNull String feedUrl) {
return api.createOrDeleteFeed(token, "feed/" + feedUrl, "subscribe"); return api.createOrDeleteFeed(token, FEED_PREFIX + feedUrl, "subscribe");
} }
/** /**
@ -173,7 +175,7 @@ public class FreshRSSAPI extends API<FreshRSSService> {
* @return Completable * @return Completable
*/ */
public Completable deleteFeed(@NonNull String token, @NonNull String feedUrl) { public Completable deleteFeed(@NonNull String token, @NonNull String feedUrl) {
return api.createOrDeleteFeed(token, "feed/" + feedUrl, "unsubscribe"); return api.createOrDeleteFeed(token, FEED_PREFIX + feedUrl, "unsubscribe");
} }
/** /**
@ -186,7 +188,7 @@ public class FreshRSSAPI extends API<FreshRSSService> {
* @return Completable * @return Completable
*/ */
public Completable updateFeed(@NonNull String token, @NonNull String feedUrl, @NonNull String title, @NonNull String folderId) { public Completable updateFeed(@NonNull String token, @NonNull String feedUrl, @NonNull String title, @NonNull String folderId) {
return api.updateFeed(token, "feed/" + feedUrl, title, folderId, "edit"); return api.updateFeed(token, FEED_PREFIX + feedUrl, title, folderId, "edit");
} }
/** /**

View File

@ -35,7 +35,7 @@ public interface FreshRSSService {
Single<FreshRSSFeeds> getFeeds(); Single<FreshRSSFeeds> getFeeds();
@GET("reader/api/0/stream/contents/user/-/state/com.google/reading-list") @GET("reader/api/0/stream/contents/user/-/state/com.google/reading-list")
Single<FreshRSSItems> getItems(@Query("xt") String excludeTarget, @Query("n") Integer max, @Query("ot") Long lastModified); Single<FreshRSSItems> getItems(@Query("xt") String excludeTarget, @Query("n") int max, @Query("ot") Long lastModified);
@GET("reader/api/0/tag/list?output=json") @GET("reader/api/0/tag/list?output=json")
Single<FreshRSSFolders> getFolders(); Single<FreshRSSFolders> getFolders();

View File

@ -1,6 +1,8 @@
package com.readrops.readropslibrary.services.freshrss.json; package com.readrops.readropslibrary.services.freshrss.json;
import com.readrops.readropslibrary.services.freshrss.FreshRSSAPI;
import java.util.List; import java.util.List;
public class FreshRSSItem { public class FreshRSSItem {
@ -105,4 +107,8 @@ public class FreshRSSItem {
this.title = title; this.title = title;
} }
public boolean isRead() {
return categories.contains(FreshRSSAPI.GOOGLE_READ);
}
} }