Implemented methods for modifying the playback history

This commit is contained in:
daniel oeh 2012-10-02 17:36:58 +02:00
parent f614b0fa72
commit 727c3bf9e8
3 changed files with 117 additions and 0 deletions

View File

@ -3,6 +3,7 @@ package de.danoeh.antennapod.feed;
import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Date;
import java.util.List;
import java.util.concurrent.Executor;
@ -29,6 +30,7 @@ import de.danoeh.antennapod.util.DownloadError;
import de.danoeh.antennapod.util.FeedtitleComparator;
import de.danoeh.antennapod.util.comparator.DownloadStatusComparator;
import de.danoeh.antennapod.util.comparator.FeedItemPubdateComparator;
import de.danoeh.antennapod.util.comparator.PlaybackCompletionDateComparator;
/**
* Singleton class Manages all feeds, categories and feeditems
@ -42,6 +44,7 @@ public class FeedManager {
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";
@ -62,6 +65,12 @@ public class FeedManager {
/** Contains the queue of items to be played. */
private List<FeedItem> queue;
/** Contains the last played items */
private List<FeedItem> playbackHistory;
/** Maximum number of items in the playback history. */
private static final int PLAYBACK_HISTORY_SIZE = 15;
private DownloadRequester requester;
/** Should be used to change the content of the arrays from another thread. */
@ -79,6 +88,8 @@ public class FeedManager {
requester = DownloadRequester.getInstance();
downloadLog = new ArrayList<DownloadStatus>();
queue = Collections.synchronizedList(new ArrayList<FeedItem>());
playbackHistory = Collections
.synchronizedList(new ArrayList<FeedItem>());
contentChanger = new Handler();
dbExec = Executors.newSingleThreadExecutor(new ThreadFactory() {
@ -211,6 +222,7 @@ public class FeedManager {
if (queue.contains(item)) {
removeQueueItem(item, adapter);
}
removeItemFromPlaybackHistory(context, item);
if (item.getMedia() != null
&& item.getMedia().isDownloaded()) {
File mediaFile = new File(item.getMedia()
@ -255,6 +267,82 @@ public class FeedManager {
context.sendBroadcast(new Intent(ACITON_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.
*
* @return an array of all feeditems that were remove from the playback
* history or null if no items were removed.
*/
private FeedItem[] cleanupPlaybackHistory() {
if (AppConfig.DEBUG)
Log.d(TAG, "Cleaning up playback history.");
Collections.sort(playbackHistory,
new PlaybackCompletionDateComparator());
final int initialSize = playbackHistory.size();
if (initialSize > PLAYBACK_HISTORY_SIZE) {
FeedItem[] removed = new FeedItem[initialSize
- PLAYBACK_HISTORY_SIZE];
for (int i = 0; i < removed.length; i++) {
removed[i] = playbackHistory.remove(playbackHistory.size() - 1);
}
if (AppConfig.DEBUG)
Log.d(TAG, "Removed " + removed.length
+ " items from playback history.");
return removed;
}
return null;
}
/**
* Executes cleanupPlaybackHistory and deletes the playbackCompletionDate of
* all item that were removed from the history.
*/
private void cleanupPlaybackHistoryWithDBCleanup(final Context context) {
final FeedItem[] removedItems = cleanupPlaybackHistory();
if (removedItems != null) {
dbExec.execute(new Runnable() {
@Override
public void run() {
PodDBAdapter adapter = new PodDBAdapter(context);
adapter.open();
for (FeedItem item : removedItems) {
if (item.getMedia() != null) {
item.getMedia().setPlaybackCompletionDate(null);
adapter.setMedia(item.getMedia());
}
}
adapter.close();
}
});
}
}
public void addItemToPlaybackHistory(Context context, FeedItem item) {
if (item.getMedia() != null
&& item.getMedia().getPlaybackCompletionDate() != null) {
if (AppConfig.DEBUG)
Log.d(TAG, "Adding new item to playback history");
if (!playbackHistory.contains(item)) {
playbackHistory.add(item);
}
cleanupPlaybackHistoryWithDBCleanup(context);
sendPlaybackHistoryUpdateBroadcast(context);
}
}
private void removeItemFromPlaybackHistory(Context context, FeedItem item) {
playbackHistory.remove(item);
sendPlaybackHistoryUpdateBroadcast(context);
}
/**
* Sets the 'read'-attribute of a FeedItem. Should be used by all Classes
* instead of the setters of FeedItem.
@ -933,6 +1021,7 @@ public class FeedManager {
adapter.close();
Collections.sort(feeds, new FeedtitleComparator());
Collections.sort(unreadItems, new FeedItemPubdateComparator());
cleanupPlaybackHistory();
}
private void extractFeedlistFromCursor(Context context, PodDBAdapter adapter) {
@ -1102,6 +1191,9 @@ public class FeedManager {
cursor.getString(PodDBAdapter.KEY_DOWNLOAD_URL_INDEX),
cursor.getInt(PodDBAdapter.KEY_DOWNLOADED_INDEX) > 0,
playbackCompletionDate));
if (playbackCompletionDate != null) {
playbackHistory.add(item);
}
}
} while (cursor.moveToNext());
@ -1204,4 +1296,8 @@ public class FeedManager {
return queue;
}
public List<FeedItem> getPlaybackHistory() {
return playbackHistory;
}
}

View File

@ -281,6 +281,8 @@ public class PodDBAdapter {
values.put(KEY_FILE_URL, media.getFile_url());
if (media.getPlaybackCompletionDate() != null) {
values.put(KEY_PLAYBACK_COMPLETION_DATE, media.getPlaybackCompletionDate().getTime());
} else {
values.put(KEY_PLAYBACK_COMPLETION_DATE, 0);
}
if (media.getId() == 0) {
media.setId(db.insert(TABLE_NAME_FEED_MEDIA, null, values));

View File

@ -0,0 +1,19 @@
package de.danoeh.antennapod.util.comparator;
import java.util.Comparator;
import de.danoeh.antennapod.feed.FeedItem;
public class PlaybackCompletionDateComparator implements Comparator<FeedItem> {
public int compare(FeedItem lhs, FeedItem rhs) {
if (lhs.getMedia() != null
&& lhs.getMedia().getPlaybackCompletionDate() != null
&& rhs.getMedia() != null
&& rhs.getMedia().getPlaybackCompletionDate() != null) {
return -lhs.getMedia().getPlaybackCompletionDate()
.compareTo(rhs.getMedia().getPlaybackCompletionDate());
}
return 0;
}
}