Implement request voice button

Stephen Paul Weber created

Change summary

src/main/java/eu/siacs/conversations/generator/MessageGenerator.java     | 13 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  5 
src/main/java/eu/siacs/conversations/ui/ConversationFragment.java        |  4 
src/main/res/layout/fragment_conversation.xml                            | 13 
4 files changed, 35 insertions(+)

Detailed changes

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);

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());

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);
     }

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" />
+
+                    <Button
+                        android:id="@+id/request_voice"
+                        style="@style/Widget.Conversations.Button.Borderless"
+                        android:visibility="gone"
+                        android:layout_width="wrap_content"
+                        android:layout_height="48dp"
+                        android:layout_marginRight="8dp"
+                        android:layout_alignParentEnd="true"
+                        android:layout_alignParentRight="true"
+                        android:layout_centerVertical="true"
+                        android:background="?attr/color_background_primary"
+                        android:text="Request to Speak" />
                 </RelativeLayout>
                 <com.google.android.material.floatingactionbutton.FloatingActionButton
                     android:id="@+id/scroll_to_bottom_button"