summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/src/androidTest/java/de/test/antennapod/util/URLCheckerTest.java28
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/service/GpodnetSyncService.java6
-rw-r--r--core/src/main/java/de/danoeh/antennapod/core/util/URLChecker.java47
3 files changed, 78 insertions, 3 deletions
diff --git a/app/src/androidTest/java/de/test/antennapod/util/URLCheckerTest.java b/app/src/androidTest/java/de/test/antennapod/util/URLCheckerTest.java
index 5bc2f7bd8..4893d7d82 100644
--- a/app/src/androidTest/java/de/test/antennapod/util/URLCheckerTest.java
+++ b/app/src/androidTest/java/de/test/antennapod/util/URLCheckerTest.java
@@ -5,6 +5,8 @@ import de.danoeh.antennapod.core.util.URLChecker;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
/**
* Test class for URLChecker
@@ -119,4 +121,30 @@ public class URLCheckerTest {
final String out = URLChecker.prepareURL(in, null);
assertEquals("http://example.com", out);
}
+
+ @Test
+ public void testUrlEqualsSame() {
+ assertTrue(URLChecker.urlEquals("https://www.example.com/test", "https://www.example.com/test"));
+ assertTrue(URLChecker.urlEquals("https://www.example.com/test", "https://www.example.com/test/"));
+ assertTrue(URLChecker.urlEquals("https://www.example.com/test", "https://www.example.com//test"));
+ assertTrue(URLChecker.urlEquals("https://www.example.com", "https://www.example.com/"));
+ assertTrue(URLChecker.urlEquals("https://www.example.com", "http://www.example.com"));
+ assertTrue(URLChecker.urlEquals("http://www.example.com/", "https://www.example.com/"));
+ assertTrue(URLChecker.urlEquals("https://www.example.com/?id=42", "https://www.example.com/?id=42"));
+ assertTrue(URLChecker.urlEquals("https://example.com/podcast%20test", "https://example.com/podcast test"));
+ assertTrue(URLChecker.urlEquals("https://example.com/?a=podcast%20test", "https://example.com/?a=podcast test"));
+ assertTrue(URLChecker.urlEquals("https://example.com/?", "https://example.com/"));
+ assertTrue(URLChecker.urlEquals("https://example.com/?", "https://example.com"));
+ assertTrue(URLChecker.urlEquals("https://Example.com", "https://example.com"));
+ assertTrue(URLChecker.urlEquals("https://example.com/test", "https://example.com/Test"));
+ }
+
+ @Test
+ public void testUrlEqualsDifferent() {
+ assertFalse(URLChecker.urlEquals("https://www.example.com/test", "https://www.example2.com/test"));
+ assertFalse(URLChecker.urlEquals("https://www.example.com/test", "https://www.example.de/test"));
+ assertFalse(URLChecker.urlEquals("https://example.com/", "https://otherpodcast.example.com/"));
+ assertFalse(URLChecker.urlEquals("https://www.example.com/?id=42&a=b", "https://www.example.com/?id=43&a=b"));
+ assertFalse(URLChecker.urlEquals("https://example.com/podcast%25test", "https://example.com/podcast test"));
+ }
}
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<String> 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<String> pathSegments1 = normalizePathSegments(url1.pathSegments());
+ List<String> 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<String> normalizePathSegments(List<String> input) {
+ List<String> result = new ArrayList<>();
+ for (String string : input) {
+ if (!TextUtils.isEmpty(string)) {
+ result.add(string.toLowerCase());
+ }
+ }
+ return result;
+ }
}