mirror of
https://github.com/readrops/Readrops.git
synced 2025-02-02 19:56:50 +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")
|
"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);
|
public abstract LiveData<ItemWithFeed> getItemById(int id);
|
||||||
|
|
||||||
@Query("Select remoteId From Item Where read_changed = 1 And read = 1")
|
@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();
|
public abstract List<String> getReadChanges(int accountId);
|
||||||
|
|
||||||
@Query("Select remoteId From Item Where read_changed = 1 And read = 0")
|
@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();
|
public abstract List<String> getUnreadChanges(int accountId);
|
||||||
|
|
||||||
@Query("Update Item set read_changed = 0")
|
@Query("Update Item set read_changed = 0 Where feed_id in (Select id From Feed Where account_id = :accountId)")
|
||||||
public abstract void resetReadChanges();
|
public abstract void resetReadChanges(int accountId);
|
||||||
}
|
}
|
||||||
|
@ -46,6 +46,11 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
account.setToken(token);
|
account.setToken(token);
|
||||||
api.setCredentials(new FreshRSSCredentials(token, account.getUrl()));
|
api.setCredentials(new FreshRSSCredentials(token, account.getUrl()));
|
||||||
|
|
||||||
|
return api.getWriteToken();
|
||||||
|
})
|
||||||
|
.flatMap(writeToken -> {
|
||||||
|
account.setWriteToken(writeToken);
|
||||||
|
|
||||||
return api.getUserInfo();
|
return api.getUserInfo();
|
||||||
})
|
})
|
||||||
.flatMap(userInfo -> {
|
.flatMap(userInfo -> {
|
||||||
@ -71,7 +76,12 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
} else
|
} else
|
||||||
syncType = SyncType.INITIAL_SYNC;
|
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 -> {
|
.flatMapObservable(syncResult -> {
|
||||||
insertFolders(syncResult.getFolders(), account);
|
insertFolders(syncResult.getFolders(), account);
|
||||||
insertFeeds(syncResult.getFeeds(), account);
|
insertFeeds(syncResult.getFeeds(), account);
|
||||||
@ -80,6 +90,8 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
account.setLastModified(syncResult.getLastUpdated());
|
account.setLastModified(syncResult.getLastUpdated());
|
||||||
database.accountDao().updateLastModified(account.getId(), syncResult.getLastUpdated());
|
database.accountDao().updateLastModified(account.getId(), syncResult.getLastUpdated());
|
||||||
|
|
||||||
|
database.itemDao().resetReadChanges(account.getId());
|
||||||
|
|
||||||
return Observable.empty();
|
return Observable.empty();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -193,24 +205,6 @@ public class FreshRSSRepository extends ARepository {
|
|||||||
.andThen(super.deleteFolder(folder));
|
.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) {
|
private List<Feed> insertFeeds(List<FreshRSSFeed> freshRSSFeeds, Account account) {
|
||||||
List<Feed> feeds = new ArrayList<>();
|
List<Feed> feeds = new ArrayList<>();
|
||||||
|
|
||||||
|
@ -83,8 +83,8 @@ public class NextNewsRepository extends ARepository {
|
|||||||
|
|
||||||
if (syncType == SyncType.CLASSIC_SYNC) {
|
if (syncType == SyncType.CLASSIC_SYNC) {
|
||||||
syncData.setLastModified(account.getLastModified() / 1000L);
|
syncData.setLastModified(account.getLastModified() / 1000L);
|
||||||
syncData.setReadItems(database.itemDao().getReadChanges());
|
syncData.setReadItems(database.itemDao().getReadChanges(account.getId()));
|
||||||
syncData.setUnreadItems(database.itemDao().getUnreadChanges());
|
syncData.setUnreadItems(database.itemDao().getUnreadChanges(account.getId()));
|
||||||
}
|
}
|
||||||
|
|
||||||
TimingLogger timings = new TimingLogger(TAG, "nextcloud news " + syncType.name().toLowerCase());
|
TimingLogger timings = new TimingLogger(TAG, "nextcloud news " + syncType.name().toLowerCase());
|
||||||
@ -105,7 +105,7 @@ public class NextNewsRepository extends ARepository {
|
|||||||
|
|
||||||
account.setLastModified(lastModified);
|
account.setLastModified(lastModified);
|
||||||
database.accountDao().updateLastModified(account.getId(), lastModified);
|
database.accountDao().updateLastModified(account.getId(), lastModified);
|
||||||
database.itemDao().resetReadChanges();
|
database.itemDao().resetReadChanges(account.getId());
|
||||||
|
|
||||||
emitter.onComplete();
|
emitter.onComplete();
|
||||||
} else
|
} else
|
||||||
@ -214,8 +214,7 @@ public class NextNewsRepository extends ARepository {
|
|||||||
folder.setName(nextNewsFolder.getName());
|
folder.setName(nextNewsFolder.getName());
|
||||||
folder.setRemoteId(String.valueOf(nextNewsFolder.getId()));
|
folder.setRemoteId(String.valueOf(nextNewsFolder.getId()));
|
||||||
database.folderDao().insert(folder);
|
database.folderDao().insert(folder);
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
emitter.onError(new Exception("Unknown error"));
|
emitter.onError(new Exception("Unknown error"));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
emitter.onError(e);
|
emitter.onError(e);
|
||||||
|
@ -42,6 +42,7 @@ dependencies {
|
|||||||
|
|
||||||
implementation 'com.squareup.okhttp3:logging-interceptor:3.14.1'
|
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 'org.jsoup:jsoup:1.11.3'
|
||||||
implementation 'com.facebook.stetho:stetho-okhttp3:1.5.1'
|
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 com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
||||||
|
|
||||||
import java.io.StringReader;
|
import java.io.StringReader;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
import io.reactivex.Completable;
|
import io.reactivex.Completable;
|
||||||
@ -56,33 +57,34 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
|||||||
return api.getUserInfo();
|
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();
|
FreshRSSSyncResult syncResult = new FreshRSSSyncResult();
|
||||||
|
|
||||||
return getFolders()
|
return setItemsReadState(syncData, writeToken)
|
||||||
.flatMap(freshRSSFolders -> {
|
.andThen(getFolders()
|
||||||
syncResult.setFolders(freshRSSFolders.getTags());
|
.flatMap(freshRSSFolders -> {
|
||||||
|
syncResult.setFolders(freshRSSFolders.getTags());
|
||||||
|
|
||||||
return getFeeds();
|
return getFeeds();
|
||||||
})
|
})
|
||||||
.flatMap(freshRSSFeeds -> {
|
.flatMap(freshRSSFeeds -> {
|
||||||
syncResult.setFeeds(freshRSSFeeds.getSubscriptions());
|
syncResult.setFeeds(freshRSSFeeds.getSubscriptions());
|
||||||
|
|
||||||
switch (syncType) {
|
switch (syncType) {
|
||||||
case INITIAL_SYNC:
|
case INITIAL_SYNC:
|
||||||
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, null);
|
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, null);
|
||||||
case CLASSIC_SYNC:
|
case CLASSIC_SYNC:
|
||||||
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, syncData.getLastModified());
|
return getItems(EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, 10000, syncData.getLastModified());
|
||||||
}
|
}
|
||||||
|
|
||||||
return Single.error(new Exception("Unknown sync type"));
|
return Single.error(new Exception("Unknown sync type"));
|
||||||
})
|
})
|
||||||
.flatMap(freshRSSItems -> {
|
.flatMap(freshRSSItems -> {
|
||||||
syncResult.setItems(freshRSSItems.getItems());
|
syncResult.setItems(freshRSSItems.getItems());
|
||||||
syncResult.setLastUpdated(freshRSSItems.getUpdated());
|
syncResult.setLastUpdated(freshRSSItems.getUpdated());
|
||||||
|
|
||||||
return Single.just(syncResult);
|
return Single.just(syncResult);
|
||||||
});
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
public Single<FreshRSSFolders> getFolders() {
|
public Single<FreshRSSFolders> getFolders() {
|
||||||
@ -97,11 +99,11 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
|||||||
return api.getItems(excludeTarget, max, lastModified);
|
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)
|
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
|
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) {
|
public Completable createFeed(String token, String feedUrl) {
|
||||||
@ -128,6 +130,22 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
|||||||
return api.deleteFolder(token, folderId);
|
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 {
|
public enum EXCLUDE_ITEMS {
|
||||||
EXCLUDE_READ_ITEMS("user/-/state/com.google/read");
|
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.FreshRSSItems;
|
||||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
import io.reactivex.Completable;
|
import io.reactivex.Completable;
|
||||||
import io.reactivex.Single;
|
import io.reactivex.Single;
|
||||||
import okhttp3.RequestBody;
|
import okhttp3.RequestBody;
|
||||||
@ -40,7 +42,7 @@ public interface FreshRSSService {
|
|||||||
|
|
||||||
@FormUrlEncoded
|
@FormUrlEncoded
|
||||||
@POST("reader/api/0/edit-tag")
|
@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
|
@FormUrlEncoded
|
||||||
@POST("reader/api/0/subscription/edit")
|
@POST("reader/api/0/subscription/edit")
|
||||||
|
@ -1,11 +1,19 @@
|
|||||||
package com.readrops.readropslibrary.services.freshrss;
|
package com.readrops.readropslibrary.services.freshrss;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class FreshRSSSyncData {
|
public class FreshRSSSyncData {
|
||||||
|
|
||||||
private long lastModified;
|
private long lastModified;
|
||||||
|
|
||||||
public FreshRSSSyncData() {
|
private List<String> readItemsIds;
|
||||||
|
|
||||||
|
private List<String> unreadItemsIds;
|
||||||
|
|
||||||
|
public FreshRSSSyncData() {
|
||||||
|
readItemsIds = new ArrayList<>();
|
||||||
|
unreadItemsIds = new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getLastModified() {
|
public long getLastModified() {
|
||||||
@ -15,4 +23,20 @@ public class FreshRSSSyncData {
|
|||||||
public void setLastModified(long lastModified) {
|
public void setLastModified(long lastModified) {
|
||||||
this.lastModified = 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