From ac0cb04154ae09cb7868de5f99c5138eff4012e9 Mon Sep 17 00:00:00 2001 From: ByteHamster Date: Tue, 17 Dec 2019 17:15:31 +0100 Subject: More forgiving duplicate detection --- .../core/service/GpodnetSyncService.java | 6 +-- .../de/danoeh/antennapod/core/util/URLChecker.java | 47 ++++++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) (limited to 'core/src/main/java/de/danoeh') 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 b254cfc59..e4d9ff361 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 @@ -38,6 +38,7 @@ import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.DownloadRequestException; import de.danoeh.antennapod.core.storage.DownloadRequester; import de.danoeh.antennapod.core.util.NetworkUtils; +import de.danoeh.antennapod.core.util.URLChecker; import de.danoeh.antennapod.core.util.gui.NotificationUtils; /** @@ -185,15 +186,14 @@ public class GpodnetSyncService extends SafeJobIntentService { // local changes are always superior to remote changes! // add subscription if (1) not already subscribed and (2) not just unsubscribed for (String downloadUrl : changes.getAdded()) { - if (!localSubscriptions.contains(downloadUrl) && - !localRemoved.contains(downloadUrl)) { + if (!URLChecker.containsUrl(localSubscriptions, downloadUrl) && !localRemoved.contains(downloadUrl)) { Feed feed = new Feed(downloadUrl, null); DownloadRequester.getInstance().downloadFeed(this, feed); } } // remove subscription if not just subscribed (again) for (String downloadUrl : changes.getRemoved()) { - if(!localAdded.contains(downloadUrl)) { + if (!localAdded.contains(downloadUrl)) { DBTasks.removeFeedWithDownloadUrl(GpodnetSyncService.this, downloadUrl); } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/util/URLChecker.java b/core/src/main/java/de/danoeh/antennapod/core/util/URLChecker.java index 7e3870a20..dbdb37c3b 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/util/URLChecker.java +++ b/core/src/main/java/de/danoeh/antennapod/core/util/URLChecker.java @@ -1,10 +1,16 @@ package de.danoeh.antennapod.core.util; import android.net.Uri; +import android.text.TextUtils; import androidx.annotation.NonNull; import android.util.Log; import de.danoeh.antennapod.core.BuildConfig; +import okhttp3.HttpUrl; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; /** * Provides methods for checking and editing a URL. @@ -78,4 +84,45 @@ public final class URLChecker { return prepareURL(url); } } + + public static boolean containsUrl(List list, String url) { + for (String item : list) { + if (urlEquals(item, url)) { + return true; + } + } + return false; + } + + public static boolean urlEquals(String string1, String string2) { + HttpUrl url1 = HttpUrl.parse(string1); + HttpUrl url2 = HttpUrl.parse(string2); + if (!url1.host().equals(url2.host())) { + return false; + } + List pathSegments1 = normalizePathSegments(url1.pathSegments()); + List pathSegments2 = normalizePathSegments(url2.pathSegments()); + if (!pathSegments1.equals(pathSegments2)) { + return false; + } + if (TextUtils.isEmpty(url1.query())) { + return TextUtils.isEmpty(url2.query()); + } + return url1.query().equals(url2.query()); + } + + /** + * Removes empty segments and converts all to lower case. + * @param input List of path segments + * @return Normalized list of path segments + */ + private static List normalizePathSegments(List input) { + List result = new ArrayList<>(); + for (String string : input) { + if (!TextUtils.isEmpty(string)) { + result.add(string.toLowerCase()); + } + } + return result; + } } -- cgit v1.2.3