Add Moshi adapter for FreshRSS folders api call

This commit is contained in:
Shinokuni 2020-01-03 15:49:48 +01:00
parent 90ef573b6e
commit fea6c78520
6 changed files with 80 additions and 29 deletions

View File

@ -20,13 +20,11 @@ import com.readrops.readropslibrary.services.SyncType;
import com.readrops.readropslibrary.services.freshrss.FreshRSSAPI; import com.readrops.readropslibrary.services.freshrss.FreshRSSAPI;
import com.readrops.readropslibrary.services.freshrss.FreshRSSCredentials; import com.readrops.readropslibrary.services.freshrss.FreshRSSCredentials;
import com.readrops.readropslibrary.services.freshrss.FreshRSSSyncData; import com.readrops.readropslibrary.services.freshrss.FreshRSSSyncData;
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolder;
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.StringTokenizer;
import io.reactivex.Completable; import io.reactivex.Completable;
import io.reactivex.Observable; import io.reactivex.Observable;
@ -199,22 +197,8 @@ public class FreshRSSRepository extends ARepository<FreshRSSAPI> {
} }
private void insertFolders(List<FreshRSSFolder> freshRSSFolders) { private void insertFolders(List<Folder> freshRSSFolders) {
List<Folder> folders = new ArrayList<>(); database.folderDao().foldersUpsert(freshRSSFolders, account);
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, boolean initialSync) { private void insertItems(List<FreshRSSItem> items, boolean initialSync) {

View File

@ -4,11 +4,12 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import com.readrops.readropsdb.entities.Feed; import com.readrops.readropsdb.entities.Feed;
import com.readrops.readropsdb.entities.Folder;
import com.readrops.readropslibrary.services.API; import com.readrops.readropslibrary.services.API;
import com.readrops.readropslibrary.services.Credentials; import com.readrops.readropslibrary.services.Credentials;
import com.readrops.readropslibrary.services.SyncType; import com.readrops.readropslibrary.services.SyncType;
import com.readrops.readropslibrary.services.freshrss.adapters.FreshRSSFeedAdapter; import com.readrops.readropslibrary.services.freshrss.adapters.FreshRSSFeedsAdapter;
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSFolders; import com.readrops.readropslibrary.services.freshrss.adapters.FreshRSSFoldersAdapter;
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSItems;
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
import com.squareup.moshi.Moshi; import com.squareup.moshi.Moshi;
@ -35,7 +36,8 @@ public class FreshRSSAPI extends API<FreshRSSService> {
@Override @Override
protected Moshi buildMoshi() { protected Moshi buildMoshi() {
return new Moshi.Builder() return new Moshi.Builder()
.add(new FreshRSSFeedAdapter()) .add(new FreshRSSFeedsAdapter())
.add(new FreshRSSFoldersAdapter())
.build(); .build();
} }
@ -122,6 +124,10 @@ public class FreshRSSAPI extends API<FreshRSSService> {
.flatMap(freshRSSFeeds -> { .flatMap(freshRSSFeeds -> {
syncResult.setFeeds(freshRSSFeeds); syncResult.setFeeds(freshRSSFeeds);
return getFolders();
}).flatMap(folders -> {
syncResult.setFolders(folders);
return Single.just(syncResult); return Single.just(syncResult);
}); });
} }
@ -131,7 +137,7 @@ public class FreshRSSAPI extends API<FreshRSSService> {
* *
* @return the feeds folders * @return the feeds folders
*/ */
public Single<FreshRSSFolders> getFolders() { public Single<List<Folder>> getFolders() {
return api.getFolders(); return api.getFolders();
} }

View File

@ -1,7 +1,7 @@
package com.readrops.readropslibrary.services.freshrss; package com.readrops.readropslibrary.services.freshrss;
import com.readrops.readropsdb.entities.Feed; 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.FreshRSSItems;
import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo; import com.readrops.readropslibrary.services.freshrss.json.FreshRSSUserInfo;
@ -38,7 +38,7 @@ public interface FreshRSSService {
Single<FreshRSSItems> getItems(@Query("xt") String excludeTarget, @Query("n") int max, @Query("ot") Long lastModified); Single<FreshRSSItems> getItems(@Query("xt") String excludeTarget, @Query("n") int max, @Query("ot") Long lastModified);
@GET("reader/api/0/tag/list?output=json") @GET("reader/api/0/tag/list?output=json")
Single<FreshRSSFolders> getFolders(); Single<List<Folder>> getFolders();
@FormUrlEncoded @FormUrlEncoded
@POST("reader/api/0/edit-tag") @POST("reader/api/0/edit-tag")

View File

@ -1,7 +1,7 @@
package com.readrops.readropslibrary.services.freshrss; package com.readrops.readropslibrary.services.freshrss;
import com.readrops.readropsdb.entities.Feed; 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 com.readrops.readropslibrary.services.freshrss.json.FreshRSSItem;
import java.util.ArrayList; import java.util.ArrayList;
@ -9,7 +9,7 @@ import java.util.List;
public class FreshRSSSyncResult { public class FreshRSSSyncResult {
private List<FreshRSSFolder> folders; private List<Folder> folders;
private List<Feed> feeds; private List<Feed> feeds;
@ -46,11 +46,11 @@ public class FreshRSSSyncResult {
this.lastUpdated = lastUpdated; this.lastUpdated = lastUpdated;
} }
public List<FreshRSSFolder> getFolders() { public List<Folder> getFolders() {
return folders; return folders;
} }
public void setFolders(List<FreshRSSFolder> folders) { public void setFolders(List<Folder> folders) {
this.folders = folders; this.folders = folders;
} }
} }

View File

@ -6,7 +6,7 @@ import com.squareup.moshi.FromJson
import com.squareup.moshi.JsonReader import com.squareup.moshi.JsonReader
import com.squareup.moshi.ToJson import com.squareup.moshi.ToJson
class FreshRSSFeedAdapter { class FreshRSSFeedsAdapter {
@ToJson @ToJson
fun toJson(feed: Feed): String = "" fun toJson(feed: Feed): String = ""

View File

@ -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<Folder> {
val folders = mutableListOf<Folder>()
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")
}
}