Handle magnet links with termux-url-opener

Fixes #1339 and #1382.
This commit is contained in:
Fredrik Fornwall
2020-01-05 01:02:13 +01:00
parent 269c3cafb0
commit fd13f3f98d
6 changed files with 66 additions and 19 deletions

View File

@@ -6,7 +6,7 @@ android {
compileSdkVersion 28 compileSdkVersion 28
dependencies { dependencies {
implementation "androidx.annotation:annotation:1.0.1" implementation "androidx.annotation:annotation:1.1.0"
implementation "androidx.viewpager:viewpager:1.0.0" implementation "androidx.viewpager:viewpager:1.0.0"
implementation "androidx.drawerlayout:drawerlayout:1.0.0" implementation "androidx.drawerlayout:drawerlayout:1.0.0"
implementation project(":terminal-view") implementation project(":terminal-view")
@@ -62,10 +62,17 @@ android {
path "src/main/cpp/Android.mk" path "src/main/cpp/Android.mk"
} }
} }
testOptions {
unitTests {
includeAndroidResources = true
}
}
} }
dependencies { dependencies {
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.13'
testImplementation 'org.robolectric:robolectric:4.3'
} }
task versionName { task versionName {

View File

@@ -21,6 +21,7 @@ import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.regex.Pattern;
public class TermuxFileReceiverActivity extends Activity { public class TermuxFileReceiverActivity extends Activity {
@@ -36,6 +37,11 @@ public class TermuxFileReceiverActivity extends Activity {
*/ */
boolean mFinishOnDismissNameDialog = true; boolean mFinishOnDismissNameDialog = true;
static boolean isSharedTextAnUrl(String sharedText) {
return Patterns.WEB_URL.matcher(sharedText).matches()
|| Pattern.matches("magnet:\\?xt=urn:btih:.*?", sharedText);
}
@Override @Override
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
@@ -50,7 +56,7 @@ public class TermuxFileReceiverActivity extends Activity {
final Uri sharedUri = intent.getParcelableExtra(Intent.EXTRA_STREAM); final Uri sharedUri = intent.getParcelableExtra(Intent.EXTRA_STREAM);
if (sharedText != null) { if (sharedText != null) {
if (Patterns.WEB_URL.matcher(sharedText).matches()) { if (isSharedTextAnUrl(sharedText)) {
handleUrlAndFinish(sharedText); handleUrlAndFinish(sharedText);
} else { } else {
String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT); String subject = intent.getStringExtra(Intent.EXTRA_SUBJECT);

View File

@@ -1,25 +1,27 @@
package com.termux.app; package com.termux.app;
import junit.framework.TestCase; import org.junit.Assert;
import org.junit.Test;
import java.util.Collections; import java.util.Collections;
import java.util.LinkedHashSet; import java.util.LinkedHashSet;
public class TermuxActivityTest extends TestCase { public class TermuxActivityTest {
private void assertUrlsAre(String text, String... urls) { private void assertUrlsAre(String text, String... urls) {
LinkedHashSet<String> expected = new LinkedHashSet<>(); LinkedHashSet<String> expected = new LinkedHashSet<>();
Collections.addAll(expected, urls); Collections.addAll(expected, urls);
assertEquals(expected, TermuxActivity.extractUrls(text)); Assert.assertEquals(expected, TermuxActivity.extractUrls(text));
} }
public void testExtractUrls() { @Test
assertUrlsAre("hello http://example.com world", "http://example.com"); 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", 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"); "http://example.com", "http://more.example.com", "https://more.example.com");
} }
} }

View File

@@ -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<String> 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<String> invalidUrls = new ArrayList<>();
invalidUrls.add("a test with example.com");
for (String url : invalidUrls) {
Assert.assertFalse(TermuxFileReceiverActivity.isSharedTextAnUrl(url));
}
}
}

View File

@@ -60,7 +60,7 @@ tasks.withType(Test) {
} }
dependencies { dependencies {
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.13'
} }
apply from: '../scripts/bintray-publish.gradle' apply from: '../scripts/bintray-publish.gradle'

View File

@@ -20,7 +20,7 @@ android {
compileSdkVersion 28 compileSdkVersion 28
dependencies { dependencies {
implementation "androidx.annotation:annotation:1.0.1" implementation "androidx.annotation:annotation:1.1.0"
api project(":terminal-emulator") api project(":terminal-emulator")
} }
@@ -44,7 +44,7 @@ android {
} }
dependencies { dependencies {
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.13'
} }
apply from: '../scripts/bintray-publish.gradle' apply from: '../scripts/bintray-publish.gradle'