From 43e29d32e895d9f2ae29e2b4a167a37681fd7c94 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Thu, 16 Feb 2023 22:17:42 -0500 Subject: [PATCH 1/2] If a MUC address is entered as a contact, join it --- .../services/XmppConnectionService.java | 12 +++++++ .../conversations/ui/BlocklistActivity.java | 2 +- .../ui/ChooseContactActivity.java | 2 +- .../conversations/ui/EnterJidDialog.java | 20 +++++++---- .../ui/StartConversationActivity.java | 33 +++++++++++-------- .../conversations/ui/widget/DialpadView.java | 6 +--- .../siacs/conversations/utils/Consumer.java | 6 ++++ 7 files changed, 54 insertions(+), 27 deletions(-) create mode 100644 src/main/java/eu/siacs/conversations/utils/Consumer.java diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 028b6b8168d0f14147fb56cb6e8ab4de2cd0eb90..3a92a3c81e696dfcbc12fc6197c9a862c277b626 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -134,6 +134,7 @@ import eu.siacs.conversations.ui.interfaces.OnMediaLoaded; import eu.siacs.conversations.ui.interfaces.OnSearchResultsAvailable; import eu.siacs.conversations.utils.AccountUtils; import eu.siacs.conversations.utils.Compatibility; +import eu.siacs.conversations.utils.Consumer; import eu.siacs.conversations.utils.ConversationsFileObserver; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.EasyOnboardingInvite; @@ -3399,6 +3400,17 @@ public class XmppConnectionService extends Service { } } + public void checkIfMuc(final Account account, final Jid jid, Consumer cb) { + IqPacket request = mIqGenerator.queryDiscoInfo(jid.asBareJid()); + sendIqPacket(account, request, (acct, reply) -> { + ServiceDiscoveryResult result = new ServiceDiscoveryResult(reply); + cb.accept( + result.getFeatures().contains("http://jabber.org/protocol/muc") && + result.hasIdentity("conference", null) + ); + }); + } + public void fetchConferenceConfiguration(final Conversation conversation) { fetchConferenceConfiguration(conversation, null); } diff --git a/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java b/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java index 55cf9ba0360cad1c315fb3adb7ee30556ca7622a..5115d508312627d6c0dbacb63c066cc47bc6668d 100644 --- a/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java @@ -82,7 +82,7 @@ public class BlocklistActivity extends AbstractSearchableListItemActivity implem null, account.getJid().asBareJid().toEscapedString(), true, - false + EnterJidDialog.SanityCheck.NO ); dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { diff --git a/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java b/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java index 6fe57a0cda475284aba4ffac33b113835dc40a2a..706c7755fdee42abab4086dfe9bbd7a872ab451a 100644 --- a/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java @@ -329,7 +329,7 @@ public class ChooseContactActivity extends AbstractSearchableListItemActivity im jid == null ? null : jid.asBareJid().toString(), getIntent().getStringExtra(EXTRA_ACCOUNT), true, - false + EnterJidDialog.SanityCheck.NO ); dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { diff --git a/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java b/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java index 88f4ec3ffd54aeb2632edd43c455a2ec386b2b22..68f8f342c0881880eb9b5b2783d1eb1e9a549142 100644 --- a/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java +++ b/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java @@ -68,11 +68,17 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected private EnterJidDialogBinding binding; private AlertDialog dialog; - private boolean sanityCheckJid = false; + private SanityCheck sanityCheckJid = SanityCheck.NO; private boolean issuedWarning = false; private GatewayListAdapter gatewayListAdapter = new GatewayListAdapter(); + public static enum SanityCheck { + NO, + YES, + ALLOW_MUC + } + public static EnterJidDialog newInstance( final List activatedAccounts, final String title, @@ -80,7 +86,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected final String prefilledJid, final String account, boolean allowEditJid, - final boolean sanity_check_jid) { + final SanityCheck sanity_check_jid) { EnterJidDialog dialog = new EnterJidDialog(); Bundle bundle = new Bundle(); bundle.putString(TITLE_KEY, title); @@ -89,7 +95,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected bundle.putString(ACCOUNT_KEY, account); bundle.putBoolean(ALLOW_EDIT_JID_KEY, allowEditJid); bundle.putStringArrayList(ACCOUNTS_LIST_KEY, (ArrayList) activatedAccounts); - bundle.putBoolean(SANITY_CHECK_JID, sanity_check_jid); + bundle.putInt(SANITY_CHECK_JID, sanity_check_jid.ordinal()); dialog.setArguments(bundle); return dialog; } @@ -131,7 +137,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected binding.jid.setCursorVisible(false); } } - sanityCheckJid = getArguments().getBoolean(SANITY_CHECK_JID, false); + sanityCheckJid = SanityCheck.values()[getArguments().getInt(SANITY_CHECK_JID, SanityCheck.NO.ordinal())]; DelayedHintHelper.setHint(R.string.account_settings_example_jabber_id, binding.jid); @@ -236,7 +242,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected return; } - final Jid contactJid; + Jid contactJid = null; try { contactJid = Jid.ofEscaped(jidString); } catch (final IllegalArgumentException e) { @@ -244,14 +250,14 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected return; } - if (!issuedWarning && sanityCheckJid) { + if (!issuedWarning && sanityCheckJid != SanityCheck.NO) { if (contactJid.isDomainJid()) { binding.jidLayout.setError(getActivity().getString(R.string.this_looks_like_a_domain)); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setText(R.string.add_anway); issuedWarning = true; return; } - if (suspiciousSubDomain(contactJid.getDomain().toEscapedString())) { + if (sanityCheckJid != SanityCheck.ALLOW_MUC && suspiciousSubDomain(contactJid.getDomain().toEscapedString())) { binding.jidLayout.setError(getActivity().getString(R.string.this_looks_like_channel)); dialog.getButton(AlertDialog.BUTTON_POSITIVE).setText(R.string.add_anway); issuedWarning = true; diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index 1f6305760de821e1c60934db38491bdd406ae290..62004862d569689c1f73e6b79b79bbe59b9ecc1c 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -536,7 +536,7 @@ public class StartConversationActivity extends XmppActivity implements XmppConne prefilledJid, invite == null ? null : invite.account, invite == null || !invite.hasFingerprints(), - true + EnterJidDialog.SanityCheck.ALLOW_MUC ); dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { @@ -548,25 +548,32 @@ public class StartConversationActivity extends XmppActivity implements XmppConne if (account == null) { return true; } - final Contact contact = account.getRoster().getContact(contactJid); + if (invite != null && invite.getName() != null) { contact.setServerName(invite.getName()); } - if (contact.isSelf()) { - switchToConversation(contact); - return true; - } else if (contact.showInRoster()) { - throw new EnterJidDialog.JidError(getString(R.string.contact_already_exists)); - } else { - final String preAuth = invite == null ? null : invite.getParameter(XmppUri.PARAMETER_PRE_AUTH); - xmppConnectionService.createContact(contact, true, preAuth); - if (invite != null && invite.hasFingerprints()) { - xmppConnectionService.verifyFingerprints(contact, invite.getFingerprints()); - } + + if (contact.isSelf() || contact.showInRoster()) { switchToConversationDoNotAppend(contact, invite == null ? null : invite.getBody()); return true; } + + xmppConnectionService.checkIfMuc(account, contactJid, (isMuc) -> { + if (isMuc) { + final Conversation conversation = xmppConnectionService.findOrCreateConversation(account, contactJid, true, true, true); + switchToConversationDoNotAppend(conversation, invite == null ? null : invite.getBody()); + } else { + final String preAuth = invite == null ? null : invite.getParameter(XmppUri.PARAMETER_PRE_AUTH); + xmppConnectionService.createContact(contact, true, preAuth); + if (invite != null && invite.hasFingerprints()) { + xmppConnectionService.verifyFingerprints(contact, invite.getFingerprints()); + } + switchToConversationDoNotAppend(contact, invite == null ? null : invite.getBody()); + } + }); + + return true; }); dialog.show(ft, FRAGMENT_TAG_DIALOG); } diff --git a/src/main/java/eu/siacs/conversations/ui/widget/DialpadView.java b/src/main/java/eu/siacs/conversations/ui/widget/DialpadView.java index ccf91cad4bfc76b7a533a2ded7a29041b84f29bc..2a2846d35a2d93c664dee9eb6edaf7cf0915c5bd 100644 --- a/src/main/java/eu/siacs/conversations/ui/widget/DialpadView.java +++ b/src/main/java/eu/siacs/conversations/ui/widget/DialpadView.java @@ -26,6 +26,7 @@ import androidx.constraintlayout.widget.ConstraintLayout; import androidx.databinding.DataBindingUtil; import eu.siacs.conversations.databinding.DialpadBinding; import eu.siacs.conversations.R; +import eu.siacs.conversations.utils.Consumer; public class DialpadView extends ConstraintLayout implements View.OnClickListener { @@ -64,9 +65,4 @@ public class DialpadView extends ConstraintLayout implements View.OnClickListene public void onClick(View v) { clickConsumer.accept(v.getTag().toString()); } - - // Based on java.util.function.Consumer to avoid Android 24 dependency - public interface Consumer { - void accept(T t); - } } diff --git a/src/main/java/eu/siacs/conversations/utils/Consumer.java b/src/main/java/eu/siacs/conversations/utils/Consumer.java new file mode 100644 index 0000000000000000000000000000000000000000..8f6d2d89939164ad869ce9d86e49489e808b75f9 --- /dev/null +++ b/src/main/java/eu/siacs/conversations/utils/Consumer.java @@ -0,0 +1,6 @@ +package eu.siacs.conversations.utils; + +// Based on java.util.function.Consumer to avoid Android 24 dependency +public interface Consumer { + void accept(T t); +} From f54fe5acd0bb38f0cfe6d77fe758d3c0ef304528 Mon Sep 17 00:00:00 2001 From: Stephen Paul Weber Date: Thu, 16 Feb 2023 23:22:27 -0500 Subject: [PATCH 2/2] Unify add contact and join channel Instead of making the user know what kind of JID they have, just let them enter it and we can figure that out. Instead of forcing them to add a contact or bookmark, make it optional with a checkbox (default checked). Instead of assuming they want to message the contact, allow them to choose to call instead (coupled with PSTN gateway features this is effectively a dialler). --- src/cheogram/res/values/strings.xml | 1 + .../conversations/ui/BlocklistActivity.java | 4 +- .../ui/ChooseContactActivity.java | 4 +- .../ui/ConversationFragment.java | 3 + .../conversations/ui/EnterJidDialog.java | 35 +++++++---- .../ui/StartConversationActivity.java | 58 ++++++++++++++----- src/main/res/layout/enter_jid_dialog.xml | 9 +++ .../menu/start_conversation_fab_submenu.xml | 6 +- 8 files changed, 86 insertions(+), 34 deletions(-) diff --git a/src/cheogram/res/values/strings.xml b/src/cheogram/res/values/strings.xml index 3ea8c47d153ddcf67d8bc2204ab142fc1e442fa7..9e310fda79eb81bd8ef3c5f9b615fb7965e89200 100644 --- a/src/cheogram/res/values/strings.xml +++ b/src/cheogram/res/values/strings.xml @@ -31,4 +31,5 @@ Incoming calls from phone numbers may ring with your system dialler instead of this app\'s notification settings Save as Sticker Sticker Name + New Contact or Channel diff --git a/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java b/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java index 5115d508312627d6c0dbacb63c066cc47bc6668d..52e12d96010cdba4e1353049aec4543691ca60fe 100644 --- a/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/BlocklistActivity.java @@ -80,12 +80,14 @@ public class BlocklistActivity extends AbstractSearchableListItemActivity implem getString(R.string.block_jabber_id), getString(R.string.block), null, + null, account.getJid().asBareJid().toEscapedString(), true, + false, EnterJidDialog.SanityCheck.NO ); - dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { + dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid, x, y) -> { Blockable blockable = new RawBlockable(account, contactJid); if (xmppConnectionService.sendBlockRequest(blockable, false)) { Toast.makeText(BlocklistActivity.this, R.string.corresponding_conversations_closed, Toast.LENGTH_SHORT).show(); diff --git a/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java b/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java index 706c7755fdee42abab4086dfe9bbd7a872ab451a..e5681cc9eef590a24b823091ca9ae574dd46bb70 100644 --- a/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ChooseContactActivity.java @@ -326,13 +326,15 @@ public class ChooseContactActivity extends AbstractSearchableListItemActivity im mActivatedAccounts, getString(R.string.enter_contact), getString(R.string.select), + null, jid == null ? null : jid.asBareJid().toString(), getIntent().getStringExtra(EXTRA_ACCOUNT), true, + false, EnterJidDialog.SanityCheck.NO ); - dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { + dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid, x, y) -> { final Intent request = getIntent(); final Intent data = new Intent(); data.putExtra("contact", contactJid.toString()); diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 50721d9dfeff1defbae6dba280f6b20445ab97c2..6c7635a97de4512fe7ba42c12dba9cc027414354 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -2859,6 +2859,9 @@ public class ConversationFragment extends XmppFragment attachFile(ATTACHMENT_CHOICE_RECORD_VOICE, false); return; } + if ("call".equals(postInitAction)) { + checkPermissionAndTriggerAudioCall(); + } if ("message".equals(postInitAction)) { binding.conversationViewPager.post(() -> { binding.conversationViewPager.setCurrentItem(0); diff --git a/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java b/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java index 68f8f342c0881880eb9b5b2783d1eb1e9a549142..10f598e6993d81f9471a7d81d225c3788c2ccb95 100644 --- a/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java +++ b/src/main/java/eu/siacs/conversations/ui/EnterJidDialog.java @@ -57,11 +57,13 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected private static final String TITLE_KEY = "title"; private static final String POSITIVE_BUTTON_KEY = "positive_button"; + private static final String SECONDARY_BUTTON_KEY = "secondary_button"; private static final String PREFILLED_JID_KEY = "prefilled_jid"; private static final String ACCOUNT_KEY = "account"; private static final String ALLOW_EDIT_JID_KEY = "allow_edit_jid"; private static final String ACCOUNTS_LIST_KEY = "activated_accounts_list"; private static final String SANITY_CHECK_JID = "sanity_check_jid"; + private static final String SHOW_BOOKMARK_CHECKBOX = "show_bookmark_checkbox"; private KnownHostsAdapter knownHostsAdapter; private Collection whitelistedDomains = Collections.emptyList(); @@ -83,19 +85,23 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected final List activatedAccounts, final String title, final String positiveButton, + final String secondaryButton, final String prefilledJid, final String account, boolean allowEditJid, + boolean showBookmarkCheckbox, final SanityCheck sanity_check_jid) { EnterJidDialog dialog = new EnterJidDialog(); Bundle bundle = new Bundle(); bundle.putString(TITLE_KEY, title); bundle.putString(POSITIVE_BUTTON_KEY, positiveButton); + bundle.putString(SECONDARY_BUTTON_KEY, secondaryButton); bundle.putString(PREFILLED_JID_KEY, prefilledJid); bundle.putString(ACCOUNT_KEY, account); bundle.putBoolean(ALLOW_EDIT_JID_KEY, allowEditJid); bundle.putStringArrayList(ACCOUNTS_LIST_KEY, (ArrayList) activatedAccounts); bundle.putInt(SANITY_CHECK_JID, sanity_check_jid.ordinal()); + bundle.putBoolean(SHOW_BOOKMARK_CHECKBOX, showBookmarkCheckbox); dialog.setArguments(bundle); return dialog; } @@ -139,6 +145,10 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected } sanityCheckJid = SanityCheck.values()[getArguments().getInt(SANITY_CHECK_JID, SanityCheck.NO.ordinal())]; + if (!getArguments().getBoolean(SHOW_BOOKMARK_CHECKBOX, false)) { + binding.bookmark.setVisibility(View.GONE); + } + DelayedHintHelper.setHint(R.string.account_settings_example_jabber_id, binding.jid); String account = getArguments().getString(ACCOUNT_KEY); @@ -191,23 +201,26 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected }); builder.setView(binding.getRoot()); - builder.setNegativeButton(R.string.cancel, null); builder.setPositiveButton(getArguments().getString(POSITIVE_BUTTON_KEY), null); + if (getArguments().getString(SECONDARY_BUTTON_KEY) == null) { + builder.setNegativeButton(R.string.cancel, null); + } else { + builder.setNegativeButton(getArguments().getString(SECONDARY_BUTTON_KEY), null); + builder.setNeutralButton(R.string.cancel, null); + } this.dialog = builder.create(); - View.OnClickListener dialogOnClick = - v -> { - handleEnter(binding, account); - }; - binding.jid.setOnEditorActionListener( (v, actionId, event) -> { - handleEnter(binding, account); + handleEnter(binding, account, false); return true; }); dialog.show(); - dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener(dialogOnClick); + dialog.getButton(AlertDialog.BUTTON_POSITIVE).setOnClickListener((v) -> handleEnter(binding, account, false)); + if (getArguments().getString(SECONDARY_BUTTON_KEY) != null) { + dialog.getButton(AlertDialog.BUTTON_NEGATIVE).setOnClickListener((v) -> handleEnter(binding, account, true)); + } return dialog; } @@ -223,7 +236,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected } } - private void handleEnter(EnterJidDialogBinding binding, String account) { + private void handleEnter(EnterJidDialogBinding binding, String account, boolean secondary) { if (!binding.account.isEnabled() && account == null) { return; } @@ -267,7 +280,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected if (mListener != null) { try { - if (mListener.onEnterJidDialogPositive(accountJid, contactJid)) { + if (mListener.onEnterJidDialogPositive(accountJid, contactJid, secondary, binding.bookmark.isChecked())) { dialog.dismiss(); } } catch (JidError error) { @@ -341,7 +354,7 @@ public class EnterJidDialog extends DialogFragment implements OnBackendConnected } public interface OnEnterJidDialogPositiveListener { - boolean onEnterJidDialogPositive(Jid account, Jid contact) throws EnterJidDialog.JidError; + boolean onEnterJidDialogPositive(Jid account, Jid contact, boolean secondary, boolean save) throws EnterJidDialog.JidError; } public static class JidError extends Exception { diff --git a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java index 62004862d569689c1f73e6b79b79bbe59b9ecc1c..13db804ec3177203071e02a26a9fd9915323cbcd 100644 --- a/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/StartConversationActivity.java @@ -339,9 +339,6 @@ public class StartConversationActivity extends XmppActivity implements XmppConne case R.id.discover_public_channels: startActivity(new Intent(this, ChannelDiscoveryActivity.class)); break; - case R.id.join_public_channel: - showJoinConferenceDialog(prefilled); - break; case R.id.create_private_group_chat: showCreatePrivateGroupChatDialog(); break; @@ -531,15 +528,17 @@ public class StartConversationActivity extends XmppActivity implements XmppConne ft.addToBackStack(null); EnterJidDialog dialog = EnterJidDialog.newInstance( mActivatedAccounts, - getString(R.string.add_contact), - getString(R.string.add), + getString(R.string.start_conversation), + getString(R.string.message), + "Call", prefilledJid, invite == null ? null : invite.account, invite == null || !invite.hasFingerprints(), + true, EnterJidDialog.SanityCheck.ALLOW_MUC ); - dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid) -> { + dialog.setOnEnterJidDialogPositiveListener((accountJid, contactJid, call, save) -> { if (!xmppConnectionServiceBound) { return false; } @@ -555,25 +554,48 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } if (contact.isSelf() || contact.showInRoster()) { - switchToConversationDoNotAppend(contact, invite == null ? null : invite.getBody()); + switchToConversationDoNotAppend(contact, invite == null ? null : invite.getBody(), call ? "call" : null); return true; } xmppConnectionService.checkIfMuc(account, contactJid, (isMuc) -> { if (isMuc) { - final Conversation conversation = xmppConnectionService.findOrCreateConversation(account, contactJid, true, true, true); - switchToConversationDoNotAppend(conversation, invite == null ? null : invite.getBody()); + if (save) { + Bookmark bookmark = account.getBookmark(contactJid); + if (bookmark != null) { + openConversationsForBookmark(bookmark); + } else { + bookmark = new Bookmark(account, contactJid.asBareJid()); + bookmark.setAutojoin(getBooleanPreference("autojoin", R.bool.autojoin)); + final String nick = contactJid.getResource(); + if (nick != null && !nick.isEmpty() && !nick.equals(MucOptions.defaultNick(account))) { + bookmark.setNick(nick); + } + xmppConnectionService.createBookmark(account, bookmark); + final Conversation conversation = xmppConnectionService + .findOrCreateConversation(account, contactJid, true, true, true); + bookmark.setConversation(conversation); + switchToConversationDoNotAppend(conversation, invite == null ? null : invite.getBody()); + } + } else { + final Conversation conversation = xmppConnectionService.findOrCreateConversation(account, contactJid, true, true, true); + switchToConversationDoNotAppend(conversation, invite == null ? null : invite.getBody()); + } } else { - final String preAuth = invite == null ? null : invite.getParameter(XmppUri.PARAMETER_PRE_AUTH); - xmppConnectionService.createContact(contact, true, preAuth); - if (invite != null && invite.hasFingerprints()) { - xmppConnectionService.verifyFingerprints(contact, invite.getFingerprints()); + if (save) { + final String preAuth = invite == null ? null : invite.getParameter(XmppUri.PARAMETER_PRE_AUTH); + xmppConnectionService.createContact(contact, true, preAuth); + if (invite != null && invite.hasFingerprints()) { + xmppConnectionService.verifyFingerprints(contact, invite.getFingerprints()); + } } - switchToConversationDoNotAppend(contact, invite == null ? null : invite.getBody()); + switchToConversationDoNotAppend(contact, invite == null ? null : invite.getBody(), call ? "call" : null); } + + dialog.dismiss(); }); - return true; + return false; }); dialog.show(ft, FRAGMENT_TAG_DIALOG); } @@ -643,8 +665,12 @@ public class StartConversationActivity extends XmppActivity implements XmppConne } protected void switchToConversationDoNotAppend(Contact contact, String body) { + switchToConversationDoNotAppend(contact, body, null); + } + + protected void switchToConversationDoNotAppend(Contact contact, String body, String postInit) { Conversation conversation = xmppConnectionService.findOrCreateConversation(contact.getAccount(), contact.getJid(), false, true); - switchToConversationDoNotAppend(conversation, body); + switchToConversation(conversation, body, false, null, false, true, postInit); } @Override diff --git a/src/main/res/layout/enter_jid_dialog.xml b/src/main/res/layout/enter_jid_dialog.xml index f7d2bfbaac97403360312e550de229363a1a8b7e..50c30e849543dbc750c431d82a6ebefe2775c62c 100644 --- a/src/main/res/layout/enter_jid_dialog.xml +++ b/src/main/res/layout/enter_jid_dialog.xml @@ -43,5 +43,14 @@ android:imeOptions="actionDone|flagNoExtractUi" android:inputType="textEmailAddress" /> + + diff --git a/src/main/res/menu/start_conversation_fab_submenu.xml b/src/main/res/menu/start_conversation_fab_submenu.xml index 2cf545d681c821da29bfbba7b9aba202a5e0dcb2..934ac62367dc74d453ef83f3a8c3b51dcaf5ce78 100644 --- a/src/main/res/menu/start_conversation_fab_submenu.xml +++ b/src/main/res/menu/start_conversation_fab_submenu.xml @@ -4,10 +4,6 @@ android:id="@+id/discover_public_channels" android:icon="@drawable/ic_search_white_24dp" android:title="@string/discover_channels" /> - - \ No newline at end of file +