Detailed changes
@@ -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();
+ }
+ }
}
@@ -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;
}
}
@@ -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);
@@ -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();