diff options
author | Martin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de> | 2015-04-02 11:47:20 +0200 |
---|---|---|
committer | Martin Fietz <marf@hadiko-99-4.hadiko.uni-karlsruhe.de> | 2015-04-05 22:11:19 +0200 |
commit | 3d19b939b125d36d3ac0ef3e828eabf403aa03d6 (patch) | |
tree | 6c3c20e577b1214a9577fbabbbd68196d52656aa /core/src/main/java | |
parent | 67cc7c98857b3fa0897ab96b2b87f52d99e4de2f (diff) | |
download | AntennaPod-3d19b939b125d36d3ac0ef3e828eabf403aa03d6.zip |
Dismiss remote play actions if queued play actions for that episode are more recent
Diffstat (limited to 'core/src/main/java')
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java | 9 | ||||
-rw-r--r-- | core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java | 66 |
2 files changed, 44 insertions, 31 deletions
diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java index 2e08396ae..cfdd0c5d6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/GpodnetPreferences.java @@ -49,7 +49,6 @@ public class GpodnetPreferences { private static Set<String> addedFeeds; private static Set<String> removedFeeds; - private static ReentrantLock episodeActionListLock = new ReentrantLock(); private static List<GpodnetEpisodeAction> queuedEpisodeActions; /** @@ -222,18 +221,18 @@ public class GpodnetPreferences { writePreference(PREF_SYNC_REMOVED, removedFeeds); } - public static void enqueueEpisodeAction(GpodnetEpisodeAction action) { + public static synchronized void enqueueEpisodeAction(GpodnetEpisodeAction action) { ensurePreferencesLoaded(); queuedEpisodeActions.add(action); writePreference(PREF_SYNC_EPISODE_ACTIONS, writeEpisodeActionsToString(queuedEpisodeActions)); } - public static Collection<GpodnetEpisodeAction> getQueuedEpisodeActions() { + public static List<GpodnetEpisodeAction> getQueuedEpisodeActions() { ensurePreferencesLoaded(); - return Collections.unmodifiableCollection(queuedEpisodeActions); + return Collections.unmodifiableList(queuedEpisodeActions); } - public static void removeQueuedEpisodeActions(Collection<GpodnetEpisodeAction> queued) { + public static synchronized void removeQueuedEpisodeActions(Collection<GpodnetEpisodeAction> queued) { ensurePreferencesLoaded(); queuedEpisodeActions.removeAll(queued); writePreference(PREF_SYNC_EPISODE_ACTIONS, writeEpisodeActionsToString(queuedEpisodeActions)); diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java index e8eb99fc5..e39197387 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java @@ -150,16 +150,18 @@ public class GpodnetSyncService extends Service { GpodnetEpisodeActionGetResponse getResponse = service.getEpisodeChanges(timestamp); long lastUpdate = getResponse.getTimestamp(); Log.d(TAG, "Downloaded episode actions: " + getResponse); - processEpisodeActions(getResponse.getEpisodeActions()); + List<GpodnetEpisodeAction> remoteActions = getResponse.getEpisodeActions(); - // upload local - Collection<GpodnetEpisodeAction> episodeActions = GpodnetPreferences.getQueuedEpisodeActions(); - if(episodeActions.size() > 0) { - Log.d(TAG, "Uploading episode actions: " + episodeActions); - GpodnetEpisodeActionPostResponse postResponse = service.uploadEpisodeActions(episodeActions); + List<GpodnetEpisodeAction> localActions = GpodnetPreferences.getQueuedEpisodeActions(); + processEpisodeActions(localActions, remoteActions); + + // upload local actions + if(localActions.size() > 0) { + Log.d(TAG, "Uploading episode actions: " + localActions); + GpodnetEpisodeActionPostResponse postResponse = service.uploadEpisodeActions(localActions); lastUpdate = postResponse.timestamp; Log.d(TAG, "Upload episode response: " + postResponse); - GpodnetPreferences.removeQueuedEpisodeActions(episodeActions); + GpodnetPreferences.removeQueuedEpisodeActions(localActions); } GpodnetPreferences.setLastEpisodeActionsSyncTimestamp(lastUpdate); clearErrorNotifications(); @@ -183,33 +185,45 @@ public class GpodnetSyncService extends Service { } } - private synchronized void processEpisodeActions(List<GpodnetEpisodeAction> episodeActions) throws DownloadRequestException { - if(episodeActions.size() == 0) { + private synchronized void processEpisodeActions(List<GpodnetEpisodeAction> localActions, List<GpodnetEpisodeAction> remoteActions) throws DownloadRequestException { + if(remoteActions.size() == 0) { return; } - Map<Pair<String, String>, GpodnetEpisodeAction> mostRecentPlayAction = new HashMap<Pair<String, String>, GpodnetEpisodeAction>(); - for (GpodnetEpisodeAction episodeAction : episodeActions) { - switch (episodeAction.getAction()) { + Map<Pair<String, String>, GpodnetEpisodeAction> localMostRecentPlayAction = new HashMap<Pair<String, String>, GpodnetEpisodeAction>(); + Map<Pair<String, String>, GpodnetEpisodeAction> remoteMostRecentPlayAction = new HashMap<Pair<String, String>, GpodnetEpisodeAction>(); + // make sure more recent local actions are not overwritten by older remote actions + for(GpodnetEpisodeAction action : localActions) { + Pair key = new Pair(action.getPodcast(), action.getEpisode()); + GpodnetEpisodeAction mostRecent = localMostRecentPlayAction.get(key); + if (mostRecent == null) { + localMostRecentPlayAction.put(key, action); + } else if (mostRecent.getTimestamp().before(action.getTimestamp())) { + localMostRecentPlayAction.put(key, action); + } + } + for (GpodnetEpisodeAction action : remoteActions) { + switch (action.getAction()) { case NEW: - FeedItem newItem = DBReader.getFeedItem(this, episodeAction.getPodcast(), episodeAction.getEpisode()); + FeedItem newItem = DBReader.getFeedItem(this, action.getPodcast(), action.getEpisode()); if(newItem != null) { DBWriter.markItemRead(this, newItem, false, true); } else { - Log.i(TAG, "Unknown feed item: " + episodeAction); + Log.i(TAG, "Unknown feed item: " + action); } break; case DOWNLOAD: break; case PLAY: - if(episodeAction.getTimestamp() == null) { - break; - } - Pair key = new Pair(episodeAction.getPodcast(), episodeAction.getEpisode()); - GpodnetEpisodeAction mostRecent = mostRecentPlayAction.get(key); - if (mostRecent == null) { - mostRecentPlayAction.put(key, episodeAction); - } else if (mostRecent.getTimestamp().before(episodeAction.getTimestamp())) { - mostRecentPlayAction.put(key, episodeAction); + Pair key = new Pair(action.getPodcast(), action.getEpisode()); + GpodnetEpisodeAction localMostRecent = localMostRecentPlayAction.get(key); + if(localMostRecent == null || + localMostRecent.getTimestamp().before(action.getTimestamp())) { + GpodnetEpisodeAction mostRecent = remoteMostRecentPlayAction.get(key); + if (mostRecent == null) { + remoteMostRecentPlayAction.put(key, action); + } else if (mostRecent.getTimestamp().before(action.getTimestamp())) { + remoteMostRecentPlayAction.put(key, action); + } } break; case DELETE: @@ -217,10 +231,10 @@ public class GpodnetSyncService extends Service { break; } } - for (GpodnetEpisodeAction episodeAction : mostRecentPlayAction.values()) { - FeedItem playItem = DBReader.getFeedItem(this, episodeAction.getPodcast(), episodeAction.getEpisode()); + for (GpodnetEpisodeAction action : remoteMostRecentPlayAction.values()) { + FeedItem playItem = DBReader.getFeedItem(this, action.getPodcast(), action.getEpisode()); if (playItem != null) { - playItem.getMedia().setPosition(episodeAction.getPosition() * 1000); + playItem.getMedia().setPosition(action.getPosition() * 1000); if(playItem.getMedia().hasAlmostEnded()) { DBWriter.markItemRead(this, playItem, true, true); DBWriter.addItemToPlaybackHistory(this, playItem.getMedia()); |