package de.danoeh.antennapod.core.feed;
import android.text.TextUtils;
import java.util.ArrayList;
import java.util.List;
import de.danoeh.antennapod.core.storage.DBReader;
import de.danoeh.antennapod.core.util.LongList;
public class FeedItemFilter {
private final String[] mProperties;
private boolean showPlayed = false;
private boolean showUnplayed = false;
private boolean showPaused = false;
private boolean showQueued = false;
private boolean showNotQueued = false;
private boolean showDownloaded = false;
private boolean showNotDownloaded = false;
public FeedItemFilter(String properties) {
this(TextUtils.split(properties, ","));
}
public FeedItemFilter(String[] properties) {
this.mProperties = properties;
for(String property : properties) {
// see R.arrays.feed_filter_values
switch(property) {
case "unplayed":
showUnplayed = true;
break;
case "paused":
showPaused = true;
break;
case "played":
showPlayed = true;
break;
case "queued":
showQueued = true;
break;
case "not_queued":
showNotQueued = true;
break;
case "downloaded":
showDownloaded = true;
break;
case "not_downloaded":
showNotDownloaded = true;
break;
}
}
}
/**
* Run a list of feed items through the filter.
*/
public List<FeedItem> filter(List<FeedItem> items) {
if(mProperties.length == 0) return items;
List<FeedItem> result = new ArrayList<>();
// Check for filter combinations that will always return an empty list
// (e.g. requiring played and unplayed at the same time)
if (showPlayed && showUnplayed) return result;
if (showQueued && showNotQueued) return result;
if (showDownloaded && showNotDownloaded) return result;
final LongList queuedIds = DBReader.getQueueIDList();
for(FeedItem item : items) {
// If the item does not meet a requirement, skip it.
if (showPlayed && !item.isPlayed()) continue;
if (showUnplayed && item.isPlayed()) continue;
if (showPaused && item.getState() != FeedItem.State.IN_PROGRESS) continue;
boolean queued = queuedIds.contains(item.getId());
if (showQueued && !queued) continue;
if (showNotQueued && queued) continue;
boolean downloaded = item.getMedia() != null && item.getMedia().isDownloaded();
if (showDownloaded && !downloaded) continue;
if (showNotDownloaded && downloaded) continue;
// If the item reaches here, it meets all criteria
result.add(item);
}
return result;
}
public String[] getValues() {
return mProperties.clone();
}
}