diff --git a/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java b/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java index 0b3ac7f9..fd07755e 100644 --- a/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java +++ b/mastodon/src/main/java/org/joinmastodon/android/ui/text/LinkSpan.java @@ -32,7 +32,7 @@ public class LinkSpan extends CharacterStyle { public void onClick(Context context){ switch(getType()){ - case URL -> UiUtils.launchWebBrowser(context, link); + case URL -> UiUtils.openURL(context, accountID, link); case MENTION -> UiUtils.openProfileByID(context, accountID, link); case HASHTAG -> UiUtils.openHashtagTimeline(context, accountID, link); } 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 7200f409..a6b0dbe2 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 @@ -38,9 +38,12 @@ import org.joinmastodon.android.api.requests.accounts.SetAccountFollowed; import org.joinmastodon.android.api.requests.accounts.SetAccountMuted; import org.joinmastodon.android.api.requests.accounts.SetDomainBlocked; import org.joinmastodon.android.api.requests.statuses.DeleteStatus; +import org.joinmastodon.android.api.requests.statuses.GetStatusByID; +import org.joinmastodon.android.api.session.AccountSessionManager; import org.joinmastodon.android.events.StatusDeletedEvent; import org.joinmastodon.android.fragments.HashtagTimelineFragment; import org.joinmastodon.android.fragments.ProfileFragment; +import org.joinmastodon.android.fragments.ThreadFragment; import org.joinmastodon.android.model.Account; import org.joinmastodon.android.model.Emoji; import org.joinmastodon.android.model.Relationship; @@ -48,6 +51,7 @@ import org.joinmastodon.android.model.Status; import org.joinmastodon.android.ui.M3AlertDialogBuilder; import org.joinmastodon.android.ui.text.CustomEmojiSpan; import org.joinmastodon.android.ui.text.SpacerSpan; +import org.parceler.Parcels; import java.io.File; import java.lang.reflect.Method; @@ -457,4 +461,35 @@ public class UiUtils{ return (MastodonApp.context.getResources().getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK)==Configuration.UI_MODE_NIGHT_YES; return GlobalUserPreferences.theme==GlobalUserPreferences.ThemePreference.DARK; } + + public static void openURL(Context context, String accountID, String url){ + Uri uri=Uri.parse(url); + String accountDomain=AccountSessionManager.getInstance().getAccount(accountID).domain; + if("https".equals(uri.getScheme()) && accountDomain.equalsIgnoreCase(uri.getAuthority())){ + List path=uri.getPathSegments(); + // Match URLs like https://mastodon.social/@Gargron/108132679274083591 + if(path.size()==2 && path.get(0).matches("^@[a-zA-Z0-9_]+$") && path.get(1).matches("^[0-9]+$")){ + new GetStatusByID(path.get(1)) + .setCallback(new Callback<>(){ + @Override + public void onSuccess(Status result){ + Bundle args=new Bundle(); + args.putString("account", accountID); + args.putParcelable("status", Parcels.wrap(result)); + Nav.go((Activity) context, ThreadFragment.class, args); + } + + @Override + public void onError(ErrorResponse error){ + error.showToast(context); + launchWebBrowser(context, url); + } + }) + .wrapProgress((Activity)context, R.string.loading, true) + .exec(accountID); + return; + } + } + launchWebBrowser(context, url); + } }