From 6c2bf04d795bb205aaad0d8a3efded1ffbf5614a Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Fri, 30 Dec 2022 00:40:43 -0500 Subject: [PATCH] Start command via Intent This allows switching to the right conversation if the jid does not match the current one --- .../ui/ConversationFragment.java | 39 ++++++++++++++++++- .../ui/ConversationsActivity.java | 1 + .../siacs/conversations/ui/XmppActivity.java | 10 +++++ .../ui/adapter/MessageAdapter.java | 3 +- 4 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index cd0d3c8553d876834cdfaabdba719aee9898a25d..2f55f3310c67ea4db3e4a22b6eea90e6f24404f2 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -2548,7 +2548,8 @@ public class ConversationFragment extends XmppFragment commandAdapter = new CommandAdapter((XmppActivity) getActivity()); binding.commandsView.setAdapter(commandAdapter); binding.commandsView.setOnItemClickListener((parent, view, position, id) -> { - conversation.startCommand(commandAdapter.getItem(position), activity.xmppConnectionService); + final Element command = commandAdapter.getItem(position); + activity.startCommand(conversation.getAccount(), command.getAttributeAsJid("jid"), command.getAttribute("node")); }); refreshCommands(); } @@ -2612,6 +2613,7 @@ public class ConversationFragment extends XmppFragment final String downloadUuid = extras.getString(ConversationsActivity.EXTRA_DOWNLOAD_UUID); final String text = extras.getString(Intent.EXTRA_TEXT); final String nick = extras.getString(ConversationsActivity.EXTRA_NICK); + final String node = extras.getString(ConversationsActivity.EXTRA_NODE); final String postInitAction = extras.getString(ConversationsActivity.EXTRA_POST_INIT_ACTION); final boolean asQuote = extras.getBoolean(ConversationsActivity.EXTRA_AS_QUOTE); @@ -2663,6 +2665,24 @@ public class ConversationFragment extends XmppFragment attachFile(ATTACHMENT_CHOICE_RECORD_VOICE, false); return; } + if ("message".equals(postInitAction)) { + binding.conversationViewPager.post(() -> { + binding.conversationViewPager.setCurrentItem(0); + }); + } + if ("command".equals(postInitAction)) { + binding.conversationViewPager.post(() -> { + PagerAdapter adapter = binding.conversationViewPager.getAdapter(); + if (adapter != null && adapter.getCount() > 1) { + binding.conversationViewPager.setCurrentItem(1); + } + final Jid commandJid = conversation.getContact().resourceWhichSupport(Namespace.COMMANDS); + if (node != null && commandJid != null) { + conversation.startCommand(commandFor(commandJid, node), activity.xmppConnectionService); + } + }); + return; + } final Message message = downloadUuid == null ? null : conversation.findMessageWithFileAndUuid(downloadUuid); if (message != null) { @@ -2670,6 +2690,23 @@ public class ConversationFragment extends XmppFragment } } + private Element commandFor(final Jid jid, final String node) { + if (commandAdapter != null) { + for (int i = 0; i < commandAdapter.getCount(); i++) { + Element command = commandAdapter.getItem(i); + final String commandNode = command.getAttribute("node"); + if (commandNode == null || !commandNode.equals(node)) continue; + + final Jid commandJid = command.getAttributeAsJid("jid"); + if (commandJid != null && !commandJid.asBareJid().equals(jid.asBareJid())) continue; + + return command; + } + } + + return new Element("command", Namespace.COMMANDS).setAttribute("name", node).setAttribute("node", node).setAttribute("jid", jid); + } + private List extractUris(final Bundle extras) { final List uris = extras.getParcelableArrayList(Intent.EXTRA_STREAM); if (uris != null) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java index c31c3464be330771452fb1507d09d1e109895a44..ddb279645efa4340d3e147e5c7c057c48fef19c2 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java @@ -99,6 +99,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio public static final String EXTRA_POST_INIT_ACTION = "post_init_action"; public static final String POST_ACTION_RECORD_VOICE = "record_voice"; public static final String EXTRA_TYPE = "type"; + public static final String EXTRA_NODE = "node"; private static final List VIEW_AND_SHARE_ACTIONS = Arrays.asList( ACTION_VIEW_CONVERSATION, diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java index 5e26c8fef37000ba668bb7c8281aaf8657580011..3f65eb4e30dbc7f4daef7bf38ac388c1fe9001cb 100644 --- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java @@ -474,6 +474,16 @@ public abstract class XmppActivity extends ActionBarActivity { return getPreferences().getBoolean(name, getResources().getBoolean(res)); } + public void startCommand(final Account account, final Jid jid, final String node) { + Intent intent = new Intent(this, ConversationsActivity.class); + intent.setAction(ConversationsActivity.ACTION_VIEW_CONVERSATION); + intent.putExtra(ConversationsActivity.EXTRA_CONVERSATION, xmppConnectionService.findOrCreateConversation(account, jid, false, false).getUuid()); + intent.putExtra(ConversationsActivity.EXTRA_POST_INIT_ACTION, "command"); + intent.putExtra(ConversationsActivity.EXTRA_NODE, node); + intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_CLEAR_TOP); + startActivity(intent); + } + public void switchToConversation(Conversation conversation) { switchToConversation(conversation, null); } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 67128e1c59212952f4e007adf2f22e107a19e9d7..7e0897b271e1004ec7b47a3c1a8c701e7a8c6a96 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -908,7 +908,8 @@ public class MessageAdapter extends ArrayAdapter { viewHolder.commands_list.setAdapter(adapter); viewHolder.commands_list.setVisibility(View.VISIBLE); viewHolder.commands_list.setOnItemClickListener((p, v, pos, id) -> { - ((Conversation) conversation).startCommand(adapter.getItem(pos), activity.xmppConnectionService); + final Element command = adapter.getItem(pos); + activity.startCommand(conversation.getAccount(), command.getAttributeAsJid("jid"), command.getAttribute("node")); }); } else { // It's unclear if we can set this to null...