From 229c0b359f5d10a21d138386b98ed13f306db0fe Mon Sep 17 00:00:00 2001 From: FineFindus Date: Wed, 26 Jun 2024 17:33:48 +0200 Subject: [PATCH 1/4] fix(LinkCard): skip mastodon.social redirect page Skips the mastodon.social exclusive link redirect warning page, by manually replacing the link card link. --- .../LinkCardStatusDisplayItem.java | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java index c06ce66b6..1e7db6da9 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java @@ -18,8 +18,12 @@ import org.joinmastodon.android.model.Card; import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable; +import org.joinmastodon.android.ui.text.HtmlParser; +import org.joinmastodon.android.ui.text.LinkSpan; import org.joinmastodon.android.ui.utils.UiUtils; +import java.util.regex.Matcher; + import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest; @@ -142,7 +146,22 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{ } private void onClick(View v){ - UiUtils.openURL(itemView.getContext(), item.parentFragment.getAccountID(), item.status.card.url); + String url=item.status.card.url; + // Mastodon.social sometimes adds an additional redirect page + // e.g. https://mastodon.social/@GenuineHuman/112683634483993833 (needs to be opened on another server) + // this is really disruptive on mobile, especially since it breaks the loopUp/openURL functionality + if(url.startsWith("https://mastodon.social/redirect/statuses/")){ + Uri parsedURL=Uri.parse(url); + Matcher matcher=HtmlParser.URL_PATTERN.matcher(item.status.content); + while(matcher.find() && parsedURL.getLastPathSegment()!=null){ + url=matcher.group(3); + if(TextUtils.isEmpty(matcher.group(4))) + url="http://"+url; + if(url.endsWith(parsedURL.getLastPathSegment())) + break; + } + } + UiUtils.openURL(itemView.getContext(), item.parentFragment.getAccountID(), url); } } } From dd4bed002791a20104f89a0ce4139ba5017a863d Mon Sep 17 00:00:00 2001 From: FineFindus Date: Thu, 27 Jun 2024 21:38:34 +0200 Subject: [PATCH 2/4] feat(LinkCard): open redirected URL --- .../LinkCardStatusDisplayItem.java | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java index 1e7db6da9..971631763 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java @@ -8,7 +8,6 @@ import android.net.Uri; import android.text.TextUtils; import android.view.View; import android.view.ViewGroup; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.TextView; @@ -19,7 +18,6 @@ import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.OutlineProviders; import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable; import org.joinmastodon.android.ui.text.HtmlParser; -import org.joinmastodon.android.ui.text.LinkSpan; import org.joinmastodon.android.ui.utils.UiUtils; import java.util.regex.Matcher; @@ -27,7 +25,6 @@ import java.util.regex.Matcher; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; import me.grishka.appkit.imageloader.requests.ImageLoaderRequest; import me.grishka.appkit.imageloader.requests.UrlImageLoaderRequest; -import me.grishka.appkit.utils.V; public class LinkCardStatusDisplayItem extends StatusDisplayItem{ private final UrlImageLoaderRequest imgRequest; @@ -148,17 +145,24 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{ private void onClick(View v){ String url=item.status.card.url; // Mastodon.social sometimes adds an additional redirect page - // e.g. https://mastodon.social/@GenuineHuman/112683634483993833 (needs to be opened on another server) // this is really disruptive on mobile, especially since it breaks the loopUp/openURL functionality if(url.startsWith("https://mastodon.social/redirect/statuses/")){ Uri parsedURL=Uri.parse(url); + // find actually linked url in status content Matcher matcher=HtmlParser.URL_PATTERN.matcher(item.status.content); + String foundURL; while(matcher.find() && parsedURL.getLastPathSegment()!=null){ - url=matcher.group(3); + foundURL=matcher.group(3); if(TextUtils.isEmpty(matcher.group(4))) - url="http://"+url; - if(url.endsWith(parsedURL.getLastPathSegment())) + foundURL="http://"+foundURL; + // SAFETY: Cannot be null, as otherwise the matcher wouldn't find it + // also, group is marked as non-null + assert foundURL!=null; + if(foundURL.endsWith(parsedURL.getLastPathSegment())) { + // found correct URL + url=foundURL; break; + } } } UiUtils.openURL(itemView.getContext(), item.parentFragment.getAccountID(), url); From 77c5173014918b17f0edb86138ed1232510311ae Mon Sep 17 00:00:00 2001 From: FineFindus Date: Sat, 29 Jun 2024 10:38:04 +0200 Subject: [PATCH 3/4] feat(LinkCard): generalize skipping redirect links --- .../ui/displayitems/LinkCardStatusDisplayItem.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java index 971631763..97afd612f 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java @@ -146,18 +146,18 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{ String url=item.status.card.url; // Mastodon.social sometimes adds an additional redirect page // this is really disruptive on mobile, especially since it breaks the loopUp/openURL functionality - if(url.startsWith("https://mastodon.social/redirect/statuses/")){ - Uri parsedURL=Uri.parse(url); + Uri parsedURL=Uri.parse(url); + if(parsedURL.getPath()!=null && parsedURL.getPath().startsWith("/redirect/statuses/")){ // find actually linked url in status content Matcher matcher=HtmlParser.URL_PATTERN.matcher(item.status.content); String foundURL; - while(matcher.find() && parsedURL.getLastPathSegment()!=null){ + while(matcher.find()){ foundURL=matcher.group(3); if(TextUtils.isEmpty(matcher.group(4))) foundURL="http://"+foundURL; // SAFETY: Cannot be null, as otherwise the matcher wouldn't find it // also, group is marked as non-null - assert foundURL!=null; + assert foundURL!=null && parsedURL.getLastPathSegment()!=null; if(foundURL.endsWith(parsedURL.getLastPathSegment())) { // found correct URL url=foundURL; From f590fde7a437ae17d1858bb24191bed04491fb79 Mon Sep 17 00:00:00 2001 From: FineFindus Date: Sat, 29 Jun 2024 11:33:37 +0200 Subject: [PATCH 4/4] feat(LinkCard): skip redirects to accounts --- .../LinkCardStatusDisplayItem.java | 41 +++++++++++-------- .../android/ui/utils/UiUtils.java | 2 +- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java index 97afd612f..831e10dd4 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/displayitems/LinkCardStatusDisplayItem.java @@ -20,6 +20,7 @@ import org.joinmastodon.android.ui.drawables.BlurhashCrossfadeDrawable; import org.joinmastodon.android.ui.text.HtmlParser; import org.joinmastodon.android.ui.utils.UiUtils; +import java.util.Optional; import java.util.regex.Matcher; import me.grishka.appkit.imageloader.ImageLoaderViewHolder; @@ -147,25 +148,31 @@ public class LinkCardStatusDisplayItem extends StatusDisplayItem{ // Mastodon.social sometimes adds an additional redirect page // this is really disruptive on mobile, especially since it breaks the loopUp/openURL functionality Uri parsedURL=Uri.parse(url); - if(parsedURL.getPath()!=null && parsedURL.getPath().startsWith("/redirect/statuses/")){ - // find actually linked url in status content - Matcher matcher=HtmlParser.URL_PATTERN.matcher(item.status.content); - String foundURL; - while(matcher.find()){ - foundURL=matcher.group(3); - if(TextUtils.isEmpty(matcher.group(4))) - foundURL="http://"+foundURL; - // SAFETY: Cannot be null, as otherwise the matcher wouldn't find it - // also, group is marked as non-null - assert foundURL!=null && parsedURL.getLastPathSegment()!=null; - if(foundURL.endsWith(parsedURL.getLastPathSegment())) { - // found correct URL - url=foundURL; - break; - } - } + if(parsedURL.getPath()!=null && parsedURL.getPath().startsWith("/redirect/")){ + url=findRedirectedURL(parsedURL).orElse(url); } UiUtils.openURL(itemView.getContext(), item.parentFragment.getAccountID(), url); } + + private Optional findRedirectedURL(Uri url){ + // find actually linked url in status content + Matcher matcher=HtmlParser.URL_PATTERN.matcher(item.status.content); + boolean isAccountRedirect=url.getPath().startsWith("/redirect/accounts"); + String foundURL; + while(matcher.find()){ + foundURL=matcher.group(3); + if(TextUtils.isEmpty(matcher.group(4))) + foundURL="http://"+foundURL; + // SAFETY: Cannot be null, as otherwise the matcher wouldn't find it + // also, group is marked as non-null + assert foundURL!=null && url.getLastPathSegment()!=null; + if(foundURL.endsWith(url.getLastPathSegment()) || + (isAccountRedirect && foundURL.matches("https://"+url.getHost()+"/@[a-zA-Z0-9_]+@[a-zA-Z0-9._]+$"))){ + // found correct URL + return Optional.of(foundURL); + } + } + return Optional.empty(); + } } } diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java index c8473bf60..b3a6c50c3 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/utils/UiUtils.java @@ -1482,7 +1482,7 @@ public class UiUtils { return; } Optional account = results.accounts.stream() - .filter(a -> uri.equals(Uri.parse(a.url))).findAny(); + .filter(a -> uri.getPath().contains(a.getFullyQualifiedName())).findAny(); if (account.isPresent()) { args.putParcelable("profileAccount", Parcels.wrap(account.get())); go.accept(ProfileFragment.class, args);