Detailed changes
@@ -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) {
@@ -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,
@@ -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);
}
@@ -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...