diff options
Diffstat (limited to 'src/de/danoeh/antennapod/feed')
-rw-r--r-- | src/de/danoeh/antennapod/feed/EventDistributor.java | 140 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/feed/Feed.java | 4 | ||||
-rw-r--r-- | src/de/danoeh/antennapod/feed/FeedManager.java | 64 |
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 |