diff --git a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/feed/FeedUpdateWorker.java b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/feed/FeedUpdateWorker.java
index fb0cb7e40..a62ded3a3 100644
--- a/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/feed/FeedUpdateWorker.java
+++ b/net/download/service/src/main/java/de/danoeh/antennapod/net/download/service/feed/FeedUpdateWorker.java
@@ -24,6 +24,7 @@ import de.danoeh.antennapod.net.download.service.feed.remote.Downloader;
import de.danoeh.antennapod.net.download.service.feed.remote.FeedParserTask;
import de.danoeh.antennapod.net.download.serviceinterface.AutoDownloadManager;
import de.danoeh.antennapod.net.download.serviceinterface.DownloadRequestCreator;
+import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueue;
import de.danoeh.antennapod.storage.database.DBReader;
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
import de.danoeh.antennapod.storage.database.DBWriter;
@@ -103,6 +104,7 @@ public class FeedUpdateWorker extends Worker {
NonSubscribedFeedsCleaner.deleteOldNonSubscribedFeeds(getApplicationContext());
AutoDownloadManager.getInstance().autodownloadUndownloadedItems(getApplicationContext());
notificationManager.cancel(R.id.notification_updating_feeds);
+ SynchronizationQueue.getInstance().syncImmediately();
return Result.success();
}
diff --git a/net/sync/service/src/main/java/de/danoeh/antennapod/net/sync/service/SyncService.java b/net/sync/service/src/main/java/de/danoeh/antennapod/net/sync/service/SyncService.java
index 6076f4b5a..fd8ed94a4 100644
--- a/net/sync/service/src/main/java/de/danoeh/antennapod/net/sync/service/SyncService.java
+++ b/net/sync/service/src/main/java/de/danoeh/antennapod/net/sync/service/SyncService.java
@@ -15,7 +15,6 @@ import androidx.core.content.ContextCompat;
import androidx.core.util.Pair;
import androidx.work.Worker;
import androidx.work.WorkerParameters;
-import de.danoeh.antennapod.event.FeedUpdateRunningEvent;
import de.danoeh.antennapod.event.MessageEvent;
import de.danoeh.antennapod.event.SyncServiceEvent;
import de.danoeh.antennapod.model.feed.Feed;
@@ -70,12 +69,21 @@ public class SyncService extends Worker {
return Result.success();
}
- SynchronizationSettings.updateLastSynchronizationAttempt();
+ if (currentlyActive) {
+ return Result.success();
+ }
currentlyActive = true;
+ SynchronizationSettings.updateLastSynchronizationAttempt();
try {
activeSyncProvider.login();
syncSubscriptions(activeSyncProvider);
- waitForDownloadServiceCompleted();
+ if (someFeedWasNotRefreshedYet()) {
+ // Note that this service might get called several times before the FeedUpdate completes
+ Log.d(TAG, "Found new subscriptions. Need to refresh them before syncing episode actions");
+ EventBus.getDefault().postSticky(new SyncServiceEvent(R.string.sync_status_wait_for_downloads));
+ FeedUpdateManager.getInstance().runOnce(getApplicationContext());
+ return Result.success();
+ }
syncEpisodeActions(activeSyncProvider);
activeSyncProvider.logout();
clearErrorNotifications();
@@ -102,6 +110,15 @@ public class SyncService extends Worker {
}
}
+ private boolean someFeedWasNotRefreshedYet() {
+ for (Feed feed : DBReader.getFeedList()) {
+ if (feed.getLastRefreshAttempt() == 0) {
+ return true;
+ }
+ }
+ return false;
+ }
+
/* package-private */ static boolean isCurrentlyActive() {
return currentlyActive;
}
@@ -125,8 +142,7 @@ public class SyncService extends Worker {
if (!UrlChecker.containsUrl(localSubscriptions, downloadUrl) && !queuedRemovedFeeds.contains(downloadUrl)) {
Feed feed = new Feed(downloadUrl, null, "Unknown podcast");
feed.setItems(Collections.emptyList());
- Feed newFeed = FeedDatabaseWriter.updateFeed(getApplicationContext(), feed, false);
- FeedUpdateManager.getInstance().runOnce(getApplicationContext(), newFeed);
+ FeedDatabaseWriter.updateFeed(getApplicationContext(), feed, false);
}
}
@@ -140,11 +156,15 @@ public class SyncService extends Worker {
if (lastSync == 0) {
Log.d(TAG, "First sync. Adding all local subscriptions.");
queuedAddedFeeds = localSubscriptions;
- queuedAddedFeeds.removeAll(subscriptionChanges.getAdded());
- queuedRemovedFeeds.removeAll(subscriptionChanges.getRemoved());
}
- if (!queuedAddedFeeds.isEmpty() || !queuedRemovedFeeds.isEmpty()) {
+ queuedAddedFeeds.removeAll(subscriptionChanges.getAdded());
+ queuedRemovedFeeds.removeAll(subscriptionChanges.getRemoved());
+
+ if (queuedAddedFeeds.isEmpty() && queuedRemovedFeeds.isEmpty()) {
+ Log.d(TAG, "No feeds to add or remove from server");
+ synchronizationQueueStorage.clearFeedQueues();
+ } else {
Log.d(TAG, "Added: " + StringUtils.join(queuedAddedFeeds, ", "));
Log.d(TAG, "Removed: " + StringUtils.join(queuedRemovedFeeds, ", "));
@@ -161,22 +181,6 @@ public class SyncService extends Worker {
SynchronizationSettings.setLastSubscriptionSynchronizationAttemptTimestamp(newTimeStamp);
}
- private void waitForDownloadServiceCompleted() {
- EventBus.getDefault().postSticky(new SyncServiceEvent(R.string.sync_status_wait_for_downloads));
- try {
- while (true) {
- //noinspection BusyWait
- Thread.sleep(1000);
- FeedUpdateRunningEvent event = EventBus.getDefault().getStickyEvent(FeedUpdateRunningEvent.class);
- if (event == null || !event.isFeedUpdateRunning) {
- return;
- }
- }
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
-
private void syncEpisodeActions(ISyncService syncServiceImpl) throws SyncServiceException {
final long lastSync = SynchronizationSettings.getLastEpisodeActionSynchronizationTimestamp();
EventBus.getDefault().postSticky(new SyncServiceEvent(R.string.sync_status_episodes_download));
diff --git a/ui/i18n/src/main/res/values/strings.xml b/ui/i18n/src/main/res/values/strings.xml
index bfdd5ae99..fe03c8ed5 100644
--- a/ui/i18n/src/main/res/values/strings.xml
+++ b/ui/i18n/src/main/res/values/strings.xml
@@ -571,7 +571,7 @@
Downloading episode changes…
Uploading played status…
Synchronizing subscriptions…
- Waiting for downloads to complete…
+ Waiting for subscriptions refresh…
Synchronization successful
Synchronization failed