Merge :net:sync:model and :net:sync:service-interface (#7063)
This commit is contained in:
parent
b6a4049ff4
commit
687db0f5ed
|
@ -70,7 +70,6 @@ dependencies {
|
||||||
implementation project(':net:download:service')
|
implementation project(':net:download:service')
|
||||||
implementation project(':net:ssl')
|
implementation project(':net:ssl')
|
||||||
implementation project(':net:sync:service')
|
implementation project(':net:sync:service')
|
||||||
implementation project(':net:sync:model')
|
|
||||||
implementation project(':parser:feed')
|
implementation project(':parser:feed')
|
||||||
implementation project(':playback:base')
|
implementation project(':playback:base')
|
||||||
implementation project(':playback:cast')
|
implementation project(':playback:cast')
|
||||||
|
|
|
@ -27,7 +27,7 @@ import de.danoeh.antennapod.ui.share.ShareUtils;
|
||||||
import de.danoeh.antennapod.ui.share.ShareDialog;
|
import de.danoeh.antennapod.ui.share.ShareDialog;
|
||||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||||
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
|
import de.danoeh.antennapod.ui.appstartintent.MediaButtonStarter;
|
||||||
import de.danoeh.antennapod.ui.view.LocalDeleteModal;
|
import de.danoeh.antennapod.ui.view.LocalDeleteModal;
|
||||||
|
|
|
@ -14,7 +14,6 @@ dependencies {
|
||||||
implementation project(':model')
|
implementation project(':model')
|
||||||
implementation project(':net:common')
|
implementation project(':net:common')
|
||||||
implementation project(':net:download:service-interface')
|
implementation project(':net:download:service-interface')
|
||||||
implementation project(':net:sync:model')
|
|
||||||
implementation project(':net:sync:service-interface')
|
implementation project(':net:sync:service-interface')
|
||||||
implementation project(':parser:media')
|
implementation project(':parser:media')
|
||||||
implementation project(':parser:feed')
|
implementation project(':parser:feed')
|
||||||
|
|
|
@ -23,7 +23,7 @@ import de.danoeh.antennapod.storage.database.DBWriter;
|
||||||
import de.danoeh.antennapod.model.download.DownloadError;
|
import de.danoeh.antennapod.model.download.DownloadError;
|
||||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handles a completed media download.
|
* Handles a completed media download.
|
||||||
|
|
|
@ -8,7 +8,7 @@ android {
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(':net:sync:model')
|
implementation project(':net:sync:service-interface')
|
||||||
|
|
||||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||||
implementation "androidx.appcompat:appcompat:$appcompatVersion"
|
implementation "androidx.appcompat:appcompat:$appcompatVersion"
|
||||||
|
|
|
@ -5,6 +5,12 @@ import android.util.Log;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.HostnameParser;
|
import de.danoeh.antennapod.net.sync.HostnameParser;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeActionChanges;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.ISyncService;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.SubscriptionChanges;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.SyncServiceException;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.UploadChangesResponse;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
@ -27,12 +33,6 @@ import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetDevice;
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetEpisodeActionPostResponse;
|
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetEpisodeActionPostResponse;
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetPodcast;
|
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetPodcast;
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetUploadChangesResponse;
|
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetUploadChangesResponse;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeActionChanges;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.ISyncService;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.SubscriptionChanges;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.SyncServiceException;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.UploadChangesResponse;
|
|
||||||
import okhttp3.Credentials;
|
import okhttp3.Credentials;
|
||||||
import okhttp3.MediaType;
|
import okhttp3.MediaType;
|
||||||
import okhttp3.OkHttpClient;
|
import okhttp3.OkHttpClient;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package de.danoeh.antennapod.net.sync.gpoddernet;
|
package de.danoeh.antennapod.net.sync.gpoddernet;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.model.SyncServiceException;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SyncServiceException;
|
||||||
|
|
||||||
public class GpodnetServiceException extends SyncServiceException {
|
public class GpodnetServiceException extends SyncServiceException {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
|
@ -2,6 +2,9 @@ package de.danoeh.antennapod.net.sync.gpoddernet.mapper;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeActionChanges;
|
||||||
|
import de.danoeh.antennapod.net.sync.serviceinterface.SubscriptionChanges;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
@ -10,10 +13,6 @@ import java.util.ArrayList;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeActionChanges;
|
|
||||||
import de.danoeh.antennapod.net.sync.model.SubscriptionChanges;
|
|
||||||
|
|
||||||
public class ResponseMapper {
|
public class ResponseMapper {
|
||||||
|
|
||||||
public static SubscriptionChanges readSubscriptionChangesFromJsonObject(@NonNull JSONObject object)
|
public static SubscriptionChanges readSubscriptionChangesFromJsonObject(@NonNull JSONObject object)
|
||||||
|
|
|
@ -2,7 +2,7 @@ package de.danoeh.antennapod.net.sync.gpoddernet.model;
|
||||||
|
|
||||||
import androidx.collection.ArrayMap;
|
import androidx.collection.ArrayMap;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.model.UploadChangesResponse;
|
import de.danoeh.antennapod.net.sync.serviceinterface.UploadChangesResponse;
|
||||||
import org.apache.commons.lang3.builder.ToStringBuilder;
|
import org.apache.commons.lang3.builder.ToStringBuilder;
|
||||||
import org.apache.commons.lang3.builder.ToStringStyle;
|
import org.apache.commons.lang3.builder.ToStringStyle;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
|
|
|
@ -3,7 +3,7 @@ package de.danoeh.antennapod.net.sync.gpoddernet.model;
|
||||||
import androidx.collection.ArrayMap;
|
import androidx.collection.ArrayMap;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
|
import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
|
||||||
import de.danoeh.antennapod.net.sync.model.UploadChangesResponse;
|
import de.danoeh.antennapod.net.sync.serviceinterface.UploadChangesResponse;
|
||||||
import org.json.JSONArray;
|
import org.json.JSONArray;
|
||||||
import org.json.JSONException;
|
import org.json.JSONException;
|
||||||
import org.json.JSONObject;
|
import org.json.JSONObject;
|
||||||
|
|
|
@ -3,12 +3,12 @@ package de.danoeh.antennapod.net.sync.nextcloud;
|
||||||
import de.danoeh.antennapod.net.sync.HostnameParser;
|
import de.danoeh.antennapod.net.sync.HostnameParser;
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.mapper.ResponseMapper;
|
import de.danoeh.antennapod.net.sync.gpoddernet.mapper.ResponseMapper;
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetUploadChangesResponse;
|
import de.danoeh.antennapod.net.sync.gpoddernet.model.GpodnetUploadChangesResponse;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeActionChanges;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeActionChanges;
|
||||||
import de.danoeh.antennapod.net.sync.model.ISyncService;
|
import de.danoeh.antennapod.net.sync.serviceinterface.ISyncService;
|
||||||
import de.danoeh.antennapod.net.sync.model.SubscriptionChanges;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SubscriptionChanges;
|
||||||
import de.danoeh.antennapod.net.sync.model.SyncServiceException;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SyncServiceException;
|
||||||
import de.danoeh.antennapod.net.sync.model.UploadChangesResponse;
|
import de.danoeh.antennapod.net.sync.serviceinterface.UploadChangesResponse;
|
||||||
import okhttp3.Credentials;
|
import okhttp3.Credentials;
|
||||||
import okhttp3.HttpUrl;
|
import okhttp3.HttpUrl;
|
||||||
import okhttp3.MediaType;
|
import okhttp3.MediaType;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package de.danoeh.antennapod.net.sync.nextcloud;
|
package de.danoeh.antennapod.net.sync.nextcloud;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.model.SyncServiceException;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SyncServiceException;
|
||||||
|
|
||||||
public class NextcloudSynchronizationServiceException extends SyncServiceException {
|
public class NextcloudSynchronizationServiceException extends SyncServiceException {
|
||||||
public NextcloudSynchronizationServiceException(Throwable e) {
|
public NextcloudSynchronizationServiceException(Throwable e) {
|
||||||
|
|
|
@ -1,3 +0,0 @@
|
||||||
# :net:sync:model
|
|
||||||
|
|
||||||
This module contains the basic interfaces for implementing a sync backend.
|
|
|
@ -1,14 +0,0 @@
|
||||||
plugins {
|
|
||||||
id("com.android.library")
|
|
||||||
}
|
|
||||||
apply from: "../../../common.gradle"
|
|
||||||
|
|
||||||
android {
|
|
||||||
namespace "de.danoeh.antennapod.net.sync.model"
|
|
||||||
}
|
|
||||||
|
|
||||||
dependencies {
|
|
||||||
implementation project(':model')
|
|
||||||
|
|
||||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
|
||||||
}
|
|
|
@ -9,9 +9,7 @@ android {
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(':model')
|
implementation project(':model')
|
||||||
implementation project(':net:sync:model')
|
|
||||||
implementation project(':storage:preferences')
|
implementation project(':storage:preferences')
|
||||||
implementation project(':ui:i18n')
|
|
||||||
|
|
||||||
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
annotationProcessor "androidx.annotation:annotation:$annotationVersion"
|
||||||
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
implementation "io.reactivex.rxjava2:rxandroid:$rxAndroidVersion"
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package de.danoeh.antennapod.net.sync.model;
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
import android.text.TextUtils;
|
import android.text.TextUtils;
|
||||||
import android.util.Log;
|
import android.util.Log;
|
|
@ -1,4 +1,4 @@
|
||||||
package de.danoeh.antennapod.net.sync.model;
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
|
@ -1,4 +1,4 @@
|
||||||
package de.danoeh.antennapod.net.sync.model;
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package de.danoeh.antennapod.net.sync.model;
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package de.danoeh.antennapod.net.sync.model;
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
public class SyncServiceException extends Exception {
|
public class SyncServiceException extends Exception {
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
|
@ -0,0 +1,25 @@
|
||||||
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
|
public enum SynchronizationProvider {
|
||||||
|
GPODDER_NET("GPODDER_NET"),
|
||||||
|
NEXTCLOUD_GPODDER("NEXTCLOUD_GPODDER");
|
||||||
|
|
||||||
|
public static SynchronizationProvider fromIdentifier(String provider) {
|
||||||
|
for (SynchronizationProvider synchronizationProvider : SynchronizationProvider.values()) {
|
||||||
|
if (synchronizationProvider.getIdentifier().equals(provider)) {
|
||||||
|
return synchronizationProvider;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private final String identifier;
|
||||||
|
|
||||||
|
SynchronizationProvider(String identifier) {
|
||||||
|
this.identifier = identifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getIdentifier() {
|
||||||
|
return identifier;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,45 +0,0 @@
|
||||||
package de.danoeh.antennapod.net.sync.serviceinterface;
|
|
||||||
|
|
||||||
public enum SynchronizationProviderViewData {
|
|
||||||
GPODDER_NET(
|
|
||||||
"GPODDER_NET",
|
|
||||||
R.string.gpodnet_description,
|
|
||||||
R.drawable.gpodder_icon
|
|
||||||
),
|
|
||||||
NEXTCLOUD_GPODDER(
|
|
||||||
"NEXTCLOUD_GPODDER",
|
|
||||||
R.string.synchronization_summary_nextcloud,
|
|
||||||
R.drawable.nextcloud_logo
|
|
||||||
);
|
|
||||||
|
|
||||||
public static SynchronizationProviderViewData fromIdentifier(String provider) {
|
|
||||||
for (SynchronizationProviderViewData synchronizationProvider : SynchronizationProviderViewData.values()) {
|
|
||||||
if (synchronizationProvider.getIdentifier().equals(provider)) {
|
|
||||||
return synchronizationProvider;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private final String identifier;
|
|
||||||
private final int iconResource;
|
|
||||||
private final int summaryResource;
|
|
||||||
|
|
||||||
SynchronizationProviderViewData(String identifier, int summaryResource, int iconResource) {
|
|
||||||
this.identifier = identifier;
|
|
||||||
this.iconResource = iconResource;
|
|
||||||
this.summaryResource = summaryResource;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getIdentifier() {
|
|
||||||
return identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getIconResource() {
|
|
||||||
return iconResource;
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getSummaryResource() {
|
|
||||||
return summaryResource;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,7 +4,6 @@ import android.content.Context;
|
||||||
|
|
||||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
|
||||||
|
|
||||||
public class SynchronizationQueueSink {
|
public class SynchronizationQueueSink {
|
||||||
// To avoid a dependency loop of every class to SyncService, and from SyncService back to every class.
|
// To avoid a dependency loop of every class to SyncService, and from SyncService back to every class.
|
||||||
|
|
|
@ -9,7 +9,6 @@ import org.json.JSONException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
|
||||||
|
|
||||||
public class SynchronizationQueueStorage {
|
public class SynchronizationQueueStorage {
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package de.danoeh.antennapod.net.sync.model;
|
package de.danoeh.antennapod.net.sync.serviceinterface;
|
||||||
|
|
||||||
public abstract class UploadChangesResponse {
|
public abstract class UploadChangesResponse {
|
||||||
|
|
|
@ -13,7 +13,6 @@ dependencies {
|
||||||
implementation project(':model')
|
implementation project(':model')
|
||||||
implementation project(':net:common')
|
implementation project(':net:common')
|
||||||
implementation project(':net:sync:gpoddernet')
|
implementation project(':net:sync:gpoddernet')
|
||||||
implementation project(':net:sync:model')
|
|
||||||
implementation project(':net:sync:service-interface')
|
implementation project(':net:sync:service-interface')
|
||||||
implementation project(':storage:database')
|
implementation project(':storage:database')
|
||||||
implementation project(':storage:preferences')
|
implementation project(':storage:preferences')
|
||||||
|
|
|
@ -8,7 +8,7 @@ import androidx.core.util.Pair;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
|
|
||||||
public class EpisodeActionFilter {
|
public class EpisodeActionFilter {
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||||
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
import de.danoeh.antennapod.net.download.serviceinterface.FeedUpdateManager;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.LockingAsyncExecutor;
|
import de.danoeh.antennapod.net.sync.serviceinterface.LockingAsyncExecutor;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProviderViewData;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProvider;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueStorage;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueStorage;
|
||||||
import de.danoeh.antennapod.storage.database.DBWriter;
|
import de.danoeh.antennapod.storage.database.DBWriter;
|
||||||
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
import de.danoeh.antennapod.storage.database.FeedDatabaseWriter;
|
||||||
|
@ -55,12 +55,12 @@ import de.danoeh.antennapod.model.feed.Feed;
|
||||||
import de.danoeh.antennapod.model.feed.FeedItem;
|
import de.danoeh.antennapod.model.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.model.feed.FeedMedia;
|
import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
|
import de.danoeh.antennapod.net.sync.gpoddernet.GpodnetService;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeActionChanges;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeActionChanges;
|
||||||
import de.danoeh.antennapod.net.sync.model.ISyncService;
|
import de.danoeh.antennapod.net.sync.serviceinterface.ISyncService;
|
||||||
import de.danoeh.antennapod.net.sync.model.SubscriptionChanges;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SubscriptionChanges;
|
||||||
import de.danoeh.antennapod.net.sync.model.SyncServiceException;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SyncServiceException;
|
||||||
import de.danoeh.antennapod.net.sync.model.UploadChangesResponse;
|
import de.danoeh.antennapod.net.sync.serviceinterface.UploadChangesResponse;
|
||||||
import de.danoeh.antennapod.net.sync.nextcloud.NextcloudSyncService;
|
import de.danoeh.antennapod.net.sync.nextcloud.NextcloudSyncService;
|
||||||
|
|
||||||
public class SyncService extends Worker {
|
public class SyncService extends Worker {
|
||||||
|
@ -369,7 +369,7 @@ public class SyncService extends Worker {
|
||||||
|
|
||||||
private ISyncService getActiveSyncProvider() {
|
private ISyncService getActiveSyncProvider() {
|
||||||
String selectedSyncProviderKey = SynchronizationSettings.getSelectedSyncProviderKey();
|
String selectedSyncProviderKey = SynchronizationSettings.getSelectedSyncProviderKey();
|
||||||
SynchronizationProviderViewData selectedService = SynchronizationProviderViewData
|
SynchronizationProvider selectedService = SynchronizationProvider
|
||||||
.fromIdentifier(selectedSyncProviderKey);
|
.fromIdentifier(selectedSyncProviderKey);
|
||||||
if (selectedService == null) {
|
if (selectedService == null) {
|
||||||
return null;
|
return null;
|
||||||
|
|
|
@ -12,7 +12,7 @@ import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
|
|
||||||
|
|
||||||
public class EpisodeActionFilterTest extends TestCase {
|
public class EpisodeActionFilterTest extends TestCase {
|
||||||
|
|
|
@ -25,7 +25,6 @@ include ':net:download:service-interface'
|
||||||
include ':net:download:service'
|
include ':net:download:service'
|
||||||
include ':net:ssl'
|
include ':net:ssl'
|
||||||
include ':net:sync:gpoddernet'
|
include ':net:sync:gpoddernet'
|
||||||
include ':net:sync:model'
|
|
||||||
include ':net:sync:service-interface'
|
include ':net:sync:service-interface'
|
||||||
include ':net:sync:service'
|
include ':net:sync:service'
|
||||||
|
|
||||||
|
|
|
@ -16,7 +16,6 @@ dependencies {
|
||||||
implementation project(':event')
|
implementation project(':event')
|
||||||
implementation project(':model')
|
implementation project(':model')
|
||||||
implementation project(':net:download:service-interface')
|
implementation project(':net:download:service-interface')
|
||||||
implementation project(':net:sync:model')
|
|
||||||
implementation project(':net:sync:service-interface')
|
implementation project(':net:sync:service-interface')
|
||||||
implementation project(':storage:preferences')
|
implementation project(':storage:preferences')
|
||||||
implementation project(':ui:app-start-intent')
|
implementation project(':ui:app-start-intent')
|
||||||
|
|
|
@ -36,7 +36,6 @@ import java.util.concurrent.TimeUnit;
|
||||||
import de.danoeh.antennapod.event.FavoritesEvent;
|
import de.danoeh.antennapod.event.FavoritesEvent;
|
||||||
import de.danoeh.antennapod.event.FeedItemEvent;
|
import de.danoeh.antennapod.event.FeedItemEvent;
|
||||||
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
import de.danoeh.antennapod.event.FeedListUpdateEvent;
|
||||||
import de.danoeh.antennapod.event.MessageEvent;
|
|
||||||
import de.danoeh.antennapod.event.playback.PlaybackHistoryEvent;
|
import de.danoeh.antennapod.event.playback.PlaybackHistoryEvent;
|
||||||
import de.danoeh.antennapod.event.QueueEvent;
|
import de.danoeh.antennapod.event.QueueEvent;
|
||||||
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
|
import de.danoeh.antennapod.event.UnreadItemsUpdateEvent;
|
||||||
|
@ -50,7 +49,7 @@ import de.danoeh.antennapod.model.feed.FeedMedia;
|
||||||
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||||
import de.danoeh.antennapod.model.playback.Playable;
|
import de.danoeh.antennapod.model.playback.Playable;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Provides methods for writing data to AntennaPod's database.
|
* Provides methods for writing data to AntennaPod's database.
|
||||||
|
@ -114,8 +113,7 @@ public class DBWriter {
|
||||||
// Local feed
|
// Local feed
|
||||||
DocumentFile documentFile = DocumentFile.fromSingleUri(context, Uri.parse(media.getLocalFileUrl()));
|
DocumentFile documentFile = DocumentFile.fromSingleUri(context, Uri.parse(media.getLocalFileUrl()));
|
||||||
if (documentFile == null || !documentFile.exists() || !documentFile.delete()) {
|
if (documentFile == null || !documentFile.exists() || !documentFile.delete()) {
|
||||||
EventBus.getDefault().post(new MessageEvent(context.getString(R.string.delete_local_failed)));
|
Log.d(TAG, "Deletion of local file failed.");
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
media.setLocalFileUrl(null);
|
media.setLocalFileUrl(null);
|
||||||
localDelete = true;
|
localDelete = true;
|
||||||
|
@ -123,9 +121,7 @@ public class DBWriter {
|
||||||
// delete downloaded media file
|
// delete downloaded media file
|
||||||
File mediaFile = new File(media.getLocalFileUrl());
|
File mediaFile = new File(media.getLocalFileUrl());
|
||||||
if (mediaFile.exists() && !mediaFile.delete()) {
|
if (mediaFile.exists() && !mediaFile.delete()) {
|
||||||
MessageEvent evt = new MessageEvent(context.getString(R.string.delete_failed));
|
Log.d(TAG, "Deletion of downloaded file failed.");
|
||||||
EventBus.getDefault().post(evt);
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
media.setDownloaded(false);
|
media.setDownloaded(false);
|
||||||
media.setLocalFileUrl(null);
|
media.setLocalFileUrl(null);
|
||||||
|
|
|
@ -11,7 +11,7 @@ import de.danoeh.antennapod.model.feed.FeedItem;
|
||||||
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
import de.danoeh.antennapod.model.feed.FeedItemFilter;
|
||||||
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
import de.danoeh.antennapod.model.feed.FeedPreferences;
|
||||||
import de.danoeh.antennapod.model.feed.SortOrder;
|
import de.danoeh.antennapod.model.feed.SortOrder;
|
||||||
import de.danoeh.antennapod.net.sync.model.EpisodeAction;
|
import de.danoeh.antennapod.net.sync.serviceinterface.EpisodeAction;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||||
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
import de.danoeh.antennapod.storage.preferences.UserPreferences;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
|
|
|
@ -218,8 +218,6 @@
|
||||||
<string name="pause_label">Pause</string>
|
<string name="pause_label">Pause</string>
|
||||||
<string name="stream_label">Stream</string>
|
<string name="stream_label">Stream</string>
|
||||||
<string name="delete_label">Delete</string>
|
<string name="delete_label">Delete</string>
|
||||||
<string name="delete_failed">Unable to delete file. Rebooting the device could help.</string>
|
|
||||||
<string name="delete_local_failed">Unable to delete file. Try re-connecting the local folder from the podcast info screen.</string>
|
|
||||||
<string name="delete_episode_label">Delete episode</string>
|
<string name="delete_episode_label">Delete episode</string>
|
||||||
<plurals name="deleted_multi_episode_batch_label">
|
<plurals name="deleted_multi_episode_batch_label">
|
||||||
<item quantity="one">1 downloaded episode deleted.</item>
|
<item quantity="one">1 downloaded episode deleted.</item>
|
||||||
|
|
|
@ -25,7 +25,6 @@ android {
|
||||||
dependencies {
|
dependencies {
|
||||||
implementation project(":event")
|
implementation project(":event")
|
||||||
implementation project(":net:common")
|
implementation project(":net:common")
|
||||||
implementation project(":net:sync:model")
|
|
||||||
implementation project(":net:sync:gpoddernet")
|
implementation project(":net:sync:gpoddernet")
|
||||||
implementation project(":storage:preferences")
|
implementation project(":storage:preferences")
|
||||||
implementation project(":storage:importexport")
|
implementation project(":storage:importexport")
|
||||||
|
|
|
@ -20,7 +20,7 @@ import androidx.fragment.app.DialogFragment;
|
||||||
import com.google.android.material.button.MaterialButton;
|
import com.google.android.material.button.MaterialButton;
|
||||||
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
||||||
import de.danoeh.antennapod.net.sync.service.SyncService;
|
import de.danoeh.antennapod.net.sync.service.SyncService;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProviderViewData;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProvider;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||||
import de.danoeh.antennapod.storage.preferences.SynchronizationCredentials;
|
import de.danoeh.antennapod.storage.preferences.SynchronizationCredentials;
|
||||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||||
|
@ -257,7 +257,7 @@ public class GpodderAuthenticationFragment extends DialogFragment {
|
||||||
throw new IllegalStateException("Device must not be null here");
|
throw new IllegalStateException("Device must not be null here");
|
||||||
} else {
|
} else {
|
||||||
SynchronizationSettings.setSelectedSyncProvider(
|
SynchronizationSettings.setSelectedSyncProvider(
|
||||||
SynchronizationProviderViewData.GPODDER_NET.getIdentifier());
|
SynchronizationProvider.GPODDER_NET.getIdentifier());
|
||||||
SynchronizationCredentials.setUsername(username);
|
SynchronizationCredentials.setUsername(username);
|
||||||
SynchronizationCredentials.setPassword(password);
|
SynchronizationCredentials.setPassword(password);
|
||||||
SynchronizationCredentials.setDeviceId(selectedDevice.getId());
|
SynchronizationCredentials.setDeviceId(selectedDevice.getId());
|
||||||
|
|
|
@ -10,7 +10,7 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import androidx.fragment.app.DialogFragment;
|
import androidx.fragment.app.DialogFragment;
|
||||||
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
import de.danoeh.antennapod.net.common.AntennapodHttpClient;
|
||||||
import de.danoeh.antennapod.net.sync.service.SyncService;
|
import de.danoeh.antennapod.net.sync.service.SyncService;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProviderViewData;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProvider;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||||
import de.danoeh.antennapod.storage.preferences.SynchronizationCredentials;
|
import de.danoeh.antennapod.storage.preferences.SynchronizationCredentials;
|
||||||
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
import de.danoeh.antennapod.storage.preferences.SynchronizationSettings;
|
||||||
|
@ -89,7 +89,7 @@ public class NextcloudAuthenticationFragment extends DialogFragment
|
||||||
@Override
|
@Override
|
||||||
public void onNextcloudAuthenticated(String server, String username, String password) {
|
public void onNextcloudAuthenticated(String server, String username, String password) {
|
||||||
SynchronizationSettings.setSelectedSyncProvider(
|
SynchronizationSettings.setSelectedSyncProvider(
|
||||||
SynchronizationProviderViewData.NEXTCLOUD_GPODDER.getIdentifier());
|
SynchronizationProvider.NEXTCLOUD_GPODDER.getIdentifier());
|
||||||
SynchronizationCredentials.clear();
|
SynchronizationCredentials.clear();
|
||||||
SynchronizationQueueSink.clearQueue(getContext());
|
SynchronizationQueueSink.clearQueue(getContext());
|
||||||
SynchronizationCredentials.setPassword(password);
|
SynchronizationCredentials.setPassword(password);
|
||||||
|
|
|
@ -12,7 +12,9 @@ import android.widget.ImageView;
|
||||||
import android.widget.ListAdapter;
|
import android.widget.ListAdapter;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
|
||||||
|
import androidx.annotation.DrawableRes;
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
|
import androidx.annotation.StringRes;
|
||||||
import androidx.appcompat.app.AppCompatActivity;
|
import androidx.appcompat.app.AppCompatActivity;
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder;
|
||||||
import androidx.core.text.HtmlCompat;
|
import androidx.core.text.HtmlCompat;
|
||||||
|
@ -22,7 +24,7 @@ import androidx.preference.PreferenceFragmentCompat;
|
||||||
import com.google.android.material.snackbar.Snackbar;
|
import com.google.android.material.snackbar.Snackbar;
|
||||||
|
|
||||||
import de.danoeh.antennapod.net.sync.service.SyncService;
|
import de.danoeh.antennapod.net.sync.service.SyncService;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProviderViewData;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationProvider;
|
||||||
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
import de.danoeh.antennapod.net.sync.serviceinterface.SynchronizationQueueSink;
|
||||||
import de.danoeh.antennapod.ui.preferences.R;
|
import de.danoeh.antennapod.ui.preferences.R;
|
||||||
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.EventBus;
|
||||||
|
@ -114,11 +116,11 @@ public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat
|
||||||
final boolean loggedIn = SynchronizationSettings.isProviderConnected();
|
final boolean loggedIn = SynchronizationSettings.isProviderConnected();
|
||||||
Preference preferenceHeader = findPreference(PREFERENCE_SYNCHRONIZATION_DESCRIPTION);
|
Preference preferenceHeader = findPreference(PREFERENCE_SYNCHRONIZATION_DESCRIPTION);
|
||||||
if (loggedIn) {
|
if (loggedIn) {
|
||||||
SynchronizationProviderViewData selectedProvider =
|
SynchronizationProvider selectedProvider =
|
||||||
SynchronizationProviderViewData.fromIdentifier(getSelectedSyncProviderKey());
|
SynchronizationProvider.fromIdentifier(getSelectedSyncProviderKey());
|
||||||
preferenceHeader.setTitle("");
|
preferenceHeader.setTitle("");
|
||||||
preferenceHeader.setSummary(selectedProvider.getSummaryResource());
|
preferenceHeader.setSummary(getProviderSummary(selectedProvider));
|
||||||
preferenceHeader.setIcon(selectedProvider.getIconResource());
|
preferenceHeader.setIcon(getProviderIcon(selectedProvider));
|
||||||
preferenceHeader.setOnPreferenceClickListener(null);
|
preferenceHeader.setOnPreferenceClickListener(null);
|
||||||
} else {
|
} else {
|
||||||
preferenceHeader.setTitle(R.string.synchronization_choose_title);
|
preferenceHeader.setTitle(R.string.synchronization_choose_title);
|
||||||
|
@ -131,7 +133,7 @@ public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat
|
||||||
}
|
}
|
||||||
|
|
||||||
Preference gpodnetSetLoginPreference = findPreference(PREFERENCE_GPODNET_SETLOGIN_INFORMATION);
|
Preference gpodnetSetLoginPreference = findPreference(PREFERENCE_GPODNET_SETLOGIN_INFORMATION);
|
||||||
gpodnetSetLoginPreference.setVisible(isProviderSelected(SynchronizationProviderViewData.GPODDER_NET));
|
gpodnetSetLoginPreference.setVisible(isProviderSelected(SynchronizationProvider.GPODDER_NET));
|
||||||
gpodnetSetLoginPreference.setEnabled(loggedIn);
|
gpodnetSetLoginPreference.setEnabled(loggedIn);
|
||||||
findPreference(PREFERENCE_SYNC).setEnabled(loggedIn);
|
findPreference(PREFERENCE_SYNC).setEnabled(loggedIn);
|
||||||
findPreference(PREFERENCE_FORCE_FULL_SYNC).setEnabled(loggedIn);
|
findPreference(PREFERENCE_FORCE_FULL_SYNC).setEnabled(loggedIn);
|
||||||
|
@ -153,9 +155,8 @@ public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat
|
||||||
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext());
|
MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(getContext());
|
||||||
builder.setTitle(R.string.dialog_choose_sync_service_title);
|
builder.setTitle(R.string.dialog_choose_sync_service_title);
|
||||||
|
|
||||||
SynchronizationProviderViewData[] providers = SynchronizationProviderViewData.values();
|
SynchronizationProvider[] providers = SynchronizationProvider.values();
|
||||||
ListAdapter adapter = new ArrayAdapter<SynchronizationProviderViewData>(
|
ListAdapter adapter = new ArrayAdapter<>(getContext(), R.layout.alertdialog_sync_provider_chooser, providers) {
|
||||||
getContext(), R.layout.alertdialog_sync_provider_chooser, providers) {
|
|
||||||
|
|
||||||
ViewHolder holder;
|
ViewHolder holder;
|
||||||
|
|
||||||
|
@ -177,9 +178,9 @@ public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat
|
||||||
} else {
|
} else {
|
||||||
holder = (ViewHolder) convertView.getTag();
|
holder = (ViewHolder) convertView.getTag();
|
||||||
}
|
}
|
||||||
SynchronizationProviderViewData synchronizationProviderViewData = getItem(position);
|
SynchronizationProvider synchronizationProvider = getItem(position);
|
||||||
holder.title.setText(synchronizationProviderViewData.getSummaryResource());
|
holder.title.setText(getProviderSummary(synchronizationProvider));
|
||||||
holder.icon.setImageResource(synchronizationProviderViewData.getIconResource());
|
holder.icon.setImageResource(getProviderIcon(synchronizationProvider));
|
||||||
return convertView;
|
return convertView;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -203,7 +204,7 @@ public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat
|
||||||
builder.show();
|
builder.show();
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isProviderSelected(@NonNull SynchronizationProviderViewData provider) {
|
private boolean isProviderSelected(@NonNull SynchronizationProvider provider) {
|
||||||
String selectedSyncProviderKey = getSelectedSyncProviderKey();
|
String selectedSyncProviderKey = getSelectedSyncProviderKey();
|
||||||
return provider.getIdentifier().equals(selectedSyncProviderKey);
|
return provider.getIdentifier().equals(selectedSyncProviderKey);
|
||||||
}
|
}
|
||||||
|
@ -219,4 +220,26 @@ public class SynchronizationPreferencesFragment extends PreferenceFragmentCompat
|
||||||
lastTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, DateUtils.FORMAT_SHOW_TIME));
|
lastTime, DateUtils.MINUTE_IN_MILLIS, DateUtils.WEEK_IN_MILLIS, DateUtils.FORMAT_SHOW_TIME));
|
||||||
((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(status);
|
((AppCompatActivity) getActivity()).getSupportActionBar().setSubtitle(status);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private @StringRes int getProviderSummary(SynchronizationProvider provider) {
|
||||||
|
switch (provider) {
|
||||||
|
case GPODDER_NET:
|
||||||
|
return R.string.gpodnet_description;
|
||||||
|
case NEXTCLOUD_GPODDER:
|
||||||
|
return R.string.synchronization_summary_nextcloud;
|
||||||
|
default:
|
||||||
|
return R.string.sync_status_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private @DrawableRes int getProviderIcon(SynchronizationProvider provider) {
|
||||||
|
switch (provider) {
|
||||||
|
case GPODDER_NET:
|
||||||
|
return R.drawable.gpodder_icon;
|
||||||
|
case NEXTCLOUD_GPODDER:
|
||||||
|
return R.drawable.nextcloud_logo;
|
||||||
|
default:
|
||||||
|
return R.drawable.ic_error;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Loading…
Reference in New Issue