Suppport ?command URIs

Stephen Paul Weber created

Change summary

src/cheogram/java/eu/siacs/conversations/ui/ShareViaAccountActivity.java | 62 
src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java       |  9 
src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java          |  5 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java                |  9 
4 files changed, 60 insertions(+), 25 deletions(-)

Detailed changes

src/cheogram/java/eu/siacs/conversations/ui/ShareViaAccountActivity.java 🔗

@@ -10,6 +10,7 @@ import eu.siacs.conversations.R;
 import eu.siacs.conversations.entities.Account;
 import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.ui.adapter.AccountAdapter;
+import eu.siacs.conversations.utils.XmppUri;
 import eu.siacs.conversations.xmpp.Jid;
 
 public class ShareViaAccountActivity extends XmppActivity {
@@ -41,17 +42,12 @@ public class ShareViaAccountActivity extends XmppActivity {
         accountListView.setAdapter(this.mAccountAdapter);
         accountListView.setOnItemClickListener((arg0, view, position, arg3) -> {
             final Account account = accountList.get(position);
-            final String body = getIntent().getStringExtra(EXTRA_BODY);
-
-            try {
-                final Jid contact = Jid.of(getIntent().getStringExtra(EXTRA_CONTACT));
-                final Conversation conversation = xmppConnectionService.findOrCreateConversation(
-                        account, contact, false, false);
-                switchToConversation(conversation, body);
-            } catch (IllegalArgumentException e) {
-                // ignore error
+            final String action = getAction();
+            if (action != null && action.equals("command")) {
+                startCommand(account, getJid(), new XmppUri(getIntent().getData()).getParameter("node"));
+            } else {
+                switchToConversation(getConversation(account), getBody(), false, null, false, false, action);
             }
-
             finish();
         });
     }
@@ -70,21 +66,47 @@ public class ShareViaAccountActivity extends XmppActivity {
         final int numAccounts = xmppConnectionService.getAccounts().size();
 
         if (numAccounts == 1) {
-            final String body = getIntent().getStringExtra(EXTRA_BODY);
             final Account account = xmppConnectionService.getAccounts().get(0);
-
-            try {
-                final Jid contact = Jid.of(getIntent().getStringExtra(EXTRA_CONTACT));
-                final Conversation conversation = xmppConnectionService.findOrCreateConversation(
-                        account, contact, false, false);
-                switchToConversation(conversation, body);
-            } catch (IllegalArgumentException e) {
-                // ignore error
+            final String action = getAction();
+            if (action != null && action.equals("command")) {
+                startCommand(account, getJid(), new XmppUri(getIntent().getData()).getParameter("node"));
+            } else {
+                switchToConversation(getConversation(account), getBody(), false, null, false, false, action);
             }
-
             finish();
         } else {
             refreshUiReal();
         }
     }
+
+    protected Conversation getConversation(Account account) {
+        try {
+            return xmppConnectionService.findOrCreateConversation(account, getJid(), false, false);
+        } catch (IllegalArgumentException e) { }
+        return null;
+    }
+
+    protected String getAction() {
+        if (getIntent().getData() == null) return null;
+        XmppUri xmppUri = new XmppUri(getIntent().getData());
+        if (xmppUri.isAction("message")) return "message";
+        if (xmppUri.isAction("command")) return "command";
+        return null;
+    }
+
+    protected Jid getJid() {
+        if (getIntent().getData() == null) {
+            return Jid.of(getIntent().getStringExtra(EXTRA_CONTACT));
+        } else {
+            return new XmppUri(getIntent().getData()).getJid();
+        }
+    }
+
+    protected String getBody() {
+        if (getIntent().getData() == null) {
+            return getIntent().getStringExtra(EXTRA_BODY);
+        } else {
+            return new XmppUri(getIntent().getData()).getBody();
+        }
+    }
 }

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

@@ -466,7 +466,14 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
         if (xmppUri.isValidJid() && !xmppUri.hasFingerprints()) {
             final Conversation conversation = xmppConnectionService.findUniqueConversationByJid(xmppUri);
             if (conversation != null) {
-                openConversation(conversation, null);
+                if (xmppUri.isAction("command")) {
+                    startCommand(conversation.getAccount(), conversation.getJid(), xmppUri.getParameter("node"));
+                } else {
+                    Bundle extras = new Bundle();
+                    extras.putString(Intent.EXTRA_TEXT, xmppUri.getBody());
+                    if (xmppUri.isAction("message")) extras.putString(EXTRA_POST_INIT_ACTION, "message");
+                    openConversation(conversation, extras);
+                }
                 return true;
             }
         }

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

@@ -153,7 +153,7 @@ public class UriHandlerActivity extends AppCompatActivity {
             }
         }
 
-        if (xmppUri.isAction(XmppUri.ACTION_MESSAGE)) {
+        if (xmppUri.isAction(XmppUri.ACTION_MESSAGE) || xmppUri.isAction("command")) {
             final Jid jid = xmppUri.getJid();
             final String body = xmppUri.getBody();
 
@@ -161,8 +161,7 @@ public class UriHandlerActivity extends AppCompatActivity {
                 final Class<?> clazz = findShareViaAccountClass();
                 if (clazz != null) {
                     intent = new Intent(this, clazz);
-                    intent.putExtra("contact", jid.toEscapedString());
-                    intent.putExtra("body", body);
+                    intent.setData(uri);
                 } else {
                     intent = new Intent(this, StartConversationActivity.class);
                     intent.setAction(Intent.ACTION_VIEW);

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

@@ -508,7 +508,13 @@ public abstract class XmppActivity extends ActionBarActivity {
         switchToConversation(conversation, null, false, nick, true, false);
     }
 
-    private void switchToConversation(Conversation conversation, String text, boolean asQuote, String nick, boolean pm, boolean doNotAppend) {
+    public void switchToConversation(Conversation conversation, String text, boolean asQuote, String nick, boolean pm, boolean doNotAppend) {
+        switchToConversation(conversation, null, false, nick, true, false, null);
+    }
+
+    public void switchToConversation(Conversation conversation, String text, boolean asQuote, String nick, boolean pm, boolean doNotAppend, String postInit) {
+        if (conversation == null) return;
+
         Intent intent = new Intent(this, ConversationsActivity.class);
         intent.setAction(ConversationsActivity.ACTION_VIEW_CONVERSATION);
         intent.putExtra(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid());
@@ -525,6 +531,7 @@ public abstract class XmppActivity extends ActionBarActivity {
         if (doNotAppend) {
             intent.putExtra(ConversationsActivity.EXTRA_DO_NOT_APPEND, true);
         }
+        intent.putExtra(ConversationsActivity.EXTRA_POST_INIT_ACTION, postInit);
         intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP);
         startActivity(intent);
         finish();