summaryrefslogtreecommitdiff
path: root/core/src/main/java
diff options
context:
space:
mode:
authorTom Hennen <tom.hennen@gmail.com>2015-09-20 16:11:57 -0400
committerTom Hennen <tom.hennen@gmail.com>2015-09-20 16:11:57 -0400
commitdfbd878afe937e87f63d7c4e88a09ea669eff069 (patch)
treed311bc5887f167c3fd589d9e28a4cd7bc4bbd3f9 /core/src/main/java
parented679b8a17b4c140a8cc0fc1c312c7996f12d5d7 (diff)
downloadAntennaPod-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.java38
-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.java7
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/feed/FeedItem.java27
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/download/DownloadService.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackServiceTaskManager.java2
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBReader.java60
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBTasks.java8
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/storage/DBWriter.java21
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));
});
}