diff --git a/app/src/main/java/app/fedilab/android/client/Entities/Account.java b/app/src/main/java/app/fedilab/android/client/Entities/Account.java index ee0eb60ef..a57dd3c33 100644 --- a/app/src/main/java/app/fedilab/android/client/Entities/Account.java +++ b/app/src/main/java/app/fedilab/android/client/Entities/Account.java @@ -828,6 +828,37 @@ public class Account implements Parcelable { } }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); } + matcher = Pattern.compile("gemini://([\\d\\w.-]*)(:\\d+)?(/\\S*)?").matcher(fieldSpan); + while (matcher.find()) { + URLSpan[] urls = fieldSpan.getSpans(0, fieldSpan.length(), URLSpan.class); + for (URLSpan span : urls) + fieldSpan.removeSpan(span); + int matchStart = matcher.start(0); + int matchEnd = matcher.end(); + final String url = fieldSpan.toString().substring(matchStart, matchEnd); + if (matchStart >= 0 && matchEnd <= fieldSpan.toString().length() && matchEnd >= matchStart) { + fieldSpan.setSpan(new ClickableSpan() { + @Override + public void onClick(@NonNull View textView) { + try { + Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); + context.startActivity(intent); + } catch (Exception e) { + Toasty.error(context, context.getString(R.string.toast_no_apps), Toast.LENGTH_LONG).show(); + } + } + + @Override + public void updateDrawState(@NonNull TextPaint ds) { + super.updateDrawState(ds); + ds.setUnderlineText(false); + ds.setColor(link_color); + } + }, matchStart, matchEnd, Spanned.SPAN_INCLUSIVE_EXCLUSIVE); + fieldsSpan.put(keySpan, fieldSpan); + } + + } if (accountsMentionUnknown.size() > 0) { for (Account accountMention : accountsMentionUnknown) { String targetedAccount = "@" + accountMention.getAcct();