summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorByteHamster <ByteHamster@users.noreply.github.com>2024-03-24 12:25:32 +0100
committerGitHub <noreply@github.com>2024-03-24 12:25:32 +0100
commit5218e06904e489f77da4078de775dd0a63b94ef4 (patch)
tree5184c4228bb66027b317d5b0fcc73e08f44d7117
parent79856b7931eebc7093013861de78ac68228ea7e6 (diff)
downloadAntennaPod-5218e06904e489f77da4078de775dd0a63b94ef4.zip
Faster feed deletion (#7019)
-rw-r--r--app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/fragment/swipeactions/DeleteSwipeAction.java2
-rw-r--r--app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceInterfaceImpl.java4
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java26
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java2
-rw-r--r--core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java6
-rw-r--r--model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java4
-rw-r--r--storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java1
13 files changed, 31 insertions, 28 deletions
diff --git a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java
index 16a5a161c..8ee31a03c 100644
--- a/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java
+++ b/app/src/main/java/de/danoeh/antennapod/adapter/actionbutton/DeleteActionButton.java
@@ -39,7 +39,7 @@ public class DeleteActionButton extends ItemActionButton {
}
LocalDeleteModal.showLocalFeedDeleteWarningIfNecessary(context, Collections.singletonList(item),
- () -> DBWriter.deleteFeedMediaOfItem(context, media.getId()));
+ () -> DBWriter.deleteFeedMediaOfItem(context, media));
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java b/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java
index 618c411ea..b4e8a4768 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/actions/EpisodeMultiSelectActionHandler.java
@@ -104,7 +104,7 @@ public class EpisodeMultiSelectActionHandler {
for (FeedItem feedItem : items) {
if (feedItem.hasMedia() && feedItem.getMedia().isDownloaded()) {
countHasMedia++;
- DBWriter.deleteFeedMediaOfItem(activity, feedItem.getMedia().getId());
+ DBWriter.deleteFeedMediaOfItem(activity, feedItem.getMedia());
}
}
showMessage(R.plurals.deleted_multi_episode_batch_label, countHasMedia);
diff --git a/app/src/main/java/de/danoeh/antennapod/fragment/swipeactions/DeleteSwipeAction.java b/app/src/main/java/de/danoeh/antennapod/fragment/swipeactions/DeleteSwipeAction.java
index e196b96b4..462fcf968 100644
--- a/app/src/main/java/de/danoeh/antennapod/fragment/swipeactions/DeleteSwipeAction.java
+++ b/app/src/main/java/de/danoeh/antennapod/fragment/swipeactions/DeleteSwipeAction.java
@@ -40,7 +40,7 @@ public class DeleteSwipeAction implements SwipeAction {
}
LocalDeleteModal.showLocalFeedDeleteWarningIfNecessary(
fragment.requireContext(), Collections.singletonList(item),
- () -> DBWriter.deleteFeedMediaOfItem(fragment.requireContext(), item.getMedia().getId()));
+ () -> DBWriter.deleteFeedMediaOfItem(fragment.requireContext(), item.getMedia()));
}
@Override
diff --git a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
index 5e86e14f0..48e43358f 100644
--- a/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
+++ b/app/src/main/java/de/danoeh/antennapod/menuhandler/FeedItemMenuHandler.java
@@ -153,7 +153,7 @@ public class FeedItemMenuHandler {
context.sendBroadcast(MediaButtonStarter.createIntent(context, KeyEvent.KEYCODE_MEDIA_NEXT));
} else if (menuItemId == R.id.remove_item) {
LocalDeleteModal.showLocalFeedDeleteWarningIfNecessary(context, Arrays.asList(selectedItem),
- () -> DBWriter.deleteFeedMediaOfItem(context, selectedItem.getMedia().getId()));
+ () -> DBWriter.deleteFeedMediaOfItem(context, selectedItem.getMedia()));
} else if (menuItemId == R.id.remove_inbox_item) {
removeNewFlagWithUndo(fragment, selectedItem);
} else if (menuItemId == R.id.mark_read_item) {
@@ -232,7 +232,7 @@ public class FeedItemMenuHandler {
FeedMedia media = item.getMedia();
boolean shouldAutoDelete = FeedUtil.shouldAutoDeleteItemsOnThatFeed(item.getFeed());
if (media != null && FeedItemUtil.hasAlmostEnded(media) && shouldAutoDelete) {
- DBWriter.deleteFeedMediaOfItem(fragment.requireContext(), media.getId());
+ DBWriter.deleteFeedMediaOfItem(fragment.requireContext(), media);
}
};
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceInterfaceImpl.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceInterfaceImpl.java
index e1490923b..6c595388a 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceInterfaceImpl.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadServiceInterfaceImpl.java
@@ -67,7 +67,9 @@ public class DownloadServiceInterfaceImpl extends DownloadServiceInterface {
@Override
public void cancel(Context context, FeedMedia media) {
// This needs to be done here, not in the worker. Reason: The worker might or might not be running.
- DBWriter.deleteFeedMediaOfItem(context, media.getId()); // Remove partially downloaded file
+ if (media.fileExists()) {
+ DBWriter.deleteFeedMediaOfItem(context, media); // Remove partially downloaded file
+ }
String tag = WORK_TAG_EPISODE_URL + media.getDownloadUrl();
Future<List<WorkInfo>> future = WorkManager.getInstance(context).getWorkInfosByTag(tag);
Observable.fromFuture(future)
diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
index 41a8a20ee..195f6b5a4 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java
@@ -1150,7 +1150,7 @@ public class PlaybackService extends MediaBrowserServiceCompat {
&& FeedUtil.shouldAutoDeleteItemsOnThatFeed(item.getFeed()));
if (shouldAutoDelete && (!item.isTagged(FeedItem.TAG_FAVORITE)
|| !UserPreferences.shouldFavoriteKeepEpisode())) {
- DBWriter.deleteFeedMediaOfItem(PlaybackService.this, media.getId());
+ DBWriter.deleteFeedMediaOfItem(PlaybackService.this, media);
Log.d(TAG, "Episode Deleted");
}
notifyChildrenChanged(getString(R.string.queue_label));
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
index 1d2e3ffd2..fad806770 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APCleanupAlgorithm.java
@@ -66,7 +66,7 @@ public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
for (FeedItem item : delete) {
try {
- DBWriter.deleteFeedMediaOfItem(context, item.getMedia().getId()).get();
+ DBWriter.deleteFeedMediaOfItem(context, item.getMedia()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
index 2bd840fd1..4f17760dc 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/APQueueCleanupAlgorithm.java
@@ -58,7 +58,7 @@ public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm {
for (FeedItem item : delete) {
try {
- DBWriter.deleteFeedMediaOfItem(context, item.getMedia().getId()).get();
+ DBWriter.deleteFeedMediaOfItem(context, item.getMedia()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
index 531de0379..ae14afc69 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java
@@ -96,18 +96,16 @@ public class DBWriter {
* Deletes a downloaded FeedMedia file from the storage device.
*
* @param context A context that is used for opening a database connection.
- * @param mediaId ID of the FeedMedia object whose downloaded file should be deleted.
*/
public static Future<?> deleteFeedMediaOfItem(@NonNull final Context context,
- final long mediaId) {
+ final FeedMedia media) {
return runOnDbThread(() -> {
- final FeedMedia media = DBReader.getFeedMedia(mediaId);
- if (media != null) {
- boolean result = deleteFeedMediaSynchronous(context, media);
-
- if (result && UserPreferences.shouldDeleteRemoveFromQueue()) {
- DBWriter.removeQueueItemSynchronous(context, false, media.getItem().getId());
- }
+ if (media == null) {
+ return;
+ }
+ boolean result = deleteFeedMediaSynchronous(context, media);
+ if (result && UserPreferences.shouldDeleteRemoveFromQueue()) {
+ DBWriter.removeQueueItemSynchronous(context, false, media.getItemId());
}
});
}
@@ -174,15 +172,11 @@ public class DBWriter {
*/
public static Future<?> deleteFeed(final Context context, final long feedId) {
return runOnDbThread(() -> {
- final Feed feed = DBReader.getFeed(feedId);
+ final Feed feed = DBReader.getFeed(feedId, false);
if (feed == null) {
return;
}
- // delete stored media files and mark them as read
- if (feed.getItems() == null) {
- DBReader.getFeedItemList(feed);
- }
deleteFeedItemsSynchronous(context, feed.getItems());
// delete feed
@@ -225,7 +219,9 @@ public class DBWriter {
IntentUtils.sendLocalBroadcast(context, PlaybackServiceInterface.ACTION_SHUTDOWN_PLAYBACK_SERVICE);
}
if (!item.getFeed().isLocalFeed()) {
- DownloadServiceInterface.get().cancel(context, item.getMedia());
+ if (DownloadServiceInterface.get().isDownloadingEpisode(item.getMedia().getDownloadUrl())) {
+ DownloadServiceInterface.get().cancel(context, item.getMedia());
+ }
if (item.getMedia().isDownloaded()) {
deleteFeedMediaSynchronous(context, item.getMedia());
}
diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java b/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java
index da01a82f1..33c9e88a8 100644
--- a/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java
+++ b/core/src/main/java/de/danoeh/antennapod/core/storage/ExceptFavoriteCleanupAlgorithm.java
@@ -59,7 +59,7 @@ public class ExceptFavoriteCleanupAlgorithm extends EpisodeCleanupAlgorithm {
for (FeedItem item : delete) {
try {
- DBWriter.deleteFeedMediaOfItem(context, item.getMedia().getId()).get();
+ DBWriter.deleteFeedMediaOfItem(context, item.getMedia()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
diff --git a/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java b/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java
index cfcff56d8..8e4cae855 100644
--- a/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java
+++ b/core/src/test/java/de/danoeh/antennapod/core/storage/DbWriterTest.java
@@ -151,7 +151,7 @@ public class DbWriterTest {
assertTrue(media.getId() != 0);
assertTrue(item.getId() != 0);
- DBWriter.deleteFeedMediaOfItem(context, media.getId())
+ DBWriter.deleteFeedMediaOfItem(context, media)
.get(TIMEOUT, TimeUnit.SECONDS);
media = DBReader.getFeedMedia(media.getId());
assertNotNull(media);
@@ -189,9 +189,9 @@ public class DbWriterTest {
assertTrue(media.getId() != 0);
assertTrue(item.getId() != 0);
queue = DBReader.getQueue();
- assertTrue(queue.size() != 0);
+ assertFalse(queue.isEmpty());
- DBWriter.deleteFeedMediaOfItem(context, media.getId());
+ DBWriter.deleteFeedMediaOfItem(context, media);
Awaitility.await().timeout(2, TimeUnit.SECONDS).until(() -> !dest.exists());
media = DBReader.getFeedMedia(media.getId());
assertNotNull(media);
diff --git a/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java b/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java
index 7cd2d4953..571cbc128 100644
--- a/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java
+++ b/model/src/main/java/de/danoeh/antennapod/model/feed/FeedMedia.java
@@ -414,6 +414,10 @@ public class FeedMedia implements Playable {
return itemID;
}
+ public void setItemId(long id) {
+ itemID = id;
+ }
+
@Override
public void onPlaybackStart() {
startPosition = Math.max(position, 0);
diff --git a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java
index cbc295e70..a169c8fda 100644
--- a/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java
+++ b/storage/database/src/main/java/de/danoeh/antennapod/storage/database/PodDBAdapter.java
@@ -667,6 +667,7 @@ public class PodDBAdapter {
}
if (item.getMedia() != null) {
setMedia(item.getMedia());
+ item.getMedia().setItemId(item.getId());
}
if (item.getChapters() != null) {
setChapters(item);