diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java index 59a15573ebacb6dfcd56a462691ec7cb5e46cbc4..d031bdb21e43d33235040ba9062c61f137280c16 100644 --- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java @@ -18,6 +18,7 @@ import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Namespace; import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.chatstate.ChatState; +import eu.siacs.conversations.xmpp.forms.Data; import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager; import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection; import eu.siacs.conversations.xmpp.jingle.Media; @@ -191,6 +192,18 @@ public class MessageGenerator extends AbstractGenerator { return packet; } + public MessagePacket requestVoice(Jid jid) { + MessagePacket packet = new MessagePacket(); + packet.setType(MessagePacket.TYPE_NORMAL); + packet.setTo(jid.asBareJid()); + Data form = new Data(); + form.setFormType("http://jabber.org/protocol/muc#request"); + form.put("muc#role", "participant"); + form.submit(); + packet.addChild(form); + return packet; + } + public MessagePacket directInvite(final Conversation conversation, final Jid contact) { MessagePacket packet = new MessagePacket(); packet.setType(MessagePacket.TYPE_NORMAL); diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index fafdc653de1305ff75fc24baa86c499619d6e9c7..eddd8e3c3978e43916040a348df354de5c345fda 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -3667,6 +3667,11 @@ public class XmppConnectionService extends Service { this.sendMessagePacket(conference.getAccount(), packet); } + public void requestVoice(final Account account, final Jid jid) { + MessagePacket packet = this.getMessageGenerator().requestVoice(jid); + this.sendMessagePacket(account, packet); + } + public void changeAffiliationInConference(final Conversation conference, Jid user, final MucOptions.Affiliation affiliation, final OnAffiliationChanged callback) { final Jid jid = user.asBareJid(); final IqPacket request = this.mIqGenerator.changeAffiliation(conference, jid, affiliation.toString()); diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 82eab5b7740c556df17cdcecf23f2b52c160cfe2..cf519fb7255501d68a2d0409715e5057bd0e02cd 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1304,6 +1304,9 @@ public class ConversationFragment extends XmppFragment conversation.setUserSelectedThread(false); setupReply(null); }); + binding.requestVoice.setOnClickListener((v) -> { + activity.xmppConnectionService.requestVoice(conversation.getAccount(), conversation.getJid()); + }); binding.scrollToBottomButton.setOnClickListener(this.mScrollButtonListener); binding.messagesView.setOnScrollListener(mOnScrollListener); @@ -3384,6 +3387,7 @@ public class ConversationFragment extends XmppFragment this.binding.textinput.setFocusableInTouchMode(canWrite); this.binding.textSendButton.setEnabled(canWrite); this.binding.textSendButton.setVisibility(canWrite ? View.VISIBLE : View.GONE); + this.binding.requestVoice.setVisibility(canWrite ? View.GONE : View.VISIBLE); this.binding.textinput.setCursorVisible(canWrite); this.binding.textinput.setEnabled(canWrite); } diff --git a/src/main/res/layout/fragment_conversation.xml b/src/main/res/layout/fragment_conversation.xml index c97edd767bf1fdd3f251aca099b319c7f5d308cb..2d4567c9382b4bfabd83be24314b619cfe6b0c12 100644 --- a/src/main/res/layout/fragment_conversation.xml +++ b/src/main/res/layout/fragment_conversation.xml @@ -187,6 +187,19 @@ android:background="?attr/color_background_primary" android:contentDescription="@string/send_message" android:src="?attr/ic_send_text_offline" /> + +