diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2f944dfe6..47648f9d3 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -301,6 +301,19 @@ + + + + + + + + + + + + + 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 cb7db1709..1ac068307 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 @@ -5,9 +5,10 @@ import android.text.TextUtils; import androidx.annotation.NonNull; import android.util.Log; -import de.danoeh.antennapod.core.BuildConfig; import okhttp3.HttpUrl; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; import java.util.ArrayList; import java.util.List; @@ -28,6 +29,7 @@ public final class URLChecker { private static final String TAG = "URLChecker"; private static final String AP_SUBSCRIBE = "antennapod-subscribe://"; + private static final String AP_SUBSCRIBE_DEEPLINK = "antennapod.org/deeplink/subscribe?url="; /** * Checks if URL is valid and modifies it if necessary. @@ -39,22 +41,30 @@ public final class URLChecker { url = url.trim(); String lowerCaseUrl = url.toLowerCase(); // protocol names are case insensitive if (lowerCaseUrl.startsWith("feed://")) { - if (BuildConfig.DEBUG) Log.d(TAG, "Replacing feed:// with http://"); + Log.d(TAG, "Replacing feed:// with http://"); return prepareURL(url.substring("feed://".length())); } else if (lowerCaseUrl.startsWith("pcast://")) { - if (BuildConfig.DEBUG) Log.d(TAG, "Removing pcast://"); + Log.d(TAG, "Removing pcast://"); return prepareURL(url.substring("pcast://".length())); } else if (lowerCaseUrl.startsWith("pcast:")) { - if (BuildConfig.DEBUG) Log.d(TAG, "Removing pcast:"); + Log.d(TAG, "Removing pcast:"); return prepareURL(url.substring("pcast:".length())); } else if (lowerCaseUrl.startsWith("itpc")) { - if (BuildConfig.DEBUG) Log.d(TAG, "Replacing itpc:// with http://"); + Log.d(TAG, "Replacing itpc:// with http://"); return prepareURL(url.substring("itpc://".length())); } else if (lowerCaseUrl.startsWith(AP_SUBSCRIBE)) { - if (BuildConfig.DEBUG) Log.d(TAG, "Removing antennapod-subscribe://"); + Log.d(TAG, "Removing antennapod-subscribe://"); return prepareURL(url.substring(AP_SUBSCRIBE.length())); + } else if (lowerCaseUrl.contains(AP_SUBSCRIBE_DEEPLINK)) { + Log.d(TAG, "Removing " + AP_SUBSCRIBE_DEEPLINK); + String removedWebsite = url.substring(url.indexOf(AP_SUBSCRIBE_DEEPLINK) + AP_SUBSCRIBE_DEEPLINK.length()); + try { + return prepareURL(URLDecoder.decode(removedWebsite, "UTF-8")); + } catch (UnsupportedEncodingException e) { + return prepareURL(removedWebsite); + } } else if (!(lowerCaseUrl.startsWith("http://") || lowerCaseUrl.startsWith("https://"))) { - if (BuildConfig.DEBUG) Log.d(TAG, "Adding http:// at the beginning of the URL"); + Log.d(TAG, "Adding http:// at the beginning of the URL"); return "http://" + url; } else { return url; diff --git a/core/src/test/java/de/danoeh/antennapod/core/util/URLCheckerTest.java b/core/src/test/java/de/danoeh/antennapod/core/util/URLCheckerTest.java index a4b3dee06..c20398ffc 100644 --- a/core/src/test/java/de/danoeh/antennapod/core/util/URLCheckerTest.java +++ b/core/src/test/java/de/danoeh/antennapod/core/util/URLCheckerTest.java @@ -4,6 +4,9 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.RobolectricTestRunner; +import java.io.UnsupportedEncodingException; +import java.net.URLEncoder; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -98,6 +101,19 @@ public class URLCheckerTest { assertEquals("https://example.com", out); } + @Test + public void testAntennaPodSubscribeDeeplink() throws UnsupportedEncodingException { + final String feed = "http://example.org/podcast.rss"; + assertEquals(feed, URLChecker.prepareURL("https://antennapod.org/deeplink/subscribe?url=" + feed)); + assertEquals(feed, URLChecker.prepareURL("http://antennapod.org/deeplink/subscribe?url=" + feed)); + assertEquals(feed, URLChecker.prepareURL("https://www.antennapod.org/deeplink/subscribe?url=" + feed)); + assertEquals(feed, URLChecker.prepareURL("http://www.antennapod.org/deeplink/subscribe?url=" + feed)); + assertEquals(feed, URLChecker.prepareURL("http://www.antennapod.org/deeplink/subscribe?url=" + + URLEncoder.encode(feed, "UTF-8"))); + assertEquals(feed, URLChecker.prepareURL("http://www.antennapod.org/deeplink/subscribe?url=" + + "example.org/podcast.rss")); + } + @Test public void testProtocolRelativeUrlIsAbsolute() { final String in = "https://example.com";