diff --git a/app/src/main/java/com/readrops/app/repositories/ARepository.java b/app/src/main/java/com/readrops/app/repositories/ARepository.java index 1b04d69f..4694a4be 100644 --- a/app/src/main/java/com/readrops/app/repositories/ARepository.java +++ b/app/src/main/java/com/readrops/app/repositories/ARepository.java @@ -50,7 +50,7 @@ public abstract class ARepository { public abstract Completable updateFolder(Folder folder, Account account); - public abstract Completable deleteFolder(Folder folder); + public abstract Completable deleteFolder(Folder folder, Account account); public abstract Completable changeFeedFolder(Feed feed, Folder newFolder); diff --git a/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java b/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java index 995d9251..f5b8e289 100644 --- a/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/LocalFeedRepository.java @@ -178,7 +178,7 @@ public class LocalFeedRepository extends ARepository { } @Override - public Completable deleteFolder(Folder folder) { + public Completable deleteFolder(Folder folder, Account account) { return Completable.create(emitter -> { database.folderDao().delete(folder); emitter.onComplete(); 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 7de486c1..700489b6 100644 --- a/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/NextNewsRepository.java @@ -21,6 +21,7 @@ import com.readrops.readropslibrary.services.nextcloudnews.SyncResult; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeed; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; +import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolders; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItem; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsUser; import com.readrops.readropslibrary.utils.UnknownFormatException; @@ -169,30 +170,62 @@ public class NextNewsRepository extends ARepository { @Override public Completable addFolder(Folder folder, Account account) { return Completable.create(emitter -> { - database.folderDao().insert(folder); - emitter.onComplete(); + NextNewsAPI api = new NextNewsAPI(); - //TODO : remote insert + try { + Credentials credentials = new Credentials(account.getLogin(), account.getPassword(), account.getUrl()); + NextNewsFolders folders = api.createFolder(credentials, new NextNewsFolder(folder.getId(), folder.getName())); + + if (folders != null) + insertFolders(folders.getFolders(), account); + else + emitter.onError(new Exception()); + } catch (Exception e) { + emitter.onError(e); + } + + emitter.onComplete(); }); } @Override public Completable updateFolder(Folder folder, Account account) { return Completable.create(emitter -> { - database.folderDao().update(folder); - emitter.onComplete(); + NextNewsAPI api = new NextNewsAPI(); - //TODO : remote update + try { + Credentials credentials = new Credentials(account.getLogin(), account.getPassword(), account.getUrl()); + + if (api.renameFolder(credentials, new NextNewsFolder(folder.getId(), folder.getName()))) + emitter.onComplete(); + else + emitter.onError(new Exception()); + + } catch (Exception e) { + emitter.onError(e); + } + + emitter.onComplete(); }); } @Override - public Completable deleteFolder(Folder folder) { + public Completable deleteFolder(Folder folder, Account account) { return Completable.create(emitter -> { - database.folderDao().delete(folder); - emitter.onComplete(); + NextNewsAPI api = new NextNewsAPI(); - //TODO : remote update + try { + Credentials credentials = new Credentials(account.getLogin(), account.getPassword(), account.getUrl()); + if (api.deleteFolder(credentials, new NextNewsFolder(folder.getId(), folder.getName()))) + emitter.onComplete(); + else + emitter.onError(new Exception()); + + } catch (Exception e) { + emitter.onError(e); + } + + emitter.onComplete(); }); } 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 fa038801..49f81aad 100644 --- a/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java +++ b/app/src/main/java/com/readrops/app/viewmodels/ManageFeedsFoldersViewModel.java @@ -76,7 +76,7 @@ public class ManageFeedsFoldersViewModel extends AndroidViewModel { } public Completable deleteFolder(Folder folder) { - return repository.deleteFolder(folder); + return repository.deleteFolder(folder, account); } public Completable deleteFeed(int feedId) { diff --git a/app/src/main/java/com/readrops/app/views/FeedsAdapter.java b/app/src/main/java/com/readrops/app/views/FeedsAdapter.java index 2244a17f..9526bed7 100644 --- a/app/src/main/java/com/readrops/app/views/FeedsAdapter.java +++ b/app/src/main/java/com/readrops/app/views/FeedsAdapter.java @@ -87,7 +87,7 @@ public class FeedsAdapter extends ListAdapter listener.onEdit(getItem(i))); viewHolder.itemView.setOnLongClickListener(v -> { @@ -107,7 +107,7 @@ public class FeedsAdapter extends ListAdapter 1) viewHolder.itemReadTime.setText(resources.getString(R.string.read_time, String.valueOf(minutes))); else - viewHolder.itemReadTime.setText(resources.getString(R.string.read_time_one_minute)); + viewHolder.itemReadTime.setText(R.string.read_time_one_minute); if (itemWithFeed.getFolder() != null) viewHolder.itemFolderName.setText(itemWithFeed.getFolder().getName()); else - viewHolder.itemFolderName.setText(resources.getString(R.string.no_folder)); + viewHolder.itemFolderName.setText(R.string.no_folder); viewHolder.setReadState(itemWithFeed.getItem().isRead()); viewHolder.setSelected(selection.contains(viewHolder.getAdapterPosition())); diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java index af4abb01..44c5dbae 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/NextNewsService.java @@ -1,6 +1,7 @@ package com.readrops.readropslibrary.services; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; +import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolders; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItemIds; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItems; @@ -39,4 +40,13 @@ public interface NextNewsService { @POST("feeds") Call createFeed(@Query("url") String url, @Query("folderId") int folderId); + + @POST("folders") + Call createFolder(@Body NextNewsFolder folder); + + @POST("folders/{folderId}") + Call deleteFolder(@Path("folderId") int folderId); + + @PUT("folders/{folderId}") + Call renameFolder(@Path("folderId") int folderId, @Body NextNewsFolder folder); } 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 99523fc4..8c7e7cbb 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 @@ -1,14 +1,18 @@ package com.readrops.readropslibrary.services.nextcloudnews; +import android.content.res.Resources; + import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.readrops.readropslibrary.services.NextNewsService; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFeeds; +import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolder; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsFolders; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItemIds; import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItems; 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; @@ -62,7 +66,7 @@ public class NextNewsAPI { Response response = api.createFeed(url, folderId).execute(); if (!response.isSuccessful()) { - if (response.code() == LibUtils.UNPROCESSABLE_CODE) + if (response.code() == LibUtils.HTTP_UNPROCESSABLE) throw new UnknownFormatException(); else return null; @@ -152,6 +156,55 @@ public class NextNewsAPI { syncResult.setError(true); } + public @Nullable NextNewsFolders createFolder(Credentials credentials, NextNewsFolder folder) throws IOException, UnknownFormatException, ConflictException { + api = createAPI(credentials); + + Response foldersResponse = api.createFolder(folder).execute(); + + if (foldersResponse.isSuccessful()) + return foldersResponse.body(); + else if (foldersResponse.code() == LibUtils.HTTP_UNPROCESSABLE) + throw new UnknownFormatException(); + else if (foldersResponse.code() == LibUtils.HTTP_CONFLICT) + throw new ConflictException(); + else + return null; + } + + public boolean deleteFolder(Credentials credentials, NextNewsFolder folder) throws IOException { + api = createAPI(credentials); + + Response response = api.deleteFolder(folder.getId()).execute(); + + if (response.isSuccessful()) + return true; + else if (response.code() == LibUtils.HTTP_NOT_FOUND) + throw new Resources.NotFoundException(); + else + return false; + } + + public boolean renameFolder(Credentials credentials, NextNewsFolder folder) throws IOException, UnknownFormatException, ConflictException { + api = createAPI(credentials); + + Response response = api.renameFolder(folder.getId(), folder).execute(); + + if (response.isSuccessful()) + return true; + else { + switch (response.code()) { + case LibUtils.HTTP_NOT_FOUND: + throw new Resources.NotFoundException(); + case LibUtils.HTTP_UNPROCESSABLE: + throw new UnknownFormatException(); + case LibUtils.HTTP_CONFLICT: + throw new ConflictException(); + default: + return false; + } + } + } + public enum SyncType { INITIAL_SYNC, CLASSIC_SYNC diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/json/NextNewsFolder.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/json/NextNewsFolder.java index 31ee8f57..ab98373f 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/json/NextNewsFolder.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/nextcloudnews/json/NextNewsFolder.java @@ -10,6 +10,14 @@ public class NextNewsFolder { @SerializedName("name") private String name; + public NextNewsFolder() { + } + + public NextNewsFolder(int id, String name) { + this.id = id; + this.name = name; + } + public int getId() { return id; } diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/ConflictException.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/ConflictException.java new file mode 100644 index 00000000..fea4a31d --- /dev/null +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/ConflictException.java @@ -0,0 +1,12 @@ +package com.readrops.readropslibrary.utils; + +public class ConflictException extends Exception { + + public ConflictException() { + + } + + public ConflictException(String message) { + super(message); + } +} diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/LibUtils.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/LibUtils.java index 6b366ae6..0240c857 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/LibUtils.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/utils/LibUtils.java @@ -18,7 +18,10 @@ public final class LibUtils { public static final String LAST_MODIFIED_HEADER = "Last-Modified"; public static final String IF_MODIFIED_HEADER = "If-Modified-Since"; - public static final int UNPROCESSABLE_CODE = 422; + public static final int HTTP_UNPROCESSABLE = 422; + public static final int HTTP_NOT_FOUND = 404; + public static final int HTTP_CONFLICT = 409; + public static String inputStreamToString(InputStream input) { Scanner scanner = new Scanner(input).useDelimiter("\\A");