0
0
mirror of https://github.com/TrianguloY/UrlChecker.git synced 2024-09-19 20:02:16 +02:00

extract links from shared text

fixes #226
This commit is contained in:
TrianguloY 2023-05-28 21:40:02 +02:00
parent 97d5861948
commit 95472046d4
4 changed files with 75 additions and 50 deletions

View File

@ -9,17 +9,16 @@ import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.service.quicksettings.TileService;
import android.util.Patterns;
import android.view.Window;
import android.widget.Toast;
import com.trianguloy.urlchecker.R;
import com.trianguloy.urlchecker.utilities.AndroidSettings;
import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.PackageUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* This activity opens (on this app) a link detected on the clipboard text. If multiple asks.
@ -83,14 +82,15 @@ public class ShortcutsActivity extends Activity {
break;
case 1:
// 1 link, open
open(links.get(0));
open(links.iterator().next());
finish();
break;
default:
// multiple links, choose
var links_array = links.toArray(new String[0]);
dialog = new AlertDialog.Builder(this)
.setItems(links.toArray(new String[0]), (dialog, which) -> {
open(links.get(which));
.setItems(links_array, (dialog, which) -> {
open(links_array[which]);
dialog.cancel();
})
.setOnCancelListener(o -> this.finish())
@ -116,21 +116,15 @@ public class ShortcutsActivity extends Activity {
/**
* Returns all links detected on the clipboard
*/
private List<String> getLinksFromClipboard() {
private Set<String> getLinksFromClipboard() {
var clipboard = (ClipboardManager) getSystemService(Context.CLIPBOARD_SERVICE);
if (clipboard == null) return Collections.emptyList();
if (clipboard == null) return Collections.emptySet();
var primaryClip = clipboard.getPrimaryClip();
if (primaryClip == null || primaryClip.getItemCount() < 1) return Collections.emptyList();
if (primaryClip == null || primaryClip.getItemCount() < 1) return Collections.emptySet();
var textLinks = primaryClip.getItemAt(0).coerceToText(this);
var links = new ArrayList<String>();
var matcher = Patterns.WEB_URL.matcher(textLinks);
while (matcher.find()) links.add(matcher.group());
return links;
return AndroidUtils.getLinksFromText(primaryClip.getItemAt(0).coerceToText(this));
}
/**

View File

@ -3,8 +3,8 @@ package com.trianguloy.urlchecker.dialogs;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
@ -25,9 +25,11 @@ import com.trianguloy.urlchecker.utilities.AndroidUtils;
import com.trianguloy.urlchecker.utilities.Inflater;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* The main dialog, when opening a url
@ -177,11 +179,39 @@ public class MainDialog extends Activity {
// get views
ll_mods = findViewById(R.id.middle_modules);
// initialize
initializeModules();
// load url (or urls)
var links = getOpenUrl();
switch (links.size()) {
case 0:
// no links, invalid
Toast.makeText(this, R.string.toast_invalid, Toast.LENGTH_SHORT).show();
finish();
break;
case 1:
// 1 link, just that
// load url
onNewUrl(new UrlData(getOpenUrl()));
// initialize
initializeModules();
// show
onNewUrl(new UrlData(links.iterator().next()));
break;
default:
// multiple links, choose
var links_array = links.toArray(new String[0]);
new AlertDialog.Builder(this)
.setItems(links_array, (dialog, which) -> {
// initialize
initializeModules();
// show
onNewUrl(new UrlData(links_array[which]));
dialog.dismiss();
})
.setOnCancelListener(o -> this.finish())
.show();
}
}
/**
@ -267,39 +297,31 @@ public class MainDialog extends Activity {
/**
* Returns the url that this activity was opened with (intent uri or sent text)
*/
private String getOpenUrl() {
private Set<String> getOpenUrl() {
// get the intent
Intent intent = getIntent();
if (intent == null) return invalid();
var intent = getIntent();
if (intent == null) return Collections.emptySet();
// check the action
String action = getIntent().getAction();
var action = getIntent().getAction();
if (Intent.ACTION_SEND.equals(action)) {
// sent text
String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText == null) return invalid();
return sharedText.trim();
var sharedText = intent.getStringExtra(Intent.EXTRA_TEXT);
if (sharedText == null) return Collections.emptySet();
var links = AndroidUtils.getLinksFromText(sharedText);
if (links.isEmpty()) links.add(sharedText.trim()); // no links? just use the whole text, the user requested the app so...
return links;
} else if (Intent.ACTION_VIEW.equals(action)) {
// view url
Uri uri = intent.getData();
if (uri == null) return invalid();
return uri.toString();
var uri = intent.getData();
if (uri == null) return Collections.emptySet();
return Collections.singleton(uri.toString());
} else {
// other
return invalid();
return Collections.emptySet();
}
}
/**
* shows a toast, finishes the activity and returns null
*/
private String invalid() {
// for an invalid parameter
Toast.makeText(this, R.string.toast_invalid, Toast.LENGTH_SHORT).show();
finish();
return null;
}
/* ------------------- its a secret! ------------------- */
/**

View File

@ -13,6 +13,7 @@ import android.os.Build;
import android.text.SpannableStringBuilder;
import android.text.style.ClickableSpan;
import android.util.Log;
import android.util.Patterns;
import android.util.TypedValue;
import android.view.View;
import android.widget.TextView;
@ -23,6 +24,8 @@ import com.trianguloy.urlchecker.R;
import java.text.DateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
/**
* Generic Android utilities
@ -217,4 +220,14 @@ public interface AndroidUtils {
drawable.setColorFilter(cntx.getResources().getColor(resolvedAttr.resourceId), PorterDuff.Mode.SRC_IN);
return drawable;
}
/**
* Returns all the unique links found on a given text
*/
static Set<String> getLinksFromText(CharSequence text) {
var links = new HashSet<String>();
var matcher = Patterns.WEB_URL.matcher(text);
while (matcher.find()) links.add(matcher.group());
return links;
}
}

View File

@ -1,18 +1,14 @@
<resources>
<string name="app_name">URLCheck</string>
<string name="lnk_playStore"
translatable="false">Play Store</string>
<string name="lnk_fDroid"
translatable="false">F-Droid</string>
<string name="lnk_playStore" translatable="false">Play Store</string>
<string name="lnk_fDroid" translatable="false">F-Droid</string>
<string name="dd"
translatable="false">%s:</string>
<string name="dd" translatable="false">%s:</string>
<string name="trianguloy">TrianguloY</string>
<string name="contributors"
translatable="false">Ilithy, PabloOQ</string>
<string name="contributors" translatable="false">Ilithy, PabloOQ</string>
<string name="sample_url"><![CDATA[http://www.google.com/?ref=referrer&foo=bar#tag]]></string>
</resources>