summaryrefslogtreecommitdiff
path: root/src/de/danoeh/antennapod/feed
diff options
context:
space:
mode:
Diffstat (limited to 'src/de/danoeh/antennapod/feed')
-rw-r--r--src/de/danoeh/antennapod/feed/EventDistributor.java140
-rw-r--r--src/de/danoeh/antennapod/feed/Feed.java4
-rw-r--r--src/de/danoeh/antennapod/feed/FeedManager.java64
3 files changed, 156 insertions, 52 deletions
diff --git a/src/de/danoeh/antennapod/feed/EventDistributor.java b/src/de/danoeh/antennapod/feed/EventDistributor.java
new file mode 100644
index 000000000..1fc7e2c35
--- /dev/null
+++ b/src/de/danoeh/antennapod/feed/EventDistributor.java
@@ -0,0 +1,140 @@
+package de.danoeh.antennapod.feed;
+
+import java.util.AbstractQueue;
+import java.util.Observable;
+import java.util.Observer;
+import java.util.concurrent.ConcurrentLinkedQueue;
+
+import android.os.Handler;
+import android.util.Log;
+import de.danoeh.antennapod.AppConfig;
+
+/**
+ * Notifies its observers about changes in the feed database. Observers can
+ * register by retrieving an instance of this class and registering an
+ * EventListener. When new events arrive, the EventDistributor will process the
+ * event queue in a handler that runs on the main thread. The observers will only
+ * be notified once if the event queue contains multiple elements.
+ *
+ * Events can be sent with the send* methods.
+ */
+public class EventDistributor extends Observable {
+ private static final String TAG = "EventDistributor";
+
+ public static final int FEED_LIST_UPDATE = 1;
+ public static final int UNREAD_ITEMS_UPDATE = 2;
+ public static final int QUEUE_UPDATE = 4;
+ public static final int DOWNLOADLOG_UPDATE = 8;
+ public static final int PLAYBACK_HISTORY_UPDATE = 16;
+ public static final int DOWNLOAD_QUEUED = 32;
+ public static final int DOWNLOAD_HANDLED = 64;
+
+ private Handler handler;
+ private AbstractQueue<Integer> events;
+
+ private static EventDistributor instance;
+
+ private EventDistributor() {
+ this.handler = new Handler();
+ events = new ConcurrentLinkedQueue<Integer>();
+ }
+
+ public static EventDistributor getInstance() {
+ if (instance == null) {
+ instance = new EventDistributor();
+ }
+ return instance;
+ }
+
+ public void register(EventListener el) {
+ addObserver(el);
+ }
+
+ public void unregister(EventListener el) {
+ deleteObserver(el);
+ }
+
+ public void addEvent(Integer i) {
+ events.offer(i);
+ handler.post(new Runnable() {
+
+ @Override
+ public void run() {
+ processEventQueue();
+ }
+ });
+ }
+
+ private void processEventQueue() {
+ Integer result = 0;
+ if (AppConfig.DEBUG)
+ Log.d(TAG,
+ "Processing event queue. Number of events: "
+ + events.size());
+ for (Integer current = events.poll(); current != null; current = events
+ .poll()) {
+ result |= current;
+ }
+ if (result != 0) {
+ if (AppConfig.DEBUG)
+ Log.d(TAG, "Notifying observers. Data: " + result);
+ setChanged();
+ notifyObservers(result);
+ } else {
+ if (AppConfig.DEBUG)
+ Log.d(TAG,
+ "Event queue didn't contain any new events. Observers will not be notified.");
+ }
+ }
+
+ @Override
+ public void addObserver(Observer observer) {
+ super.addObserver(observer);
+ if (!(observer instanceof EventListener)) {
+ throw new IllegalArgumentException(
+ "Observer must be instance of FeedManager.EventListener");
+ }
+ }
+
+ public void sendDownloadQueuedBroadcast() {
+ addEvent(DOWNLOAD_QUEUED);
+ }
+
+ public void sendUnreadItemsUpdateBroadcast() {
+ addEvent(UNREAD_ITEMS_UPDATE);
+ }
+
+ public void sendQueueUpdateBroadcast() {
+ addEvent(QUEUE_UPDATE);
+ }
+
+ public void sendFeedUpdateBroadcast() {
+ addEvent(FEED_LIST_UPDATE);
+ }
+
+ public void sendPlaybackHistoryUpdateBroadcast() {
+ addEvent(PLAYBACK_HISTORY_UPDATE);
+ }
+
+ public void sendDownloadLogUpdateBroadcast() {
+ addEvent(DOWNLOADLOG_UPDATE);
+ }
+
+ public void sendDownloadHandledBroadcast() {
+ addEvent(DOWNLOAD_HANDLED);
+ }
+
+ public static abstract class EventListener implements Observer {
+
+ @Override
+ public void update(Observable observable, Object data) {
+ if (observable instanceof EventDistributor
+ && data instanceof Integer) {
+ update((EventDistributor) observable, (Integer) data);
+ }
+ }
+
+ public abstract void update(EventDistributor eventDistributor,
+ Integer arg);
+ }
+}
diff --git a/src/de/danoeh/antennapod/feed/Feed.java b/src/de/danoeh/antennapod/feed/Feed.java
index 64e6fc4d8..6220bde00 100644
--- a/src/de/danoeh/antennapod/feed/Feed.java
+++ b/src/de/danoeh/antennapod/feed/Feed.java
@@ -4,11 +4,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Date;
import java.util.List;
-import java.util.concurrent.CopyOnWriteArrayList;
-import android.content.SyncResult;
-import android.preference.PreferenceManager;
-import de.danoeh.antennapod.PodcastApp;
import de.danoeh.antennapod.preferences.UserPreferences;
import de.danoeh.antennapod.util.EpisodeFilter;
diff --git a/src/de/danoeh/antennapod/feed/FeedManager.java b/src/de/danoeh/antennapod/feed/FeedManager.java
index 890a7cbb6..308cf9d5f 100644
--- a/src/de/danoeh/antennapod/feed/FeedManager.java
+++ b/src/de/danoeh/antennapod/feed/FeedManager.java
@@ -41,14 +41,6 @@ import de.danoeh.antennapod.util.exception.MediaFileNotFoundException;
public class FeedManager {
private static final String TAG = "FeedManager";
- public static final String ACTION_FEED_LIST_UPDATE = "de.danoeh.antennapod.action.feed.feedlistUpdate";
- public static final String ACTION_UNREAD_ITEMS_UPDATE = "de.danoeh.antennapod.action.feed.unreadItemsUpdate";
- public static final String ACTION_QUEUE_UPDATE = "de.danoeh.antennapod.action.feed.queueUpdate";
- public static final String ACTION_DOWNLOADLOG_UPDATE = "de.danoeh.antennapod.action.feed.downloadLogUpdate";
- public static final String ACTION_PLAYBACK_HISTORY_UPDATE = "de.danoeh.antennapod.action.feed.playbackHistoryUpdate";
- public static final String EXTRA_FEED_ITEM_ID = "de.danoeh.antennapod.extra.feed.feedItemId";
- public static final String EXTRA_FEED_ID = "de.danoeh.antennapod.extra.feed.feedId";
-
/** Number of completed Download status entries to store. */
private static final int DOWNLOAD_LOG_SIZE = 50;
@@ -81,6 +73,8 @@ public class FeedManager {
/** Prevents user from starting several feed updates at the same time. */
private static boolean isStartingFeedRefresh = false;
+ private EventDistributor eventDist = EventDistributor.getInstance();
+
private FeedManager() {
feeds = Collections.synchronizedList(new ArrayList<Feed>());
unreadItems = Collections.synchronizedList(new ArrayList<FeedItem>());
@@ -214,7 +208,7 @@ public class FeedManager {
@Override
public void run() {
feeds.remove(feed);
- sendFeedUpdateBroadcast(context);
+ eventDist.sendFeedUpdateBroadcast();
dbExec.execute(new Runnable() {
@Override
@@ -267,32 +261,6 @@ public class FeedManager {
}
- private void sendUnreadItemsUpdateBroadcast(Context context, FeedItem item) {
- Intent update = new Intent(ACTION_UNREAD_ITEMS_UPDATE);
- if (item != null) {
- update.putExtra(EXTRA_FEED_ID, item.getFeed().getId());
- update.putExtra(EXTRA_FEED_ITEM_ID, item.getId());
- }
- context.sendBroadcast(update);
- }
-
- private void sendQueueUpdateBroadcast(Context context, FeedItem item) {
- Intent update = new Intent(ACTION_QUEUE_UPDATE);
- if (item != null) {
- update.putExtra(EXTRA_FEED_ID, item.getFeed().getId());
- update.putExtra(EXTRA_FEED_ITEM_ID, item.getId());
- }
- context.sendBroadcast(update);
- }
-
- private void sendFeedUpdateBroadcast(Context context) {
- context.sendBroadcast(new Intent(ACTION_FEED_LIST_UPDATE));
- }
-
- private void sendPlaybackHistoryUpdateBroadcast(Context context) {
- context.sendBroadcast(new Intent(ACTION_PLAYBACK_HISTORY_UPDATE));
- }
-
/**
* Makes sure that playback history is sorted and is not larger than
* PLAYBACK_HISTORY_SIZE.
@@ -354,7 +322,7 @@ public class FeedManager {
final FeedItem[] items = playbackHistory
.toArray(new FeedItem[playbackHistory.size()]);
playbackHistory.clear();
- sendPlaybackHistoryUpdateBroadcast(context);
+ eventDist.sendPlaybackHistoryUpdateBroadcast();
dbExec.execute(new Runnable() {
@Override
@@ -383,13 +351,13 @@ public class FeedManager {
playbackHistory.add(item);
}
cleanupPlaybackHistoryWithDBCleanup(context);
- sendPlaybackHistoryUpdateBroadcast(context);
+ eventDist.sendPlaybackHistoryUpdateBroadcast();
}
}
private void removeItemFromPlaybackHistory(Context context, FeedItem item) {
playbackHistory.remove(item);
- sendPlaybackHistoryUpdateBroadcast(context);
+ eventDist.sendPlaybackHistoryUpdateBroadcast();
}
/**
@@ -421,7 +389,7 @@ public class FeedManager {
Collections.sort(unreadItems,
new FeedItemPubdateComparator());
}
- sendUnreadItemsUpdateBroadcast(context, item);
+ eventDist.sendUnreadItemsUpdateBroadcast();
}
});
@@ -450,7 +418,7 @@ public class FeedManager {
final ArrayList<FeedItem> unreadItemsCopy = new ArrayList<FeedItem>(
unreadItems);
unreadItems.clear();
- sendUnreadItemsUpdateBroadcast(context, null);
+ eventDist.sendUnreadItemsUpdateBroadcast();
dbExec.execute(new Runnable() {
@Override
@@ -537,7 +505,7 @@ public class FeedManager {
media.setDownloaded(false);
media.setFile_url(null);
setFeedMedia(context, media);
- sendFeedUpdateBroadcast(context);
+ eventDist.sendFeedUpdateBroadcast();
}
public void refreshFeed(Context context, Feed feed)
@@ -560,7 +528,7 @@ public class FeedManager {
} else {
removedStatus = null;
}
- context.sendBroadcast(new Intent(ACTION_DOWNLOADLOG_UPDATE));
+ eventDist.sendDownloadLogUpdateBroadcast();
dbExec.execute(new Runnable() {
@Override
@@ -641,7 +609,7 @@ public class FeedManager {
queue.add(item);
}
}
- sendQueueUpdateBroadcast(context, items[0]);
+ eventDist.sendQueueUpdateBroadcast();
dbExec.execute(new Runnable() {
@Override
@@ -677,7 +645,7 @@ public class FeedManager {
if (AppConfig.DEBUG)
Log.d(TAG, "Clearing queue");
queue.clear();
- sendQueueUpdateBroadcast(context, null);
+ eventDist.sendQueueUpdateBroadcast();
dbExec.execute(new Runnable() {
@Override
@@ -717,7 +685,7 @@ public class FeedManager {
});
}
- sendQueueUpdateBroadcast(context, item);
+ eventDist.sendQueueUpdateBroadcast();
}
/**
@@ -793,7 +761,7 @@ public class FeedManager {
}
});
if (broadcastUpdate) {
- sendQueueUpdateBroadcast(context, item);
+ eventDist.sendQueueUpdateBroadcast();
}
}
}
@@ -817,7 +785,7 @@ public class FeedManager {
public void run() {
feeds.add(feed);
Collections.sort(feeds, new FeedtitleComparator());
- sendFeedUpdateBroadcast(context);
+ eventDist.sendFeedUpdateBroadcast();
}
});
setCompleteFeed(context, feed);
@@ -1688,4 +1656,4 @@ public class FeedManager {
}
}
-}
+} \ No newline at end of file