Add adapter for Nextcloud News items api call

This commit is contained in:
Shinokuni 2020-01-12 15:14:27 +01:00
parent a179a18432
commit 6d79fdf64d
7 changed files with 104 additions and 45 deletions

View File

@ -10,7 +10,6 @@ import androidx.annotation.Nullable;
import com.readrops.app.utils.FeedInsertionResult;
import com.readrops.app.utils.ParsingResult;
import com.readrops.app.utils.Utils;
import com.readrops.app.utils.matchers.ItemMatcher;
import com.readrops.readropsdb.entities.Feed;
import com.readrops.readropsdb.entities.Folder;
import com.readrops.readropsdb.entities.Item;
@ -24,7 +23,6 @@ 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.NextNewsRenameFeed;
import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsUser;
import com.readrops.readropslibrary.utils.UnknownFormatException;
@ -118,8 +116,8 @@ public class NextNewsRepository extends ARepository<NextNewsAPI> {
insertFeeds(syncResult.getFeeds());
timings.addSplit("insert feeds");
/*insertItems(syncResult.getItems(), syncType == SyncType.INITIAL_SYNC);
timings.addSplit("insert items");*/
insertItems(syncResult.getItems(), syncType == SyncType.INITIAL_SYNC);
timings.addSplit("insert items");
timings.dumpToLog();
account.setLastModified(lastModified);
@ -292,26 +290,27 @@ public class NextNewsRepository extends ARepository<NextNewsAPI> {
database.folderDao().foldersUpsert(nextNewsFolders, account);
}
private void insertItems(List<NextNewsItem> items, boolean initialSync) {
List<Item> newItems = new ArrayList<>();
private void insertItems(List<Item> items, boolean initialSync) {
List<Item> itemsToInsert = new ArrayList<>();
for (NextNewsItem nextNewsItem : items) {
int feedId = database.feedDao().getFeedIdByRemoteId(String.valueOf(nextNewsItem.getFeedId()), account.getId());
for (Item item : items) {
int feedId = database.feedDao().getFeedIdByRemoteId(item.getFeedRemoteId(), account.getId());
if (!initialSync && feedId > 0 && database.itemDao().remoteItemExists(String.valueOf(nextNewsItem.getId()), feedId)) {
database.itemDao().setReadState(String.valueOf(nextNewsItem.getId()), !nextNewsItem.isUnread());
//if the item already exists, update only its read state
if (!initialSync && feedId > 0 && database.itemDao().remoteItemExists(String.valueOf(item.getRemoteId()), feedId)) {
database.itemDao().setReadState(item.getRemoteId(), item.isRead());
break;
}
Item item = ItemMatcher.nextNewsItemToItem(nextNewsItem, feedId);
item.setFeedId(feedId);
item.setReadTime(Utils.readTimeFromString(item.getContent()));
newItems.add(item);
itemsToInsert.add(item);
}
if (!newItems.isEmpty()) {
Collections.sort(newItems, Item::compareTo);
database.itemDao().insert(newItems);
if (!itemsToInsert.isEmpty()) {
Collections.sort(itemsToInsert, Item::compareTo);
database.itemDao().insert(itemsToInsert);
}
}
}

View File

@ -7,23 +7,25 @@ import androidx.annotation.Nullable;
import com.readrops.readropsdb.entities.Feed;
import com.readrops.readropsdb.entities.Folder;
import com.readrops.readropsdb.entities.Item;
import com.readrops.readropslibrary.services.API;
import com.readrops.readropslibrary.services.Credentials;
import com.readrops.readropslibrary.services.SyncType;
import com.readrops.readropslibrary.services.nextcloudnews.adapters.NextNewsFeedsAdapter;
import com.readrops.readropslibrary.services.nextcloudnews.adapters.NextNewsFoldersAdapter;
import com.readrops.readropslibrary.services.nextcloudnews.adapters.NextNewsItemsAdapter;
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.NextNewsItemIds;
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.LibUtils;
import com.readrops.readropslibrary.utils.UnknownFormatException;
import com.squareup.moshi.Moshi;
import com.squareup.moshi.Types;
import java.io.IOException;
import java.util.HashMap;
@ -45,6 +47,7 @@ public class NextNewsAPI extends API<NextNewsService> {
return new Moshi.Builder()
.add(new NextNewsFeedsAdapter())
.add(new NextNewsFoldersAdapter())
.add(Types.newParameterizedType(List.class, Item.class), new NextNewsItemsAdapter())
.build();
}
@ -93,28 +96,28 @@ public class NextNewsAPI extends API<NextNewsService> {
private void initialSync(NextNewsSyncResult syncResult) throws IOException {
getFeedsAndFolders(syncResult);
/*Response<NextNewsItems> itemsResponse = api.getItems(3, false, MAX_ITEMS).execute();
NextNewsItems itemList = itemsResponse.body();
Response<List<Item>> itemsResponse = api.getItems(3, false, MAX_ITEMS).execute();
List<Item> itemList = itemsResponse.body();
if (!itemsResponse.isSuccessful())
syncResult.setError(true);
if (itemList != null)
syncResult.setItems(itemList.getItems());*/
syncResult.setItems(itemList);
}
private void classicSync(NextNewsSyncResult syncResult, NextNewsSyncData data) throws IOException {
putModifiedItems(data, syncResult);
getFeedsAndFolders(syncResult);
Response<NextNewsItems> itemsResponse = api.getNewItems(data.getLastModified(), 3).execute();
NextNewsItems itemList = itemsResponse.body();
Response<List<Item>> itemsResponse = api.getNewItems(data.getLastModified(), 3).execute();
List<Item> itemList = itemsResponse.body();
if (!itemsResponse.isSuccessful())
syncResult.setError(true);
if (itemList != null)
syncResult.setItems(itemList.getItems());
syncResult.setItems(itemList);
}
private void getFeedsAndFolders(NextNewsSyncResult syncResult) throws IOException {

View File

@ -2,11 +2,11 @@ package com.readrops.readropslibrary.services.nextcloudnews;
import com.readrops.readropsdb.entities.Feed;
import com.readrops.readropsdb.entities.Folder;
import com.readrops.readropsdb.entities.Item;
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.NextNewsRenameFeed;
import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsUser;
@ -37,10 +37,10 @@ public interface NextNewsService {
Call<List<Feed>> getFeeds();
@GET("items")
Call<NextNewsItems> getItems(@Query("type") int type, @Query("getRead") boolean read, @Query("batchSize") int batchSize);
Call<List<Item>> getItems(@Query("type") int type, @Query("getRead") boolean read, @Query("batchSize") int batchSize);
@GET("items/updated")
Call<NextNewsItems> getNewItems(@Query("lastModified") long lastModified, @Query("type") int type);
Call<List<Item>> getNewItems(@Query("lastModified") long lastModified, @Query("type") int type);
@PUT("items/{stateType}/multiple")
Call<ResponseBody> setArticlesState(@Path("stateType") String stateType, @Body NextNewsItemIds items);

View File

@ -2,7 +2,7 @@ package com.readrops.readropslibrary.services.nextcloudnews;
import com.readrops.readropsdb.entities.Feed;
import com.readrops.readropsdb.entities.Folder;
import com.readrops.readropslibrary.services.nextcloudnews.json.NextNewsItem;
import com.readrops.readropsdb.entities.Item;
import java.util.List;
@ -12,7 +12,7 @@ public class NextNewsSyncResult {
private List<Feed> feeds;
private List<NextNewsItem> items;
private List<Item> items;
private boolean error;
@ -36,11 +36,11 @@ public class NextNewsSyncResult {
this.feeds = feeds;
}
public List<NextNewsItem> getItems() {
public List<Item> getItems() {
return items;
}
public void setItems(List<NextNewsItem> items) {
public void setItems(List<Item> items) {
this.items = items;
}

View File

@ -0,0 +1,67 @@
package com.readrops.readropslibrary.services.nextcloudnews.adapters
import com.readrops.readropsdb.entities.Item
import com.readrops.readropslibrary.utils.LibUtils
import com.squareup.moshi.JsonAdapter
import com.squareup.moshi.JsonReader
import com.squareup.moshi.JsonWriter
import org.joda.time.DateTimeZone
import org.joda.time.LocalDateTime
class NextNewsItemsAdapter : JsonAdapter<List<Item>>() {
override fun toJson(writer: JsonWriter, value: List<Item>?) {
// no need of this
}
@Override
override fun fromJson(reader: JsonReader): List<Item> {
val items = mutableListOf<Item>()
reader.beginObject()
reader.nextName() // "items", beginning of items array
reader.beginArray()
while (reader.hasNext()) {
val item = Item()
reader.beginObject()
var enclosureMime: String? = null
var enclosureLink: String? = null
while (reader.hasNext()) {
with(item) {
when (reader.selectName(NAMES)) {
0 -> remoteId = reader.nextInt().toString()
1 -> link = reader.nextString()
2 -> title = reader.nextString()
3 -> author = reader.nextString()
4 -> pubDate = LocalDateTime(reader.nextLong() * 1000L, DateTimeZone.getDefault())
5 -> content = reader.nextString()
6 -> enclosureMime = if (reader.peek() != JsonReader.Token.NULL) reader.nextString() else reader.nextNull()
7 -> enclosureLink = if (reader.peek() != JsonReader.Token.NULL) reader.nextString() else reader.nextNull()
8 -> feedRemoteId = reader.nextInt().toString()
9 -> isRead = !reader.nextBoolean()
else -> reader.skipValue()
}
}
}
if (enclosureMime != null && LibUtils.isMimeImage(enclosureMime!!))
item.imageLink = enclosureLink
items += item
reader.endObject()
}
reader.endArray()
reader.endObject()
return items
}
companion object {
val NAMES: JsonReader.Options = JsonReader.Options.of("id", "url", "title", "author",
"pubDate", "body", "enclosureMime", "enclosureLink", "feedId", "unread")
}
}

View File

@ -1,16 +0,0 @@
package com.readrops.readropslibrary.services.nextcloudnews.json;
import java.util.List;
public class NextNewsItems {
private List<NextNewsItem> items;
public NextNewsItems(List<NextNewsItem> items) {
this.items = items;
}
public List<NextNewsItem> getItems() {
return items;
}
}

View File

@ -3,6 +3,8 @@ package com.readrops.readropslibrary.utils;
import android.content.Context;
import android.net.Uri;
import androidx.annotation.NonNull;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.Scanner;
@ -38,4 +40,8 @@ public final class LibUtils {
return inputStreamToString(inputStream);
}
public static boolean isMimeImage(@NonNull String type) {
return type.equals("image") || type.equals("image/jpeg") || type.equals("image/jpg")
|| type.equals("image/png");
}
}