Add star/unstar api calls for FreshRSS

This commit is contained in:
Shinokuni 2020-10-25 21:27:11 +01:00
parent 9ceb5e6dd7
commit 04e2f3eadb
6 changed files with 99 additions and 17 deletions

View File

@ -24,6 +24,7 @@ public class FreshRSSDataSource {
private static final int MAX_ITEMS = 5000;
public static final String GOOGLE_READ = "user/-/state/com.google/read";
public static final String GOOGLE_STARRED = "user/-/state/com.google/starred";
private static final String FEED_PREFIX = "feed/";
@ -87,6 +88,7 @@ public class FreshRSSDataSource {
SyncResult syncResult = new SyncResult();
return setItemsReadState(syncData, writeToken)
.andThen(setItemsStarState(syncData, writeToken))
.andThen(getFolders()
.flatMap(freshRSSFolders -> {
syncResult.setFolders(freshRSSFolders);
@ -149,10 +151,27 @@ public class FreshRSSDataSource {
* @return Completable
*/
public Completable markItemsReadUnread(boolean read, @NonNull List<String> itemIds, @NonNull String token) {
if (read)
return api.setItemsReadState(token, GOOGLE_READ, null, itemIds);
else
return api.setItemsReadState(token, null, GOOGLE_READ, itemIds);
if (read) {
return api.setItemsState(token, GOOGLE_READ, null, itemIds);
} else {
return api.setItemsState(token, null, GOOGLE_READ, itemIds);
}
}
/**
* Mark items as starred or unstarred
*
* @param starred true for starred, false for unstarred
* @param itemIds items ids to mark
* @param token token for modifications
* @return Completable
*/
public Completable markItemsStarredUnstarred(boolean starred, @NonNull List<String> itemIds, @NonNull String token) {
if (starred) {
return api.setItemsState(token, GOOGLE_STARRED, null, itemIds);
} else {
return api.setItemsState(token, null, GOOGLE_STARRED, itemIds);
}
}
/**
@ -225,7 +244,7 @@ public class FreshRSSDataSource {
}
/**
* Set the state of items
* Set items star state
*
* @param syncData data containing items to mark
* @param token token for modifications
@ -233,17 +252,44 @@ public class FreshRSSDataSource {
*/
private Completable setItemsReadState(@NonNull FreshRSSSyncData syncData, @NonNull String token) {
Completable readItemsCompletable;
if (syncData.getReadItemsIds().isEmpty())
if (syncData.getReadItemsIds().isEmpty()) {
readItemsCompletable = Completable.complete();
else
} else {
readItemsCompletable = markItemsReadUnread(true, syncData.getReadItemsIds(), token);
}
Completable unreadItemsCompletable;
if (syncData.getUnreadItemsIds().isEmpty())
if (syncData.getUnreadItemsIds().isEmpty()) {
unreadItemsCompletable = Completable.complete();
else
} else {
unreadItemsCompletable = markItemsReadUnread(false, syncData.getUnreadItemsIds(), token);
}
return readItemsCompletable.concatWith(unreadItemsCompletable);
}
/**
* Set items star state
*
* @param syncData data containing items to mark
* @param token token for modifications
* @return A concatenation of two completable (starred and unstarred completable)
*/
private Completable setItemsStarState(@NonNull FreshRSSSyncData syncData, @NonNull String token) {
Completable starredItemsCompletable;
if (syncData.getStarredItemsIds().isEmpty()) {
starredItemsCompletable = Completable.complete();
} else {
starredItemsCompletable = markItemsStarredUnstarred(true, syncData.getStarredItemsIds(), token);
}
Completable unstarredItemsCompletable;
if (syncData.getUnstarredItemsIds().isEmpty()) {
unstarredItemsCompletable = Completable.complete();
} else {
unstarredItemsCompletable = markItemsStarredUnstarred(false, syncData.getUnstarredItemsIds(), token);
}
return starredItemsCompletable.concatWith(unstarredItemsCompletable);
}
}

View File

@ -42,7 +42,7 @@ public interface FreshRSSService {
@FormUrlEncoded
@POST("reader/api/0/edit-tag")
Completable setItemsReadState(@Field("T") String token, @Field("a") String readAction, @Field("r") String unreadAction, @Field("i") List<String> itemIds);
Completable setItemsState(@Field("T") String token, @Field("a") String addAction, @Field("r") String removeAction, @Field("i") List<String> itemIds);
@FormUrlEncoded
@POST("reader/api/0/subscription/edit")

View File

@ -11,6 +11,10 @@ public class FreshRSSSyncData {
private List<String> unreadItemsIds;
private List<String> starredItemsIds;
private List<String> unstarredItemsIds;
public FreshRSSSyncData() {
readItemsIds = new ArrayList<>();
unreadItemsIds = new ArrayList<>();
@ -39,4 +43,20 @@ public class FreshRSSSyncData {
public void setUnreadItemsIds(List<String> unreadItemsIds) {
this.unreadItemsIds = unreadItemsIds;
}
public List<String> getStarredItemsIds() {
return starredItemsIds;
}
public void setStarredItemsIds(List<String> starredItemsIds) {
this.starredItemsIds = starredItemsIds;
}
public List<String> getUnstarredItemsIds() {
return unstarredItemsIds;
}
public void setUnstarredItemsIds(List<String> unstarredItemsIds) {
this.unstarredItemsIds = unstarredItemsIds;
}
}

View File

@ -1,9 +1,10 @@
package com.readrops.api.services.freshrss.adapters
import android.util.TimingLogger
import com.readrops.db.entities.Item
import com.readrops.api.services.freshrss.FreshRSSDataSource.GOOGLE_READ
import com.readrops.api.services.freshrss.FreshRSSDataSource.GOOGLE_STARRED
import com.readrops.api.utils.exceptions.ParseException
import com.readrops.db.entities.Item
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
@ -53,7 +54,7 @@ class FreshRSSItemsAdapter : JsonAdapter<List<Item>>() {
2 -> title = reader.nextString()
3 -> content = getContent(reader)
4 -> link = getLink(reader)
5 -> isRead = getReadState(reader)
5 -> getStates(reader, this)
6 -> feedRemoteId = getRemoteFeedId(reader)
7 -> author = reader.nextString()
else -> reader.skipValue()
@ -102,18 +103,17 @@ class FreshRSSItemsAdapter : JsonAdapter<List<Item>>() {
return href
}
private fun getReadState(reader: JsonReader): Boolean {
var isRead = false
private fun getStates(reader: JsonReader, item: Item) {
reader.beginArray()
while (reader.hasNext()) {
when (reader.nextString()) {
GOOGLE_READ -> isRead = true
GOOGLE_READ -> item.isRead = true
GOOGLE_STARRED -> item.isStarred = true
}
}
reader.endArray()
return isRead
}
private fun getRemoteFeedId(reader: JsonReader): String? {

View File

@ -91,6 +91,9 @@ public class FreshRSSRepository extends ARepository {
syncData.setReadItemsIds(database.itemDao().getReadChanges(account.getId()));
syncData.setUnreadItemsIds(database.itemDao().getUnreadChanges(account.getId()));
syncData.setStarredItemsIds(database.itemDao().getFreshRSSStarChanges(account.getId()));
syncData.setUnstarredItemsIds(database.itemDao().getFreshRSSUnstarChanges(account.getId()));
emitter.onSuccess(syncData);
}).flatMap(syncData1 -> dataSource.sync(syncType, syncData1, account.getWriteToken()))
.flatMapObservable(syncResult -> {
@ -107,7 +110,14 @@ public class FreshRSSRepository extends ARepository {
account.setLastModified(newLastModified);
database.accountDao().updateLastModified(account.getId(), newLastModified);
database.itemDao().resetReadChanges(account.getId());
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();

View File

@ -71,6 +71,12 @@ public interface ItemDao extends BaseDao<Item> {
@Query("Select Item.remoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where read_changed = 1 And read = 0 And account_id = :accountId")
List<String> getUnreadChanges(int accountId);
@Query("Select Item.remoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where starred_changed = 1 And starred = 1 And account_id = :accountId")
List<String> getFreshRSSStarChanges(int accountId);
@Query("Select Item.remoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where starred_changed = 1 And starred = 0 And account_id = :accountId")
List<String> getFreshRSSUnstarChanges(int accountId);
@Query("Select Item.guid, Feed.remoteId as feedRemoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where starred_changed = 1 And starred = 1 And account_id = :accountId")
List<StarItem> getStarChanges(int accountId);