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 ec1a3e12..1c8a85be 100644 --- a/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java +++ b/app/src/main/java/com/readrops/app/repositories/FreshRSSRepository.java @@ -20,13 +20,11 @@ import com.readrops.readropslibrary.services.SyncType; import com.readrops.readropslibrary.services.freshrss.FreshRSSAPI; import com.readrops.readropslibrary.services.freshrss.FreshRSSCredentials; import com.readrops.readropslibrary.services.freshrss.FreshRSSSyncData; -import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolder; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem; import java.util.ArrayList; import java.util.Collections; import java.util.List; -import java.util.StringTokenizer; import io.reactivex.Completable; import io.reactivex.Observable; @@ -199,22 +197,8 @@ public class FreshRSSRepository extends ARepository { } - private void insertFolders(List freshRSSFolders) { - List folders = new ArrayList<>(); - - for (FreshRSSFolder freshRSSFolder : freshRSSFolders) { - if (freshRSSFolder.getType() != null && freshRSSFolder.getType().equals("folder")) { - List 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 insertFolders(List freshRSSFolders) { + database.folderDao().foldersUpsert(freshRSSFolders, account); } private void insertItems(List items, boolean initialSync) { 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 f8523544..f39a7656 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 @@ -4,11 +4,12 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.readrops.readropsdb.entities.Feed; +import com.readrops.readropsdb.entities.Folder; import com.readrops.readropslibrary.services.API; import com.readrops.readropslibrary.services.Credentials; import com.readrops.readropslibrary.services.SyncType; -import com.readrops.readropslibrary.services.freshrss.adapters.FreshRSSFeedAdapter; -import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders; +import com.readrops.readropslibrary.services.freshrss.adapters.FreshRSSFeedsAdapter; +import com.readrops.readropslibrary.services.freshrss.adapters.FreshRSSFoldersAdapter; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo; import com.squareup.moshi.Moshi; @@ -35,7 +36,8 @@ public class FreshRSSAPI extends API { @Override protected Moshi buildMoshi() { return new Moshi.Builder() - .add(new FreshRSSFeedAdapter()) + .add(new FreshRSSFeedsAdapter()) + .add(new FreshRSSFoldersAdapter()) .build(); } @@ -122,6 +124,10 @@ public class FreshRSSAPI extends API { .flatMap(freshRSSFeeds -> { syncResult.setFeeds(freshRSSFeeds); + return getFolders(); + }).flatMap(folders -> { + syncResult.setFolders(folders); + return Single.just(syncResult); }); } @@ -131,7 +137,7 @@ public class FreshRSSAPI extends API { * * @return the feeds folders */ - public Single getFolders() { + public Single> getFolders() { return api.getFolders(); } 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 162c0969..ad81d1fc 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 @@ -1,7 +1,7 @@ package com.readrops.readropslibrary.services.freshrss; import com.readrops.readropsdb.entities.Feed; -import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders; +import com.readrops.readropsdb.entities.Folder; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo; @@ -38,7 +38,7 @@ public interface FreshRSSService { Single getItems(@Query("xt") String excludeTarget, @Query("n") int max, @Query("ot") Long lastModified); @GET("reader/api/0/tag/list?output=json") - Single getFolders(); + Single> getFolders(); @FormUrlEncoded @POST("reader/api/0/edit-tag") diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSSyncResult.java b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSSyncResult.java index 6eac5db5..36966ae7 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSSyncResult.java +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/FreshRSSSyncResult.java @@ -1,7 +1,7 @@ package com.readrops.readropslibrary.services.freshrss; import com.readrops.readropsdb.entities.Feed; -import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolder; +import com.readrops.readropsdb.entities.Folder; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem; import java.util.ArrayList; @@ -9,7 +9,7 @@ import java.util.List; public class FreshRSSSyncResult { - private List folders; + private List folders; private List feeds; @@ -46,11 +46,11 @@ public class FreshRSSSyncResult { this.lastUpdated = lastUpdated; } - public List getFolders() { + public List getFolders() { return folders; } - public void setFolders(List folders) { + public void setFolders(List folders) { this.folders = folders; } } diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFeedAdapter.kt b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFeedsAdapter.kt similarity index 98% rename from readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFeedAdapter.kt rename to readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFeedsAdapter.kt index c80f12af..33bfb0be 100644 --- a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFeedAdapter.kt +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFeedsAdapter.kt @@ -6,7 +6,7 @@ import com.squareup.moshi.FromJson import com.squareup.moshi.JsonReader import com.squareup.moshi.ToJson -class FreshRSSFeedAdapter { +class FreshRSSFeedsAdapter { @ToJson fun toJson(feed: Feed): String = "" diff --git a/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFoldersAdapter.kt b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFoldersAdapter.kt new file mode 100644 index 00000000..00a0c604 --- /dev/null +++ b/readropslibrary/src/main/java/com/readrops/readropslibrary/services/freshrss/adapters/FreshRSSFoldersAdapter.kt @@ -0,0 +1,61 @@ +package com.readrops.readropslibrary.services.freshrss.adapters + +import android.annotation.SuppressLint +import com.readrops.readropsdb.entities.Folder +import com.squareup.moshi.FromJson +import com.squareup.moshi.JsonReader +import com.squareup.moshi.ToJson +import java.util.* + +class FreshRSSFoldersAdapter { + + @ToJson + fun toJson(folder: Folder): String = "" + + @SuppressLint("CheckResult") + @FromJson + fun fromJson(reader: JsonReader): List { + val folders = mutableListOf() + + reader.beginObject() + reader.nextName() // "tags", beginning of folder array + reader.beginArray() + + while (reader.hasNext()) { + reader.beginObject() + + val folder = Folder() + var type: String? = null + + while (reader.hasNext()) { + with(folder) { + when (reader.selectName(NAMES)) { + 0 -> { + val id = reader.nextString() + name = StringTokenizer(id, "/") + .toList() + .last() as String + remoteId = id + } + 1 -> type = reader.nextString() + else -> reader.skipValue() + } + } + } + + if (type == "folder") // add only folders and avoid tags + folders += folder + + reader.endObject() + } + + reader.endArray() + reader.endObject() + + return folders + } + + companion object { + val NAMES: JsonReader.Options = JsonReader.Options.of("id", "type") + } +} \ No newline at end of file