Start command via Intent

Stephen Paul Weber created

This allows switching to the right conversation if the jid does not match the
current one

Change summary

src/main/java/eu/siacs/conversations/ui/ConversationFragment.java   | 39 
src/main/java/eu/siacs/conversations/ui/ConversationsActivity.java  |  1 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java           | 10 
src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java |  3 
4 files changed, 51 insertions(+), 2 deletions(-)

Detailed changes

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<Uri> extractUris(final Bundle extras) {
         final List<Uri> uris = extras.getParcelableArrayList(Intent.EXTRA_STREAM);
         if (uris != null) {

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<String> VIEW_AND_SHARE_ACTIONS = Arrays.asList(
             ACTION_VIEW_CONVERSATION,

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);
     }

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

@@ -908,7 +908,8 @@ public class MessageAdapter extends ArrayAdapter<Message> {
                 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...