Add greader folders (tags) request and insertion

This commit is contained in:
Shinokuni 2019-08-13 22:45:57 +02:00
parent 500b363942
commit f6c322c4f2
10 changed files with 123 additions and 27 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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