From 3d19b939b125d36d3ac0ef3e828eabf403aa03d6 Mon Sep 17 00:00:00 2001 From: Martin Fietz Date: Thu, 2 Apr 2015 11:47:20 +0200 Subject: Dismiss remote play actions if queued play actions for that episode are more recent --- .../core/preferences/GpodnetPreferences.java | 9 ++- .../core/service/GpodnetSyncService.java | 66 +++++++++++++--------- 2 files changed, 44 insertions(+), 31 deletions(-) (limited to 'core/src/main/java') 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 addedFeeds; private static Set removedFeeds; - private static ReentrantLock episodeActionListLock = new ReentrantLock(); private static List 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 getQueuedEpisodeActions() { + public static List getQueuedEpisodeActions() { ensurePreferencesLoaded(); - return Collections.unmodifiableCollection(queuedEpisodeActions); + return Collections.unmodifiableList(queuedEpisodeActions); } - public static void removeQueuedEpisodeActions(Collection queued) { + public static synchronized void removeQueuedEpisodeActions(Collection 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 remoteActions = getResponse.getEpisodeActions(); - // upload local - Collection episodeActions = GpodnetPreferences.getQueuedEpisodeActions(); - if(episodeActions.size() > 0) { - Log.d(TAG, "Uploading episode actions: " + episodeActions); - GpodnetEpisodeActionPostResponse postResponse = service.uploadEpisodeActions(episodeActions); + List 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 episodeActions) throws DownloadRequestException { - if(episodeActions.size() == 0) { + private synchronized void processEpisodeActions(List localActions, List remoteActions) throws DownloadRequestException { + if(remoteActions.size() == 0) { return; } - Map, GpodnetEpisodeAction> mostRecentPlayAction = new HashMap, GpodnetEpisodeAction>(); - for (GpodnetEpisodeAction episodeAction : episodeActions) { - switch (episodeAction.getAction()) { + Map, GpodnetEpisodeAction> localMostRecentPlayAction = new HashMap, GpodnetEpisodeAction>(); + Map, GpodnetEpisodeAction> remoteMostRecentPlayAction = new HashMap, 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()); -- cgit v1.2.3