Remember column indices between different list items (#7051)

This is way faster than searching for the column index again for every item.
This commit is contained in:
ByteHamster 2024-04-03 22:21:42 +02:00 committed by GitHub
parent a846e417b0
commit 613a9896e9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
14 changed files with 484 additions and 430 deletions

View File

@ -25,12 +25,11 @@ import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.model.feed.SubscriptionsFilter;
import de.danoeh.antennapod.model.download.DownloadResult;
import de.danoeh.antennapod.storage.database.mapper.ChapterCursorMapper;
import de.danoeh.antennapod.storage.database.mapper.DownloadResultCursorMapper;
import de.danoeh.antennapod.storage.database.mapper.FeedCursorMapper;
import de.danoeh.antennapod.storage.database.mapper.FeedItemCursorMapper;
import de.danoeh.antennapod.storage.database.mapper.FeedMediaCursorMapper;
import de.danoeh.antennapod.storage.database.mapper.FeedPreferencesCursorMapper;
import de.danoeh.antennapod.storage.database.mapper.ChapterCursor;
import de.danoeh.antennapod.storage.database.mapper.DownloadResultCursor;
import de.danoeh.antennapod.storage.database.mapper.FeedCursor;
import de.danoeh.antennapod.storage.database.mapper.FeedItemCursor;
import de.danoeh.antennapod.storage.database.mapper.FeedMediaCursor;
/**
* Provides methods for reading data from the AntennaPod database.
@ -72,11 +71,10 @@ public final class DBReader {
@NonNull
private static List<Feed> getFeedList(PodDBAdapter adapter) {
try (Cursor cursor = adapter.getAllFeedsCursor()) {
try (FeedCursor cursor = new FeedCursor(adapter.getAllFeedsCursor())) {
List<Feed> feeds = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
Feed feed = extractFeedFromCursorRow(cursor);
feeds.add(feed);
feeds.add(cursor.getFeed());
}
return feeds;
}
@ -173,8 +171,8 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getItemsOfFeedCursor(feed, filter)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getItemsOfFeedCursor(feed, filter))) {
List<FeedItem> items = extractItemlistFromCursor(cursor);
FeedItemPermutors.getPermutor(sortOrder).reorder(items);
feed.setItems(items);
for (FeedItem item : items) {
@ -186,45 +184,20 @@ public final class DBReader {
}
}
public static List<FeedItem> extractItemlistFromCursor(Cursor itemlistCursor) {
Log.d(TAG, "extractItemlistFromCursor() called with: " + "itemlistCursor = [" + itemlistCursor + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try {
return extractItemlistFromCursor(adapter, itemlistCursor);
} finally {
adapter.close();
}
}
@NonNull
private static List<FeedItem> extractItemlistFromCursor(PodDBAdapter adapter, Cursor cursor) {
private static List<FeedItem> extractItemlistFromCursor(FeedItemCursor cursor) {
List<FeedItem> result = new ArrayList<>(cursor.getCount());
if (cursor.moveToFirst()) {
int indexMediaId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_MEDIA_ID);
do {
FeedItem item = FeedItemCursorMapper.convert(cursor);
result.add(item);
if (!cursor.isNull(indexMediaId)) {
item.setMedia(FeedMediaCursorMapper.convert(cursor));
}
} while (cursor.moveToNext());
while (cursor.moveToNext()) {
result.add(cursor.getFeedItem());
}
return result;
}
private static Feed extractFeedFromCursorRow(Cursor cursor) {
Feed feed = FeedCursorMapper.convert(cursor);
FeedPreferences preferences = FeedPreferencesCursorMapper.convert(cursor);
feed.setPreferences(preferences);
return feed;
}
@NonNull
public static List<FeedItem> getQueue(PodDBAdapter adapter) {
Log.d(TAG, "getQueue()");
try (Cursor cursor = adapter.getQueueCursor()) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getQueueCursor())) {
List<FeedItem> items = extractItemlistFromCursor(cursor);
loadAdditionalFeedItemListData(items);
return items;
}
@ -303,8 +276,8 @@ public final class DBReader {
Log.d(TAG, "getRecentlyPublishedEpisodes() called with: offset=" + offset + ", limit=" + limit);
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getEpisodesCursor(offset, limit, filter, sortOrder)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getEpisodesCursor(offset, limit, filter, sortOrder))) {
List<FeedItem> items = extractItemlistFromCursor(cursor);
loadAdditionalFeedItemListData(items);
return items;
} finally {
@ -328,8 +301,8 @@ public final class DBReader {
public static List<FeedItem> getRandomEpisodes(int limit, int seed) {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getRandomEpisodesCursor(limit, seed)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getRandomEpisodesCursor(limit, seed))) {
List<FeedItem> items = extractItemlistFromCursor(cursor);
loadAdditionalFeedItemListData(items);
return items;
} finally {
@ -348,10 +321,10 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getDownloadLogCursor(DOWNLOAD_LOG_SIZE)) {
try (DownloadResultCursor cursor = new DownloadResultCursor(adapter.getDownloadLogCursor(DOWNLOAD_LOG_SIZE))) {
List<DownloadResult> downloadLog = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
downloadLog.add(DownloadResultCursorMapper.convert(cursor));
downloadLog.add(cursor.getDownloadResult());
}
return downloadLog;
} finally {
@ -371,10 +344,11 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feedId)) {
try (DownloadResultCursor cursor = new DownloadResultCursor(
adapter.getDownloadLog(Feed.FEEDFILETYPE_FEED, feedId))) {
List<DownloadResult> downloadLog = new ArrayList<>(cursor.getCount());
while (cursor.moveToNext()) {
downloadLog.add(DownloadResultCursorMapper.convert(cursor));
downloadLog.add(cursor.getDownloadResult());
}
return downloadLog;
} finally {
@ -408,9 +382,9 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
Feed feed = null;
try (Cursor cursor = adapter.getFeedCursor(feedId)) {
try (FeedCursor cursor = new FeedCursor(adapter.getFeedCursor(feedId))) {
if (cursor.moveToNext()) {
feed = extractFeedFromCursorRow(cursor);
feed = cursor.getFeed();
if (filtered) {
feed.setItems(getFeedItemList(feed, feed.getItemFilter()));
} else {
@ -430,13 +404,11 @@ public final class DBReader {
Log.d(TAG, "Loading feeditem with id " + itemId);
FeedItem item = null;
try (Cursor cursor = adapter.getFeedItemCursor(Long.toString(itemId))) {
if (cursor.moveToNext()) {
List<FeedItem> list = extractItemlistFromCursor(adapter, cursor);
if (!list.isEmpty()) {
item = list.get(0);
loadAdditionalFeedItemListData(list);
}
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getFeedItemCursor(Long.toString(itemId)))) {
List<FeedItem> list = extractItemlistFromCursor(cursor);
if (!list.isEmpty()) {
item = list.get(0);
loadAdditionalFeedItemListData(list);
}
return item;
}
@ -473,18 +445,16 @@ public final class DBReader {
Log.d(TAG, "getNextInQueue() called with: " + "itemId = [" + item.getId() + "]");
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try {
FeedItem nextItem = null;
try (Cursor cursor = adapter.getNextInQueue(item)) {
List<FeedItem> list = extractItemlistFromCursor(adapter, cursor);
if (!list.isEmpty()) {
nextItem = list.get(0);
loadAdditionalFeedItemListData(list);
}
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getNextInQueue(item))) {
List<FeedItem> list = extractItemlistFromCursor(cursor);
if (!list.isEmpty()) {
FeedItem nextItem = list.get(0);
loadAdditionalFeedItemListData(list);
return nextItem;
} catch (Exception e) {
return null;
}
return null;
} catch (Exception e) {
return null;
} finally {
adapter.close();
}
@ -494,8 +464,8 @@ public final class DBReader {
public static List<FeedItem> getPausedQueue(int limit) {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor cursor = adapter.getPausedQueueCursor(limit)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, cursor);
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getPausedQueueCursor(limit))) {
List<FeedItem> items = extractItemlistFromCursor(cursor);
loadAdditionalFeedItemListData(items);
return items;
} finally {
@ -514,11 +484,8 @@ public final class DBReader {
@Nullable
private static FeedItem getFeedItemByGuidOrEpisodeUrl(final String guid, final String episodeUrl,
PodDBAdapter adapter) {
try (Cursor cursor = adapter.getFeedItemCursor(guid, episodeUrl)) {
if (!cursor.moveToNext()) {
return null;
}
List<FeedItem> list = extractItemlistFromCursor(adapter, cursor);
try (FeedItemCursor cursor = new FeedItemCursor(adapter.getFeedItemCursor(guid, episodeUrl))) {
List<FeedItem> list = extractItemlistFromCursor(cursor);
if (!list.isEmpty()) {
return list.get(0);
}
@ -584,7 +551,7 @@ public final class DBReader {
}
private static List<Chapter> loadChaptersOfFeedItem(PodDBAdapter adapter, FeedItem item) {
try (Cursor cursor = adapter.getSimpleChaptersOfFeedItemCursor(item)) {
try (ChapterCursor cursor = new ChapterCursor(adapter.getSimpleChaptersOfFeedItemCursor(item))) {
int chaptersCount = cursor.getCount();
if (chaptersCount == 0) {
item.setChapters(null);
@ -592,7 +559,7 @@ public final class DBReader {
}
ArrayList<Chapter> chapters = new ArrayList<>();
while (cursor.moveToNext()) {
chapters.add(ChapterCursorMapper.convert(cursor));
chapters.add(cursor.getChapter());
}
return chapters;
}
@ -609,14 +576,14 @@ public final class DBReader {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor mediaCursor = adapter.getSingleFeedMediaCursor(mediaId)) {
try (FeedMediaCursor mediaCursor = new FeedMediaCursor(adapter.getSingleFeedMediaCursor(mediaId))) {
if (!mediaCursor.moveToFirst()) {
return null;
}
int indexFeedItem = mediaCursor.getColumnIndex(PodDBAdapter.KEY_FEEDITEM);
long itemId = mediaCursor.getLong(indexFeedItem);
FeedMedia media = FeedMediaCursorMapper.convert(mediaCursor);
FeedMedia media = mediaCursor.getFeedMedia();
FeedItem item = getFeedItem(itemId);
if (item != null) {
media.setItem(item);
@ -631,8 +598,8 @@ public final class DBReader {
public static List<FeedItem> getFeedItemsWithUrl(List<String> urls) {
PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open();
try (Cursor itemCursor = adapter.getFeedItemCursorByUrl(urls)) {
List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor);
try (FeedItemCursor itemCursor = new FeedItemCursor(adapter.getFeedItemCursorByUrl(urls))) {
List<FeedItem> items = extractItemlistFromCursor(itemCursor);
loadAdditionalFeedItemListData(items);
return items;
} finally {
@ -708,7 +675,8 @@ public final class DBReader {
adapter.open();
StatisticsResult result = new StatisticsResult();
try (Cursor cursor = adapter.getFeedStatisticsCursor(includeMarkedAsPlayed, timeFilterFrom, timeFilterTo)) {
try (FeedCursor cursor = new FeedCursor(adapter.getFeedStatisticsCursor(
includeMarkedAsPlayed, timeFilterFrom, timeFilterTo))) {
int indexOldestDate = cursor.getColumnIndexOrThrow("oldest_date");
int indexNumEpisodes = cursor.getColumnIndexOrThrow("num_episodes");
int indexEpisodesStarted = cursor.getColumnIndexOrThrow("episodes_started");
@ -718,7 +686,7 @@ public final class DBReader {
int indexDownloadSize = cursor.getColumnIndexOrThrow("download_size");
while (cursor.moveToNext()) {
Feed feed = extractFeedFromCursorRow(cursor);
Feed feed = cursor.getFeed();
long feedPlayedTime = Long.parseLong(cursor.getString(indexPlayedTime)) / 1000;
long feedTotalTime = Long.parseLong(cursor.getString(indexTotalTime)) / 1000;
@ -860,7 +828,7 @@ public final class DBReader {
public static List<FeedItem> searchFeedItems(final long feedId, final String query) {
PodDBAdapter adapter = PodDBAdapter.getInstance().open();
Cursor searchResult = adapter.searchItems(feedId, query);
FeedItemCursor searchResult = new FeedItemCursor(adapter.searchItems(feedId, query));
List<FeedItem> items = extractItemlistFromCursor(searchResult);
loadAdditionalFeedItemListData(items);
searchResult.close();
@ -870,15 +838,14 @@ public final class DBReader {
public static List<Feed> searchFeeds(final String query) {
PodDBAdapter adapter = PodDBAdapter.getInstance();
Cursor cursor = adapter.searchFeeds(query);
List<Feed> items = new ArrayList<>();
if (cursor.moveToFirst()) {
do {
items.add(FeedCursorMapper.convert(cursor));
} while (cursor.moveToNext());
try (FeedCursor cursor = new FeedCursor(adapter.searchFeeds(query))) {
List<Feed> items = new ArrayList<>();
while (cursor.moveToNext()) {
items.add(cursor.getFeed());
}
return items;
} finally {
adapter.close();
}
cursor.close();
adapter.close();
return items;
}
}

View File

@ -0,0 +1,41 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.database.CursorWrapper;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.Chapter;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
/**
* Converts a {@link Cursor} to a {@link Chapter} object.
*/
public class ChapterCursor extends CursorWrapper {
private final int indexId;
private final int indexTitle;
private final int indexStart;
private final int indexLink;
private final int indexImage;
public ChapterCursor(Cursor cursor) {
super(cursor);
indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_ID);
indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TITLE);
indexStart = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_START);
indexLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LINK);
indexImage = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
}
/**
* Create a {@link Chapter} instance from a database row (cursor).
*/
@NonNull
public Chapter getChapter() {
Chapter chapter = new Chapter(
getLong(indexStart),
getString(indexTitle),
getString(indexLink),
getString(indexImage));
chapter.setId(getLong(indexId));
return chapter;
}
}

View File

@ -1,32 +0,0 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.Chapter;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
/**
* Converts a {@link Cursor} to a {@link Chapter} object.
*/
public abstract class ChapterCursorMapper {
/**
* Create a {@link Chapter} instance from a database row (cursor).
*/
@NonNull
public static Chapter convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_ID);
int indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TITLE);
int indexStart = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_START);
int indexLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LINK);
int indexImage = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
long id = cursor.getLong(indexId);
String title = cursor.getString(indexTitle);
long start = cursor.getLong(indexStart);
String link = cursor.getString(indexLink);
String imageUrl = cursor.getString(indexImage);
Chapter chapter = new Chapter(start, title, link, imageUrl);
chapter.setId(id);
return chapter;
}
}

View File

@ -0,0 +1,52 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.database.CursorWrapper;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.download.DownloadResult;
import de.danoeh.antennapod.model.download.DownloadError;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Date;
/**
* Converts a {@link Cursor} to a {@link DownloadResult} object.
*/
public class DownloadResultCursor extends CursorWrapper {
private final int indexId;
private final int indexTitle;
private final int indexFeedFile;
private final int indexFileFileType;
private final int indexSuccessful;
private final int indexReason;
private final int indexCompletionDate;
private final int indexReasonDetailed;
public DownloadResultCursor(Cursor cursor) {
super(cursor);
indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_ID);
indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE);
indexFeedFile = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEEDFILE);
indexFileFileType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEEDFILETYPE);
indexSuccessful = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SUCCESSFUL);
indexReason = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_REASON);
indexCompletionDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_COMPLETION_DATE);
indexReasonDetailed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_REASON_DETAILED);
}
/**
* Create a {@link DownloadResult} instance from a database row (cursor).
*/
@NonNull
public DownloadResult getDownloadResult() {
return new DownloadResult(
getLong(indexId),
getString(indexTitle),
getLong(indexFeedFile),
getInt(indexFileFileType),
getInt(indexSuccessful) > 0,
DownloadError.fromCode(getInt(indexReason)),
new Date(getLong(indexCompletionDate)),
getString(indexReasonDetailed));
}
}

View File

@ -1,35 +0,0 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.download.DownloadResult;
import de.danoeh.antennapod.model.download.DownloadError;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Date;
/**
* Converts a {@link Cursor} to a {@link DownloadResult} object.
*/
public abstract class DownloadResultCursorMapper {
/**
* Create a {@link DownloadResult} instance from a database row (cursor).
*/
@NonNull
public static DownloadResult convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_ID);
int indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE);
int indexFeedFile = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEEDFILE);
int indexFileFileType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEEDFILETYPE);
int indexSuccessful = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SUCCESSFUL);
int indexReason = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_REASON);
int indexCompletionDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_COMPLETION_DATE);
int indexReasonDetailed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_REASON_DETAILED);
return new DownloadResult(cursor.getLong(indexId), cursor.getString(indexTitle), cursor.getLong(indexFeedFile),
cursor.getInt(indexFileFileType), cursor.getInt(indexSuccessful) > 0,
DownloadError.fromCode(cursor.getInt(indexReason)),
new Date(cursor.getLong(indexCompletionDate)),
cursor.getString(indexReasonDetailed));
}
}

View File

@ -0,0 +1,92 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.database.CursorWrapper;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
/**
* Converts a {@link Cursor} to a {@link Feed} object.
*/
public class FeedCursor extends CursorWrapper {
private final FeedPreferencesCursor preferencesCursor;
private final int indexId;
private final int indexLastUpdate;
private final int indexTitle;
private final int indexCustomTitle;
private final int indexLink;
private final int indexDescription;
private final int indexPaymentLink;
private final int indexAuthor;
private final int indexLanguage;
private final int indexType;
private final int indexFeedIdentifier;
private final int indexFileUrl;
private final int indexDownloadUrl;
private final int indexLastRefreshed;
private final int indexIsPaged;
private final int indexNextPageLink;
private final int indexHide;
private final int indexSortOrder;
private final int indexLastUpdateFailed;
private final int indexImageUrl;
public FeedCursor(Cursor cursor) {
super(new FeedPreferencesCursor(cursor));
preferencesCursor = (FeedPreferencesCursor) getWrappedCursor();
indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_FEED_ID);
indexLastUpdate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LASTUPDATE);
indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TITLE);
indexCustomTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_CUSTOM_TITLE);
indexLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LINK);
indexDescription = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DESCRIPTION);
indexPaymentLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PAYMENT_LINK);
indexAuthor = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTHOR);
indexLanguage = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LANGUAGE);
indexType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TYPE);
indexFeedIdentifier = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_IDENTIFIER);
indexFileUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FILE_URL);
indexDownloadUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_URL);
indexLastRefreshed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_REFRESH_ATTEMPT);
indexIsPaged = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IS_PAGED);
indexNextPageLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_NEXT_PAGE_LINK);
indexHide = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HIDE);
indexSortOrder = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SORT_ORDER);
indexLastUpdateFailed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_UPDATE_FAILED);
indexImageUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
}
/**
* Create a {@link Feed} instance from the current database row.
*/
@NonNull
public Feed getFeed() {
Feed feed = new Feed(
getLong(indexId),
getString(indexLastUpdate),
getString(indexTitle),
getString(indexCustomTitle),
getString(indexLink),
getString(indexDescription),
getString(indexPaymentLink),
getString(indexAuthor),
getString(indexLanguage),
getString(indexType),
getString(indexFeedIdentifier),
getString(indexImageUrl),
getString(indexFileUrl),
getString(indexDownloadUrl),
getLong(indexLastRefreshed),
getInt(indexIsPaged) > 0,
getString(indexNextPageLink),
getString(indexHide),
SortOrder.fromCodeString(getString(indexSortOrder)),
getInt(indexLastUpdateFailed) > 0);
feed.setPreferences(preferencesCursor.getFeedPreferences());
return feed;
}
}

View File

@ -1,70 +0,0 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
/**
* Converts a {@link Cursor} to a {@link Feed} object.
*/
public abstract class FeedCursorMapper {
/**
* Create a {@link Feed} instance from a database row (cursor).
*/
@NonNull
public static Feed convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_FEED_ID);
int indexLastUpdate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LASTUPDATE);
int indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TITLE);
int indexCustomTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_CUSTOM_TITLE);
int indexLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LINK);
int indexDescription = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DESCRIPTION);
int indexPaymentLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PAYMENT_LINK);
int indexAuthor = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTHOR);
int indexLanguage = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LANGUAGE);
int indexType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TYPE);
int indexFeedIdentifier = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_IDENTIFIER);
int indexFileUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FILE_URL);
int indexDownloadUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_URL);
int indexLastRefreshed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_REFRESH_ATTEMPT);
int indexIsPaged = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IS_PAGED);
int indexNextPageLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_NEXT_PAGE_LINK);
int indexHide = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HIDE);
int indexSortOrder = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SORT_ORDER);
int indexLastUpdateFailed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_UPDATE_FAILED);
int indexImageUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
Feed feed = new Feed(
cursor.getLong(indexId),
cursor.getString(indexLastUpdate),
cursor.getString(indexTitle),
cursor.getString(indexCustomTitle),
cursor.getString(indexLink),
cursor.getString(indexDescription),
cursor.getString(indexPaymentLink),
cursor.getString(indexAuthor),
cursor.getString(indexLanguage),
cursor.getString(indexType),
cursor.getString(indexFeedIdentifier),
cursor.getString(indexImageUrl),
cursor.getString(indexFileUrl),
cursor.getString(indexDownloadUrl),
cursor.getLong(indexLastRefreshed),
cursor.getInt(indexIsPaged) > 0,
cursor.getString(indexNextPageLink),
cursor.getString(indexHide),
SortOrder.fromCodeString(cursor.getString(indexSortOrder)),
cursor.getInt(indexLastUpdateFailed) > 0
);
FeedPreferences preferences = FeedPreferencesCursorMapper.convert(cursor);
feed.setPreferences(preferences);
return feed;
}
}

View File

@ -0,0 +1,71 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.database.CursorWrapper;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Date;
/**
* Converts a {@link Cursor} to a {@link FeedItem} object.
*/
public class FeedItemCursor extends CursorWrapper {
private final FeedMediaCursor feedMediaCursor;
private final int indexId;
private final int indexTitle;
private final int indexLink;
private final int indexPubDate;
private final int indexPaymentLink;
private final int indexFeedId;
private final int indexHasChapters;
private final int indexRead;
private final int indexItemIdentifier;
private final int indexAutoDownload;
private final int indexImageUrl;
private final int indexPodcastIndexChapterUrl;
private final int indexMediaId;
public FeedItemCursor(Cursor cursor) {
super(new FeedMediaCursor(cursor));
feedMediaCursor = (FeedMediaCursor) getWrappedCursor();
indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_ITEM_ID);
indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TITLE);
indexLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LINK);
indexPubDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PUBDATE);
indexPaymentLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PAYMENT_LINK);
indexFeedId = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED);
indexHasChapters = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HAS_CHAPTERS);
indexRead = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_READ);
indexItemIdentifier = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_ITEM_IDENTIFIER);
indexAutoDownload = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTO_DOWNLOAD_ENABLED);
indexImageUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
indexPodcastIndexChapterUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_CHAPTER_URL);
indexMediaId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_MEDIA_ID);
}
/**
* Create a {@link FeedItem} instance from a database row (cursor).
*/
@NonNull
public FeedItem getFeedItem() {
FeedItem item = new FeedItem(
getInt(indexId),
getString(indexTitle),
getString(indexLink),
new Date(getLong(indexPubDate)),
getString(indexPaymentLink),
getLong(indexFeedId),
getInt(indexHasChapters) > 0,
getString(indexImageUrl),
getInt(indexRead),
getString(indexItemIdentifier),
getLong(indexAutoDownload) > 0,
getString(indexPodcastIndexChapterUrl));
if (!isNull(indexMediaId)) {
item.setMedia(feedMediaCursor.getFeedMedia());
}
return item;
}
}

View File

@ -1,48 +0,0 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Date;
/**
* Converts a {@link Cursor} to a {@link FeedItem} object.
*/
public abstract class FeedItemCursorMapper {
/**
* Create a {@link FeedItem} instance from a database row (cursor).
*/
@NonNull
public static FeedItem convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_ITEM_ID);
int indexTitle = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_TITLE);
int indexLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LINK);
int indexPubDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PUBDATE);
int indexPaymentLink = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PAYMENT_LINK);
int indexFeedId = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED);
int indexHasChapters = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HAS_CHAPTERS);
int indexRead = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_READ);
int indexItemIdentifier = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_ITEM_IDENTIFIER);
int indexAutoDownload = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTO_DOWNLOAD_ENABLED);
int indexImageUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_IMAGE_URL);
int indexPodcastIndexChapterUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PODCASTINDEX_CHAPTER_URL);
long id = cursor.getInt(indexId);
String title = cursor.getString(indexTitle);
String link = cursor.getString(indexLink);
Date pubDate = new Date(cursor.getLong(indexPubDate));
String paymentLink = cursor.getString(indexPaymentLink);
long feedId = cursor.getLong(indexFeedId);
boolean hasChapters = cursor.getInt(indexHasChapters) > 0;
int state = cursor.getInt(indexRead);
String itemIdentifier = cursor.getString(indexItemIdentifier);
boolean autoDownloadEnabled = cursor.getLong(indexAutoDownload) > 0;
String imageUrl = cursor.getString(indexImageUrl);
String podcastIndexChapterUrl = cursor.getString(indexPodcastIndexChapterUrl);
return new FeedItem(id, title, link, pubDate, paymentLink, feedId,
hasChapters, imageUrl, state, itemIdentifier, autoDownloadEnabled, podcastIndexChapterUrl);
}
}

View File

@ -0,0 +1,81 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.database.CursorWrapper;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Date;
/**
* Converts a {@link Cursor} to a {@link FeedMedia} object.
*/
public class FeedMediaCursor extends CursorWrapper {
private final int indexId;
private final int indexPlaybackCompletionDate;
private final int indexDuration;
private final int indexPosition;
private final int indexSize;
private final int indexMimeType;
private final int indexFileUrl;
private final int indexDownloadUrl;
private final int indexDownloaded;
private final int indexPlayedDuration;
private final int indexLastPlayedTime;
private final int indexHasEmbeddedPicture;
public FeedMediaCursor(Cursor cursor) {
super(cursor);
indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_MEDIA_ID);
indexPlaybackCompletionDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE);
indexDuration = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DURATION);
indexPosition = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_POSITION);
indexSize = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SIZE);
indexMimeType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MIME_TYPE);
indexFileUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FILE_URL);
indexDownloadUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_URL);
indexDownloaded = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOADED);
indexPlayedDuration = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PLAYED_DURATION);
indexLastPlayedTime = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_PLAYED_TIME);
indexHasEmbeddedPicture = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE);
}
/**
* Create a {@link FeedMedia} instance from a database row (cursor).
*/
@NonNull
public FeedMedia getFeedMedia() {
long playbackCompletionTime = getLong(indexPlaybackCompletionDate);
Date playbackCompletionDate = playbackCompletionTime > 0 ? new Date(playbackCompletionTime) : null;
Boolean hasEmbeddedPicture;
switch (getInt(indexHasEmbeddedPicture)) {
case 1:
hasEmbeddedPicture = Boolean.TRUE;
break;
case 0:
hasEmbeddedPicture = Boolean.FALSE;
break;
default:
hasEmbeddedPicture = null;
break;
}
return new FeedMedia(
getLong(indexId),
null,
getInt(indexDuration),
getInt(indexPosition),
getLong(indexSize),
getString(indexMimeType),
getString(indexFileUrl),
getString(indexDownloadUrl),
getInt(indexDownloaded) > 0,
playbackCompletionDate,
getInt(indexPlayedDuration),
hasEmbeddedPicture,
getLong(indexLastPlayedTime)
);
}
}

View File

@ -1,67 +0,0 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.FeedMedia;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Date;
/**
* Converts a {@link Cursor} to a {@link FeedMedia} object.
*/
public abstract class FeedMediaCursorMapper {
/**
* Create a {@link FeedMedia} instance from a database row (cursor).
*/
@NonNull
public static FeedMedia convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_MEDIA_ID);
int indexPlaybackCompletionDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE);
int indexDuration = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DURATION);
int indexPosition = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_POSITION);
int indexSize = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_SIZE);
int indexMimeType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MIME_TYPE);
int indexFileUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FILE_URL);
int indexDownloadUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_URL);
int indexDownloaded = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOADED);
int indexPlayedDuration = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PLAYED_DURATION);
int indexLastPlayedTime = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_PLAYED_TIME);
long mediaId = cursor.getLong(indexId);
Date playbackCompletionDate = null;
long playbackCompletionTime = cursor.getLong(indexPlaybackCompletionDate);
if (playbackCompletionTime > 0) {
playbackCompletionDate = new Date(playbackCompletionTime);
}
Boolean hasEmbeddedPicture;
switch (cursor.getInt(cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE))) {
case 1:
hasEmbeddedPicture = Boolean.TRUE;
break;
case 0:
hasEmbeddedPicture = Boolean.FALSE;
break;
default:
hasEmbeddedPicture = null;
break;
}
return new FeedMedia(
mediaId,
null,
cursor.getInt(indexDuration),
cursor.getInt(indexPosition),
cursor.getLong(indexSize),
cursor.getString(indexMimeType),
cursor.getString(indexFileUrl),
cursor.getString(indexDownloadUrl),
cursor.getInt(indexDownloaded) > 0,
playbackCompletionDate,
cursor.getInt(indexPlayedDuration),
hasEmbeddedPicture,
cursor.getLong(indexLastPlayedTime)
);
}
}

View File

@ -0,0 +1,85 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.database.CursorWrapper;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.FeedFilter;
import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Arrays;
import java.util.HashSet;
/**
* Converts a {@link Cursor} to a {@link FeedPreferences} object.
*/
public class FeedPreferencesCursor extends CursorWrapper {
private final int indexId;
private final int indexAutoDownload;
private final int indexAutoRefresh;
private final int indexAutoDeleteAction;
private final int indexVolumeAdaption;
private final int indexUsername;
private final int indexPassword;
private final int indexIncludeFilter;
private final int indexExcludeFilter;
private final int indexMinimalDurationFilter;
private final int indexFeedPlaybackSpeed;
private final int indexFeedSkipSilence;
private final int indexAutoSkipIntro;
private final int indexAutoSkipEnding;
private final int indexEpisodeNotification;
private final int indexNewEpisodesAction;
private final int indexTags;
public FeedPreferencesCursor(Cursor cursor) {
super(cursor);
indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_FEED_ID);
indexAutoDownload = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTO_DOWNLOAD_ENABLED);
indexAutoRefresh = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_KEEP_UPDATED);
indexAutoDeleteAction = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTO_DELETE_ACTION);
indexVolumeAdaption = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_VOLUME_ADAPTION);
indexUsername = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_USERNAME);
indexPassword = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PASSWORD);
indexIncludeFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_INCLUDE_FILTER);
indexExcludeFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EXCLUDE_FILTER);
indexMinimalDurationFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MINIMAL_DURATION_FILTER);
indexFeedPlaybackSpeed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_PLAYBACK_SPEED);
indexFeedSkipSilence = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_SILENCE);
indexAutoSkipIntro = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_INTRO);
indexAutoSkipEnding = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_ENDING);
indexEpisodeNotification = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EPISODE_NOTIFICATION);
indexNewEpisodesAction = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_NEW_EPISODES_ACTION);
indexTags = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_TAGS);
}
/**
* Create a {@link FeedPreferences} instance from a database row (cursor).
*/
@NonNull
public FeedPreferences getFeedPreferences() {
String tagsString = getString(indexTags);
if (TextUtils.isEmpty(tagsString)) {
tagsString = FeedPreferences.TAG_ROOT;
}
return new FeedPreferences(
getLong(indexId),
getInt(indexAutoDownload) > 0,
getInt(indexAutoRefresh) > 0,
FeedPreferences.AutoDeleteAction.fromCode(getInt(indexAutoDeleteAction)),
VolumeAdaptionSetting.fromInteger(getInt(indexVolumeAdaption)),
getString(indexUsername),
getString(indexPassword),
new FeedFilter(getString(indexIncludeFilter),
getString(indexExcludeFilter), getInt(indexMinimalDurationFilter)),
getFloat(indexFeedPlaybackSpeed),
getInt(indexAutoSkipIntro),
getInt(indexAutoSkipEnding),
FeedPreferences.SkipSilence.fromCode(getInt(indexFeedSkipSilence)),
getInt(indexEpisodeNotification) > 0,
FeedPreferences.NewEpisodesAction.fromCode(getInt(indexNewEpisodesAction)),
new HashSet<>(Arrays.asList(tagsString.split(FeedPreferences.TAG_SEPARATOR))));
}
}

View File

@ -1,82 +0,0 @@
package de.danoeh.antennapod.storage.database.mapper;
import android.database.Cursor;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import de.danoeh.antennapod.model.feed.FeedFilter;
import de.danoeh.antennapod.model.feed.FeedPreferences;
import de.danoeh.antennapod.model.feed.VolumeAdaptionSetting;
import de.danoeh.antennapod.storage.database.PodDBAdapter;
import java.util.Arrays;
import java.util.HashSet;
/**
* Converts a {@link Cursor} to a {@link FeedPreferences} object.
*/
public abstract class FeedPreferencesCursorMapper {
/**
* Create a {@link FeedPreferences} instance from a database row (cursor).
*/
@NonNull
public static FeedPreferences convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndexOrThrow(PodDBAdapter.SELECT_KEY_FEED_ID);
int indexAutoDownload = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTO_DOWNLOAD_ENABLED);
int indexAutoRefresh = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_KEEP_UPDATED);
int indexAutoDeleteAction = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_AUTO_DELETE_ACTION);
int indexVolumeAdaption = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_VOLUME_ADAPTION);
int indexUsername = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_USERNAME);
int indexPassword = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PASSWORD);
int indexIncludeFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_INCLUDE_FILTER);
int indexExcludeFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EXCLUDE_FILTER);
int indexMinimalDurationFilter = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MINIMAL_DURATION_FILTER);
int indexFeedPlaybackSpeed = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_PLAYBACK_SPEED);
int indexFeedSkipSilence = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_SILENCE);
int indexAutoSkipIntro = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_INTRO);
int indexAutoSkipEnding = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_SKIP_ENDING);
int indexEpisodeNotification = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_EPISODE_NOTIFICATION);
int indexNewEpisodesAction = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_NEW_EPISODES_ACTION);
int indexTags = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_TAGS);
long feedId = cursor.getLong(indexId);
boolean autoDownload = cursor.getInt(indexAutoDownload) > 0;
boolean autoRefresh = cursor.getInt(indexAutoRefresh) > 0;
FeedPreferences.AutoDeleteAction autoDeleteAction =
FeedPreferences.AutoDeleteAction.fromCode(cursor.getInt(indexAutoDeleteAction));
int volumeAdaptionValue = cursor.getInt(indexVolumeAdaption);
VolumeAdaptionSetting volumeAdaptionSetting = VolumeAdaptionSetting.fromInteger(volumeAdaptionValue);
String username = cursor.getString(indexUsername);
String password = cursor.getString(indexPassword);
String includeFilter = cursor.getString(indexIncludeFilter);
String excludeFilter = cursor.getString(indexExcludeFilter);
int minimalDurationFilter = cursor.getInt(indexMinimalDurationFilter);
float feedPlaybackSpeed = cursor.getFloat(indexFeedPlaybackSpeed);
int feedAutoSkipIntro = cursor.getInt(indexAutoSkipIntro);
int feedAutoSkipEnding = cursor.getInt(indexAutoSkipEnding);
FeedPreferences.SkipSilence feedSkipSilence =
FeedPreferences.SkipSilence.fromCode(cursor.getInt(indexFeedSkipSilence));
FeedPreferences.NewEpisodesAction feedNewEpisodesAction =
FeedPreferences.NewEpisodesAction.fromCode(cursor.getInt(indexNewEpisodesAction));
boolean showNotification = cursor.getInt(indexEpisodeNotification) > 0;
String tagsString = cursor.getString(indexTags);
if (TextUtils.isEmpty(tagsString)) {
tagsString = FeedPreferences.TAG_ROOT;
}
return new FeedPreferences(feedId,
autoDownload,
autoRefresh,
autoDeleteAction,
volumeAdaptionSetting,
username,
password,
new FeedFilter(includeFilter, excludeFilter, minimalDurationFilter),
feedPlaybackSpeed,
feedAutoSkipIntro,
feedAutoSkipEnding,
feedSkipSilence,
showNotification,
feedNewEpisodesAction,
new HashSet<>(Arrays.asList(tagsString.split(FeedPreferences.TAG_SEPARATOR))));
}
}

View File

@ -2,7 +2,6 @@ package de.danoeh.antennapod.storage.database.mapper;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import androidx.test.platform.app.InstrumentationRegistry;
@ -40,9 +39,9 @@ public class FeedCursorMapperTest {
@SuppressWarnings("ConstantConditions")
@Test
public void testFromCursor() {
try (Cursor cursor = adapter.getAllFeedsCursor()) {
try (FeedCursor cursor = new FeedCursor(adapter.getAllFeedsCursor())) {
cursor.moveToNext();
Feed feed = FeedCursorMapper.convert(cursor);
Feed feed = cursor.getFeed();
assertTrue(feed.getId() >= 0);
assertEquals("feed custom title", feed.getTitle());
assertEquals("feed custom title", feed.getCustomTitle());