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 +