Store download date in database (#7090)

This commit is contained in:
ByteHamster 2024-04-13 17:28:56 +02:00 committed by GitHub
parent 456159e85f
commit 04fab47072
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
18 changed files with 62 additions and 55 deletions

View File

@ -138,7 +138,8 @@ public class PlaybackServiceMediaPlayerTest {
f.setItems(new ArrayList<>()); f.setItems(new ArrayList<>());
FeedItem i = new FeedItem(0, "t", "i", "l", new Date(), FeedItem.UNPLAYED, f); FeedItem i = new FeedItem(0, "t", "i", "l", new Date(), FeedItem.UNPLAYED, f);
f.getItems().add(i); f.getItems().add(i);
FeedMedia media = new FeedMedia(0, i, 0, 0, 0, "audio/wav", fileUrl, downloadUrl, fileUrl != null, null, 0, 0); FeedMedia media = new FeedMedia(0, i, 0, 0, 0, "audio/wav", fileUrl, downloadUrl,
fileUrl == null ? 0 : System.currentTimeMillis(), null, 0, 0);
i.setMedia(media); i.setMedia(media);
PodDBAdapter adapter = PodDBAdapter.getInstance(); PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open(); adapter.open();

View File

@ -134,7 +134,8 @@ public class UITestUtils {
if (!hostTextOnlyFeeds) { if (!hostTextOnlyFeeds) {
File mediaFile = newMediaFile("feed-" + i + "-episode-" + j + ".mp3"); File mediaFile = newMediaFile("feed-" + i + "-episode-" + j + ".mp3");
item.setMedia(new FeedMedia(j, item, 0, 0, mediaFile.length(), "audio/mp3", null, hostFile(mediaFile), false, null, 0, 0)); item.setMedia(new FeedMedia(j, item, 0, 0, mediaFile.length(), "audio/mp3",
null, hostFile(mediaFile), 0, null, 0, 0));
} }
} }
feed.setItems(items); feed.setItems(items);
@ -175,7 +176,7 @@ public class UITestUtils {
FeedMedia media = item.getMedia(); FeedMedia media = item.getMedia();
int fileId = Integer.parseInt(StringUtils.substringAfter(media.getDownloadUrl(), "files/")); int fileId = Integer.parseInt(StringUtils.substringAfter(media.getDownloadUrl(), "files/"));
media.setLocalFileUrl(server.accessFile(fileId).getAbsolutePath()); media.setLocalFileUrl(server.accessFile(fileId).getAbsolutePath());
media.setDownloaded(true); media.setDownloaded(true, System.currentTimeMillis());
} }
} }
} }

View File

@ -42,7 +42,7 @@ public class PlayActionButton extends ItemActionButton {
} }
if (!media.fileExists()) { if (!media.fileExists()) {
Log.i(TAG, "Missing episode. Will update the database now."); Log.i(TAG, "Missing episode. Will update the database now.");
media.setDownloaded(false); media.setDownloaded(false, 0);
media.setLocalFileUrl(null); media.setLocalFileUrl(null);
DBWriter.setFeedMedia(media); DBWriter.setFeedMedia(media);
EventBus.getDefault().post(FeedItemEvent.updated(media.getItem())); EventBus.getDefault().post(FeedItemEvent.updated(media.getItem()));

View File

@ -34,7 +34,7 @@ public class FeedMedia implements Playable {
private long id; private long id;
private String localFileUrl; private String localFileUrl;
private String downloadUrl; private String downloadUrl;
private boolean downloaded; private long downloadDate;
private int duration; private int duration;
private int position; // Current position in file private int position; // Current position in file
private long lastPlayedTime; // Last time this media was played (in ms) private long lastPlayedTime; // Last time this media was played (in ms)
@ -56,7 +56,7 @@ public class FeedMedia implements Playable {
String mimeType) { String mimeType) {
this.localFileUrl = null; this.localFileUrl = null;
this.downloadUrl = downloadUrl; this.downloadUrl = downloadUrl;
this.downloaded = false; this.downloadDate = 0;
this.item = i; this.item = i;
this.size = size; this.size = size;
this.mimeType = mimeType; this.mimeType = mimeType;
@ -64,11 +64,11 @@ public class FeedMedia implements Playable {
public FeedMedia(long id, FeedItem item, int duration, int position, public FeedMedia(long id, FeedItem item, int duration, int position,
long size, String mimeType, String localFileUrl, String downloadUrl, long size, String mimeType, String localFileUrl, String downloadUrl,
boolean downloaded, Date playbackCompletionDate, int playedDuration, long downloadDate, Date playbackCompletionDate, int playedDuration,
long lastPlayedTime) { long lastPlayedTime) {
this.localFileUrl = localFileUrl; this.localFileUrl = localFileUrl;
this.downloadUrl = downloadUrl; this.downloadUrl = downloadUrl;
this.downloaded = downloaded; this.downloadDate = downloadDate;
this.id = id; this.id = id;
this.item = item; this.item = item;
this.duration = duration; this.duration = duration;
@ -84,9 +84,9 @@ public class FeedMedia implements Playable {
public FeedMedia(long id, FeedItem item, int duration, int position, public FeedMedia(long id, FeedItem item, int duration, int position,
long size, String mimeType, String localFileUrl, String downloadUrl, long size, String mimeType, String localFileUrl, String downloadUrl,
boolean downloaded, Date playbackCompletionDate, int playedDuration, long downloadDate, Date playbackCompletionDate, int playedDuration,
Boolean hasEmbeddedPicture, long lastPlayedTime) { Boolean hasEmbeddedPicture, long lastPlayedTime) {
this(id, item, duration, position, size, mimeType, localFileUrl, downloadUrl, downloaded, this(id, item, duration, position, size, mimeType, localFileUrl, downloadUrl, downloadDate,
playbackCompletionDate, playedDuration, lastPlayedTime); playbackCompletionDate, playedDuration, lastPlayedTime);
this.hasEmbeddedPicture = hasEmbeddedPicture; this.hasEmbeddedPicture = hasEmbeddedPicture;
} }
@ -293,7 +293,7 @@ public class FeedMedia implements Playable {
dest.writeString(mimeType); dest.writeString(mimeType);
dest.writeString(localFileUrl); dest.writeString(localFileUrl);
dest.writeString(downloadUrl); dest.writeString(downloadUrl);
dest.writeByte((byte) ((downloaded) ? 1 : 0)); dest.writeLong(downloadDate);
dest.writeLong((playbackCompletionDate != null) ? playbackCompletionDate.getTime() : 0); dest.writeLong((playbackCompletionDate != null) ? playbackCompletionDate.getTime() : 0);
dest.writeInt(playedDuration); dest.writeInt(playedDuration);
dest.writeLong(lastPlayedTime); dest.writeLong(lastPlayedTime);
@ -393,7 +393,7 @@ public class FeedMedia implements Playable {
} }
public boolean isDownloaded() { public boolean isDownloaded() {
return downloaded; return downloadDate > 0;
} }
public long getItemId() { public long getItemId() {
@ -441,7 +441,7 @@ public class FeedMedia implements Playable {
final long id = in.readLong(); final long id = in.readLong();
final long itemID = in.readLong(); final long itemID = in.readLong();
FeedMedia result = new FeedMedia(id, null, in.readInt(), in.readInt(), in.readLong(), in.readString(), in.readString(), FeedMedia result = new FeedMedia(id, null, in.readInt(), in.readInt(), in.readLong(), in.readString(), in.readString(),
in.readString(), in.readByte() != 0, new Date(in.readLong()), in.readInt(), in.readLong()); in.readString(), in.readLong(), new Date(in.readLong()), in.readInt(), in.readLong());
result.itemID = itemID; result.itemID = itemID;
return result; return result;
} }
@ -466,17 +466,21 @@ public class FeedMedia implements Playable {
this.hasEmbeddedPicture = hasEmbeddedPicture; this.hasEmbeddedPicture = hasEmbeddedPicture;
} }
public void setDownloaded(boolean downloaded) { public void setDownloaded(boolean downloaded, long when) {
this.downloaded = downloaded; this.downloadDate = downloaded ? when : 0;
if (item != null && downloaded && item.isNew()) { if (item != null && downloaded && item.isNew()) {
item.setPlayed(false); item.setPlayed(false);
} }
} }
public long getDownloadDate() {
return downloadDate;
}
public void setLocalFileUrl(String fileUrl) { public void setLocalFileUrl(String fileUrl) {
this.localFileUrl = fileUrl; this.localFileUrl = fileUrl;
if (fileUrl == null) { if (fileUrl == null) {
downloaded = false; downloadDate = 0;
} }
} }

View File

@ -28,7 +28,7 @@ public class FeedMediaTest {
when(item.isPlayed()).thenReturn(false); when(item.isPlayed()).thenReturn(false);
media.setItem(item); media.setItem(item);
media.setDownloaded(true); media.setDownloaded(true, System.currentTimeMillis());
verify(item, never()).setNew(); verify(item, never()).setNew();
verify(item, never()).setPlayed(true); verify(item, never()).setPlayed(true);
@ -45,7 +45,7 @@ public class FeedMediaTest {
when(item.isPlayed()).thenReturn(true); when(item.isPlayed()).thenReturn(true);
media.setItem(item); media.setItem(item);
media.setDownloaded(true); media.setDownloaded(true, System.currentTimeMillis());
verify(item, never()).setNew(); verify(item, never()).setNew();
verify(item, never()).setPlayed(true); verify(item, never()).setPlayed(true);
@ -62,7 +62,7 @@ public class FeedMediaTest {
when(item.isPlayed()).thenReturn(false); when(item.isPlayed()).thenReturn(false);
media.setItem(item); media.setItem(item);
media.setDownloaded(true); media.setDownloaded(true, System.currentTimeMillis());
verify(item).setPlayed(false); verify(item).setPlayed(false);
verify(item, never()).setNew(); verify(item, never()).setNew();

View File

@ -117,6 +117,6 @@ public class DownloadRequestBuilderTest {
private FeedMedia createFeedItem(final int id) { private FeedMedia createFeedItem(final int id) {
// Use mockito would be less verbose, but it'll take extra 1 second for this tiny test // Use mockito would be less verbose, but it'll take extra 1 second for this tiny test
return new FeedMedia(id, null, 0, 0, 0, "", "", "http://example.com/episode" + id, false, null, 0, 0); return new FeedMedia(id, null, 0, 0, 0, "", "", "http://example.com/episode" + id, 0, null, 0, 0);
} }
} }

View File

@ -50,7 +50,7 @@ public class MediaDownloadedHandler implements Runnable {
} }
// media.setDownloaded modifies played state // media.setDownloaded modifies played state
boolean broadcastUnreadStateUpdate = media.getItem() != null && media.getItem().isNew(); boolean broadcastUnreadStateUpdate = media.getItem() != null && media.getItem().isNew();
media.setDownloaded(true); media.setDownloaded(true, System.currentTimeMillis());
media.setLocalFileUrl(request.getDestination()); media.setLocalFileUrl(request.getDestination());
media.setSize(new File(request.getDestination()).length()); media.setSize(new File(request.getDestination()).length());
media.checkEmbeddedPicture(); // enforce check media.checkEmbeddedPicture(); // enforce check

View File

@ -172,7 +172,7 @@ public class LocalFeedUpdater {
long size = file.getLength(); long size = file.getLength();
FeedMedia media = new FeedMedia(0, item, 0, 0, size, file.getType(), FeedMedia media = new FeedMedia(0, item, 0, 0, size, file.getType(),
file.getUri().toString(), file.getUri().toString(), false, null, 0, 0); file.getUri().toString(), file.getUri().toString(), 0, null, 0, 0);
item.setMedia(media); item.setMedia(media);
for (FeedItem existingItem : feed.getItems()) { for (FeedItem existingItem : feed.getItems()) {

View File

@ -137,7 +137,7 @@ public class DbCleanupTests {
assertTrue(f.createNewFile()); assertTrue(f.createNewFile());
files.add(f); files.add(f);
item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m",
f.getAbsolutePath(), "url", true, playbackCompletionDate, 0, 0)); f.getAbsolutePath(), "url", System.currentTimeMillis(), playbackCompletionDate, 0, 0));
items.add(item); items.add(item);
} }
@ -206,7 +206,7 @@ public class DbCleanupTests {
List<Feed> feeds = saveFeedlist(1, 1, true); List<Feed> feeds = saveFeedlist(1, 1, true);
FeedMedia m = feeds.get(0).getItems().get(0).getMedia(); FeedMedia m = feeds.get(0).getItems().get(0).getMedia();
//noinspection ConstantConditions //noinspection ConstantConditions
m.setDownloaded(true); m.setDownloaded(true, System.currentTimeMillis());
m.setLocalFileUrl("file"); m.setLocalFileUrl("file");
PodDBAdapter adapter = PodDBAdapter.getInstance(); PodDBAdapter adapter = PodDBAdapter.getInstance();
adapter.open(); adapter.open();

View File

@ -101,7 +101,7 @@ public class DbNullCleanupAlgorithmTest {
File f = new File(destFolder, "file " + i); File f = new File(destFolder, "file " + i);
assertTrue(f.createNewFile()); assertTrue(f.createNewFile());
files.add(f); files.add(f);
item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", true, item.setMedia(new FeedMedia(0, item, 1, 0, 1L, "m", f.getAbsolutePath(), "url", System.currentTimeMillis(),
new Date(numItems - i), 0, 0)); new Date(numItems - i), 0, 0));
items.add(item); items.add(item);
} }

View File

@ -231,7 +231,7 @@ public class DbReaderTest {
int i = random.nextInt(numItems); int i = random.nextInt(numItems);
if (!downloaded.contains(items.get(i))) { if (!downloaded.contains(items.get(i))) {
FeedItem item = items.get(i); FeedItem item = items.get(i);
item.getMedia().setDownloaded(true); item.getMedia().setDownloaded(true, System.currentTimeMillis());
item.getMedia().setLocalFileUrl("file" + i); item.getMedia().setLocalFileUrl("file" + i);
downloaded.add(item); downloaded.add(item);
} }

View File

@ -101,7 +101,7 @@ public class DbWriterTest {
FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, feed); FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, feed);
items.add(item); items.add(item);
FeedMedia media = new FeedMedia(0, item, duration, 1, 1, "mime_type", FeedMedia media = new FeedMedia(0, item, duration, 1, 1, "mime_type",
"dummy path", "download_url", true, null, 0, 0); "dummy path", "download_url", System.currentTimeMillis(), null, 0, 0);
item.setMedia(media); item.setMedia(media);
DBWriter.setFeedItem(item).get(TIMEOUT, TimeUnit.SECONDS); DBWriter.setFeedItem(item).get(TIMEOUT, TimeUnit.SECONDS);
@ -133,7 +133,7 @@ public class DbWriterTest {
FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, feed); FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.PLAYED, feed);
FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type", FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type",
dest.getAbsolutePath(), "download_url", true, null, 0, 0); dest.getAbsolutePath(), "download_url", System.currentTimeMillis(), null, 0, 0);
item.setMedia(media); item.setMedia(media);
items.add(item); items.add(item);
@ -168,7 +168,7 @@ public class DbWriterTest {
FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.UNPLAYED, feed); FeedItem item = new FeedItem(0, "Item", "Item", "url", new Date(), FeedItem.UNPLAYED, feed);
FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type", FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type",
dest.getAbsolutePath(), "download_url", true, null, 0, 0); dest.getAbsolutePath(), "download_url", System.currentTimeMillis(), null, 0, 0);
item.setMedia(media); item.setMedia(media);
items.add(item); items.add(item);
@ -214,7 +214,7 @@ public class DbWriterTest {
itemFiles.add(enc); itemFiles.add(enc);
FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type", FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type",
enc.getAbsolutePath(), "download_url", true, null, 0, 0); enc.getAbsolutePath(), "download_url", System.currentTimeMillis(), null, 0, 0);
item.setMedia(media); item.setMedia(media);
} }
@ -335,7 +335,7 @@ public class DbWriterTest {
feed.getItems().add(item); feed.getItems().add(item);
File enc = new File(destFolder, "file " + i); File enc = new File(destFolder, "file " + i);
FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type", FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type",
enc.getAbsolutePath(), "download_url", false, null, 0, 0); enc.getAbsolutePath(), "download_url", 0, null, 0, 0);
item.setMedia(media); item.setMedia(media);
} }
@ -395,7 +395,7 @@ public class DbWriterTest {
feed.getItems().add(item); feed.getItems().add(item);
File enc = new File(destFolder, "file " + i); File enc = new File(destFolder, "file " + i);
FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type", FeedMedia media = new FeedMedia(0, item, 1, 1, 1, "mime_type",
enc.getAbsolutePath(), "download_url", false, null, 0, 0); enc.getAbsolutePath(), "download_url", 0, null, 0, 0);
item.setMedia(media); item.setMedia(media);
} }
@ -469,7 +469,7 @@ public class DbWriterTest {
feed.setItems(new ArrayList<>()); feed.setItems(new ArrayList<>());
FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed); FeedItem item = new FeedItem(0, "title", "id", "link", new Date(), FeedItem.PLAYED, feed);
FeedMedia media = new FeedMedia(0, item, 10, 0, 1, "mime", null, FeedMedia media = new FeedMedia(0, item, 10, 0, 1, "mime", null,
"url", false, playbackCompletionDate, 0, 0); "url", 0, playbackCompletionDate, 0, 0);
feed.getItems().add(item); feed.getItems().add(item);
item.setMedia(media); item.setMedia(media);
PodDBAdapter adapter = PodDBAdapter.getInstance(); PodDBAdapter adapter = PodDBAdapter.getInstance();

View File

@ -146,10 +146,10 @@ class DBUpgrader {
+ " ADD COLUMN " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + " INTEGER DEFAULT -1"); + " ADD COLUMN " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + " INTEGER DEFAULT -1");
db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA db.execSQL("UPDATE " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " SET " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=0" + " SET " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=0"
+ " WHERE " + PodDBAdapter.KEY_DOWNLOADED + "=0"); + " WHERE " + PodDBAdapter.KEY_DOWNLOAD_DATE + "=0");
Cursor c = db.rawQuery("SELECT " + PodDBAdapter.KEY_FILE_URL Cursor c = db.rawQuery("SELECT " + PodDBAdapter.KEY_FILE_URL
+ " FROM " + PodDBAdapter.TABLE_NAME_FEED_MEDIA + " FROM " + PodDBAdapter.TABLE_NAME_FEED_MEDIA
+ " WHERE " + PodDBAdapter.KEY_DOWNLOADED + "=1 " + " WHERE " + PodDBAdapter.KEY_DOWNLOAD_DATE + "=1 "
+ " AND " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=-1", null); + " AND " + PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE + "=-1", null);
if (c.moveToFirst()) { if (c.moveToFirst()) {
MediaMetadataRetriever mmr = new MediaMetadataRetriever(); MediaMetadataRetriever mmr = new MediaMetadataRetriever();
@ -185,7 +185,7 @@ class DBUpgrader {
+ PodDBAdapter.TABLE_NAME_QUEUE + "." + PodDBAdapter.KEY_FEEDITEM + PodDBAdapter.TABLE_NAME_QUEUE + "." + PodDBAdapter.KEY_FEEDITEM
+ " WHERE " + " WHERE "
+ PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_READ + " = 0 AND " // unplayed + PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_READ + " = 0 AND " // unplayed
+ PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DOWNLOADED + " = 0 AND " // undownloaded + PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DOWNLOAD_DATE + " = 0 AND " // undownloaded
+ PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_POSITION + " = 0 AND " // not partially played + PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_POSITION + " = 0 AND " // not partially played
+ PodDBAdapter.TABLE_NAME_QUEUE + "." + PodDBAdapter.KEY_ID + " IS NULL"; // not in queue + PodDBAdapter.TABLE_NAME_QUEUE + "." + PodDBAdapter.KEY_ID + " IS NULL"; // not in queue
String sql = "UPDATE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS String sql = "UPDATE " + PodDBAdapter.TABLE_NAME_FEED_ITEMS

View File

@ -123,7 +123,7 @@ public class DBWriter {
if (mediaFile.exists() && !mediaFile.delete()) { if (mediaFile.exists() && !mediaFile.delete()) {
Log.d(TAG, "Deletion of downloaded file failed."); Log.d(TAG, "Deletion of downloaded file failed.");
} }
media.setDownloaded(false); media.setDownloaded(false, 0);
media.setLocalFileUrl(null); media.setLocalFileUrl(null);
media.setHasEmbeddedPicture(false); media.setHasEmbeddedPicture(false);
PodDBAdapter adapter = PodDBAdapter.getInstance(); PodDBAdapter adapter = PodDBAdapter.getInstance();

View File

@ -76,7 +76,7 @@ public class PodDBAdapter {
public static final String KEY_IMAGE_URL = "image_url"; public static final String KEY_IMAGE_URL = "image_url";
public static final String KEY_FEED = "feed"; public static final String KEY_FEED = "feed";
public static final String KEY_MEDIA = "media"; public static final String KEY_MEDIA = "media";
public static final String KEY_DOWNLOADED = "downloaded"; public static final String KEY_DOWNLOAD_DATE = "downloaded";
public static final String KEY_LAST_REFRESH_ATTEMPT = "downloaded"; public static final String KEY_LAST_REFRESH_ATTEMPT = "downloaded";
public static final String KEY_LASTUPDATE = "last_update"; public static final String KEY_LASTUPDATE = "last_update";
public static final String KEY_FEEDFILE = "feedfile"; public static final String KEY_FEEDFILE = "feedfile";
@ -187,7 +187,7 @@ public class PodDBAdapter {
private static final String CREATE_TABLE_FEED_MEDIA = "CREATE TABLE " private static final String CREATE_TABLE_FEED_MEDIA = "CREATE TABLE "
+ TABLE_NAME_FEED_MEDIA + " (" + TABLE_PRIMARY_KEY + KEY_DURATION + TABLE_NAME_FEED_MEDIA + " (" + TABLE_PRIMARY_KEY + KEY_DURATION
+ " INTEGER," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL + " INTEGER," + KEY_FILE_URL + " TEXT," + KEY_DOWNLOAD_URL
+ " TEXT," + KEY_DOWNLOADED + " INTEGER," + KEY_POSITION + " TEXT," + KEY_DOWNLOAD_DATE + " INTEGER," + KEY_POSITION
+ " INTEGER," + KEY_SIZE + " INTEGER," + KEY_MIME_TYPE + " TEXT," + " INTEGER," + KEY_SIZE + " INTEGER," + KEY_MIME_TYPE + " TEXT,"
+ KEY_PLAYBACK_COMPLETION_DATE + " INTEGER," + KEY_PLAYBACK_COMPLETION_DATE + " INTEGER,"
+ KEY_FEEDITEM + " INTEGER," + KEY_FEEDITEM + " INTEGER,"
@ -277,7 +277,7 @@ public class PodDBAdapter {
+ TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_FILE_URL + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_FILE_URL + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_URL + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_URL + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_DATE + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_POSITION + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + ", "
+ TABLE_NAME_FEED_MEDIA + "." + KEY_MIME_TYPE + ", " + TABLE_NAME_FEED_MEDIA + "." + KEY_MIME_TYPE + ", "
@ -504,7 +504,7 @@ public class PodDBAdapter {
values.put(KEY_SIZE, media.getSize()); values.put(KEY_SIZE, media.getSize());
values.put(KEY_MIME_TYPE, media.getMimeType()); values.put(KEY_MIME_TYPE, media.getMimeType());
values.put(KEY_DOWNLOAD_URL, media.getDownloadUrl()); values.put(KEY_DOWNLOAD_URL, media.getDownloadUrl());
values.put(KEY_DOWNLOADED, media.isDownloaded()); values.put(KEY_DOWNLOAD_DATE, media.getDownloadDate());
values.put(KEY_FILE_URL, media.getLocalFileUrl()); values.put(KEY_FILE_URL, media.getLocalFileUrl());
values.put(KEY_HAS_EMBEDDED_PICTURE, media.hasEmbeddedPicture()); values.put(KEY_HAS_EMBEDDED_PICTURE, media.hasEmbeddedPicture());
values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime()); values.put(KEY_LAST_PLAYED_TIME, media.getLastPlayedTime());
@ -1202,9 +1202,9 @@ public class PodDBAdapter {
+ "IFNULL(SUM(CASE WHEN (" + timeFilter + ")" + "IFNULL(SUM(CASE WHEN (" + timeFilter + ")"
+ " THEN (" + playedTime + ") ELSE 0 END), 0) AS played_time, " + " THEN (" + playedTime + ") ELSE 0 END), 0) AS played_time, "
+ "IFNULL(SUM(" + TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + "), 0) AS total_time, " + "IFNULL(SUM(" + TABLE_NAME_FEED_MEDIA + "." + KEY_DURATION + "), 0) AS total_time, "
+ "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " > 0" + "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_DATE + " > 0"
+ " THEN 1 ELSE 0 END) AS num_downloaded, " + " THEN 1 ELSE 0 END) AS num_downloaded, "
+ "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOADED + " > 0" + "SUM(CASE WHEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_DOWNLOAD_DATE + " > 0"
+ " THEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + " ELSE 0 END) AS download_size" + " THEN " + TABLE_NAME_FEED_MEDIA + "." + KEY_SIZE + " ELSE 0 END) AS download_size"
+ " FROM " + TABLE_NAME_FEED_ITEMS + " FROM " + TABLE_NAME_FEED_ITEMS
+ JOIN_FEED_ITEM_AND_MEDIA + JOIN_FEED_ITEM_AND_MEDIA
@ -1251,12 +1251,12 @@ public class PodDBAdapter {
+ " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")"; + " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")";
break; break;
case SHOW_DOWNLOADED: case SHOW_DOWNLOADED:
whereRead = KEY_DOWNLOADED + "=1"; whereRead = KEY_DOWNLOAD_DATE + ">0";
break; break;
case SHOW_DOWNLOADED_UNPLAYED: case SHOW_DOWNLOADED_UNPLAYED:
whereRead = "(" + KEY_READ + "=" + FeedItem.NEW whereRead = "(" + KEY_READ + "=" + FeedItem.NEW
+ " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")" + " OR " + KEY_READ + "=" + FeedItem.UNPLAYED + ")"
+ " AND " + KEY_DOWNLOADED + "=1"; + " AND " + KEY_DOWNLOAD_DATE + ">0";
break; break;
case SHOW_NONE: case SHOW_NONE:
// deliberate fall-through // deliberate fall-through

View File

@ -23,7 +23,7 @@ public class FeedItemFilterQuery {
String keyRead = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_READ; String keyRead = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_READ;
String keyPosition = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_POSITION; String keyPosition = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_POSITION;
String keyCompletionDate = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE; String keyCompletionDate = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_PLAYBACK_COMPLETION_DATE;
String keyDownloaded = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DOWNLOADED; String keyDownloaded = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_DOWNLOAD_DATE;
String keyMediaId = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_ID; String keyMediaId = PodDBAdapter.TABLE_NAME_FEED_MEDIA + "." + PodDBAdapter.KEY_ID;
String keyItemId = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_ID; String keyItemId = PodDBAdapter.TABLE_NAME_FEED_ITEMS + "." + PodDBAdapter.KEY_ID;
String keyFeedItem = PodDBAdapter.KEY_FEEDITEM; String keyFeedItem = PodDBAdapter.KEY_FEEDITEM;
@ -49,7 +49,7 @@ public class FeedItemFilterQuery {
statements.add(keyItemId + " NOT IN (SELECT " + keyFeedItem + " FROM " + tableQueue + ") "); statements.add(keyItemId + " NOT IN (SELECT " + keyFeedItem + " FROM " + tableQueue + ") ");
} }
if (filter.showDownloaded) { if (filter.showDownloaded) {
statements.add(keyDownloaded + " = 1 "); statements.add(keyDownloaded + " > 0 ");
} else if (filter.showNotDownloaded) { } else if (filter.showNotDownloaded) {
statements.add(keyDownloaded + " = 0 "); statements.add(keyDownloaded + " = 0 ");
} }

View File

@ -20,7 +20,7 @@ public class FeedMediaCursor extends CursorWrapper {
private final int indexMimeType; private final int indexMimeType;
private final int indexFileUrl; private final int indexFileUrl;
private final int indexDownloadUrl; private final int indexDownloadUrl;
private final int indexDownloaded; private final int indexDownloadDate;
private final int indexPlayedDuration; private final int indexPlayedDuration;
private final int indexLastPlayedTime; private final int indexLastPlayedTime;
private final int indexHasEmbeddedPicture; private final int indexHasEmbeddedPicture;
@ -35,7 +35,7 @@ public class FeedMediaCursor extends CursorWrapper {
indexMimeType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MIME_TYPE); indexMimeType = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_MIME_TYPE);
indexFileUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FILE_URL); indexFileUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_FILE_URL);
indexDownloadUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_URL); indexDownloadUrl = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_URL);
indexDownloaded = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOADED); indexDownloadDate = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_DOWNLOAD_DATE);
indexPlayedDuration = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PLAYED_DURATION); indexPlayedDuration = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_PLAYED_DURATION);
indexLastPlayedTime = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_PLAYED_TIME); indexLastPlayedTime = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_LAST_PLAYED_TIME);
indexHasEmbeddedPicture = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE); indexHasEmbeddedPicture = cursor.getColumnIndexOrThrow(PodDBAdapter.KEY_HAS_EMBEDDED_PICTURE);
@ -71,7 +71,7 @@ public class FeedMediaCursor extends CursorWrapper {
getString(indexMimeType), getString(indexMimeType),
getString(indexFileUrl), getString(indexFileUrl),
getString(indexDownloadUrl), getString(indexDownloadUrl),
getInt(indexDownloaded) > 0, getLong(indexDownloadDate),
playbackCompletionDate, playbackCompletionDate,
getInt(indexPlayedDuration), getInt(indexPlayedDuration),
hasEmbeddedPicture, hasEmbeddedPicture,

View File

@ -1,8 +1,6 @@
package de.danoeh.antennapod.storage.database; package de.danoeh.antennapod.storage.database;
import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.model.feed.SortOrder;
import de.danoeh.antennapod.storage.database.FeedItemPermutors;
import de.danoeh.antennapod.storage.database.Permutor;
import org.junit.Test; import org.junit.Test;
import java.util.ArrayList; import java.util.ArrayList;
@ -188,21 +186,24 @@ public class FeedItemPermutorsTest {
calendar.set(2019, 0, 1); // January 1st calendar.set(2019, 0, 1); // January 1st
Feed feed1 = new Feed(null, null, "Feed title 1"); Feed feed1 = new Feed(null, null, "Feed title 1");
FeedItem feedItem1 = new FeedItem(1, "Title 1", null, null, calendar.getTime(), 0, feed1); FeedItem feedItem1 = new FeedItem(1, "Title 1", null, null, calendar.getTime(), 0, feed1);
FeedMedia feedMedia1 = new FeedMedia(0, feedItem1, 1000, 0, 100, null, null, null, true, null, 0, 0); FeedMedia feedMedia1 = new FeedMedia(0, feedItem1, 1000, 0, 100, null, null, null,
System.currentTimeMillis(), null, 0, 0);
feedItem1.setMedia(feedMedia1); feedItem1.setMedia(feedMedia1);
itemList.add(feedItem1); itemList.add(feedItem1);
calendar.set(2019, 2, 1); // March 1st calendar.set(2019, 2, 1); // March 1st
Feed feed2 = new Feed(null, null, "Feed title 3"); Feed feed2 = new Feed(null, null, "Feed title 3");
FeedItem feedItem2 = new FeedItem(3, "Title 3", null, null, calendar.getTime(), 0, feed2); FeedItem feedItem2 = new FeedItem(3, "Title 3", null, null, calendar.getTime(), 0, feed2);
FeedMedia feedMedia2 = new FeedMedia(0, feedItem2, 3000, 0, 300, null, null, null, true, null, 0, 0); FeedMedia feedMedia2 = new FeedMedia(0, feedItem2, 3000, 0, 300, null, null, null,
System.currentTimeMillis(), null, 0, 0);
feedItem2.setMedia(feedMedia2); feedItem2.setMedia(feedMedia2);
itemList.add(feedItem2); itemList.add(feedItem2);
calendar.set(2019, 1, 1); // February 1st calendar.set(2019, 1, 1); // February 1st
Feed feed3 = new Feed(null, null, "Feed title 2"); Feed feed3 = new Feed(null, null, "Feed title 2");
FeedItem feedItem3 = new FeedItem(2, "Title 2", null, null, calendar.getTime(), 0, feed3); FeedItem feedItem3 = new FeedItem(2, "Title 2", null, null, calendar.getTime(), 0, feed3);
FeedMedia feedMedia3 = new FeedMedia(0, feedItem3, 2000, 0, 200, null, null, null, true, null, 0, 0); FeedMedia feedMedia3 = new FeedMedia(0, feedItem3, 2000, 0, 200, null, null, null,
System.currentTimeMillis(), null, 0, 0);
feedItem3.setMedia(feedMedia3); feedItem3.setMedia(feedMedia3);
itemList.add(feedItem3); itemList.add(feedItem3);