Faster feed deletion (#7019)

This commit is contained in:
ByteHamster 2024-03-24 12:25:32 +01:00 committed by GitHub
parent 79856b7931
commit 5218e06904
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 31 additions and 28 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);
}
};

View File

@ -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)

View File

@ -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));

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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());
}

View File

@ -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();
}

View File

@ -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);

View File

@ -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);

View File

@ -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);