Sync now pushes read and unread items

This commit is contained in:
Shinokuni 2019-08-23 20:52:37 +02:00
parent 21b261b0e1
commit c9e47cfc12
7 changed files with 94 additions and 56 deletions

View File

@ -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);
}

View File

@ -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<>();

View File

@ -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);

View File

@ -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'
}

View File

@ -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");

View File

@ -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")

View File

@ -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;
}
}