diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java
index c408d147ff0db514af49f28809650f2b100fb85f..38e97957a29d706b5817bfaa3312c6f090697f49 100644
--- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java
+++ b/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";
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index 484eaea0daafb15102b2c5503b7a666c5b47268b..cff35a97dd852140353af52fa362af6c0b3a3af1 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/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();
}
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
index 5ed83219d19bb5bd41e6e1157cc281431c5e14cb..928a625d84e241b2a8756b44c3cc8517c628f1bf 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java
+++ b/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() {
diff --git a/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java b/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java
index 3772a851e5574e2b9e9db1ddc09ffc63ccfa0916..1b6c4e6d6ee391e91147c013c421b65fda20e5fd 100644
--- a/src/main/java/eu/siacs/conversations/ui/util/MucConfiguration.java
+++ b/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};
}
}
-
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/forms/Data.java b/src/main/java/eu/siacs/conversations/xmpp/forms/Data.java
index e3bd9eb7481229914bd0fdc144373036420b7a53..58fa06cc51223fad1c87f0c41c5532bea0f41c69 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/forms/Data.java
+++ b/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()));
}
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index a7acb7ecacb51174c2ddda2e838366a558c65e47..ecd0e1ee6c900abda76bc09494540a89892cb3c9 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -1064,4 +1064,5 @@
Full screen notifications
Allow this app to show incoming call notifications that take up the full screen when the device is locked.
Unsupported operation
+ Allow private messages