package de.danoeh.antennapod.core.storage;
import android.content.Context;
import android.support.annotation.NonNull;
import android.util.Log;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.core.feed.FeedItem;
/**
* A cleanup algorithm that removes any item that isn't in the queue and isn't a favorite
* but only if space is needed.
*/
public class APQueueCleanupAlgorithm extends EpisodeCleanupAlgorithm {
private static final String TAG = "APQueueCleanupAlgorithm";
/**
* @return the number of episodes that *could* be cleaned up, if needed
*/
public int getReclaimableItems()
{
return getCandidates().size();
}
@Override
public int performCleanup(Context context, int numberOfEpisodesToDelete) {
List<FeedItem> candidates = getCandidates();
List<FeedItem> delete;
// in the absence of better data, we'll sort by item publication date
Collections.sort(candidates, (lhs, rhs) -> {
Date l = lhs.getPubDate();
Date r = rhs.getPubDate();
if (l == null) {
l = new Date();
}
if (r == null) {
r = new Date();
}
return l.compareTo(r);
});
if (candidates.size() > numberOfEpisodesToDelete) {
delete = candidates.subList(0, numberOfEpisodesToDelete);
} else {
delete = candidates;
}
for (FeedItem item : delete) {
try {
DBWriter.deleteFeedMediaOfItem(context, item.getMedia().getId()).get();
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
int counter = delete.size();
Log.i(TAG, String.format(
"Auto-delete deleted %d episodes (%d requested)", counter,
numberOfEpisodesToDelete));
return counter;
}
@NonNull
private List<FeedItem> getCandidates() {
List<FeedItem> candidates = new ArrayList<>();
List<FeedItem> downloadedItems = DBReader.getDownloadedItems();
for (FeedItem item : downloadedItems) {
if (item.hasMedia()
&& item.getMedia().isDownloaded()
&& !item.isTagged(FeedItem.TAG_QUEUE)
&& !item.isTagged(FeedItem.TAG_FAVORITE)) {
candidates.add(item);
}
}
return candidates;
}
@Override
public int getDefaultCleanupParameter() {
return getNumEpisodesToCleanup(0);
}
}