Clean up non-subscribed feeds

This commit is contained in:
ByteHamster 2024-04-16 23:42:23 +02:00
parent 2bc755abba
commit 2037978dd3
3 changed files with 152 additions and 1 deletions

View File

@ -34,6 +34,7 @@ import de.danoeh.antennapod.model.download.DownloadRequest;
import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequestBuilder;
import de.danoeh.antennapod.parser.feed.FeedHandlerResult;
import de.danoeh.antennapod.storage.database.NonSubscribedFeedsCleaner;
import de.danoeh.antennapod.ui.notifications.NotificationUtils;
import java.util.ArrayList;
import java.util.Collections;
@ -96,8 +97,9 @@ public class FeedUpdateWorker extends Worker {
}
refreshFeeds(toUpdate, force);
notificationManager.cancel(R.id.notification_updating_feeds);
NonSubscribedFeedsCleaner.deleteOldNonSubscribedFeeds(getApplicationContext());
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(getApplicationContext());
notificationManager.cancel(R.id.notification_updating_feeds);
return Result.success();
}

View File

@ -0,0 +1,45 @@
package de.danoeh.antennapod.storage.database;
import android.content.Context;
import android.util.Log;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedItemFilter;
import de.danoeh.antennapod.model.feed.SortOrder;
import java.util.List;
public class NonSubscribedFeedsCleaner {
private static final String TAG = "NonSubscrFeedsCleaner";
public static void deleteOldNonSubscribedFeeds(Context context) {
List<Feed> feeds = DBReader.getFeedList();
for (Feed feed : feeds) {
if (feed.getState() != Feed.STATE_NOT_SUBSCRIBED) {
continue;
}
DBReader.getFeedItemList(feed, FeedItemFilter.unfiltered(), SortOrder.DATE_NEW_OLD, 0, Integer.MAX_VALUE);
if (shouldDelete(feed)) {
Log.d(TAG, "Deleting unsubscribed feed " + feed.getTitle());
DBWriter.deleteFeed(context, feed.getId());
}
feed.setItems(null); // Let it be garbage collected
}
}
public static boolean shouldDelete(Feed feed) {
if (feed.getState() != Feed.STATE_NOT_SUBSCRIBED) {
return false;
} else if (feed.getItems() == null) {
return false;
}
for (FeedItem item : feed.getItems()) {
if (item.isTagged(FeedItem.TAG_FAVORITE)
|| item.isTagged(FeedItem.TAG_QUEUE)
|| item.isDownloaded()) {
return false;
}
}
return feed.getLastRefreshAttempt() < System.currentTimeMillis() - 1000L * 3600 * 24 * 100;
}
}

View File

@ -0,0 +1,104 @@
package de.danoeh.antennapod.storage.database;
import de.danoeh.antennapod.model.feed.Feed;
import de.danoeh.antennapod.model.feed.FeedItem;
import de.danoeh.antennapod.model.feed.FeedMedia;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.robolectric.RobolectricTestRunner;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@RunWith(RobolectricTestRunner.class)
public class NonSubscribedFeedsCleanerTest {
@Test
public void testSubscribed() {
Feed feed = createFeed();
feed.setLastRefreshAttempt(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(200, TimeUnit.DAYS));
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
feed.setState(Feed.STATE_NOT_SUBSCRIBED);
assertTrue(NonSubscribedFeedsCleaner.shouldDelete(feed));
}
@Test
public void testOldDate() {
Feed feed = createFeed();
feed.setState(Feed.STATE_NOT_SUBSCRIBED);
feed.setLastRefreshAttempt(System.currentTimeMillis());
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
feed.setLastRefreshAttempt(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(10, TimeUnit.DAYS));
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
feed.setLastRefreshAttempt(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(200, TimeUnit.DAYS));
assertTrue(NonSubscribedFeedsCleaner.shouldDelete(feed));
feed.setLastRefreshAttempt(System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(200, TimeUnit.DAYS));
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
}
@Test
public void testQueuedItem() {
Feed feed = createFeed();
feed.setState(Feed.STATE_NOT_SUBSCRIBED);
feed.setLastRefreshAttempt(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(200, TimeUnit.DAYS));
feed.getItems().add(createItem(feed));
assertTrue(NonSubscribedFeedsCleaner.shouldDelete(feed));
FeedItem queuedItem = createItem(feed);
queuedItem.addTag(FeedItem.TAG_QUEUE);
feed.getItems().add(queuedItem);
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
}
@Test
public void testFavoriteItem() {
Feed feed = createFeed();
feed.setState(Feed.STATE_NOT_SUBSCRIBED);
feed.setLastRefreshAttempt(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(200, TimeUnit.DAYS));
feed.getItems().add(createItem(feed));
assertTrue(NonSubscribedFeedsCleaner.shouldDelete(feed));
FeedItem queuedItem = createItem(feed);
queuedItem.addTag(FeedItem.TAG_FAVORITE);
feed.getItems().add(queuedItem);
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
}
@Test
public void testDownloadedItem() {
Feed feed = createFeed();
feed.setState(Feed.STATE_NOT_SUBSCRIBED);
feed.setLastRefreshAttempt(System.currentTimeMillis() - TimeUnit.MILLISECONDS.convert(200, TimeUnit.DAYS));
feed.getItems().add(createItem(feed));
assertTrue(NonSubscribedFeedsCleaner.shouldDelete(feed));
FeedItem queuedItem = createItem(feed);
queuedItem.getMedia().setDownloaded(true, System.currentTimeMillis());
feed.getItems().add(queuedItem);
assertFalse(NonSubscribedFeedsCleaner.shouldDelete(feed));
}
private Feed createFeed() {
Feed feed = new Feed(0, null, "title", "http://example.com", "This is the description",
"http://example.com/payment", "Daniel", "en", null, "http://example.com/feed",
"http://example.com/image", null, "http://example.com/feed", System.currentTimeMillis());
feed.setItems(new ArrayList<>());
return feed;
}
private FeedItem createItem(Feed feed) {
FeedItem item = new FeedItem(0, "Item", "ItemId", "url", new Date(), FeedItem.PLAYED, feed);
FeedMedia media = new FeedMedia(item, "http://download.url.net/", 1234567, "audio/mpeg");
media.setId(item.getId());
item.setMedia(media);
return item;
}
}