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.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.ExecutionException;
import de.danoeh.antennapod.core.feed.FeedItem;
import de.danoeh.antennapod.core.feed.FeedMedia;
/**
* Implementation of the EpisodeCleanupAlgorithm interface used by AntennaPod.
*/
public class APCleanupAlgorithm extends EpisodeCleanupAlgorithm {
private static final String TAG = "APCleanupAlgorithm";
/** the number of days after playback to wait before an item is eligible to be cleaned up */
private final int numberOfDaysAfterPlayback;
public APCleanupAlgorithm(int numberOfDaysAfterPlayback) {
this.numberOfDaysAfterPlayback = numberOfDaysAfterPlayback;
}
/**
* @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;
Collections.sort(candidates, (lhs, rhs) -> {
Date l = lhs.getMedia().getPlaybackCompletionDate();
Date r = rhs.getMedia().getPlaybackCompletionDate();
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();
Calendar cal = Calendar.getInstance();
cal.add(Calendar.DAY_OF_MONTH, -1 * numberOfDaysAfterPlayback);
Date mostRecentDateForDeletion = cal.getTime();
for (FeedItem item : downloadedItems) {
if (item.hasMedia()
&& item.getMedia().isDownloaded()
&& !item.isTagged(FeedItem.TAG_QUEUE)
&& item.isPlayed()
&& !item.isTagged(FeedItem.TAG_FAVORITE)) {
FeedMedia media = item.getMedia();
// make sure this candidate was played at least the proper amount of days prior
// to now
if (media != null
&& media.getPlaybackCompletionDate() != null
&& media.getPlaybackCompletionDate().before(mostRecentDateForDeletion)) {
candidates.add(item);
}
}
}
return candidates;
}
@Override
public int getDefaultCleanupParameter() {
return getNumEpisodesToCleanup(0);
}
public int getNumberOfDaysAfterPlayback() { return numberOfDaysAfterPlayback; }
}