From 62eec1e077d1698f48ec75b133b38487ddf385d8 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Sat, 17 Aug 2019 16:04:56 +0200 Subject: [PATCH] Add greader feed insertion and deletion requests --- .../app/database/entities/Account.java | 20 +++++++++---- .../app/repositories/FreshRSSRepository.java | 30 +++++++++++++++---- .../app/repositories/NextNewsRepository.java | 16 +++++----- .../app/viewmodels/AddFeedsViewModel.java | 7 ++++- .../ManageFeedsFoldersViewModel.java | 4 +++ .../services/freshrss/FreshRSSAPI.java | 11 ++++++- .../services/freshrss/FreshRSSService.java | 4 +++ .../services/nextcloudnews/NextNewsAPI.java | 3 +- 8 files changed, 72 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/com/readrops/app/database/entities/Account.java b/app/src/main/java/com/readrops/app/database/entities/Account.java index f40dd677..a2adc329 100644 --- a/app/src/main/java/com/readrops/app/database/entities/Account.java +++ b/app/src/main/java/com/readrops/app/database/entities/Account.java @@ -12,6 +12,7 @@ import androidx.room.Ignore; import androidx.room.PrimaryKey; import com.readrops.app.R; +import com.readrops.readropslibrary.services.Credentials; import com.readrops.readropslibrary.services.freshrss.FreshRSSCredentials; import com.readrops.readropslibrary.services.nextcloudnews.NextNewsCredentials; @@ -67,6 +68,8 @@ public class Account implements Parcelable { currentAccount = in.readByte() != 0; login = in.readString(); password = in.readString(); + token = in.readString(); + writeToken = in.readString(); } public static final Creator CREATOR = new Creator() { @@ -193,6 +196,8 @@ public class Account implements Parcelable { dest.writeByte((byte) (currentAccount ? 1 : 0)); dest.writeString(login); dest.writeString(password); + dest.writeString(token); + dest.writeString(writeToken); } public enum AccountType implements Parcelable { @@ -244,12 +249,15 @@ public class Account implements Parcelable { } } - public NextNewsCredentials toNextNewsCredentials() { - return new NextNewsCredentials(login, password, url); - } - - public FreshRSSCredentials toFreshRSSCredentials() { - return new FreshRSSCredentials(token, url); + public Credentials toCredentials() { + switch (accountType) { + case NEXTCLOUD_NEWS: + return new NextNewsCredentials(login, password, url); + case FRESHRSS: + return new FreshRSSCredentials(token, url); + default: + return null; + } } public boolean isLocal() { diff --git a/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java b/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java index 4959e78e..1d74c2e3 100644 --- a/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java @@ -61,7 +61,7 @@ public class FreshRSSRepository extends ARepository { @Override public Observable sync(List feeds) { - FreshRSSAPI api = new FreshRSSAPI(account.toFreshRSSCredentials()); + FreshRSSAPI api = new FreshRSSAPI(account.toCredentials()); FreshRSSSyncData syncData = new FreshRSSSyncData(); SyncType syncType; @@ -87,7 +87,17 @@ public class FreshRSSRepository extends ARepository { @Override public Single> addFeeds(List results) { - return null; + FreshRSSAPI api = new FreshRSSAPI(account.toCredentials()); + + List completableList = new ArrayList<>(); + + for (ParsingResult result : results) { + completableList.add(api.createFeed(account.getWriteToken(), result.getUrl())); + } + + // TODO : see how to handle exceptions/errors like the others repositories + return Completable.concat(completableList) + .andThen(Single.just(new ArrayList<>())); } @Override @@ -97,7 +107,13 @@ public class FreshRSSRepository extends ARepository { @Override public Completable deleteFeed(Feed feed) { - return null; + FreshRSSAPI api = new FreshRSSAPI(account.toCredentials()); + + return api.deleteFeed(account.getWriteToken(), feed.getUrl()) + .andThen(Completable.create(emitter -> { + database.feedDao().delete(feed.getId()); + emitter.onComplete(); + })); } @Override @@ -117,17 +133,19 @@ public class FreshRSSRepository extends ARepository { @Override public Completable setItemReadState(Item item, boolean read) { - FreshRSSAPI api = new FreshRSSAPI(account.toFreshRSSCredentials()); + 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).concatWith(super.setItemReadState(item, read)); + return api.markItemReadUnread(read, item.getRemoteId(), writeToken) + .concatWith(super.setItemReadState(item, read)); }); } else { - return api.markItemReadUnread(read, item.getRemoteId(), account.getWriteToken()).concatWith(super.setItemReadState(item, read)); + return api.markItemReadUnread(read, item.getRemoteId(), account.getWriteToken()) + .concatWith(super.setItemReadState(item, read)); } } diff --git a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java index fbc63f93..0e09d604 100644 --- a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java @@ -51,7 +51,7 @@ public class NextNewsRepository extends ARepository { @Override public Single login(Account account, boolean insert) { return Single.create(emitter -> { - NextNewsAPI newsAPI = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI newsAPI = new NextNewsAPI(account.toCredentials()); NextNewsUser user = newsAPI.login(); if (user != null) { @@ -70,7 +70,7 @@ public class NextNewsRepository extends ARepository { public Observable sync(List feeds) { return Observable.create(emitter -> { try { - NextNewsAPI newsAPI = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI newsAPI = new NextNewsAPI(account.toCredentials()); long lastModified = LocalDateTime.now().toDateTime().getMillis(); SyncType syncType; @@ -122,7 +122,7 @@ public class NextNewsRepository extends ARepository { public Single> addFeeds(List results) { return Single.create(emitter -> { List feedInsertionResults = new ArrayList<>(); - NextNewsAPI newsAPI = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI newsAPI = new NextNewsAPI(account.toCredentials()); for (ParsingResult result : results) { FeedInsertionResult insertionResult = new FeedInsertionResult(); @@ -159,7 +159,7 @@ public class NextNewsRepository extends ARepository { @Override public Completable updateFeed(Feed feed) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); Folder folder = feed.getFolderId() == null ? null : database.folderDao().select(feed.getFolderId()); @@ -190,7 +190,7 @@ public class NextNewsRepository extends ARepository { @Override public Completable deleteFeed(Feed feed) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { if (api.deleteFeed(Integer.parseInt(feed.getRemoteId()))) { @@ -209,7 +209,7 @@ public class NextNewsRepository extends ARepository { @Override public Completable addFolder(Folder folder) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { NextNewsFolders folders = api.createFolder(new NextNewsFolder(Integer.parseInt(folder.getRemoteId()), folder.getName())); @@ -229,7 +229,7 @@ public class NextNewsRepository extends ARepository { @Override public Completable updateFolder(Folder folder) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { if (api.renameFolder(new NextNewsFolder(Integer.parseInt(folder.getRemoteId()), folder.getName()))) { @@ -249,7 +249,7 @@ public class NextNewsRepository extends ARepository { @Override public Completable deleteFolder(Folder folder) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(account.toNextNewsCredentials()); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { if (api.deleteFolder(new NextNewsFolder(Integer.parseInt(folder.getRemoteId()), folder.getName()))) { diff --git a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java index f4731341..d7dbf9cc 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/AddFeedsViewModel.java @@ -1,13 +1,15 @@ package com.readrops.app.viewmodels; import android.app.Application; -import androidx.lifecycle.AndroidViewModel; + import androidx.annotation.NonNull; +import androidx.lifecycle.AndroidViewModel; import androidx.lifecycle.LiveData; import com.readrops.app.database.Database; import com.readrops.app.database.entities.Account; import com.readrops.app.repositories.ARepository; +import com.readrops.app.repositories.FreshRSSRepository; import com.readrops.app.repositories.LocalFeedRepository; import com.readrops.app.repositories.NextNewsRepository; import com.readrops.app.utils.FeedInsertionResult; @@ -39,6 +41,9 @@ public class AddFeedsViewModel extends AndroidViewModel { case NEXTCLOUD_NEWS: repository = new NextNewsRepository(getApplication(), account); break; + case FRESHRSS: + repository = new FreshRSSRepository(getApplication(), account); + break; } return repository.addFeeds(results); diff --git a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java index 7ffb68bb..cb000e4d 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java @@ -11,6 +11,7 @@ import com.readrops.app.database.entities.Feed; import com.readrops.app.database.entities.Folder; import com.readrops.app.database.pojo.FeedWithFolder; import com.readrops.app.repositories.ARepository; +import com.readrops.app.repositories.FreshRSSRepository; import com.readrops.app.repositories.LocalFeedRepository; import com.readrops.app.repositories.NextNewsRepository; @@ -41,6 +42,9 @@ public class ManageFeedsFoldersViewModel extends AndroidViewModel { case NEXTCLOUD_NEWS: repository = new NextNewsRepository(getApplication(), account); break; + case FRESHRSS: + repository = new FreshRSSRepository(getApplication(), account); + break; } feedsWithFolder = db.feedDao().getAllFeedsWithFolder(account.getId()); diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSAPI.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSAPI.java index 66ea18c0..82ee3f72 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSAPI.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSAPI.java @@ -3,6 +3,7 @@ package com.readrops.readropslibrary.services.freshrss; import androidx.annotation.NonNull; import com.readrops.readropslibrary.services.API; +import com.readrops.readropslibrary.services.Credentials; import com.readrops.readropslibrary.services.SyncType; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFeeds; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders; @@ -19,7 +20,7 @@ import okhttp3.RequestBody; public class FreshRSSAPI extends API { - public FreshRSSAPI(FreshRSSCredentials credentials) { + public FreshRSSAPI(Credentials credentials) { super(credentials, FreshRSSService.class, FreshRSSService.END_POINT); } @@ -103,6 +104,14 @@ public class FreshRSSAPI extends API { return api.setItemReadState(token, null, EXCLUDE_ITEMS.EXCLUDE_READ_ITEMS.value, itemId); } + public Completable createFeed(String token, String feedUrl) { + return api.createOrDeleteFeed(token, "feed/" + feedUrl, "subscribe"); + } + + public Completable deleteFeed(String token, String feedUrl) { + return api.createOrDeleteFeed(token, "feed/" + feedUrl, "unsubscribe"); + } + public enum EXCLUDE_ITEMS { EXCLUDE_READ_ITEMS("user/-/state/com.google/read"); diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSService.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSService.java index a72fd66a..dcca08f0 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSService.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSService.java @@ -41,4 +41,8 @@ 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); + + @FormUrlEncoded + @POST("reader/api/0/subscription/edit") + Completable createOrDeleteFeed(@Field("T") String token, @Field("s") String feedUrl, @Field("ac") String action); } diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java index 06b4a406..e5ce6e47 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsAPI.java @@ -6,6 +6,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.readrops.readropslibrary.services.API; +import com.readrops.readropslibrary.services.Credentials; import com.readrops.readropslibrary.services.SyncType; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeed; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; @@ -29,7 +30,7 @@ public class NextNewsAPI extends API { private static final String TAG = NextNewsAPI.class.getSimpleName(); - public NextNewsAPI(NextNewsCredentials credentials) { + public NextNewsAPI(Credentials credentials) { super(credentials, NextNewsService.class, NextNewsService.END_POINT); }