summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas <tschneider.ac@gmail.com>2023-08-09 16:59:40 +0200
committerThomas <tschneider.ac@gmail.com>2023-08-09 16:59:40 +0200
commit65b9015d51fb5013ca32b223aab7e075c66da88d (patch)
tree5d452357b08ddc3da5ed097d74d38ed87514e424
parent243039151a78c7b2c8ab5dbb7bccb35471c388a0 (diff)
Fix issue #931 - Click on card does not open Mastodon posts inside the app
-rw-r--r--app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java213
-rw-r--r--app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java4
2 files changed, 111 insertions, 106 deletions
diff --git a/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java b/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java
index 5341c3776..b0805fb93 100644
--- a/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java
+++ b/app/src/main/java/app/fedilab/android/mastodon/helper/SpannableHelper.java
@@ -598,111 +598,7 @@ public class SpannableHelper {
public void onClick(@NonNull View textView) {
textView.setTag(CLICKABLE_SPAN);
- Pattern link = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w._-]*[0-9]*)(/[0-9]+)?$");
- Matcher matcherLink = link.matcher(finalUrl);
- Pattern linkLong = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)(/[0-9]+)?$");
- Matcher matcherLinkLong = linkLong.matcher(finalUrl);
- Pattern userWithoutAt = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(users/([\\w._-]*[0-9]*))/statuses/([0-9]+)");
- Matcher matcherUserWithoutAt = userWithoutAt.matcher(finalUrl);
- if (matcherLink.find() && !finalUrl.contains("medium.com")) {
- if (matcherLink.group(3) != null && Objects.requireNonNull(matcherLink.group(3)).length() > 0) { //It's a toot
- CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() {
- @Override
- public void federatedStatus(Status status) {
- Intent intent = new Intent(context, ContextActivity.class);
- intent.putExtra(Helper.ARG_STATUS, status);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
-
- @Override
- public void federatedAccount(Account account) {
- }
- });
- } else {//It's an account
- CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherLink.group(2) + "@" + matcherLink.group(1), new CrossActionHelper.Callback() {
- @Override
- public void federatedStatus(Status status) {
- }
-
- @Override
- public void federatedAccount(Account account) {
- Intent intent = new Intent(context, ProfileActivity.class);
- Bundle b = new Bundle();
- b.putSerializable(Helper.ARG_ACCOUNT, account);
- intent.putExtras(b);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
- });
- }
- } else if (matcherLinkLong.find() && !finalUrl.contains("medium.com")) {
- if (matcherLinkLong.group(3) != null && Objects.requireNonNull(matcherLinkLong.group(3)).length() > 0) { //It's a toot
- CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() {
- @Override
- public void federatedStatus(Status status) {
- Intent intent = new Intent(context, ContextActivity.class);
- intent.putExtra(Helper.ARG_STATUS, status);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
-
- @Override
- public void federatedAccount(Account account) {
- }
- });
- } else if (matcherLinkLong.group(2) != null) {//It's an account
- CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherLinkLong.group(2), new CrossActionHelper.Callback() {
- @Override
- public void federatedStatus(Status status) {
- }
-
- @Override
- public void federatedAccount(Account account) {
- Intent intent = new Intent(context, ProfileActivity.class);
- Bundle b = new Bundle();
- b.putSerializable(Helper.ARG_ACCOUNT, account);
- intent.putExtras(b);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
- });
- }
- } else if (matcherUserWithoutAt.find() && !finalUrl.contains("medium.com")) {
- if (matcherUserWithoutAt.group(4) != null && Objects.requireNonNull(matcherUserWithoutAt.group(4)).length() > 0) { //It's a toot
- CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() {
- @Override
- public void federatedStatus(Status status) {
- Intent intent = new Intent(context, ContextActivity.class);
- intent.putExtra(Helper.ARG_STATUS, status);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
-
- @Override
- public void federatedAccount(Account account) {
- }
- });
- } else {//It's an account
- CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherUserWithoutAt.group(3) + "@" + matcherUserWithoutAt.group(1), new CrossActionHelper.Callback() {
- @Override
- public void federatedStatus(Status status) {
- }
-
- @Override
- public void federatedAccount(Account account) {
- Intent intent = new Intent(context, ProfileActivity.class);
- Bundle b = new Bundle();
- b.putSerializable(Helper.ARG_ACCOUNT, account);
- intent.putExtras(b);
- intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(intent);
- }
- });
- }
- } else {
- Helper.openBrowser(context, finalUrl);
- }
+ linkClickAction(context, finalUrl);
}
@Override
@@ -716,6 +612,113 @@ public class SpannableHelper {
}, start, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
}
+ public static void linkClickAction(Context context, String finalUrl) {
+ Pattern link = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w._-]*[0-9]*)(/[0-9]+)?$");
+ Matcher matcherLink = link.matcher(finalUrl);
+ Pattern linkLong = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(@[\\w_.-]+@[a-zA-Z0-9][a-zA-Z0-9.-]{1,61}[a-zA-Z0-9](?:\\.[a-zA-Z]{2,})+)(/[0-9]+)?$");
+ Matcher matcherLinkLong = linkLong.matcher(finalUrl);
+ Pattern userWithoutAt = Pattern.compile("https?://([\\da-z.-]+\\.[a-z.]{2,10})/(users/([\\w._-]*[0-9]*))/statuses/([0-9]+)");
+ Matcher matcherUserWithoutAt = userWithoutAt.matcher(finalUrl);
+ if (matcherLink.find() && !finalUrl.contains("medium.com")) {
+ if (matcherLink.group(3) != null && Objects.requireNonNull(matcherLink.group(3)).length() > 0) { //It's a toot
+ CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+ Intent intent = new Intent(context, ContextActivity.class);
+ intent.putExtra(Helper.ARG_STATUS, status);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ }
+ });
+ } else {//It's an account
+ CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherLink.group(2) + "@" + matcherLink.group(1), new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ Intent intent = new Intent(context, ProfileActivity.class);
+ Bundle b = new Bundle();
+ b.putSerializable(Helper.ARG_ACCOUNT, account);
+ intent.putExtras(b);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+ });
+ }
+ } else if (matcherLinkLong.find() && !finalUrl.contains("medium.com")) {
+ if (matcherLinkLong.group(3) != null && Objects.requireNonNull(matcherLinkLong.group(3)).length() > 0) { //It's a toot
+ CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+ Intent intent = new Intent(context, ContextActivity.class);
+ intent.putExtra(Helper.ARG_STATUS, status);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ }
+ });
+ } else if (matcherLinkLong.group(2) != null) {//It's an account
+ CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherLinkLong.group(2), new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ Intent intent = new Intent(context, ProfileActivity.class);
+ Bundle b = new Bundle();
+ b.putSerializable(Helper.ARG_ACCOUNT, account);
+ intent.putExtras(b);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+ });
+ }
+ } else if (matcherUserWithoutAt.find() && !finalUrl.contains("medium.com")) {
+ if (matcherUserWithoutAt.group(4) != null && Objects.requireNonNull(matcherUserWithoutAt.group(4)).length() > 0) { //It's a toot
+ CrossActionHelper.fetchRemoteStatus(context, currentAccount, finalUrl, new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+ Intent intent = new Intent(context, ContextActivity.class);
+ intent.putExtra(Helper.ARG_STATUS, status);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ }
+ });
+ } else {//It's an account
+ CrossActionHelper.fetchRemoteAccount(context, currentAccount, matcherUserWithoutAt.group(3) + "@" + matcherUserWithoutAt.group(1), new CrossActionHelper.Callback() {
+ @Override
+ public void federatedStatus(Status status) {
+ }
+
+ @Override
+ public void federatedAccount(Account account) {
+ Intent intent = new Intent(context, ProfileActivity.class);
+ Bundle b = new Bundle();
+ b.putSerializable(Helper.ARG_ACCOUNT, account);
+ intent.putExtras(b);
+ intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+ context.startActivity(intent);
+ }
+ });
+ }
+ } else {
+ Helper.openBrowser(context, finalUrl);
+ }
+ }
private static void emails(Context context, Spannable content) {
// --- For all patterns defined in Helper class ---
diff --git a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java
index 741a12fef..b2efa7d4e 100644
--- a/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java
+++ b/app/src/main/java/app/fedilab/android/mastodon/ui/drawer/StatusAdapter.java
@@ -844,7 +844,9 @@ public class StatusAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>
holder.binding.cardTitle.setText(statusToDeal.card.title);
holder.binding.cardDescription.setText(statusToDeal.card.description);
holder.binding.cardUrl.setText(Helper.transformURL(context, statusToDeal.card.url));
- holder.binding.card.setOnClickListener(v -> Helper.openBrowser(context, Helper.transformURL(context, statusToDeal.card.url)));
+ holder.binding.card.setOnClickListener(v -> {
+ SpannableHelper.linkClickAction(context, statusToDeal.card.url);
+ });
holder.binding.card.setVisibility(View.VISIBLE);
} else {
holder.binding.card.setVisibility(View.GONE);