mirror of
https://github.com/readrops/Readrops.git
synced 2025-02-02 11:46:52 +01:00
Sync now pushes read and unread items
This commit is contained in:
parent
21b261b0e1
commit
c9e47cfc12
@ -56,12 +56,12 @@ public abstract class ItemDao implements BaseDao<Item> {
|
||||
"Folder.name as folder_name from Item Inner Join Feed On Item.feed_id = Feed.id Left Join Folder on Folder.id = Feed.folder_id Where Item.id = :id")
|
||||
public abstract LiveData<ItemWithFeed> getItemById(int id);
|
||||
|
||||
@Query("Select remoteId From Item Where read_changed = 1 And read = 1")
|
||||
public abstract List<String> getReadChanges();
|
||||
@Query("Select Item.remoteId From Item Inner Join Feed On Item.feed_id = Feed.id Where read_changed = 1 And read = 1 And account_id = :accountId")
|
||||
public abstract List<String> getReadChanges(int accountId);
|
||||
|
||||
@Query("Select remoteId From Item Where read_changed = 1 And read = 0")
|
||||
public abstract List<String> getUnreadChanges();
|
||||
@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")
|
||||
public abstract List<String> getUnreadChanges(int accountId);
|
||||
|
||||
@Query("Update Item set read_changed = 0")
|
||||
public abstract void resetReadChanges();
|
||||
@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);
|
||||
}
|
||||
|
@ -46,6 +46,11 @@ public class FreshRSSRepository extends ARepository {
|
||||
account.setToken(token);
|
||||
api.setCredentials(new FreshRSSCredentials(token, account.getUrl()));
|
||||
|
||||
return api.getWriteToken();
|
||||
})
|
||||
.flatMap(writeToken -> {
|
||||
account.setWriteToken(writeToken);
|
||||
|
||||
return api.getUserInfo();
|
||||
})
|
||||
.flatMap(userInfo -> {
|
||||
@ -71,7 +76,12 @@ public class FreshRSSRepository extends ARepository {
|
||||
} else
|
||||
syncType = SyncType.INITIAL_SYNC;
|
||||
|
||||
return api.sync(syncType, syncData)
|
||||
return Single.<FreshRSSSyncData>create(emitter -> {
|
||||
syncData.setReadItemsIds(database.itemDao().getReadChanges(account.getId()));
|
||||
syncData.setUnreadItemsIds(database.itemDao().getUnreadChanges(account.getId()));
|
||||
|
||||
emitter.onSuccess(syncData);
|
||||
}).flatMap(syncData1 -> api.sync(syncType, syncData1, account.getWriteToken()))
|
||||
.flatMapObservable(syncResult -> {
|
||||
insertFolders(syncResult.getFolders(), account);
|
||||
insertFeeds(syncResult.getFeeds(), account);
|
||||
@ -80,6 +90,8 @@ public class FreshRSSRepository extends ARepository {
|
||||
account.setLastModified(syncResult.getLastUpdated());
|
||||
database.accountDao().updateLastModified(account.getId(), syncResult.getLastUpdated());
|
||||
|
||||
database.itemDao().resetReadChanges(account.getId());
|
||||
|
||||
return Observable.empty();
|
||||
});
|
||||
}
|
||||
@ -193,24 +205,6 @@ public class FreshRSSRepository extends ARepository {
|
||||
.andThen(super.deleteFolder(folder));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Completable setItemReadState(Item item, boolean read) {
|
||||
FreshRSSAPI api = new FreshRSSAPI(account.toCredentials());
|
||||
|
||||
if (account.getWriteToken() == null) {
|
||||
return api.getWriteToken()
|
||||
.flatMapCompletable(writeToken -> {
|
||||
database.accountDao().updateWriteToken(account.getId(), writeToken);
|
||||
|
||||
return api.markItemReadUnread(read, item.getRemoteId(), writeToken)
|
||||
.andThen(super.setItemReadState(item, read));
|
||||
});
|
||||
} else {
|
||||
return api.markItemReadUnread(read, item.getRemoteId(), account.getWriteToken())
|
||||
.andThen(super.setItemReadState(item, read));
|
||||
}
|
||||
}
|
||||
|
||||
private List<Feed> insertFeeds(List<FreshRSSFeed> freshRSSFeeds, Account account) {
|
||||
List<Feed> feeds = new ArrayList<>();
|
||||
|
||||
|
@ -83,8 +83,8 @@ public class NextNewsRepository extends ARepository {
|
||||
|
||||
if (syncType == SyncType.CLASSIC_SYNC) {
|
||||
syncData.setLastModified(account.getLastModified() / 1000L);
|
||||
syncData.setReadItems(database.itemDao().getReadChanges());
|
||||
syncData.setUnreadItems(database.itemDao().getUnreadChanges());
|
||||
syncData.setReadItems(database.itemDao().getReadChanges(account.getId()));
|
||||
syncData.setUnreadItems(database.itemDao().getUnreadChanges(account.getId()));
|
||||
}
|
||||
|
||||
TimingLogger timings = new TimingLogger(TAG, "nextcloud news " + syncType.name().toLowerCase());
|
||||
@ -105,7 +105,7 @@ public class NextNewsRepository extends ARepository {
|
||||
|
||||
account.setLastModified(lastModified);
|
||||
database.accountDao().updateLastModified(account.getId(), lastModified);
|
||||
database.itemDao().resetReadChanges();
|
||||
database.itemDao().resetReadChanges(account.getId());
|
||||
|
||||
emitter.onComplete();
|
||||
} else
|
||||
@ -214,8 +214,7 @@ public class NextNewsRepository extends ARepository {
|
||||
folder.setName(nextNewsFolder.getName());
|
||||
folder.setRemoteId(String.valueOf(nextNewsFolder.getId()));
|
||||
database.folderDao().insert(folder);
|
||||
}
|
||||
else
|
||||
} else
|
||||
emitter.onError(new Exception("Unknown error"));
|
||||
} catch (Exception e) {
|
||||
emitter.onError(e);
|
||||
|
@ -42,6 +42,7 @@ dependencies {
|
||||
|
||||
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.1'
|
||||
|
||||
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
|
||||
implementation 'org.jsoup:jsoup:1.11.3'
|
||||
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
|
||||
}
|
||||
|
@ -11,6 +11,7 @@ import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
||||
|
||||
import java.io.StringReader;
|
||||
import java.util.List;
|
||||
import java.util.Properties;
|
||||
|
||||
import io.reactivex.Completable;
|
||||
@ -56,33 +57,34 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
||||
return api.getUserInfo();
|
||||
}
|
||||
|
||||
public Single<FreshRSSSyncResult> sync(@NonNull SyncType syncType, @NonNull FreshRSSSyncData syncData) {
|
||||
public Single<FreshRSSSyncResult> sync(@NonNull SyncType syncType, @NonNull FreshRSSSyncData syncData, String writeToken) {
|
||||
FreshRSSSyncResult syncResult = new FreshRSSSyncResult();
|
||||
|
||||
return getFolders()
|
||||
.flatMap(freshRSSFolders -> {
|
||||
syncResult.setFolders(freshRSSFolders.getTags());
|
||||
return setItemsReadState(syncData, writeToken)
|
||||
.andThen(getFolders()
|
||||
.flatMap(freshRSSFolders -> {
|
||||
syncResult.setFolders(freshRSSFolders.getTags());
|
||||
|
||||
return getFeeds();
|
||||
})
|
||||
.flatMap(freshRSSFeeds -> {
|
||||
syncResult.setFeeds(freshRSSFeeds.getSubscriptions());
|
||||
return getFeeds();
|
||||
})
|
||||
.flatMap(freshRSSFeeds -> {
|
||||
syncResult.setFeeds(freshRSSFeeds.getSubscriptions());
|
||||
|
||||
switch (syncType) {
|
||||
case INITIAL_SYNC:
|
||||
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, null);
|
||||
case CLASSIC_SYNC:
|
||||
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, syncData.getLastModified());
|
||||
}
|
||||
switch (syncType) {
|
||||
case INITIAL_SYNC:
|
||||
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, null);
|
||||
case CLASSIC_SYNC:
|
||||
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, syncData.getLastModified());
|
||||
}
|
||||
|
||||
return Single.error(new Exception("Unknown sync type"));
|
||||
})
|
||||
.flatMap(freshRSSItems -> {
|
||||
syncResult.setItems(freshRSSItems.getItems());
|
||||
syncResult.setLastUpdated(freshRSSItems.getUpdated());
|
||||
return Single.error(new Exception("Unknown sync type"));
|
||||
})
|
||||
.flatMap(freshRSSItems -> {
|
||||
syncResult.setItems(freshRSSItems.getItems());
|
||||
syncResult.setLastUpdated(freshRSSItems.getUpdated());
|
||||
|
||||
return Single.just(syncResult);
|
||||
});
|
||||
return Single.just(syncResult);
|
||||
}));
|
||||
}
|
||||
|
||||
public Single<FreshRSSFolders> getFolders() {
|
||||
@ -97,11 +99,11 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
||||
return api.getItems(excludeTarget, max, lastModified);
|
||||
}
|
||||
|
||||
public Completable markItemReadUnread(Boolean read, String itemId, String token) {
|
||||
public Completable markItemsReadUnread(Boolean read, List<String> itemIds, String token) {
|
||||
if (read)
|
||||
return api.setItemReadState(token, EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, null, itemId);
|
||||
return api.setItemsReadState(token, EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, null, itemIds);
|
||||
else
|
||||
return api.setItemReadState(token, null, EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, itemId);
|
||||
return api.setItemsReadState(token, null, EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, itemIds);
|
||||
}
|
||||
|
||||
public Completable createFeed(String token, String feedUrl) {
|
||||
@ -128,6 +130,22 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
||||
return api.deleteFolder(token, folderId);
|
||||
}
|
||||
|
||||
private Completable setItemsReadState(FreshRSSSyncData syncData, String token) {
|
||||
Completable readItemsCompletable;
|
||||
if (syncData.getReadItemsIds().isEmpty())
|
||||
readItemsCompletable = Completable.complete();
|
||||
else
|
||||
readItemsCompletable = markItemsReadUnread(true, syncData.getReadItemsIds(), token);
|
||||
|
||||
Completable unreadItemsCompletable;
|
||||
if (syncData.getUnreadItemsIds().isEmpty())
|
||||
unreadItemsCompletable = Completable.complete();
|
||||
else
|
||||
unreadItemsCompletable = markItemsReadUnread(false, syncData.getUnreadItemsIds(), token);
|
||||
|
||||
return readItemsCompletable.concatWith(unreadItemsCompletable);
|
||||
}
|
||||
|
||||
public enum EXCLUDE_ITEMS {
|
||||
EXCLUDE_READ_ITEMS("user/-/state/com.google/read");
|
||||
|
||||
|
@ -5,6 +5,8 @@ import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.Single;
|
||||
import okhttp3.RequestBody;
|
||||
@ -40,7 +42,7 @@ public interface FreshRSSService {
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST("reader/api/0/edit-tag")
|
||||
Completable setItemReadState(@Field("T") String token, @Field("a") String readAction, @Field("r") String unreadAction, @Field("i") String itemId);
|
||||
Completable setItemsReadState(@Field("T") String token, @Field("a") String readAction, @Field("r") String unreadAction, @Field("i") List<String> itemIds);
|
||||
|
||||
@FormUrlEncoded
|
||||
@POST("reader/api/0/subscription/edit")
|
||||
|
@ -1,11 +1,19 @@
|
||||
package com.readrops.readropslibrary.services.freshrss;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class FreshRSSSyncData {
|
||||
|
||||
private long lastModified;
|
||||
|
||||
public FreshRSSSyncData() {
|
||||
private List<String> readItemsIds;
|
||||
|
||||
private List<String> unreadItemsIds;
|
||||
|
||||
public FreshRSSSyncData() {
|
||||
readItemsIds = new ArrayList<>();
|
||||
unreadItemsIds = new ArrayList<>();
|
||||
}
|
||||
|
||||
public long getLastModified() {
|
||||
@ -15,4 +23,20 @@ public class FreshRSSSyncData {
|
||||
public void setLastModified(long lastModified) {
|
||||
this.lastModified = lastModified;
|
||||
}
|
||||
|
||||
public List<String> getReadItemsIds() {
|
||||
return readItemsIds;
|
||||
}
|
||||
|
||||
public void setReadItemsIds(List<String> readItemsIds) {
|
||||
this.readItemsIds = readItemsIds;
|
||||
}
|
||||
|
||||
public List<String> getUnreadItemsIds() {
|
||||
return unreadItemsIds;
|
||||
}
|
||||
|
||||
public void setUnreadItemsIds(List<String> unreadItemsIds) {
|
||||
this.unreadItemsIds = unreadItemsIds;
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user