Add greader folders (tags) request and insertion
This commit is contained in:
parent
500b363942
commit
f6c322c4f2
@ -7,7 +7,6 @@ import androidx.room.Transaction;
|
||||
|
||||
import com.readrops.app.database.entities.Account;
|
||||
import com.readrops.app.database.entities.Folder;
|
||||
import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
@ -22,41 +21,38 @@ public abstract class FolderDao implements BaseDao<Folder> {
|
||||
public abstract List<Folder> getFolders(int accountId);
|
||||
|
||||
@Query("Update Folder set name = :name Where remoteId = :remoteFolderId And account_id = :accountId")
|
||||
public abstract void updateName(int remoteFolderId, int accountId, String name);
|
||||
public abstract void updateName(String remoteFolderId, int accountId, String name);
|
||||
|
||||
@Query("Select case When :remoteId In (Select remoteId From Folder Where account_id = :accountId) Then 1 else 0 end")
|
||||
public abstract boolean remoteFolderExists(int remoteId, int accountId);
|
||||
abstract boolean remoteFolderExists(String remoteId, int accountId);
|
||||
|
||||
@Query("Select * from Folder Where id = :folderId")
|
||||
public abstract Folder select(int folderId);
|
||||
|
||||
@Query("Select remoteId From Folder Where account_id = :accountId")
|
||||
public abstract List<Long> getFolderRemoteIdsOfAccount(int accountId);
|
||||
public abstract List<String> getFolderRemoteIdsOfAccount(int accountId);
|
||||
|
||||
@Query("Delete From Folder Where id in (:ids)")
|
||||
public abstract void deleteByIds(List<Long> ids);
|
||||
abstract void deleteByIds(List<String> ids);
|
||||
|
||||
/**
|
||||
* Insert, update and delete folders
|
||||
* @param nextNewsFolders folders to insert or update
|
||||
*
|
||||
* @param folders folders to insert or update
|
||||
* @param account owner of the feeds
|
||||
* @return the list of the inserted feeds ids
|
||||
*/
|
||||
@Transaction
|
||||
public List<Long> upsert(List<NextNewsFolder> nextNewsFolders, Account account) {
|
||||
List<Long> accountFolderIds = getFolderRemoteIdsOfAccount(account.getId());
|
||||
public List<Long> foldersUpsert(List<Folder> folders, Account account) {
|
||||
List<String> accountFolderIds = getFolderRemoteIdsOfAccount(account.getId());
|
||||
List<Folder> foldersToInsert = new ArrayList<>();
|
||||
|
||||
for (NextNewsFolder nextNewsFolder : nextNewsFolders) {
|
||||
if (remoteFolderExists(nextNewsFolder.getId(), account.getId())) {
|
||||
updateName(nextNewsFolder.getId(), account.getId(), nextNewsFolder.getName());
|
||||
for (Folder folder : folders) {
|
||||
if (remoteFolderExists(folder.getRemoteId(), account.getId())) {
|
||||
updateName(folder.getRemoteId(), account.getId(), folder.getName());
|
||||
|
||||
accountFolderIds.remove((long) nextNewsFolder.getId());
|
||||
accountFolderIds.remove(folder.getRemoteId());
|
||||
} else {
|
||||
Folder folder = new Folder(nextNewsFolder.getName());
|
||||
folder.setRemoteId(nextNewsFolder.getId());
|
||||
folder.setAccountId(account.getId());
|
||||
|
||||
foldersToInsert.add(folder);
|
||||
}
|
||||
}
|
||||
|
@ -11,14 +11,14 @@ import androidx.room.PrimaryKey;
|
||||
|
||||
@Entity(foreignKeys = @ForeignKey(entity = Account.class, parentColumns = "id",
|
||||
childColumns = "account_id", onDelete = ForeignKey.CASCADE))
|
||||
public class Folder implements Parcelable, Comparable<Folder> {
|
||||
public class Folder implements Parcelable, Comparable<Folder> {
|
||||
|
||||
@PrimaryKey(autoGenerate = true)
|
||||
private int id;
|
||||
|
||||
private String name;
|
||||
|
||||
private int remoteId;
|
||||
private String remoteId;
|
||||
|
||||
@ColumnInfo(name = "account_id", index = true)
|
||||
private int accountId;
|
||||
@ -53,11 +53,11 @@ public class Folder implements Parcelable, Comparable<Folder> {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public int getRemoteId() {
|
||||
public String getRemoteId() {
|
||||
return remoteId;
|
||||
}
|
||||
|
||||
public void setRemoteId(int remoteId) {
|
||||
public void setRemoteId(String remoteId) {
|
||||
this.remoteId = remoteId;
|
||||
}
|
||||
|
||||
|
@ -17,6 +17,7 @@ import com.readrops.readropslibrary.services.freshrss.FreshRSSCredentials;
|
||||
import com.readrops.readropslibrary.services.freshrss.FreshRSSService;
|
||||
import com.readrops.readropslibrary.services.freshrss.FreshRSSSyncData;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFeed;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolder;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem;
|
||||
|
||||
import org.joda.time.LocalDateTime;
|
||||
@ -24,6 +25,7 @@ import org.joda.time.LocalDateTime;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.StringTokenizer;
|
||||
|
||||
import io.reactivex.Completable;
|
||||
import io.reactivex.Observable;
|
||||
@ -72,6 +74,7 @@ public class FreshRSSRepository extends ARepository {
|
||||
|
||||
return api.sync(syncType, syncData)
|
||||
.flatMapObservable(syncResult -> {
|
||||
insertFolders(syncResult.getFolders(), account);
|
||||
insertFeeds(syncResult.getFeeds(), account);
|
||||
insertItems(syncResult.getItems(), account, syncType == SyncType.INITIAL_SYNC);
|
||||
|
||||
@ -130,6 +133,24 @@ public class FreshRSSRepository extends ARepository {
|
||||
return insertedFeeds;
|
||||
}
|
||||
|
||||
private void insertFolders(List<FreshRSSFolder> freshRSSFolders, Account account) {
|
||||
List<Folder> folders = new ArrayList<>();
|
||||
|
||||
for (FreshRSSFolder freshRSSFolder : freshRSSFolders) {
|
||||
if (freshRSSFolder.getType() != null && freshRSSFolder.getType().equals("folder")) {
|
||||
List<Object> tokens = Collections.list(new StringTokenizer(freshRSSFolder.getId(), "/"));
|
||||
|
||||
Folder folder = new Folder((String) tokens.get(tokens.size() - 1));
|
||||
folder.setRemoteId(freshRSSFolder.getId());
|
||||
folder.setAccountId(account.getId());
|
||||
|
||||
folders.add(folder);
|
||||
}
|
||||
}
|
||||
|
||||
database.folderDao().foldersUpsert(folders, account);
|
||||
}
|
||||
|
||||
private void insertItems(List<FreshRSSItem> items, Account account, boolean initialSync) {
|
||||
List<Item> newItems = new ArrayList<>();
|
||||
|
||||
|
@ -164,7 +164,7 @@ public class NextNewsRepository extends ARepository {
|
||||
|
||||
NextNewsFeed newsFeed;
|
||||
if (folder != null)
|
||||
newsFeed = new NextNewsFeed(Integer.parseInt(feed.getRemoteId()), folder.getRemoteId());
|
||||
newsFeed = new NextNewsFeed(Integer.parseInt(feed.getRemoteId()), Integer.parseInt(folder.getRemoteId()));
|
||||
else
|
||||
newsFeed = new NextNewsFeed(Integer.parseInt(feed.getRemoteId()), 0); // 0 for no folder
|
||||
|
||||
@ -209,7 +209,7 @@ public class NextNewsRepository extends ARepository {
|
||||
NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials());
|
||||
|
||||
try {
|
||||
NextNewsFolders folders = api.createFolder(new NextNewsFolder(folder.getRemoteId(), folder.getName()));
|
||||
NextNewsFolders folders = api.createFolder(new NextNewsFolder(Integer.parseInt(folder.getRemoteId()), folder.getName()));
|
||||
|
||||
if (folders != null)
|
||||
insertFolders(folders.getFolders(), account);
|
||||
@ -229,7 +229,7 @@ public class NextNewsRepository extends ARepository {
|
||||
NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials());
|
||||
|
||||
try {
|
||||
if (api.renameFolder(new NextNewsFolder(folder.getRemoteId(), folder.getName()))) {
|
||||
if (api.renameFolder(new NextNewsFolder(Integer.parseInt(folder.getRemoteId()), folder.getName()))) {
|
||||
database.folderDao().update(folder);
|
||||
emitter.onComplete();
|
||||
} else
|
||||
@ -249,7 +249,7 @@ public class NextNewsRepository extends ARepository {
|
||||
NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials());
|
||||
|
||||
try {
|
||||
if (api.deleteFolder(new NextNewsFolder(folder.getRemoteId(), folder.getName()))) {
|
||||
if (api.deleteFolder(new NextNewsFolder(Integer.parseInt(folder.getRemoteId()), folder.getName()))) {
|
||||
database.folderDao().delete(folder);
|
||||
emitter.onComplete();
|
||||
} else
|
||||
@ -281,8 +281,18 @@ public class NextNewsRepository extends ARepository {
|
||||
return insertedFeeds;
|
||||
}
|
||||
|
||||
private void insertFolders(List<NextNewsFolder> folders, Account account) {
|
||||
database.folderDao().upsert(folders, account);
|
||||
private void insertFolders(List<NextNewsFolder> nextNewsFolders, Account account) {
|
||||
List<Folder> folders = new ArrayList<>();
|
||||
|
||||
for (NextNewsFolder nextNewsFolder : nextNewsFolders) {
|
||||
Folder folder = new Folder(nextNewsFolder.getName());
|
||||
folder.setAccountId(account.getId());
|
||||
folder.setRemoteId(String.valueOf(nextNewsFolder.getId()));
|
||||
|
||||
folders.add(folder);
|
||||
}
|
||||
|
||||
database.folderDao().foldersUpsert(folders, account);
|
||||
}
|
||||
|
||||
private void insertItems(List<NextNewsItem> items, Account account, boolean initialSync) {
|
||||
|
@ -35,6 +35,7 @@ public final class FeedMatcher {
|
||||
|
||||
newFeed.setIconUrl(feed.getIconUrl());
|
||||
|
||||
newFeed.setRemoteFolderId(feed.getCategories().get(0).getId());
|
||||
newFeed.setAccountId(account.getId());
|
||||
newFeed.setRemoteId(feed.getId());
|
||||
|
||||
|
@ -5,6 +5,7 @@ import androidx.annotation.NonNull;
|
||||
import com.readrops.readropslibrary.services.API;
|
||||
import com.readrops.readropslibrary.services.SyncType;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFeeds;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
||||
|
||||
@ -51,7 +52,12 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
||||
public Single<FreshRSSSyncResult> sync(@NonNull SyncType syncType, @NonNull FreshRSSSyncData syncData) {
|
||||
FreshRSSSyncResult syncResult = new FreshRSSSyncResult();
|
||||
|
||||
return getFeeds()
|
||||
return getFolders()
|
||||
.flatMap(freshRSSFolders -> {
|
||||
syncResult.setFolders(freshRSSFolders.getTags());
|
||||
|
||||
return getFeeds();
|
||||
})
|
||||
.flatMap(freshRSSFeeds -> {
|
||||
syncResult.setFeeds(freshRSSFeeds.getSubscriptions());
|
||||
|
||||
@ -71,6 +77,10 @@ public class FreshRSSAPI extends API<FreshRSSService> {
|
||||
});
|
||||
}
|
||||
|
||||
public Single<FreshRSSFolders> getFolders() {
|
||||
return api.getFolders();
|
||||
}
|
||||
|
||||
public Single<FreshRSSFeeds> getFeeds() {
|
||||
return api.getFeeds();
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.readrops.readropslibrary.services.freshrss;
|
||||
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFeeds;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
|
||||
|
||||
@ -27,4 +28,7 @@ public interface FreshRSSService {
|
||||
|
||||
@GET("reader/api/0/stream/contents/user/-/state/com.google/reading-list")
|
||||
Single<FreshRSSItems> getItems(@Query("xt") String excludeTarget, @Query("n") Integer max, @Query("ot") Long lastModified);
|
||||
|
||||
@GET("reader/api/0/tag/list?output=json")
|
||||
Single<FreshRSSFolders> getFolders();
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
package com.readrops.readropslibrary.services.freshrss;
|
||||
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFeed;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolder;
|
||||
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem;
|
||||
|
||||
import java.util.ArrayList;
|
||||
@ -8,6 +9,8 @@ import java.util.List;
|
||||
|
||||
public class FreshRSSSyncResult {
|
||||
|
||||
private List<FreshRSSFolder> folders;
|
||||
|
||||
private List<FreshRSSFeed> feeds;
|
||||
|
||||
private List<FreshRSSItem> items;
|
||||
@ -32,4 +35,12 @@ public class FreshRSSSyncResult {
|
||||
public void setItems(List<FreshRSSItem> items) {
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
public List<FreshRSSFolder> getFolders() {
|
||||
return folders;
|
||||
}
|
||||
|
||||
public void setFolders(List<FreshRSSFolder> folders) {
|
||||
this.folders = folders;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,27 @@
|
||||
package com.readrops.readropslibrary.services.freshrss.json;
|
||||
|
||||
public class FreshRSSFolder {
|
||||
|
||||
private String id;
|
||||
|
||||
private String type;
|
||||
|
||||
public FreshRSSFolder() {
|
||||
}
|
||||
|
||||
public String getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(String id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getType() {
|
||||
return type;
|
||||
}
|
||||
|
||||
public void setType(String type) {
|
||||
this.type = type;
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
package com.readrops.readropslibrary.services.freshrss.json;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class FreshRSSFolders {
|
||||
|
||||
private List<FreshRSSFolder> tags;
|
||||
|
||||
public List<FreshRSSFolder> getTags() {
|
||||
return tags;
|
||||
}
|
||||
|
||||
public void setTags(List<FreshRSSFolder> tags) {
|
||||
this.tags = tags;
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user