From 5df094ca3086b2a207f215e5ccc2f7c0c6208378 Mon Sep 17 00:00:00 2001 From: Shinokuni Date: Fri, 9 Aug 2019 12:44:07 +0200 Subject: [PATCH] Add abstraction level for services APIs --- .../app/repositories/NextNewsRepository.java | 39 +++++----- .../readropslibrary/services/API.java | 37 +++++++++ .../services/nextcloudnews/NextNewsAPI.java | 77 +++++-------------- .../{ => nextcloudnews}/NextNewsService.java | 4 +- .../{SyncData.java => NextNewsSyncData.java} | 4 +- ...yncResult.java => NextNewsSyncResult.java} | 5 +- 6 files changed, 83 insertions(+), 83 deletions(-) create mode 100644 readropslibrary/src/main/java/com/readrops/readropslibrary/services/API.java rename readropslibrary/src/main/java/com/readrops/readropslibrary/services/{ => nextcloudnews}/NextNewsService.java (95%) rename readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/{SyncData.java => NextNewsSyncData.java} (95%) rename readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/{SyncResult.java => NextNewsSyncResult.java} (91%) 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 1b5f6902..044e3f91 100644 --- a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java @@ -13,8 +13,8 @@ import com.readrops.app.utils.ItemMatcher; import com.readrops.app.utils.ParsingResult; import com.readrops.app.utils.Utils; import com.readrops.readropslibrary.services.nextcloudnews.NextNewsAPI; -import com.readrops.readropslibrary.services.nextcloudnews.SyncData; -import com.readrops.readropslibrary.services.nextcloudnews.SyncResult; +import com.readrops.readropslibrary.services.nextcloudnews.NextNewsSyncData; +import com.readrops.readropslibrary.services.nextcloudnews.NextNewsSyncResult; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeed; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; @@ -46,8 +46,8 @@ public class NextNewsRepository extends ARepository { @Override public Single login(Account account, boolean insert) { return Single.create(emitter -> { - NextNewsAPI newsAPI = new NextNewsAPI(); - NextNewsUser user = newsAPI.login(account.toCredentials()); + NextNewsAPI newsAPI = new NextNewsAPI(account.toCredentials()); + NextNewsUser user = newsAPI.login(); if (user != null) { account.setDisplayedName(user.getDisplayName()); @@ -65,7 +65,7 @@ public class NextNewsRepository extends ARepository { public Observable sync(List feeds, Account account) { return Observable.create(emitter -> { try { - NextNewsAPI newsAPI = new NextNewsAPI(); + NextNewsAPI newsAPI = new NextNewsAPI(account.toCredentials()); long lastModified = LocalDateTime.now().toDateTime().getMillis(); NextNewsAPI.SyncType syncType; @@ -74,7 +74,7 @@ public class NextNewsRepository extends ARepository { else syncType = NextNewsAPI.SyncType.INITIAL_SYNC; - SyncData syncData = new SyncData(); + NextNewsSyncData syncData = new NextNewsSyncData(); if (syncType == NextNewsAPI.SyncType.CLASSIC_SYNC) { syncData.setLastModified(account.getLastModified() / 1000L); @@ -83,7 +83,7 @@ public class NextNewsRepository extends ARepository { } TimingLogger timings = new TimingLogger(TAG, "nextcloud news " + syncType.name().toLowerCase()); - SyncResult syncResult = newsAPI.sync(account.toCredentials(), syncType, syncData); + NextNewsSyncResult syncResult = newsAPI.sync(syncType, syncData); timings.addSplit("server queries"); if (!syncResult.isError()) { @@ -117,13 +117,13 @@ public class NextNewsRepository extends ARepository { public Single> addFeeds(List results, Account account) { return Single.create(emitter -> { List feedInsertionResults = new ArrayList<>(); - NextNewsAPI newsAPI = new NextNewsAPI(); + NextNewsAPI newsAPI = new NextNewsAPI(account.toCredentials()); for (ParsingResult result : results) { FeedInsertionResult insertionResult = new FeedInsertionResult(); try { - NextNewsFeeds nextNewsFeeds = newsAPI.createFeed(account.toCredentials(), result.getUrl(), 0); + NextNewsFeeds nextNewsFeeds = newsAPI.createFeed(result.getUrl(), 0); if (nextNewsFeeds != null) { List newFeeds = insertFeeds(nextNewsFeeds.getFeeds(), account); @@ -154,7 +154,7 @@ public class NextNewsRepository extends ARepository { @Override public Completable updateFeed(Feed feed, Account account) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); Folder folder = feed.getFolderId() == null ? null : database.folderDao().select(feed.getFolderId()); @@ -167,8 +167,7 @@ public class NextNewsRepository extends ARepository { newsFeed = new NextNewsFeed(feed.getRemoteId(), 0); // 0 for no folder try { - if (api.renameFeed(account.toCredentials(), newsRenameFeed) && - api.changeFeedFolder(account.toCredentials(), newsFeed)) { + if (api.renameFeed(newsRenameFeed) && api.changeFeedFolder(newsFeed)) { if (folder != null) database.feedDao().updateFeedFields(feed.getId(), feed.getName(), feed.getUrl(), folder.getId()); else @@ -186,10 +185,10 @@ public class NextNewsRepository extends ARepository { @Override public Completable deleteFeed(Feed feed, Account account) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { - if (api.deleteFeed(account.toCredentials(), feed.getRemoteId())) { + if (api.deleteFeed(feed.getRemoteId())) { database.feedDao().delete(feed.getId()); emitter.onComplete(); } else @@ -205,10 +204,10 @@ public class NextNewsRepository extends ARepository { @Override public Completable addFolder(Folder folder, Account account) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { - NextNewsFolders folders = api.createFolder(account.toCredentials(), new NextNewsFolder(folder.getRemoteId(), folder.getName())); + NextNewsFolders folders = api.createFolder(new NextNewsFolder(folder.getRemoteId(), folder.getName())); if (folders != null) insertFolders(folders.getFolders(), account); @@ -225,10 +224,10 @@ public class NextNewsRepository extends ARepository { @Override public Completable updateFolder(Folder folder, Account account) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { - if (api.renameFolder(account.toCredentials(), new NextNewsFolder(folder.getRemoteId(), folder.getName()))) { + if (api.renameFolder(new NextNewsFolder(folder.getRemoteId(), folder.getName()))) { database.folderDao().update(folder); emitter.onComplete(); } else @@ -245,10 +244,10 @@ public class NextNewsRepository extends ARepository { @Override public Completable deleteFolder(Folder folder, Account account) { return Completable.create(emitter -> { - NextNewsAPI api = new NextNewsAPI(); + NextNewsAPI api = new NextNewsAPI(account.toCredentials()); try { - if (api.deleteFolder(account.toCredentials(), new NextNewsFolder(folder.getRemoteId(), folder.getName()))) { + if (api.deleteFolder(new NextNewsFolder(folder.getRemoteId(), folder.getName()))) { database.folderDao().delete(folder); emitter.onComplete(); } else diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/API.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/API.java new file mode 100644 index 00000000..2bae7d2b --- /dev/null +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/API.java @@ -0,0 +1,37 @@ +package com.readrops.readropslibrary; + +import androidx.annotation.NonNull; + +import com.readrops.readropslibrary.services.nextcloudnews.Credentials; +import com.readrops.readropslibrary.utils.HttpManager; + +import retrofit2.Retrofit; +import retrofit2.converter.gson.GsonConverterFactory; + +/** + * Abstraction level for services APIs + * @param an API service interface + */ +public abstract class API { + + protected T api; + + public API(Credentials credentials, @NonNull Class clazz, @NonNull String endPoint) { + api = createAPI(credentials, clazz, endPoint); + } + + protected Retrofit getConfiguredRetrofitInstance(@NonNull HttpManager httpManager, @NonNull String endPoint) { + return new Retrofit.Builder() + .baseUrl(httpManager.getCredentials().getUrl() + endPoint) + .addConverterFactory(GsonConverterFactory.create()) + .client(httpManager.getOkHttpClient()) + .build(); + } + + private T createAPI(@NonNull Credentials credentials, @NonNull Class clazz, @NonNull String endPoint) { + HttpManager httpManager = new HttpManager(credentials); + Retrofit retrofit = getConfiguredRetrofitInstance(httpManager, endPoint); + + return retrofit.create(clazz); + } +} 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 b89c34d8..1c044ae4 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 @@ -5,7 +5,8 @@ import android.content.res.Resources; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import com.readrops.readropslibrary.services.NextNewsService; +import com.readrops.readropslibrary.services.API; +import com.readrops.readropslibrary.services.Credentials; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeed; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; @@ -15,7 +16,6 @@ import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItems; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsRenameFeed; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsUser; import com.readrops.readropslibrary.utils.ConflictException; -import com.readrops.readropslibrary.utils.HttpManager; import com.readrops.readropslibrary.utils.LibUtils; import com.readrops.readropslibrary.utils.UnknownFormatException; @@ -24,37 +24,16 @@ import java.util.HashMap; import java.util.Map; import retrofit2.Response; -import retrofit2.Retrofit; -import retrofit2.converter.gson.GsonConverterFactory; -public class NextNewsAPI { +public class NextNewsAPI extends API { private static final String TAG = NextNewsAPI.class.getSimpleName(); - private NextNewsService api; - - public NextNewsAPI() { - + public NextNewsAPI(Credentials credentials) { + super(credentials, NextNewsService.class, NextNewsService.END_POINT); } - private Retrofit getConfiguredRetrofitInstance(@NonNull HttpManager httpManager) { - return new Retrofit.Builder() - .baseUrl(httpManager.getCredentials().getUrl() + NextNewsService.ENDPOINT) - .addConverterFactory(GsonConverterFactory.create()) - .client(httpManager.getOkHttpClient()) - .build(); - } - - private NextNewsService createAPI(@NonNull Credentials credentials) { - HttpManager httpManager = new HttpManager(credentials); - Retrofit retrofit = getConfiguredRetrofitInstance(httpManager); - - return retrofit.create(NextNewsService.class); - } - - public NextNewsUser login(Credentials credentials) throws IOException { - api = createAPI(credentials); - + public NextNewsUser login() throws IOException { Response response = api.getUser().execute(); if (!response.isSuccessful()) @@ -64,10 +43,8 @@ public class NextNewsAPI { } public @Nullable - NextNewsFeeds createFeed(Credentials credentials, String url, int folderId) + NextNewsFeeds createFeed(String url, int folderId) throws IOException, UnknownFormatException { - api = createAPI(credentials); - Response response = api.createFeed(url, folderId).execute(); if (!response.isSuccessful()) { @@ -80,17 +57,15 @@ public class NextNewsAPI { return response.body(); } - public SyncResult sync(@NonNull Credentials credentials, @NonNull SyncType syncType, @Nullable SyncData data) throws IOException { - api = createAPI(credentials); - - SyncResult syncResult = new SyncResult(); + public NextNewsSyncResult sync(@NonNull SyncType syncType, @Nullable NextNewsSyncData data) throws IOException { + NextNewsSyncResult syncResult = new NextNewsSyncResult(); switch (syncType) { case INITIAL_SYNC: initialSync(syncResult); break; case CLASSIC_SYNC: if (data == null) - throw new NullPointerException("SyncData can't be null"); + throw new NullPointerException("NextNewsSyncData can't be null"); classicSync(syncResult, data); break; @@ -99,7 +74,7 @@ public class NextNewsAPI { return syncResult; } - private void initialSync(SyncResult syncResult) throws IOException { + private void initialSync(NextNewsSyncResult syncResult) throws IOException { getFeedsAndFolders(syncResult); Response itemsResponse = api.getItems(3, false, -1).execute(); @@ -112,7 +87,7 @@ public class NextNewsAPI { syncResult.setItems(itemList.getItems()); } - private void classicSync(SyncResult syncResult, SyncData data) throws IOException { + private void classicSync(NextNewsSyncResult syncResult, NextNewsSyncData data) throws IOException { putModifiedItems(data, syncResult); getFeedsAndFolders(syncResult); @@ -126,7 +101,7 @@ public class NextNewsAPI { syncResult.setItems(itemList.getItems()); } - private void getFeedsAndFolders(SyncResult syncResult) throws IOException { + private void getFeedsAndFolders(NextNewsSyncResult syncResult) throws IOException { Response feedResponse = api.getFeeds().execute(); NextNewsFeeds feedList = feedResponse.body(); @@ -147,7 +122,7 @@ public class NextNewsAPI { } - private void putModifiedItems(SyncData data, SyncResult syncResult) throws IOException { + private void putModifiedItems(NextNewsSyncData data, NextNewsSyncResult syncResult) throws IOException { if (data.getReadItems().size() == 0 && data.getUnreadItems().size() == 0) return; @@ -165,9 +140,7 @@ public class NextNewsAPI { } public @Nullable - NextNewsFolders createFolder(Credentials credentials, NextNewsFolder folder) throws IOException, UnknownFormatException, ConflictException { - api = createAPI(credentials); - + NextNewsFolders createFolder(NextNewsFolder folder) throws IOException, UnknownFormatException, ConflictException { Response foldersResponse = api.createFolder(folder).execute(); if (foldersResponse.isSuccessful()) @@ -180,9 +153,7 @@ public class NextNewsAPI { return null; } - public boolean deleteFolder(Credentials credentials, NextNewsFolder folder) throws IOException { - api = createAPI(credentials); - + public boolean deleteFolder(NextNewsFolder folder) throws IOException { Response response = api.deleteFolder(folder.getId()).execute(); if (response.isSuccessful()) @@ -193,9 +164,7 @@ public class NextNewsAPI { return false; } - public boolean renameFolder(Credentials credentials, NextNewsFolder folder) throws IOException, UnknownFormatException, ConflictException { - api = createAPI(credentials); - + public boolean renameFolder(NextNewsFolder folder) throws IOException, UnknownFormatException, ConflictException { Response response = api.renameFolder(folder.getId(), folder).execute(); if (response.isSuccessful()) @@ -214,9 +183,7 @@ public class NextNewsAPI { } } - public boolean deleteFeed(Credentials credentials, int feedId) throws IOException { - api = createAPI(credentials); - + public boolean deleteFeed(int feedId) throws IOException { Response response = api.deleteFeed(feedId).execute(); if (response.isSuccessful()) @@ -227,9 +194,7 @@ public class NextNewsAPI { return false; } - public boolean changeFeedFolder(Credentials credentials, NextNewsFeed feed) throws IOException { - api = createAPI(credentials); - + public boolean changeFeedFolder(NextNewsFeed feed) throws IOException { Map folderIdMap = new HashMap<>(); folderIdMap.put("folderId", feed.getFolderId()); @@ -243,9 +208,7 @@ public class NextNewsAPI { return false; } - public boolean renameFeed(Credentials credentials, NextNewsRenameFeed feed) throws IOException { - api = createAPI(credentials); - + public boolean renameFeed(NextNewsRenameFeed feed) throws IOException { Response response = api.renameFeed(feed.getId(), feed).execute(); if (response.isSuccessful()) diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsService.java similarity index 95% rename from readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java rename to readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsService.java index 9fb3f713..68b1ad4e 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsService.java @@ -1,4 +1,4 @@ -package com.readrops.readropslibrary.services; +package com.readrops.readropslibrary.services.nextcloudnews; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; @@ -22,7 +22,7 @@ import retrofit2.http.Query; public interface NextNewsService { - String ENDPOINT = "/index.php/apps/news/api/v1-2/"; + String END_POINT = "/index.php/apps/news/api/v1-2/"; @GET("user") Call getUser(); diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncData.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsSyncData.java similarity index 95% rename from readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncData.java rename to readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsSyncData.java index 0259a5f1..dd470112 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncData.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsSyncData.java @@ -3,7 +3,7 @@ package com.readrops.readropslibrary.services.nextcloudnews; import java.util.ArrayList; import java.util.List; -public class SyncData { +public class NextNewsSyncData { private List unreadItems; @@ -15,7 +15,7 @@ public class SyncData { private long lastModified; - public SyncData() { + public NextNewsSyncData() { unreadItems = new ArrayList<>(); readItems = new ArrayList<>(); starredItems = new ArrayList<>(); diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResult.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsSyncResult.java similarity index 91% rename from readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResult.java rename to readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsSyncResult.java index 098923c0..b299b786 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/SyncResult.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/NextNewsSyncResult.java @@ -6,7 +6,7 @@ import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItem; import java.util.List; -public class SyncResult { +public class NextNewsSyncResult { private List folders; @@ -16,7 +16,8 @@ public class SyncResult { private boolean error; - public SyncResult() { + public NextNewsSyncResult() { + // empty constructor } public List getFolders() {