Merge pull request #6039 from ByteHamster/statistics-performance

Make statistics loading more efficient
This commit is contained in:
ByteHamster 2022-08-26 21:01:53 +02:00 committed by GitHub
commit ec92722c04
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 157 additions and 137 deletions

View File

@ -7,7 +7,6 @@ import androidx.collection.ArrayMap;
import android.text.TextUtils;
import android.util.Log;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@ -852,52 +851,34 @@ public final class DBReader {
adapter.open();
StatisticsResult result = new StatisticsResult();
List<Feed> feeds = getFeedList();
for (Feed feed : feeds) {
long feedPlayedTime = 0;
long feedTotalTime = 0;
long episodes = 0;
long episodesStarted = 0;
long totalDownloadSize = 0;
long episodesDownloadCount = 0;
List<FeedItem> items = getFeed(feed.getId()).getItems();
for (FeedItem item : items) {
FeedMedia media = item.getMedia();
if (media == null) {
continue;
try (Cursor cursor = adapter.getFeedStatisticsCursor(includeMarkedAsPlayed, timeFilterFrom, timeFilterTo)) {
int indexOldestDate = cursor.getColumnIndexOrThrow("oldest_date");
int indexNumEpisodes = cursor.getColumnIndexOrThrow("num_episodes");
int indexEpisodesStarted = cursor.getColumnIndexOrThrow("episodes_started");
int indexTotalTime = cursor.getColumnIndexOrThrow("total_time");
int indexPlayedTime = cursor.getColumnIndexOrThrow("played_time");
int indexNumDownloaded = cursor.getColumnIndexOrThrow("num_downloaded");
int indexDownloadSize = cursor.getColumnIndexOrThrow("download_size");
while (cursor.moveToNext()) {
Feed feed = extractFeedFromCursorRow(cursor);
long feedPlayedTime = Long.parseLong(cursor.getString(indexPlayedTime)) / 1000;
long feedTotalTime = Long.parseLong(cursor.getString(indexTotalTime)) / 1000;
long episodes = Long.parseLong(cursor.getString(indexNumEpisodes));
long episodesStarted = Long.parseLong(cursor.getString(indexEpisodesStarted));
long totalDownloadSize = Long.parseLong(cursor.getString(indexDownloadSize));
long episodesDownloadCount = Long.parseLong(cursor.getString(indexNumDownloaded));
long oldestDate = Long.parseLong(cursor.getString(indexOldestDate));
if (episodes > 0 && oldestDate < Long.MAX_VALUE) {
result.oldestDate = Math.min(result.oldestDate, oldestDate);
}
if (media.getLastPlayedTime() > 0 && media.getPlayedDuration() != 0) {
result.oldestDate = Math.min(result.oldestDate, media.getLastPlayedTime());
}
if (media.getLastPlayedTime() >= timeFilterFrom
&& media.getLastPlayedTime() <= timeFilterTo) {
if (media.getPlayedDuration() != 0) {
feedPlayedTime += media.getPlayedDuration() / 1000;
} else if (includeMarkedAsPlayed && item.isPlayed()) {
feedPlayedTime += media.getDuration() / 1000;
}
}
boolean markedAsStarted = item.isPlayed() || media.getPosition() != 0;
boolean hasStatistics = media.getPlaybackCompletionDate() != null || media.getPlayedDuration() > 0;
if (hasStatistics || (includeMarkedAsPlayed && markedAsStarted)) {
episodesStarted++;
}
feedTotalTime += media.getDuration() / 1000;
if (media.isDownloaded()) {
totalDownloadSize += new File(media.getFile_url()).length();
episodesDownloadCount++;
}
episodes++;
result.feedTime.add(new StatisticsItem(feed, feedTotalTime, feedPlayedTime, episodes,
episodesStarted, totalDownloadSize, episodesDownloadCount));
}
result.feedTime.add(new StatisticsItem(feed, feedTotalTime, feedPlayedTime, episodes,
episodesStarted, totalDownloadSize, episodesDownloadCount));
}
adapter.close();
return result;
}

View File

@ -226,46 +226,6 @@ public class PodDBAdapter {
+ TABLE_NAME_FAVORITES + "(" + KEY_ID + " INTEGER PRIMARY KEY,"
+ KEY_FEEDITEM + " INTEGER," + KEY_FEED + " INTEGER)";
/**
* Select all columns from the feed-table
*/
private static final String[] FEED_SEL_STD = {
TABLE_NAME_FEEDS + "." + KEY_ID,
TABLE_NAME_FEEDS + "." + KEY_TITLE,
TABLE_NAME_FEEDS + "." + KEY_CUSTOM_TITLE,
TABLE_NAME_FEEDS + "." + KEY_FILE_URL,
TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL,
TABLE_NAME_FEEDS + "." + KEY_DOWNLOADED,
TABLE_NAME_FEEDS + "." + KEY_LINK,
TABLE_NAME_FEEDS + "." + KEY_DESCRIPTION,
TABLE_NAME_FEEDS + "." + KEY_PAYMENT_LINK,
TABLE_NAME_FEEDS + "." + KEY_LASTUPDATE,
TABLE_NAME_FEEDS + "." + KEY_LANGUAGE,
TABLE_NAME_FEEDS + "." + KEY_AUTHOR,
TABLE_NAME_FEEDS + "." + KEY_IMAGE_URL,
TABLE_NAME_FEEDS + "." + KEY_TYPE,
TABLE_NAME_FEEDS + "." + KEY_FEED_IDENTIFIER,
TABLE_NAME_FEEDS + "." + KEY_AUTO_DOWNLOAD_ENABLED,
TABLE_NAME_FEEDS + "." + KEY_KEEP_UPDATED,
TABLE_NAME_FEEDS + "." + KEY_IS_PAGED,
TABLE_NAME_FEEDS + "." + KEY_NEXT_PAGE_LINK,
TABLE_NAME_FEEDS + "." + KEY_USERNAME,
TABLE_NAME_FEEDS + "." + KEY_PASSWORD,
TABLE_NAME_FEEDS + "." + KEY_HIDE,
TABLE_NAME_FEEDS + "." + KEY_SORT_ORDER,
TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED,
TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION,
TABLE_NAME_FEEDS + "." + KEY_FEED_VOLUME_ADAPTION,
TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER,
TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER,
TABLE_NAME_FEEDS + "." + KEY_MINIMAL_DURATION_FILTER,
TABLE_NAME_FEEDS + "." + KEY_FEED_PLAYBACK_SPEED,
TABLE_NAME_FEEDS + "." + KEY_FEED_TAGS,
TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_INTRO,
TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_ENDING,
TABLE_NAME_FEEDS + "." + KEY_EPISODE_NOTIFICATION
};
/**
* All the tables in the database
*/
@ -281,6 +241,7 @@ public class PodDBAdapter {
public static final String SELECT_KEY_ITEM_ID = "item_id";
public static final String SELECT_KEY_MEDIA_ID = "media_id";
public static final String SELECT_KEY_FEED_ID = "feed_id";
private static final String KEYS_FEED_ITEM_WITHOUT_DESCRIPTION =
TABLE_NAME_FEED_ITEMS + "." + KEY_ID + " AS " + SELECT_KEY_ITEM_ID + ", "
@ -312,6 +273,42 @@ public class PodDBAdapter {
+ TABLE_NAME_FEED_MEDIA + "." + KEY_HAS_EMBEDDED_PICTURE + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_LAST_PLAYED_TIME;
private static final String KEYS_FEED =
TABLE_NAME_FEEDS + "." + KEY_ID + " AS " + SELECT_KEY_FEED_ID + ", "
+ TABLE_NAME_FEEDS + "." + KEY_TITLE + ", "
+ TABLE_NAME_FEEDS + "." + KEY_CUSTOM_TITLE + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FILE_URL + ", "
+ TABLE_NAME_FEEDS + "." + KEY_DOWNLOAD_URL + ", "
+ TABLE_NAME_FEEDS + "." + KEY_DOWNLOADED + ", "
+ TABLE_NAME_FEEDS + "." + KEY_LINK + ", "
+ TABLE_NAME_FEEDS + "." + KEY_DESCRIPTION + ", "
+ TABLE_NAME_FEEDS + "." + KEY_PAYMENT_LINK + ", "
+ TABLE_NAME_FEEDS + "." + KEY_LASTUPDATE + ", "
+ TABLE_NAME_FEEDS + "." + KEY_LANGUAGE + ", "
+ TABLE_NAME_FEEDS + "." + KEY_AUTHOR + ", "
+ TABLE_NAME_FEEDS + "." + KEY_IMAGE_URL + ", "
+ TABLE_NAME_FEEDS + "." + KEY_TYPE + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FEED_IDENTIFIER + ", "
+ TABLE_NAME_FEEDS + "." + KEY_IS_PAGED + ", "
+ TABLE_NAME_FEEDS + "." + KEY_NEXT_PAGE_LINK + ", "
+ TABLE_NAME_FEEDS + "." + KEY_LAST_UPDATE_FAILED + ", "
+ TABLE_NAME_FEEDS + "." + KEY_AUTO_DOWNLOAD_ENABLED + ", "
+ TABLE_NAME_FEEDS + "." + KEY_KEEP_UPDATED + ", "
+ TABLE_NAME_FEEDS + "." + KEY_USERNAME + ", "
+ TABLE_NAME_FEEDS + "." + KEY_PASSWORD + ", "
+ TABLE_NAME_FEEDS + "." + KEY_HIDE + ", "
+ TABLE_NAME_FEEDS + "." + KEY_SORT_ORDER + ", "
+ TABLE_NAME_FEEDS + "." + KEY_AUTO_DELETE_ACTION + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FEED_VOLUME_ADAPTION + ", "
+ TABLE_NAME_FEEDS + "." + KEY_INCLUDE_FILTER + ", "
+ TABLE_NAME_FEEDS + "." + KEY_EXCLUDE_FILTER + ", "
+ TABLE_NAME_FEEDS + "." + KEY_MINIMAL_DURATION_FILTER + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FEED_PLAYBACK_SPEED + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FEED_TAGS + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_INTRO + ", "
+ TABLE_NAME_FEEDS + "." + KEY_FEED_SKIP_ENDING + ", "
+ TABLE_NAME_FEEDS + "." + KEY_EPISODE_NOTIFICATION;
private static final String JOIN_FEED_ITEM_AND_MEDIA = " LEFT JOIN " + TABLE_NAME_FEED_MEDIA
+ " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_ID + "=" + TABLE_NAME_FEED_MEDIA + "." + KEY_FEEDITEM + " ";
@ -914,8 +911,10 @@ public class PodDBAdapter {
* @return The cursor of the query
*/
public final Cursor getAllFeedsCursor() {
return db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, null, null, null, null,
KEY_TITLE + " COLLATE NOCASE ASC");
final String query = "SELECT " + KEYS_FEED
+ " FROM " + TABLE_NAME_FEEDS
+ " ORDER BY " + TABLE_NAME_FEEDS + "." + KEY_TITLE + " COLLATE NOCASE ASC";
return db.rawQuery(query, null);
}
public final Cursor getFeedCursorDownloadUrls() {
@ -1102,8 +1101,10 @@ public class PodDBAdapter {
}
public final Cursor getFeedCursor(final long id) {
return db.query(TABLE_NAME_FEEDS, FEED_SEL_STD, KEY_ID + "=" + id, null,
null, null, null);
final String query = "SELECT " + KEYS_FEED
+ " FROM " + TABLE_NAME_FEEDS
+ " WHERE " + SELECT_KEY_FEED_ID + " = " + id;
return db.rawQuery(query, null);
}
public final Cursor getFeedItemCursor(final String id) {
@ -1167,6 +1168,46 @@ public class PodDBAdapter {
return db.rawQuery(query, null);
}
public final Cursor getFeedStatisticsCursor(boolean includeMarkedAsPlayed, long timeFilterFrom, long timeFilterTo) {
final String lastPlayedTime = TABLE_NAME_FEED_MEDIA + "." + KEY_LAST_PLAYED_TIME;
String wasStarted = TABLE_NAME_FEED_MEDIA + "." + KEY_PLAYBACK_COMPLETION_DATE + " > 0"
+ " AND " + TABLE_NAME_FEED_MEDIA + "." + KEY_PLAYED_DURATION + " > 0";
if (includeMarkedAsPlayed) {
wasStarted = "(" + wasStarted + ") OR "
+ TABLE_NAME_FEED_ITEMS + "." + KEY_READ + "=" + FeedItem.PLAYED + " OR "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + "> 0";
}
final String timeFilter = lastPlayedTime + ">=" + timeFilterFrom
+ " AND " + lastPlayedTime + "<=" + timeFilterTo;
String playedTime = TABLE_NAME_FEED_MEDIA + "." + KEY_PLAYED_DURATION;
if (includeMarkedAsPlayed) {
playedTime = "(CASE WHEN " + playedTime + " != 0"
+ " THEN " + playedTime + " ELSE ("
+ "CASE WHEN " + TABLE_NAME_FEED_ITEMS + "." + KEY_READ + "=" + FeedItem.PLAYED
+ " THEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + " ELSE 0 END"
+ ") END)";
}
final String query = "SELECT " + KEYS_FEED + ", "
+ "COUNT(*) AS num_episodes, "
+ "MIN(CASE WHEN " + lastPlayedTime + " > 0"
+ " THEN " + lastPlayedTime + " ELSE " + Long.MAX_VALUE + " END) AS oldest_date, "
+ "SUM(CASE WHEN (" + wasStarted + ") THEN 1 ELSE 0 END) AS episodes_started, "
+ "IFNULL(SUM(CASE WHEN (" + timeFilter + ")"
+ " THEN (" + playedTime + ") ELSE 0 END), 0) AS played_time, "
+ "IFNULL(SUM(" + TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + "), 0) AS total_time, "
+ "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " > 0"
+ " THEN 1 ELSE 0 END) AS num_downloaded, "
+ "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " > 0"
+ " THEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + " ELSE 0 END) AS download_size"
+ " FROM " + TABLE_NAME_FEED_ITEMS
+ JOIN_FEED_ITEM_AND_MEDIA
+ " INNER JOIN " + TABLE_NAME_FEEDS
+ " ON " + TABLE_NAME_FEED_ITEMS + "." + KEY_FEED + "=" + TABLE_NAME_FEEDS + "." + KEY_ID
+ " GROUP BY " + TABLE_NAME_FEEDS + "." + KEY_ID;
return db.rawQuery(query, null);
}
public int getQueueSize() {
final String query = String.format("SELECT COUNT(%s) FROM %s", KEY_ID, TABLE_NAME_QUEUE);
Cursor c = db.rawQuery(query, null);

View File

@ -14,11 +14,11 @@ public abstract class ChapterCursorMapper {
*/
@NonNull
public static Chapter convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID);
int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_TITLE);
int indexStart = cursor.getColumnIndex(PodDBAdapter.KEY_START);
int indexLink = cursor.getColumnIndex(PodDBAdapter.KEY_LINK);
int indexImage = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE_URL);
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);

View File

@ -17,14 +17,14 @@ public abstract class DownloadStatusCursorMapper {
*/
@NonNull
public static DownloadStatus convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID);
int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOADSTATUS_TITLE);
int indexFeedFile = cursor.getColumnIndex(PodDBAdapter.KEY_FEEDFILE);
int indexFileFileType = cursor.getColumnIndex(PodDBAdapter.KEY_FEEDFILETYPE);
int indexSuccessful = cursor.getColumnIndex(PodDBAdapter.KEY_SUCCESSFUL);
int indexReason = cursor.getColumnIndex(PodDBAdapter.KEY_REASON);
int indexCompletionDate = cursor.getColumnIndex(PodDBAdapter.KEY_COMPLETION_DATE);
int indexReasonDetailed = cursor.getColumnIndex(PodDBAdapter.KEY_REASON_DETAILED);
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 DownloadStatus(cursor.getLong(indexId), cursor.getString(indexTitle), cursor.getLong(indexFeedFile),
cursor.getInt(indexFileFileType), cursor.getInt(indexSuccessful) > 0, false, true,

View File

@ -19,26 +19,26 @@ public abstract class FeedCursorMapper {
*/
@NonNull
public static Feed convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID);
int indexLastUpdate = cursor.getColumnIndex(PodDBAdapter.KEY_LASTUPDATE);
int indexTitle = cursor.getColumnIndex(PodDBAdapter.KEY_TITLE);
int indexCustomTitle = cursor.getColumnIndex(PodDBAdapter.KEY_CUSTOM_TITLE);
int indexLink = cursor.getColumnIndex(PodDBAdapter.KEY_LINK);
int indexDescription = cursor.getColumnIndex(PodDBAdapter.KEY_DESCRIPTION);
int indexPaymentLink = cursor.getColumnIndex(PodDBAdapter.KEY_PAYMENT_LINK);
int indexAuthor = cursor.getColumnIndex(PodDBAdapter.KEY_AUTHOR);
int indexLanguage = cursor.getColumnIndex(PodDBAdapter.KEY_LANGUAGE);
int indexType = cursor.getColumnIndex(PodDBAdapter.KEY_TYPE);
int indexFeedIdentifier = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_IDENTIFIER);
int indexFileUrl = cursor.getColumnIndex(PodDBAdapter.KEY_FILE_URL);
int indexDownloadUrl = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOAD_URL);
int indexDownloaded = cursor.getColumnIndex(PodDBAdapter.KEY_DOWNLOADED);
int indexIsPaged = cursor.getColumnIndex(PodDBAdapter.KEY_IS_PAGED);
int indexNextPageLink = cursor.getColumnIndex(PodDBAdapter.KEY_NEXT_PAGE_LINK);
int indexHide = cursor.getColumnIndex(PodDBAdapter.KEY_HIDE);
int indexSortOrder = cursor.getColumnIndex(PodDBAdapter.KEY_SORT_ORDER);
int indexLastUpdateFailed = cursor.getColumnIndex(PodDBAdapter.KEY_LAST_UPDATE_FAILED);
int indexImageUrl = cursor.getColumnIndex(PodDBAdapter.KEY_IMAGE_URL);
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 indexDownloaded = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOADED);
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),

View File

@ -20,21 +20,21 @@ public abstract class FeedPreferencesCursorMapper {
*/
@NonNull
public static FeedPreferences convert(@NonNull Cursor cursor) {
int indexId = cursor.getColumnIndex(PodDBAdapter.KEY_ID);
int indexAutoDownload = cursor.getColumnIndex(PodDBAdapter.KEY_AUTO_DOWNLOAD_ENABLED);
int indexAutoRefresh = cursor.getColumnIndex(PodDBAdapter.KEY_KEEP_UPDATED);
int indexAutoDeleteAction = cursor.getColumnIndex(PodDBAdapter.KEY_AUTO_DELETE_ACTION);
int indexVolumeAdaption = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_VOLUME_ADAPTION);
int indexUsername = cursor.getColumnIndex(PodDBAdapter.KEY_USERNAME);
int indexPassword = cursor.getColumnIndex(PodDBAdapter.KEY_PASSWORD);
int indexIncludeFilter = cursor.getColumnIndex(PodDBAdapter.KEY_INCLUDE_FILTER);
int indexExcludeFilter = cursor.getColumnIndex(PodDBAdapter.KEY_EXCLUDE_FILTER);
int indexMinimalDurationFilter = cursor.getColumnIndex(PodDBAdapter.KEY_MINIMAL_DURATION_FILTER);
int indexFeedPlaybackSpeed = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_PLAYBACK_SPEED);
int indexAutoSkipIntro = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_SKIP_INTRO);
int indexAutoSkipEnding = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_SKIP_ENDING);
int indexEpisodeNotification = cursor.getColumnIndex(PodDBAdapter.KEY_EPISODE_NOTIFICATION);
int indexTags = cursor.getColumnIndex(PodDBAdapter.KEY_FEED_TAGS);
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 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 indexTags = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FEED_TAGS);
long feedId = cursor.getLong(indexId);
boolean autoDownload = cursor.getInt(indexAutoDownload) > 0;

View File

@ -85,9 +85,7 @@ public class YearStatisticsListAdapter extends RecyclerView.Adapter<RecyclerView
item.year = lastDataPoint / 12;
item.month = lastDataPoint % 12 + 1;
statisticsData.add(item); // Compensate for months without playback
System.out.println("aaaaa extra:" + item.month + "/" + item.year);
}
System.out.println("aaaaa add:" + statistic.month + "/" + statistic.year);
statisticsData.add(statistic);
lastDataPoint = (statistic.month - 1) + statistic.year * 12;
}