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" />
+
+