make newly created conferences private by default

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/MucOptions.java            |  1 
src/main/java/eu/siacs/conversations/generator/IqGenerator.java          | 10 
src/main/java/eu/siacs/conversations/parser/PresenceParser.java          | 10 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java | 19 
src/main/java/eu/siacs/conversations/ui/XmppActivity.java                |  2 
5 files changed, 32 insertions(+), 10 deletions(-)

Detailed changes

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

@@ -118,6 +118,7 @@ public class MucOptions {
 
 	public static final String STATUS_CODE_ROOM_CONFIG_CHANGED = "104";
 	public static final String STATUS_CODE_SELF_PRESENCE = "110";
+	public static final String STATUS_CODE_ROOM_CREATED = "201";
 	public static final String STATUS_CODE_BANNED = "301";
 	public static final String STATUS_CODE_CHANGED_NICK = "303";
 	public static final String STATUS_CODE_KICKED = "307";

src/main/java/eu/siacs/conversations/generator/IqGenerator.java 🔗

@@ -1,6 +1,7 @@
 package eu.siacs.conversations.generator;
 
 
+import android.os.Bundle;
 import android.util.Base64;
 import android.util.Log;
 
@@ -343,4 +344,13 @@ public class IqGenerator extends AbstractGenerator {
 		packet.query("http://jabber.org/protocol/muc#admin").addChild("item").setAttribute("affiliation",affiliation);
 		return packet;
 	}
+
+	public static Bundle defaultRoomConfiguration() {
+		Bundle options = new Bundle();
+		options.putString("muc#roomconfig_persistentroom", "1");
+		options.putString("muc#roomconfig_membersonly", "1");
+		options.putString("muc#roomconfig_publicroom", "0");
+		options.putString("muc#roomconfig_whois", "anyone");
+		return options;
+	}
 }

src/main/java/eu/siacs/conversations/parser/PresenceParser.java 🔗

@@ -14,6 +14,7 @@ import eu.siacs.conversations.entities.Conversation;
 import eu.siacs.conversations.entities.Message;
 import eu.siacs.conversations.entities.MucOptions;
 import eu.siacs.conversations.entities.Presence;
+import eu.siacs.conversations.generator.IqGenerator;
 import eu.siacs.conversations.generator.PresenceGenerator;
 import eu.siacs.conversations.services.XmppConnectionService;
 import eu.siacs.conversations.xml.Element;
@@ -77,6 +78,15 @@ public class PresenceParser extends AbstractParser implements
 						} else {
 							mucOptions.addUser(user);
 						}
+						if (codes.contains(MucOptions.STATUS_CODE_ROOM_CREATED)) {
+							Log.d(Config.LOGTAG,mucOptions.getAccount().getJid().toBareJid()
+									+": room '"
+									+mucOptions.getConversation().getJid().toBareJid()
+									+"' created. pushing default configuration");
+							mXmppConnectionService.pushConferenceConfiguration(mucOptions.getConversation(),
+									IqGenerator.defaultRoomConfiguration(),
+									null);
+						}
 						if (mXmppConnectionService.getPgpEngine() != null) {
 							Element signed = packet.findChild("x", "jabber:x:signed");
 							if (signed != null) {

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

@@ -2034,7 +2034,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 		return null;
 	}
 
-	public void createAdhocConference(final Account account, final Iterable<Jid> jids, final UiCallback<Conversation> callback) {
+	public void createAdhocConference(final Account account,
+									  final String subject,
+									  final Iterable<Jid> jids,
+									  final UiCallback<Conversation> callback) {
 		Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": creating adhoc conference with " + jids.toString());
 		if (account.getStatus() == Account.State.ONLINE) {
 			try {
@@ -2045,20 +2048,18 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 					}
 					return;
 				}
-				String name = new BigInteger(75, getRNG()).toString(32);
-				Jid jid = Jid.fromParts(name, server, null);
+				String localpart = new BigInteger(75, getRNG()).toString(32);
+				Jid jid = Jid.fromParts(localpart, server, null);
 				final Conversation conversation = findOrCreateConversation(account, jid, true);
 				joinMuc(conversation, new OnConferenceJoined() {
 					@Override
 					public void onConferenceJoined(final Conversation conversation) {
-						Bundle options = new Bundle();
-						options.putString("muc#roomconfig_persistentroom", "1");
-						options.putString("muc#roomconfig_membersonly", "1");
-						options.putString("muc#roomconfig_publicroom", "0");
-						options.putString("muc#roomconfig_whois", "anyone");
-						pushConferenceConfiguration(conversation, options, new OnConferenceOptionsPushed() {
+						pushConferenceConfiguration(conversation, IqGenerator.defaultRoomConfiguration(), new OnConferenceOptionsPushed() {
 							@Override
 							public void onPushSucceeded() {
+								if (subject != null && !subject.trim().isEmpty()) {
+									pushSubjectToConference(conversation, subject);
+								}
 								for (Jid invite : jids) {
 									invite(conversation, invite);
 								}

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

@@ -1159,7 +1159,7 @@ public abstract class XmppActivity extends Activity {
 				}
 			} else {
 				jids.add(conversation.getJid().toBareJid());
-				service.createAdhocConference(conversation.getAccount(), jids, activity.adhocCallback);
+				service.createAdhocConference(conversation.getAccount(), null, jids, activity.adhocCallback);
 			}
 		}
 	}