hide subject edit button if not editable by user

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/MucOptions.java            | 22 
src/main/java/eu/siacs/conversations/services/XmppConnectionService.java |  7 
src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java   |  2 
src/main/java/eu/siacs/conversations/xmpp/forms/Field.java               |  4 
4 files changed, 30 insertions(+), 5 deletions(-)

Detailed changes

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

@@ -9,6 +9,8 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import eu.siacs.conversations.R;
 import eu.siacs.conversations.crypto.PgpEngine;
 import eu.siacs.conversations.xml.Element;
+import eu.siacs.conversations.xmpp.forms.Data;
+import eu.siacs.conversations.xmpp.forms.Field;
 import eu.siacs.conversations.xmpp.jid.InvalidJidException;
 import eu.siacs.conversations.xmpp.jid.Jid;
 import eu.siacs.conversations.xmpp.stanzas.PresencePacket;
@@ -207,6 +209,7 @@ public class MucOptions {
 	private Account account;
 	private List<User> users = new CopyOnWriteArrayList<>();
 	private List<String> features = new ArrayList<>();
+	private Data form = new Data();
 	private Conversation conversation;
 	private boolean isOnline = false;
 	private int error = ERROR_UNKNOWN;
@@ -226,12 +229,22 @@ public class MucOptions {
 		this.features.addAll(features);
 	}
 
+	public void updateFormData(Data form) {
+		this.form = form;
+	}
+
 	public boolean hasFeature(String feature) {
 		return this.features.contains(feature);
 	}
 
 	public boolean canInvite() {
-		 return !membersOnly() || self.getAffiliation().ranks(Affiliation.ADMIN);
+		Field field = this.form.getFieldByName("muc#roomconfig_allowinvites");
+		return !membersOnly() || self.getRole().ranks(Role.MODERATOR) || (field != null && "1".equals(field.getValue()));
+	}
+
+	public boolean canChangeSubject() {
+		Field field = this.form.getFieldByName("muc#roomconfig_changesubject");
+		return self.getRole().ranks(Role.MODERATOR) || (field != null && "1".equals(field.getValue()));
 	}
 
 	public boolean participating() {
@@ -472,11 +485,12 @@ public class MucOptions {
 				ids.add(user.getPgpKeyId());
 			}
 		}
-		long[] primitivLongArray = new long[ids.size()];
+		ids.add(account.getPgpId());
+		long[] primitiveLongArray = new long[ids.size()];
 		for (int i = 0; i < ids.size(); ++i) {
-			primitivLongArray[i] = ids.get(i);
+			primitiveLongArray[i] = ids.get(i);
 		}
-		return primitivLongArray;
+		return primitiveLongArray;
 	}
 
 	public boolean pgpKeysInUse() {

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

@@ -1940,7 +1940,8 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 			public void onIqPacketReceived(Account account, IqPacket packet) {
 				if (packet.getType() == IqPacket.TYPE.RESULT) {
 					ArrayList<String> features = new ArrayList<>();
-					for (Element child : packet.query().getChildren()) {
+					Element query = packet.query();
+					for (Element child : query.getChildren()) {
 						if (child != null && child.getName().equals("feature")) {
 							String var = child.getAttribute("var");
 							if (var != null) {
@@ -1948,6 +1949,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
 							}
 						}
 					}
+					Element form = query.findChild("x","jabber:x:data");
+					if (form != null) {
+						conversation.getMucOptions().updateFormData(Data.parse(form));
+					}
 					conversation.getMucOptions().updateFeatures(features);
 					if (callback != null) {
 						callback.onConferenceConfigurationFetched(conversation);

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

@@ -267,6 +267,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 		MenuItem menuItemSaveBookmark = menu.findItem(R.id.action_save_as_bookmark);
 		MenuItem menuItemDeleteBookmark = menu.findItem(R.id.action_delete_bookmark);
 		MenuItem menuItemAdvancedMode = menu.findItem(R.id.action_advanced_mode);
+		MenuItem menuItemChangeSubject = menu.findItem(R.id.action_edit_subject);
 		menuItemAdvancedMode.setChecked(mAdvancedMode);
 		if (mConversation == null) {
 			return true;
@@ -279,6 +280,7 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
 			menuItemDeleteBookmark.setVisible(false);
 			menuItemSaveBookmark.setVisible(true);
 		}
+		menuItemChangeSubject.setVisible(mConversation.getMucOptions().canChangeSubject());
 		return true;
 	}