From fd13f3f98d4c3ab99a9b31d0c79fdfeda95e6101 Mon Sep 17 00:00:00 2001 From: Fredrik Fornwall Date: Sun, 5 Jan 2020 01:02:13 +0100 Subject: [PATCH] Handle magnet links with termux-url-opener Fixes #1339 and #1382. --- app/build.gradle | 11 +++++-- .../TermuxFileReceiverActivity.java | 8 ++++- .../com/termux/app/TermuxActivityTest.java | 28 ++++++++-------- .../TermuxFileReceiverActivityTest.java | 32 +++++++++++++++++++ terminal-emulator/build.gradle | 2 +- terminal-view/build.gradle | 4 +-- 6 files changed, 66 insertions(+), 19 deletions(-) create mode 100644 app/src/test/java/com/termux/filepicker/TermuxFileReceiverActivityTest.java diff --git a/app/build.gradle b/app/build.gradle index c2a2f1c3..70088b78 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -6,7 +6,7 @@ android { compileSdkVersion 28 dependencies { - implementation "androidx.annotation:annotation:1.0.1" + implementation "androidx.annotation:annotation:1.1.0" implementation "androidx.viewpager:viewpager:1.0.0" implementation "androidx.drawerlayout:drawerlayout:1.0.0" implementation project(":terminal-view") @@ -62,10 +62,17 @@ android { path "src/main/cpp/Android.mk" } } + + testOptions { + unitTests { + includeAndroidResources = true + } + } } dependencies { - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' + testImplementation 'org.robolectric:robolectric:4.3' } task versionName { diff --git a/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java b/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java index 1081e4cf..e1ef5d42 100644 --- a/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java +++ b/app/src/main/java/com/termux/filepicker/TermuxFileReceiverActivity.java @@ -21,6 +21,7 @@ import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.nio.charset.StandardCharsets; +import java.util.regex.Pattern; public class TermuxFileReceiverActivity extends Activity { @@ -36,6 +37,11 @@ public class TermuxFileReceiverActivity extends Activity { */ boolean mFinishOnDismissNameDialog = true; + static boolean isSharedTextAnUrl(String sharedText) { + return Patterns.WEB_URL.matcher(sharedText).matches() + || Pattern.matches("magnet:\\?xt=urn:btih:.*?", sharedText); + } + @Override protected void onResume() { super.onResume(); @@ -50,7 +56,7 @@ public class TermuxFileReceiverActivity extends Activity { final Uri sharedUri = intent.getParcelableExtra(Intent.EXTRA_STREAM); if (sharedText != null) { - if (Patterns.WEB_URL.matcher(sharedText).matches()) { + if (isSharedTextAnUrl(sharedText)) { handleUrlAndFinish(sharedText); } else { String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); diff --git a/app/src/test/java/com/termux/app/TermuxActivityTest.java b/app/src/test/java/com/termux/app/TermuxActivityTest.java index b9358aa3..07be4773 100644 --- a/app/src/test/java/com/termux/app/TermuxActivityTest.java +++ b/app/src/test/java/com/termux/app/TermuxActivityTest.java @@ -1,25 +1,27 @@ package com.termux.app; -import junit.framework.TestCase; +import org.junit.Assert; +import org.junit.Test; import java.util.Collections; import java.util.LinkedHashSet; -public class TermuxActivityTest extends TestCase { +public class TermuxActivityTest { - private void assertUrlsAre(String text, String... urls) { - LinkedHashSet expected = new LinkedHashSet<>(); - Collections.addAll(expected, urls); - assertEquals(expected, TermuxActivity.extractUrls(text)); - } + private void assertUrlsAre(String text, String... urls) { + LinkedHashSet expected = new LinkedHashSet<>(); + Collections.addAll(expected, urls); + Assert.assertEquals(expected, TermuxActivity.extractUrls(text)); + } - public void testExtractUrls() { - assertUrlsAre("hello http://example.com world", "http://example.com"); + @Test + public void testExtractUrls() { + assertUrlsAre("hello http://example.com world", "http://example.com"); - assertUrlsAre("http://example.com\nhttp://another.com", "http://example.com", "http://another.com"); + assertUrlsAre("http://example.com\nhttp://another.com", "http://example.com", "http://another.com"); - assertUrlsAre("hello http://example.com world and http://more.example.com with secure https://more.example.com", - "http://example.com", "http://more.example.com", "https://more.example.com"); - } + assertUrlsAre("hello http://example.com world and http://more.example.com with secure https://more.example.com", + "http://example.com", "http://more.example.com", "https://more.example.com"); + } } diff --git a/app/src/test/java/com/termux/filepicker/TermuxFileReceiverActivityTest.java b/app/src/test/java/com/termux/filepicker/TermuxFileReceiverActivityTest.java new file mode 100644 index 00000000..9becbefc --- /dev/null +++ b/app/src/test/java/com/termux/filepicker/TermuxFileReceiverActivityTest.java @@ -0,0 +1,32 @@ +package com.termux.filepicker; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.robolectric.RobolectricTestRunner; + +import java.util.ArrayList; +import java.util.List; + +@RunWith(RobolectricTestRunner.class) +public class TermuxFileReceiverActivityTest { + + @Test + public void testIsSharedTextAnUrl() { + List validUrls = new ArrayList<>(); + validUrls.add("http://example.com"); + validUrls.add("https://example.com"); + validUrls.add("https://example.com/path/parameter=foo"); + validUrls.add("magnet:?xt=urn:btih:d540fc48eb12f2833163eed6421d449dd8f1ce1f&dn=Ubuntu+desktop+19.04+%2864bit%29&tr=udp%3A%2F%2Ftracker.openbittorrent.com%3A80&tr=udp%3A%2F%2Ftracker.publicbt.com%3A80&tr=udp%3A%2F%2Ftracker.ccc.de%3A80"); + for (String url : validUrls) { + Assert.assertTrue(TermuxFileReceiverActivity.isSharedTextAnUrl(url)); + } + + List invalidUrls = new ArrayList<>(); + invalidUrls.add("a test with example.com"); + for (String url : invalidUrls) { + Assert.assertFalse(TermuxFileReceiverActivity.isSharedTextAnUrl(url)); + } + } + +} diff --git a/terminal-emulator/build.gradle b/terminal-emulator/build.gradle index 320e549d..dd6da0a3 100644 --- a/terminal-emulator/build.gradle +++ b/terminal-emulator/build.gradle @@ -60,7 +60,7 @@ tasks.withType(Test) { } dependencies { - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' } apply from: '../scripts/bintray-publish.gradle' diff --git a/terminal-view/build.gradle b/terminal-view/build.gradle index 12a19a14..3aad1644 100644 --- a/terminal-view/build.gradle +++ b/terminal-view/build.gradle @@ -20,7 +20,7 @@ android { compileSdkVersion 28 dependencies { - implementation "androidx.annotation:annotation:1.0.1" + implementation "androidx.annotation:annotation:1.1.0" api project(":terminal-emulator") } @@ -44,7 +44,7 @@ android { } dependencies { - testImplementation 'junit:junit:4.12' + testImplementation 'junit:junit:4.13' } apply from: '../scripts/bintray-publish.gradle'