Add wownero

Stephen Paul Weber created

I think the regex is too broad but no one seems to know what it should be

Change summary

src/cheogram/res/drawable/wownero_24dp.xml                          | 3 
src/main/java/eu/siacs/conversations/entities/Message.java          | 2 
src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java | 4 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java | 5 
src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java         | 1 
src/main/java/eu/siacs/conversations/utils/Patterns.java            | 6 
6 files changed, 20 insertions(+), 1 deletion(-)

Detailed changes

src/cheogram/res/drawable/wownero_24dp.xml 🔗

@@ -0,0 +1,5 @@
+<vector android:height="24dp" android:viewportHeight="64"
+    android:viewportWidth="64" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"
+    android:tint="?attr/colorControlNormal">

src/main/java/eu/siacs/conversations/entities/Message.java 🔗

@@ -1429,7 +1429,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable
     public synchronized Uri wholeIsKnownURI() {
         if (wholeIsKnownURI != null) return wholeIsKnownURI;
 
-        if (Patterns.BITCOIN_URI.matcher(body).matches() ||Patterns.BITCOINCASH_URI.matcher(body).matches() || Patterns.MONERO_URI.matcher(body).matches()) {
+        if (Patterns.BITCOIN_URI.matcher(body).matches() ||Patterns.BITCOINCASH_URI.matcher(body).matches() || Patterns.MONERO_URI.matcher(body).matches() || Patterns.WOWNERO_URI.matcher(body).matches()) {
             wholeIsKnownURI = Uri.parse(body.replace(":", "://")); // hack to make query parser work
         }
 

src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java 🔗

@@ -831,6 +831,10 @@ public class ContactDetailsActivity extends OmemoActivity implements OnAccountUp
                     binding.command.setText(uri.getSchemeSpecificPart());
                     binding.command.setCompoundDrawablesRelativeWithIntrinsicBounds(getDrawable(R.drawable.monero_24dp), null, null, null);
                     binding.command.setCompoundDrawablePadding(20);
+                } else if (uri.getScheme().equals("wownero")) {
+                    binding.command.setText(uri.getSchemeSpecificPart());
+                    binding.command.setCompoundDrawablesRelativeWithIntrinsicBounds(getDrawable(R.drawable.wownero_24dp), null, null, null);
+                    binding.command.setCompoundDrawablePadding(20);
                 } else if (uri.getScheme().equals("https") && "liberapay.com".equals(uri.getHost())) {
                     binding.command.setText(uri.getPath().substring(1));
                     binding.command.setCompoundDrawablesRelativeWithIntrinsicBounds(getDrawable(R.drawable.liberapay), null, null, null);

src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java 🔗

@@ -948,6 +948,11 @@ public class MessageAdapter extends ArrayAdapter<Message> {
             final var formattedAmount = amount == null || amount.equals("") ? "" : amount + " ";
             viewHolder.download_button.setIconResource(R.drawable.monero_24dp);
             viewHolder.download_button.setText("Send " + formattedAmount + "Monero");
+        } else if ("wownero".equals(uri.getScheme())) {
+            final var amount = uri.getQueryParameter("tx_amount");
+            final var formattedAmount = amount == null || amount.equals("") ? "" : amount + " ";
+            viewHolder.download_button.setIconResource(R.drawable.wownero_24dp);
+            viewHolder.download_button.setText("Send " + formattedAmount + "Wownero");
         }
         viewHolder.download_button.setOnClickListener(v -> new FixedURLSpan(message.getRawBody()).onClick(v));
     }

src/main/java/eu/siacs/conversations/ui/util/MyLinkify.java 🔗

@@ -135,6 +135,7 @@ public class MyLinkify {
         Linkify.addLinks(body, Patterns.BITCOIN_URI, "bitcoin");
         Linkify.addLinks(body, Patterns.BITCOINCASH_URI, "bitcoincash");
         Linkify.addLinks(body, Patterns.MONERO_URI, "monero");
+        Linkify.addLinks(body, Patterns.WOWNERO_URI, "wownero");
         Linkify.addLinks(body, Patterns.AUTOLINK_WEB_URL, "http", WEBURL_MATCH_FILTER, WEBURL_TRANSFORM_FILTER);
         if (includeGeo) {
             Linkify.addLinks(body, GeoHelper.GEO_URI, "geo");

src/main/java/eu/siacs/conversations/utils/Patterns.java 🔗

@@ -51,6 +51,12 @@ public class Patterns {
                     + "\\;\\/\\?\\@\\&\\=\\#\\~\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])"
                     + "|(?:\\%[a-fA-F0-9]{2}))+)?");
 
+    public static final Pattern WOWNERO_URI = Pattern
+            .compile("wownero\\:(?:W(?:[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{96}|[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{106}|[123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz]{187}))(?:\\?(?:(?:["
+                    + Patterns.GOOD_IRI_CHAR
+                    + "\\;\\/\\?\\@\\&\\=\\#\\~\\-\\.\\+\\!\\*\\'\\(\\)\\,\\_])"
+                    + "|(?:\\%[a-fA-F0-9]{2}))+)?");
+
     /**
      *  Regular expression to match all IANA top-level domains.
      *  List accurate as of 2011/07/18.  List taken from: