diff options
author | Tom Hennen <tom.hennen@gmail.com> | 2015-09-20 16:11:57 -0400 |
---|---|---|
committer | Tom Hennen <tom.hennen@gmail.com> | 2015-09-20 16:11:57 -0400 |
commit | dfbd878afe937e87f63d7c4e88a09ea669eff069 (patch) | |
tree | d311bc5887f167c3fd589d9e28a4cd7bc4bbd3f9 /core/src/main/java | |
parent | ed679b8a17b4c140a8cc0fc1c312c7996f12d5d7 (diff) | |
download | AntennaPod-dfbd878afe937e87f63d7c4e88a09ea669eff069.zip |
Added 'tags' to FeedItem and properly showing/not showing menu items for favorites.
Diffstat (limited to 'core/src/main/java')
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java | 38 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/event/QueueEvent.java (renamed from core/src/main/java/de/danoeh/antennapod/core/feed/QueueEvent.java) | 4 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java | 7 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java | 27 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java | 2 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java | 2 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java | 60 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java | 8 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java | 21 |
9 files changed, 140 insertions, 29 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java new file mode 100644 index 000000000..d09f6802f --- /dev/null +++ b/core/src/main/java/de/danoeh/antennapod/core/event/FavoritesEvent.java @@ -0,0 +1,38 @@ +package de.danoeh.antennapod.core.event; + +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; + +import de.danoeh.antennapod.core.feed.FeedItem; + +public class FavoritesEvent { + + public enum Action { + ADDED, REMOVED + } + + public final Action action; + public final FeedItem item; + + private FavoritesEvent(Action action, FeedItem item) { + this.action = action; + this.item = item; + } + + public static FavoritesEvent added(FeedItem item) { + return new FavoritesEvent(Action.ADDED, item); + } + + public static FavoritesEvent removed(FeedItem item) { + return new FavoritesEvent(Action.REMOVED, item); + } + + @Override + public String toString() { + return new ToStringBuilder(this, ToStringStyle.SHORT_PREFIX_STYLE) + .append("action", action) + .append("item", item) + .toString(); + } + +} diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/QueueEvent.java b/core/src/main/java/de/danoeh/antennapod/core/event/QueueEvent.java index 97d086e5b..4d59d75eb 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/QueueEvent.java +++ b/core/src/main/java/de/danoeh/antennapod/core/event/QueueEvent.java @@ -1,10 +1,12 @@ -package de.danoeh.antennapod.core.feed; +package de.danoeh.antennapod.core.event; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.List; +import de.danoeh.antennapod.core.feed.FeedItem; + public class QueueEvent { public enum Action { diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java index 50911f74e..2667a2e12 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/EventDistributor.java @@ -29,7 +29,6 @@ public class EventDistributor extends Observable { public static final int DOWNLOAD_QUEUED = 32; public static final int DOWNLOAD_HANDLED = 64; public static final int PLAYER_STATUS_UPDATE = 128; - public static final int FAVORITE_UPDATE = 256; private Handler handler; private AbstractQueue<Integer> events; @@ -113,11 +112,7 @@ public class EventDistributor extends Observable { addEvent(DOWNLOAD_HANDLED); } - public void sendPlayerStatusUpdateBroadcast() { - addEvent(PLAYER_STATUS_UPDATE); - } - - public void sendFavoriteUpdateBroadcast() { addEvent(FAVORITE_UPDATE); } + public void sendPlayerStatusUpdateBroadcast() { addEvent(PLAYER_STATUS_UPDATE); } public static abstract class EventListener implements Observer { diff --git a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java index 5c3ed303f..c54cc1d5b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java +++ b/core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java @@ -7,7 +7,9 @@ import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; import java.util.concurrent.Callable; import de.danoeh.antennapod.core.asynctask.ImageResource; @@ -24,6 +26,11 @@ import de.danoeh.antennapod.core.util.flattr.FlattrThing; */ public class FeedItem extends FeedComponent implements ShownotesProvider, FlattrThing, ImageResource { + /** tag that indicates this item is in the queue */ + public static final String TAG_QUEUE = "Queue"; + /** tag that indicates this item is in favorites */ + public static final String TAG_FAVORITE = "Favorite"; + /** * The id/guid that can be found in the rss/atom feed. Might not be set. */ @@ -70,6 +77,11 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr private boolean autoDownload = true; + /** + * Any tags assigned to this item + */ + private Set<String> tags = new HashSet<>(); + public FeedItem() { this.state = UNPLAYED; this.flattrStatus = new FlattrStatus(); @@ -451,6 +463,21 @@ public class FeedItem extends FeedComponent implements ShownotesProvider, Flattr this.getAutoDownload(); } + /** + * @return true if the item has this tag + */ + public boolean isTagged(String tag) { return tags.contains(tag); } + + /** + * @param tag adds this tag to the item. NOTE: does NOT persist to the database + */ + public void addTag(String tag) { tags.add(tag); } + + /** + * @param tag the to remove + */ + public void removeTag(String tag) { tags.remove(tag); } + @Override public String toString() { return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java index 36ea1e222..cb050463e 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java @@ -1129,7 +1129,7 @@ public class DownloadService extends Service { DBWriter.setFeedMedia(media).get(); if (!DBTasks.isInQueue(DownloadService.this, item.getId())) { - DBWriter.addQueueItem(DownloadService.this, item.getId()).get(); + DBWriter.addQueueItem(DownloadService.this, item).get(); } } catch (ExecutionException e) { e.printStackTrace(); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java index dba66a36d..19ef6ef09 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java @@ -16,7 +16,7 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.feed.FeedItem; -import de.danoeh.antennapod.core.feed.QueueEvent; +import de.danoeh.antennapod.core.event.QueueEvent; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.util.playback.Playable; import de.greenrobot.event.EventBus; diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java index efa655f8b..d95e4ff02 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java @@ -104,6 +104,30 @@ public final class DBReader { return result; } + + /** + * Loads additional data in to the feed items from other database queries + * @param items the FeedItems who should have other data loaded + */ + public static void loadAdditionalFeedItemListData(List<FeedItem> items) { + loadTagsOfFeedItemList(items); + loadFeedDataOfFeedItemList(items); + } + + public static void loadTagsOfFeedItemList(List<FeedItem> items) { + LongList favoriteIds = getFavoriteIDList(); + LongList queueIds = getQueueIDList(); + + for (FeedItem item : items) { + if (favoriteIds.contains(item.getId())) { + item.addTag(FeedItem.TAG_FAVORITE); + } + if (queueIds.contains(item.getId())) { + item.addTag(FeedItem.TAG_QUEUE); + } + } + } + /** * Takes a list of FeedItems and loads their corresponding Feed-objects from the database. * The feedID-attribute of a FeedItem must be set to the ID of its feed or the method will @@ -111,7 +135,7 @@ public final class DBReader { * * @param items The FeedItems whose Feed-objects should be loaded. */ - public static void loadFeedDataOfFeedItemlist(List<FeedItem> items) { + public static void loadFeedDataOfFeedItemList(List<FeedItem> items) { List<Feed> feeds = getFeedList(); for (FeedItem item : items) { for (Feed feed : feeds) { @@ -251,7 +275,7 @@ public final class DBReader { Cursor itemlistCursor = adapter.getQueueCursor(); List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor); itemlistCursor.close(); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); return items; } @@ -316,7 +340,7 @@ public final class DBReader { List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor); itemlistCursor.close(); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); Collections.sort(items, new FeedItemPubdateComparator()); adapter.close(); @@ -338,7 +362,7 @@ public final class DBReader { List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor); itemlistCursor.close(); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); adapter.close(); @@ -360,7 +384,7 @@ public final class DBReader { List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor); itemlistCursor.close(); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); adapter.close(); @@ -377,13 +401,27 @@ public final class DBReader { List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor); itemlistCursor.close(); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); adapter.close(); return items; } + static LongList getFavoriteIDList() { + PodDBAdapter adapter = PodDBAdapter.getInstance().open(); + Cursor favoritesCursor = adapter.getFavoritesCursor(); + + LongList favoriteIDs = new LongList(favoritesCursor.getCount()); + if (favoritesCursor.moveToFirst()) { + do { + favoriteIDs.add(favoritesCursor.getLong(0)); + } while (favoritesCursor.moveToNext()); + } + favoritesCursor.close(); + return favoriteIDs; + } + /** * Loads a list of FeedItems sorted by pubDate in descending order. * @@ -399,7 +437,7 @@ public final class DBReader { List<FeedItem> items = extractItemlistFromCursor(adapter, itemlistCursor); itemlistCursor.close(); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); adapter.close(); @@ -428,7 +466,7 @@ public final class DBReader { mediaCursor.close(); Cursor itemCursor = adapter.getFeedItemCursor(itemIds); List<FeedItem> items = extractItemlistFromCursor(adapter, itemCursor); - loadFeedDataOfFeedItemlist(items); + loadAdditionalFeedItemListData(items); itemCursor.close(); adapter.close(); @@ -550,7 +588,7 @@ public final class DBReader { List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor); if (list.size() > 0) { item = list.get(0); - loadFeedDataOfFeedItemlist(list); + loadAdditionalFeedItemListData(list); if (item.hasChapters()) { loadChaptersOfFeedItem(adapter, item); } @@ -573,7 +611,7 @@ public final class DBReader { Cursor itemCursor = adapter.getFeedItemCursor(ids); if (itemCursor.moveToFirst()) { result = extractItemlistFromCursor(adapter, itemCursor); - loadFeedDataOfFeedItemlist(result); + loadAdditionalFeedItemListData(result); for(FeedItem item : result) { if (item.hasChapters()) { loadChaptersOfFeedItem(adapter, item); @@ -613,7 +651,7 @@ public final class DBReader { List<FeedItem> list = extractItemlistFromCursor(adapter, itemCursor); if (list.size() > 0) { item = list.get(0); - loadFeedDataOfFeedItemlist(list); + loadAdditionalFeedItemListData(list); if (item.hasChapters()) { loadChaptersOfFeedItem(adapter, item); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java index 96a632d68..3f9cece77 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java @@ -601,7 +601,7 @@ public final class DBTasks { Cursor searchResult = adapter.searchItemTitles(feedID, query); List<FeedItem> items = DBReader.extractItemlistFromCursor(searchResult); - DBReader.loadFeedDataOfFeedItemlist(items); + DBReader.loadAdditionalFeedItemListData(items); setResult(items); searchResult.close(); } @@ -625,7 +625,7 @@ public final class DBTasks { Cursor searchResult = adapter.searchItemDescriptions(feedID, query); List<FeedItem> items = DBReader.extractItemlistFromCursor(searchResult); - DBReader.loadFeedDataOfFeedItemlist(items); + DBReader.loadAdditionalFeedItemListData(items); setResult(items); searchResult.close(); } @@ -649,7 +649,7 @@ public final class DBTasks { Cursor searchResult = adapter.searchItemContentEncoded(feedID, query); List<FeedItem> items = DBReader.extractItemlistFromCursor(searchResult); - DBReader.loadFeedDataOfFeedItemlist(items); + DBReader.loadAdditionalFeedItemListData(items); setResult(items); searchResult.close(); } @@ -672,7 +672,7 @@ public final class DBTasks { Cursor searchResult = adapter.searchItemChapters(feedID, query); List<FeedItem> items = DBReader.extractItemlistFromCursor(searchResult); - DBReader.loadFeedDataOfFeedItemlist(items); + DBReader.loadAdditionalFeedItemListData(items); setResult(items); searchResult.close(); } diff --git a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java index 190d032bf..f4f2a1bfa 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java +++ b/core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java @@ -26,6 +26,7 @@ import java.util.concurrent.Future; import de.danoeh.antennapod.core.BuildConfig; import de.danoeh.antennapod.core.ClientConfig; import de.danoeh.antennapod.core.asynctask.FlattrClickWorker; +import de.danoeh.antennapod.core.event.FavoritesEvent; import de.danoeh.antennapod.core.feed.EventDistributor; import de.danoeh.antennapod.core.feed.Feed; import de.danoeh.antennapod.core.feed.FeedEvent; @@ -33,7 +34,7 @@ import de.danoeh.antennapod.core.feed.FeedImage; import de.danoeh.antennapod.core.feed.FeedItem; import de.danoeh.antennapod.core.feed.FeedMedia; import de.danoeh.antennapod.core.feed.FeedPreferences; -import de.danoeh.antennapod.core.feed.QueueEvent; +import de.danoeh.antennapod.core.event.QueueEvent; import de.danoeh.antennapod.core.gpoddernet.model.GpodnetEpisodeAction; import de.danoeh.antennapod.core.preferences.GpodnetPreferences; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; @@ -317,6 +318,8 @@ public class DBWriter { if (item != null) { queue.add(index, item); adapter.setQueue(queue); + // no need to tag the item here, since we got it right out of the database + // and no one is ever going to see it... EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.ADDED, item, index)); if (item.isNew()) { DBWriter.markItemPlayed(FeedItem.UNPLAYED, item.getId()); @@ -335,8 +338,13 @@ public class DBWriter { } public static Future<?> addQueueItem(final Context context, - final long... itemIds) { - return addQueueItem(context, false, itemIds); + final FeedItem... items) { + LongList itemIds = new LongList(items.length); + for (FeedItem item : items) { + itemIds.add(item.getId()); + item.addTag(FeedItem.TAG_QUEUE); + } + return addQueueItem(context, false, itemIds.toArray()); } /** @@ -427,6 +435,7 @@ public class DBWriter { if (position >= 0) { queue.remove(position); adapter.setQueue(queue); + item.removeTag(FeedItem.TAG_QUEUE); EventBus.getDefault().post(new QueueEvent(QueueEvent.Action.REMOVED, item, position)); } else { Log.w(TAG, "Queue was not modified by call to removeQueueItem"); @@ -447,7 +456,8 @@ public class DBWriter { final PodDBAdapter adapter = PodDBAdapter.getInstance().open(); adapter.addFavoriteItem(item); adapter.close(); - EventDistributor.getInstance().sendFavoriteUpdateBroadcast(); + item.addTag(FeedItem.TAG_FAVORITE); + EventBus.getDefault().post(FavoritesEvent.added(item)); }); } @@ -456,7 +466,8 @@ public class DBWriter { final PodDBAdapter adapter = PodDBAdapter.getInstance().open(); adapter.removeFavoriteItem(item); adapter.close(); - EventDistributor.getInstance().sendFavoriteUpdateBroadcast(); + item.removeTag(FeedItem.TAG_FAVORITE); + EventBus.getDefault().post(FavoritesEvent.removed(item)); }); } |