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