From 9ef3c99899196538baa446db869c2ac23c15cb99 Mon Sep 17 00:00:00 2001 From: recalculated Date: Sat, 23 Jan 2016 20:16:53 -0600 Subject: Use positive/reverse filtering --- .../java/de/danoeh/antennapod/core/feed/Feed.java | 2 +- .../antennapod/core/feed/FeedItemFilter.java | 76 +++++++++++++--------- core/src/main/res/values/arrays.xml | 4 +- 3 files changed, 48 insertions(+), 34 deletions(-) (limited to 'core') diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java index 0de046fe5..4be788f33 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/Feed.java @@ -544,7 +544,7 @@ public class Feed extends FeedFile implements FlattrThing, ImageResource { return itemfilter; } - public void setHiddenItemProperties(String[] properties) { + public void setItemFilter(String[] properties) { if (properties != null) { this.itemfilter = new FeedItemFilter(properties); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java index 8636ac50a..33f5cf504 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItemFilter.java @@ -8,73 +8,87 @@ import java.util.List; import de.danoeh.antennapod.core.storage.DBReader; public class FeedItemFilter { + private final String[] mProperties; - private final String[] properties; - - private boolean hideUnplayed = false; - private boolean hidePaused = false; - private boolean hidePlayed = false; - private boolean hideQueued = false; - private boolean hideNotQueued = false; - private boolean hideDownloaded = false; - private boolean hideNotDownloaded = false; + 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.properties = properties; + this.mProperties = properties; for(String property : properties) { // see R.arrays.feed_filter_values switch(property) { case "unplayed": - hideUnplayed = true; + showUnplayed = true; break; case "paused": - hidePaused = true; + showPaused = true; break; case "played": - hidePlayed = true; + showPlayed = true; break; case "queued": - hideQueued = true; + showQueued = true; break; case "not_queued": - hideNotQueued = true; + showNotQueued = true; break; case "downloaded": - hideDownloaded = true; + showDownloaded = true; break; case "not_downloaded": - hideNotDownloaded = true; + showNotDownloaded = true; break; } } } + /** + * Run a list of feed items through the filter. + */ public List filter(List items) { - if(properties.length == 0) { - return items; - } - List result = new ArrayList(); + if(mProperties.length == 0) return items; + + List 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; + for(FeedItem item : items) { - if(hideUnplayed && false == item.isPlayed()) continue; - if(hidePaused && item.getState() == FeedItem.State.IN_PROGRESS) continue; - if(hidePlayed && item.isPlayed()) continue; - boolean isQueued = DBReader.getQueueIDList().contains(item.getId()); - if(hideQueued && isQueued) continue; - if(hideNotQueued && false == isQueued) continue; - boolean isDownloaded = item.getMedia() != null && item.getMedia().isDownloaded(); - if(hideDownloaded && isDownloaded) continue; - if(hideNotDownloaded && false == isDownloaded) continue; + // 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 = DBReader.getQueueIDList().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 properties.clone(); + return mProperties.clone(); } } diff --git a/core/src/main/res/values/arrays.xml b/core/src/main/res/values/arrays.xml index 55da0ee04..0de515292 100644 --- a/core/src/main/res/values/arrays.xml +++ b/core/src/main/res/values/arrays.xml @@ -175,7 +175,7 @@ 3 - + @string/hide_unplayed_episodes_label @string/hide_paused_episodes_label @string/hide_played_episodes_label @@ -185,7 +185,7 @@ @string/hide_not_downloaded_episodes_label - + unplayed paused played -- cgit v1.2.3