XmppUri: Parse 'message action' query

Marc Schink created

Change summary

src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java |  6 
src/main/java/eu/siacs/conversations/utils/XmppUri.java                | 31 
2 files changed, 27 insertions(+), 10 deletions(-)

Detailed changes

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

@@ -876,7 +876,7 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
             return true;
         }
         List<Contact> contacts = xmppConnectionService.findContacts(invite.getJid(),invite.account);
-        if (invite.isMuc()) {
+        if (invite.isAction(XmppUri.ACTION_JOIN)) {
             Conversation muc = xmppConnectionService.findFirstMuc(invite.getJid());
             if (muc != null) {
                 switchToConversation(muc,invite.getBody(),false);
@@ -1202,9 +1202,5 @@ public class StartConversationActivity extends XmppActivity implements OnRosterU
             }
             return false;
         }
-
-        public boolean isMuc() {
-            return muc;
-        }
     }
 }

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

@@ -14,14 +14,17 @@ import eu.siacs.conversations.xmpp.jid.Jid;
 public class XmppUri {
 
 	protected String jid;
-	protected boolean muc;
 	protected List<Fingerprint> fingerprints = new ArrayList<>();
 	private String body;
+	private String action;
 	protected boolean safeSource = true;
 
 	public static final String OMEMO_URI_PARAM = "omemo-sid-";
 	public static final String OTR_URI_PARAM = "otr-fingerprint";
 
+	public static final String ACTION_JOIN = "join";
+	public static final String ACTION_MESSAGE = "message";
+
 	public XmppUri(String uri) {
 		try {
 			parse(Uri.parse(uri));
@@ -63,11 +66,21 @@ public class XmppUri {
 				// sample : https://conversations.im/i/foo/bar.com
 				jid = segments.get(1) + "@" + segments.get(2);
 			}
-			muc = segments.size() > 1 && "j".equalsIgnoreCase(segments.get(0));
+			if (segments.size() > 1 && "j".equalsIgnoreCase(segments.get(0))) {
+				action = ACTION_JOIN;
+			}
 			fingerprints = parseFingerprints(uri.getQuery(),'&');
 		} else if ("xmpp".equalsIgnoreCase(scheme)) {
 			// sample: xmpp:foo@bar.com
-			muc = isMuc(uri.getQuery());
+
+			final String query = uri.getQuery();
+
+			if (hasAction(query, ACTION_JOIN)) {
+				this.action = ACTION_JOIN;
+			} else if (hasAction(query, ACTION_MESSAGE)) {
+				this.action = ACTION_MESSAGE;
+			}
+
 			if (uri.getAuthority() != null) {
 				jid = uri.getAuthority();
 			} else {
@@ -138,16 +151,24 @@ public class XmppUri {
 		return null;
 	}
 
-	protected boolean isMuc(String query) {
+	private boolean hasAction(String query, String action) {
 		for(String pair : query == null ? new String[0] : query.split(";")) {
 			final String[] parts = pair.split("=",2);
-			if (parts.length == 1 && "join".equals(parts[0])) {
+			if (parts.length == 1 && parts[0].equals(action)) {
 				return true;
 			}
 		}
 		return false;
 	}
 
+	public boolean isAction(final String action) {
+		if (this.action == null) {
+			return false;
+		}
+
+		return this.action.equals(action);
+	}
+
 	public Jid getJid() {
 		try {
 			return this.jid == null ? null :Jid.fromString(this.jid.toLowerCase());