make allow_pm configurable

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/MucOptions.java            |  14 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |   9 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java   |  55 
src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java       | 103 
src/main/java/eu/siacs/conversations/xmpp/forms/Data.java                |   4 
src/main/res/values/strings.xml                                          |   1 
6 files changed, 107 insertions(+), 79 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/entities/MucOptions.java 🔗

@@ -5,13 +5,6 @@ import android.text.TextUtils;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Set;
-
 import eu.siacs.conversations.Config;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.services.AvatarService;
@@ -24,6 +17,13 @@ import eu.siacs.conversations.xmpp.forms.Data;
 import eu.siacs.conversations.xmpp.forms.Field;
 import eu.siacs.conversations.xmpp.pep.Avatar;
 
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Locale;
+import java.util.Set;
+
 public class MucOptions {
 
     public static final String STATUS_CODE_SELF_PRESENCE = "110";

src/main/java/eu/siacs/conversations/services/XmppConnectionService.java 🔗

@@ -3663,7 +3663,7 @@ public class XmppConnectionService extends Service {
                     Element configuration = pubsub == null ? null : pubsub.findChild("configure");
                     Element x = configuration == null ? null : configuration.findChild("x", Namespace.DATA);
                     if (x != null) {
-                        Data data = Data.parse(x);
+                        final Data data = Data.parse(x);
                         data.submit(options);
                         sendIqPacket(account, mIqGenerator.publishPubsubConfiguration(jid, node, data), new OnIqPacketReceived() {
                             @Override
@@ -3695,6 +3695,12 @@ public class XmppConnectionService extends Service {
             final boolean moderated = "1".equals(options.getString("muc#roomconfig_moderatedroom"));
             options.putString("members_by_default", moderated ? "0" : "1");
         }
+        if (options.containsKey("muc#roomconfig_allowpm")) {
+            // ejabberd :-/
+            final boolean allow = "anyone".equals(options.getString("muc#roomconfig_allowpm"));
+            options.putString("allow_private_messages", allow ? "1" : "0");
+            options.putString("allow_private_messages_from_visitors", allow ? "anyone" : "nobody");
+        }
         final IqPacket request = new IqPacket(IqPacket.TYPE.GET);
         request.setTo(conversation.getJid().asBareJid());
         request.query("http://jabber.org/protocol/muc#owner");
@@ -3714,6 +3720,7 @@ public class XmppConnectionService extends Service {
                                 if (packet.getType() == IqPacket.TYPE.RESULT) {
                                     callback.onPushSucceeded();
                                 } else {
+                                    Log.d(Config.LOGTAG,"failed: "+packet.toString());
                                     callback.onPushFailed();
                                 }
                             }

src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java 🔗

@@ -128,28 +128,39 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
         }
     };
 
-    private final OnClickListener mChangeConferenceSettings = new OnClickListener() {
-        @Override
-        public void onClick(View v) {
-            final MucOptions mucOptions = mConversation.getMucOptions();
-            final MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(ConferenceDetailsActivity.this);
-            MucConfiguration configuration = MucConfiguration.get(ConferenceDetailsActivity.this, mAdvancedMode, mucOptions);
-            builder.setTitle(configuration.title);
-            final boolean[] values = configuration.values;
-            builder.setMultiChoiceItems(configuration.names, values, (dialog, which, isChecked) -> values[which] = isChecked);
-            builder.setNegativeButton(R.string.cancel, null);
-            builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
-                final Bundle options = configuration.toBundle(values);
-                options.putString("muc#roomconfig_persistentroom", "1");
-                options.putString("{http://prosody.im/protocol/muc}roomconfig_allowmemberinvites", options.getString("muc#roomconfig_allowinvites"));
-                xmppConnectionService.pushConferenceConfiguration(mConversation,
-                        options,
-                        ConferenceDetailsActivity.this);
-            });
-            builder.create().show();
-        }
-    };
-
+    private final OnClickListener mChangeConferenceSettings =
+            new OnClickListener() {
+                @Override
+                public void onClick(View v) {
+                    final MucOptions mucOptions = mConversation.getMucOptions();
+                    final MaterialAlertDialogBuilder builder =
+                            new MaterialAlertDialogBuilder(ConferenceDetailsActivity.this);
+                    MucConfiguration configuration =
+                            MucConfiguration.get(
+                                    ConferenceDetailsActivity.this, mAdvancedMode, mucOptions);
+                    builder.setTitle(configuration.title);
+                    final boolean[] values = configuration.values;
+                    builder.setMultiChoiceItems(
+                            configuration.names,
+                            values,
+                            (dialog, which, isChecked) -> values[which] = isChecked);
+                    builder.setNegativeButton(R.string.cancel, null);
+                    builder.setPositiveButton(
+                            R.string.confirm,
+                            (dialog, which) -> {
+                                final Bundle options = configuration.toBundle(values);
+                                options.putString("muc#roomconfig_persistentroom", "1");
+                                if (options.containsKey("muc#roomconfig_allowinvites")) {
+                                    options.putString(
+                                            "{http://prosody.im/protocol/muc}roomconfig_allowmemberinvites",
+                                            options.getString("muc#roomconfig_allowinvites"));
+                                }
+                                xmppConnectionService.pushConferenceConfiguration(
+                                        mConversation, options, ConferenceDetailsActivity.this);
+                            });
+                    builder.create().show();
+                }
+            };
 
     @Override
     public void onConversationUpdate() {

src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java 🔗

@@ -10,13 +10,13 @@ import eu.siacs.conversations.entities.MucOptions;
 
 public class MucConfiguration {
 
-    public final @StringRes
-    int title;
+    public final @StringRes int title;
     public final String[] names;
     public final boolean[] values;
     public final Option[] options;
 
-    private MucConfiguration(@StringRes int title, String[] names, boolean[] values, Option[] options) {
+    private MucConfiguration(
+            @StringRes int title, String[] names, boolean[] values, Option[] options) {
         this.title = title;
         this.names = names;
         this.values = values;
@@ -25,52 +25,62 @@ public class MucConfiguration {
 
     public static MucConfiguration get(Context context, boolean advanced, MucOptions mucOptions) {
         if (mucOptions.isPrivateAndNonAnonymous()) {
-            String[] names = new String[]{
-                    context.getString(R.string.allow_participants_to_edit_subject),
-                    context.getString(R.string.allow_participants_to_invite_others)
-            };
-            boolean[] values = new boolean[]{
-                    mucOptions.participantsCanChangeSubject(),
-                    mucOptions.allowInvites()
-            };
-            final Option[] options = new Option[]{
-                    new Option("muc#roomconfig_changesubject"),
-                    new Option("muc#roomconfig_allowinvites")
-            };
+            String[] names =
+                    new String[] {
+                        context.getString(R.string.allow_participants_to_edit_subject),
+                        context.getString(R.string.allow_participants_to_invite_others)
+                    };
+            boolean[] values =
+                    new boolean[] {
+                        mucOptions.participantsCanChangeSubject(), mucOptions.allowInvites()
+                    };
+            final Option[] options =
+                    new Option[] {
+                        new Option("muc#roomconfig_changesubject"),
+                        new Option("muc#roomconfig_allowinvites")
+                    };
             return new MucConfiguration(R.string.conference_options, names, values, options);
         } else {
             final String[] names;
             final boolean[] values;
             final Option[] options;
             if (advanced) {
-                names = new String[]{
-                        context.getString(R.string.non_anonymous),
-                        context.getString(R.string.allow_participants_to_edit_subject),
-                        context.getString(R.string.moderated)
-                };
-                values = new boolean[]{
-                        mucOptions.nonanonymous(),
-                        mucOptions.participantsCanChangeSubject(),
-                        mucOptions.moderated()
-                };
-                options = new Option[]{
-                        new Option("muc#roomconfig_whois", "anyone", "moderators"),
-                        new Option("muc#roomconfig_changesubject"),
-                        new Option("muc#roomconfig_moderatedroom")
-                };
+                names =
+                        new String[] {
+                            context.getString(R.string.non_anonymous),
+                            context.getString(R.string.allow_participants_to_edit_subject),
+                            context.getString(R.string.moderated),
+                            context.getString(R.string.allow_private_messages)
+                        };
+                values =
+                        new boolean[] {
+                            mucOptions.nonanonymous(),
+                            mucOptions.participantsCanChangeSubject(),
+                            mucOptions.moderated(),
+                            mucOptions.allowPm()
+                        };
+                options =
+                        new Option[] {
+                            new Option("muc#roomconfig_whois", "anyone", "moderators"),
+                            new Option("muc#roomconfig_changesubject"),
+                            new Option("muc#roomconfig_moderatedroom"),
+                            new Option("muc#roomconfig_allowpm", "anyone", "moderators"),
+                        };
             } else {
-                names = new String[]{
-                        context.getString(R.string.non_anonymous),
-                        context.getString(R.string.allow_participants_to_edit_subject),
-                };
-                values = new boolean[]{
-                        mucOptions.nonanonymous(),
-                        mucOptions.participantsCanChangeSubject()
-                };
-                options = new Option[]{
-                        new Option("muc#roomconfig_whois", "anyone", "moderators"),
-                        new Option("muc#roomconfig_changesubject")
-                };
+                names =
+                        new String[] {
+                            context.getString(R.string.non_anonymous),
+                            context.getString(R.string.allow_participants_to_edit_subject),
+                        };
+                values =
+                        new boolean[] {
+                            mucOptions.nonanonymous(), mucOptions.participantsCanChangeSubject()
+                        };
+                options =
+                        new Option[] {
+                            new Option("muc#roomconfig_whois", "anyone", "moderators"),
+                            new Option("muc#roomconfig_changesubject")
+                        };
             }
             return new MucConfiguration(R.string.channel_options, names, values, options);
         }
@@ -108,9 +118,9 @@ public class MucConfiguration {
 
     public Bundle toBundle(boolean[] values) {
         Bundle bundle = new Bundle();
-        for(int i = 0; i < values.length; ++i) {
+        for (int i = 0; i < values.length; ++i) {
             final Option option = options[i];
-            bundle.putString(option.name,option.values[values[i] ? 0 : 1]);
+            bundle.putString(option.name, option.values[values[i] ? 0 : 1]);
         }
         return bundle;
     }
@@ -121,13 +131,12 @@ public class MucConfiguration {
 
         private Option(String name) {
             this.name = name;
-            this.values = new String[]{"1","0"};
+            this.values = new String[] {"1", "0"};
         }
 
         private Option(String name, String on, String off) {
             this.name = name;
-            this.values = new String[]{on,off};
+            this.values = new String[] {on, off};
         }
     }
-
 }

src/main/java/eu/siacs/conversations/xmpp/forms/Data.java 🔗

@@ -59,8 +59,8 @@ public class Data extends Element {
 		field.setValues(values);
 	}
 
-	public void submit(Bundle options) {
-		for (Field field : getFields()) {
+	public void submit(final Bundle options) {
+		for (final Field field : getFields()) {
 			if (options.containsKey(field.getFieldName())) {
 				field.setValue(options.getString(field.getFieldName()));
 			}

src/main/res/values/strings.xml 🔗

@@ -1064,4 +1064,5 @@
     <string name="pref_fullscreen_notification">Full screen notifications</string>
     <string name="pref_fullscreen_notification_summary">Allow this app to show incoming call notifications that take up the full screen when the device is locked.</string>
     <string name="unsupported_operation">Unsupported operation</string>
+    <string name="allow_private_messages">Allow private messages</string>
 </resources>