From 5160cd65c50c0d0ee91f377141d671a6a025310c Mon Sep 17 00:00:00 2001 From: Thomas Date: Mon, 21 Nov 2022 09:55:42 +0100 Subject: [PATCH] Fix issue #503 - Wrong URL displayed when long pressing a link that has been transformed --- .../android/client/entities/api/Status.java | 4 -- .../app/fedilab/android/helper/Helper.java | 37 ++++++++++++++++--- .../android/helper/SpannableHelper.java | 22 +---------- 3 files changed, 33 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/app/fedilab/android/client/entities/api/Status.java b/app/src/main/java/app/fedilab/android/client/entities/api/Status.java index f996b9a4..e3c75305 100644 --- a/app/src/main/java/app/fedilab/android/client/entities/api/Status.java +++ b/app/src/main/java/app/fedilab/android/client/entities/api/Status.java @@ -127,11 +127,7 @@ public class Status implements Serializable, Cloneable { public synchronized Spannable getSpanContent(Context context, WeakReference viewWeakReference) { return SpannableHelper.convert(context, content, this, null, null, true, viewWeakReference); } - //Some extra spannable element - They will be filled automatically when fetching the status - public Spannable getSpanContentNitter() { - return SpannableHelper.convertNitter(content); - } public synchronized Spannable getSpanSpoiler(Context context, WeakReference viewWeakReference) { return SpannableHelper.convert(context, spoiler_text, this, null, null, true, viewWeakReference); diff --git a/app/src/main/java/app/fedilab/android/helper/Helper.java b/app/src/main/java/app/fedilab/android/helper/Helper.java index cd295eb4..7a34d668 100644 --- a/app/src/main/java/app/fedilab/android/helper/Helper.java +++ b/app/src/main/java/app/fedilab/android/helper/Helper.java @@ -745,39 +745,56 @@ public class Helper { */ public static String transformURL(Context context, String url) { SharedPreferences sharedpreferences = PreferenceManager.getDefaultSharedPreferences(context); - Matcher matcher = Helper.nitterPattern.matcher(url); + Matcher matcher; boolean nitter = Helper.getSharedValue(context, context.getString(R.string.SET_NITTER)); if (nitter) { + matcher = Helper.nitterPattern.matcher(url); if (matcher.find()) { final String nitter_directory = matcher.group(2); String nitterHost = sharedpreferences.getString(context.getString(R.string.SET_NITTER_HOST), context.getString(R.string.DEFAULT_NITTER_HOST)).toLowerCase(); + if (nitterHost.trim().isEmpty()) { + nitterHost = context.getString(R.string.DEFAULT_NITTER_HOST); + } return "https://" + nitterHost + nitter_directory; } } - matcher = Helper.bibliogramPattern.matcher(url); + boolean bibliogram = Helper.getSharedValue(context, context.getString(R.string.SET_BIBLIOGRAM)); + if (bibliogram) { + matcher = Helper.bibliogramPattern.matcher(url); if (matcher.find()) { final String bibliogram_directory = matcher.group(2); String bibliogramHost = sharedpreferences.getString(context.getString(R.string.SET_BIBLIOGRAM_HOST), context.getString(R.string.DEFAULT_BIBLIOGRAM_HOST)).toLowerCase(); + if (bibliogramHost.trim().isEmpty()) { + bibliogramHost = context.getString(R.string.DEFAULT_BIBLIOGRAM_HOST); + } return "https://" + bibliogramHost + bibliogram_directory; } } - matcher = Helper.libredditPattern.matcher(url); + boolean libreddit = Helper.getSharedValue(context, context.getString(R.string.SET_LIBREDDIT)); if (libreddit) { + matcher = Helper.libredditPattern.matcher(url); if (matcher.find()) { final String libreddit_directory = matcher.group(3); String libreddit_host = sharedpreferences.getString(context.getString(R.string.SET_LIBREDDIT_HOST), context.getString(R.string.DEFAULT_LIBREDDIT_HOST)).toLowerCase(); + if (libreddit_host.trim().isEmpty()) { + libreddit_host = context.getString(R.string.DEFAULT_LIBREDDIT_HOST); + } return "https://" + libreddit_host + "/" + libreddit_directory; } } - matcher = Helper.youtubePattern.matcher(url); + boolean invidious = Helper.getSharedValue(context, context.getString(R.string.SET_INVIDIOUS)); if (invidious) { + matcher = Helper.youtubePattern.matcher(url); if (matcher.find()) { final String youtubeId = matcher.group(3); String invidiousHost = sharedpreferences.getString(context.getString(R.string.SET_INVIDIOUS_HOST), context.getString(R.string.DEFAULT_INVIDIOUS_HOST)).toLowerCase(); + if (invidiousHost.trim().isEmpty()) { + invidiousHost = context.getString(R.string.DEFAULT_INVIDIOUS_HOST); + } if (matcher.group(2) != null && Objects.equals(matcher.group(2), "youtu.be")) { return "https://" + invidiousHost + "/watch?v=" + youtubeId + "&local=true"; } else { @@ -785,9 +802,10 @@ public class Helper { } } } - matcher = Helper.mediumPattern.matcher(url); + boolean medium = Helper.getSharedValue(context, context.getString(R.string.REPLACE_MEDIUM)); if (medium) { + matcher = Helper.mediumPattern.matcher(url); if (matcher.find()) { String path = matcher.group(2); String user = matcher.group(1); @@ -795,12 +813,16 @@ public class Helper { path = user + "/" + path; } String mediumReplaceHost = sharedpreferences.getString(context.getString(R.string.REPLACE_MEDIUM_HOST), context.getString(R.string.DEFAULT_REPLACE_MEDIUM_HOST)).toLowerCase(); + if (mediumReplaceHost.trim().isEmpty()) { + mediumReplaceHost = context.getString(R.string.DEFAULT_REPLACE_MEDIUM_HOST); + } return "https://" + mediumReplaceHost + "/" + path; } } - matcher = Helper.wikipediaPattern.matcher(url); + boolean wikipedia = Helper.getSharedValue(context, context.getString(R.string.REPLACE_WIKIPEDIA)); if (wikipedia) { + matcher = Helper.wikipediaPattern.matcher(url); if (matcher.find()) { String subdomain = matcher.group(1); String path = matcher.group(2); @@ -810,6 +832,9 @@ public class Helper { lang = (path.contains("?")) ? TextUtils.htmlEncode("&") : "?"; lang = lang + "lang=" + subdomain; } + if (wikipediaReplaceHost.trim().isEmpty()) { + wikipediaReplaceHost = context.getString(R.string.DEFAULT_REPLACE_WIKIPEDIA_HOST); + } return "https://" + wikipediaReplaceHost + "/" + path + lang; } } diff --git a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java index df8c628a..cdf65612 100644 --- a/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java +++ b/app/src/main/java/app/fedilab/android/helper/SpannableHelper.java @@ -249,8 +249,8 @@ public class SpannableHelper { dialogBuilder.setView(popupLinksBinding.getRoot()); AlertDialog alertDialog = dialogBuilder.create(); alertDialog.show(); - String finalURl = url; - String uniqueUrl = url.endsWith("…") ? url : url + "…"; + String finalURl = newURL; + String uniqueUrl = newURL.endsWith("…") ? newURL : newURL + "…"; if (urlDetails.containsValue(uniqueUrl)) { finalURl = Helper.getKeyByValue(urlDetails, uniqueUrl); } @@ -872,24 +872,6 @@ public class SpannableHelper { } } - /** - * Convert HTML content to text. Also, it handles click on link - * This needs to be run asynchronously - * - * @param text String - text to convert, it can be content, spoiler, poll items, etc. - * @return Spannable string - */ - public static Spannable convertNitter(String text) { - SpannableString initialContent; - if (text == null) { - return null; - } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) - initialContent = new SpannableString(Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY)); - else - initialContent = new SpannableString(Html.fromHtml(text)); - return initialContent; - } /**