From b0d43da81c8de1af5a2d646ca2d3f7d3df687848 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 30 Dec 2022 00:42:24 -0500 Subject: [PATCH] Suppport ?command URIs --- .../ui/ShareViaAccountActivity.java | 62 +++++++++++++------ .../ui/ConversationsActivity.java | 9 ++- .../conversations/ui/UriHandlerActivity.java | 5 +- .../siacs/conversations/ui/XmppActivity.java | 9 ++- 4 files changed, 60 insertions(+), 25 deletions(-) diff --git a/src/cheogram/java/eu/siacs/conversations/ui/ShareViaAccountActivity.java b/src/cheogram/java/eu/siacs/conversations/ui/ShareViaAccountActivity.java index 762dfbb422780c20293eec13c3acdcd846d2595e..b9fc1fbf915c3d148e359da5c8fed7cecd8adb4e 100644 --- a/src/cheogram/java/eu/siacs/conversations/ui/ShareViaAccountActivity.java +++ b/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(); + } + } } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index ddb279645efa4340d3e147e5c7c057c48fef19c2..07c0d74859f365dbb6a84f58708331746ab08383 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/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; } } diff --git a/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java b/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java index 5583fb5fbe1c304b25ea9957d70bd8f679af56a1..fc25079b2c5e93d9bdb33fca4912635fc1d73e2f 100644 --- a/src/main/java/eu/siacs/conversations/ui/UriHandlerActivity.java +++ b/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); diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java index 3f65eb4e30dbc7f4daef7bf38ac388c1fe9001cb..d828101eee0ca317edf97b14bbb0794d1c55b3c4 100644 --- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java +++ b/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();