Add star/unstar api calls for FreshRSS
This commit is contained in:
parent
9ceb5e6dd7
commit
04e2f3eadb
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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")
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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? {
|
||||
|
@ -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();
|
||||
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user