aboutsummaryrefslogtreecommitdiffstats
path: root/src/main/java
diff options
context:
space:
mode:
authorChristian Schneppe <christian@pix-art.de>2018-06-29 22:22:29 +0200
committerChristian Schneppe <christian@pix-art.de>2018-06-29 22:22:29 +0200
commitd269fd47eecc7b4f34634118926a19bc084d07a4 (patch)
tree60e32019ff038b683dadb421aa6695461876fad6 /src/main/java
parent298e5757cdfcdeacdd1d219ce314d52089fc2823 (diff)
use room name (if available and != localpart) as group name
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/pixart/messenger/entities/Conversation.java22
-rw-r--r--src/main/java/de/pixart/messenger/entities/MucOptions.java58
-rw-r--r--src/main/java/de/pixart/messenger/services/XmppConnectionService.java19
-rw-r--r--src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java22
4 files changed, 69 insertions, 52 deletions
diff --git a/src/main/java/de/pixart/messenger/entities/Conversation.java b/src/main/java/de/pixart/messenger/entities/Conversation.java
index 81c3c1d95..4729eb976 100644
--- a/src/main/java/de/pixart/messenger/entities/Conversation.java
+++ b/src/main/java/de/pixart/messenger/entities/Conversation.java
@@ -60,7 +60,6 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
private static final String ATTRIBUTE_NEXT_MESSAGE_TIMESTAMP = "next_message_timestamp";
private static final String ATTRIBUTE_CRYPTO_TARGETS = "crypto_targets";
private static final String ATTRIBUTE_NEXT_ENCRYPTION = "next_encryption";
- public static final String ATTRIBUTE_ALLOW_PM = "allow_pm";
public static final String ATTRIBUTE_MEMBERS_ONLY = "members_only";
public static final String ATTRIBUTE_MODERATED = "moderated";
public static final String ATTRIBUTE_NON_ANONYMOUS = "non_anonymous";
@@ -509,10 +508,13 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
public @NonNull CharSequence getName() {
if (getMode() == MODE_MULTI) {
+ final String roomName = getMucOptions().getName();
final String subject = getMucOptions().getSubject();
final Bookmark bookmark = getBookmark();
final String bookmarkName = bookmark != null ? bookmark.getBookmarkName() : null;
- if (printableValue(subject)) {
+ if (printableValue(roomName)) {
+ return roomName;
+ } else if (printableValue(subject)) {
return subject;
} else if (printableValue(bookmarkName, false)) {
return bookmarkName;
@@ -910,10 +912,20 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
public boolean setAttribute(String key, String value) {
synchronized (this.attributes) {
try {
- this.attributes.put(key, value == null ? "" : value);
- return true;
+ if (value == null) {
+ if (this.attributes.has(key)) {
+ this.attributes.remove(key);
+ return true;
+ } else {
+ return false;
+ }
+ } else {
+ String prev = this.attributes.getString(key);
+ this.attributes.put(key, value);
+ return !value.equals(prev);
+ }
} catch (JSONException e) {
- return false;
+ throw new AssertionError(e);
}
}
}
diff --git a/src/main/java/de/pixart/messenger/entities/MucOptions.java b/src/main/java/de/pixart/messenger/entities/MucOptions.java
index eb5629b2e..ecf016c48 100644
--- a/src/main/java/de/pixart/messenger/entities/MucOptions.java
+++ b/src/main/java/de/pixart/messenger/entities/MucOptions.java
@@ -1,8 +1,10 @@
package de.pixart.messenger.entities;
import android.annotation.SuppressLint;
+import android.support.annotation.NonNull;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -322,7 +324,7 @@ public class MucOptions {
}
@Override
- public int compareTo(User another) {
+ public int compareTo(@NonNull User another) {
if (another.getAffiliation().outranks(getAffiliation())) {
return 1;
} else if (getAffiliation().outranks(another.getAffiliation())) {
@@ -358,8 +360,7 @@ public class MucOptions {
private Account account;
private final Set<User> users = new HashSet<>();
- private final List<String> features = new ArrayList<>();
- private Data form = new Data();
+ private ServiceDiscoveryResult serviceDiscoveryResult;
private final Conversation conversation;
private boolean isOnline = false;
private Error error = Error.NONE;
@@ -373,34 +374,39 @@ public class MucOptions {
this.self = new User(this, createJoinJid(getProposedNick()));
}
- public boolean updateConfiguration(List<String> features, String name, Data data) {
- updateFeatures(features);
- updateFormData(data == null ? new Data() : data);
- Field allowPmField = this.form.getFieldByName("muc#roomconfig_allowpm");
- boolean changed = false;
- changed |= conversation.setAttribute(Conversation.ATTRIBUTE_ALLOW_PM, allowPmField == null || "1".equals(allowPmField.getValue()));
+ public boolean updateConfiguration(ServiceDiscoveryResult serviceDiscoveryResult) {
+ this.serviceDiscoveryResult = serviceDiscoveryResult;
+ String name;
+ Field roomInfoName = getRoomInfoForm().getFieldByName("muc#roominfo_name");
+ if (roomInfoName != null) {
+ name = roomInfoName.getValue();
+ } else {
+ List<ServiceDiscoveryResult.Identity> identities = serviceDiscoveryResult.getIdentities();
+ String identityName = identities.size() > 0 ? identities.get(0).getName() : null;
+ if (!conversation.getJid().getEscapedLocal().equals(identityName)) {
+ name = identityName;
+ } else {
+ name = null;
+ }
+ }
+ boolean changed = conversation.setAttribute("muc_name", name);
changed |= conversation.setAttribute(Conversation.ATTRIBUTE_MEMBERS_ONLY, this.hasFeature("muc_membersonly"));
changed |= conversation.setAttribute(Conversation.ATTRIBUTE_MODERATED, this.hasFeature("muc_moderated"));
changed |= conversation.setAttribute(Conversation.ATTRIBUTE_NON_ANONYMOUS, this.hasFeature("muc_nonanonymous"));
- changed |= setName(name);
return changed;
}
- private void updateFeatures(List<String> features) {
- this.features.clear();
- this.features.addAll(features);
+ private Data getRoomInfoForm() {
+ final List<Data> forms = serviceDiscoveryResult == null ? Collections.emptyList() : serviceDiscoveryResult.forms;
+ return forms.size() == 0 ? new Data() : forms.get(0);
}
public String getAvatar() {
return account.getRoster().getContact(conversation.getJid()).getAvatar();
}
- private void updateFormData(Data form) {
- this.form = form;
- }
-
public boolean hasFeature(String feature) {
- return this.features.contains(feature);
+ return this.serviceDiscoveryResult != null && this.serviceDiscoveryResult.features.contains(feature);
}
public boolean hasVCards() {
@@ -408,17 +414,18 @@ public class MucOptions {
}
public boolean canInvite() {
- Field field = this.form.getFieldByName("muc#roomconfig_allowinvites");
+ Field field = getRoomInfoForm().getFieldByName("muc#roominfo_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");
+ Field field = getRoomInfoForm().getFieldByName("muc#roominfo_changesubject");
return self.getRole().ranks(Role.MODERATOR) || (field != null && "1".equals(field.getValue()));
}
public boolean allowPm() {
- return conversation.getBooleanAttribute(Conversation.ATTRIBUTE_ALLOW_PM, false);
+ Field field = getRoomInfoForm().getFieldByName("muc#roominfo_allowpm");
+ return field != null && "1".equals(field.getValue());
}
public boolean participating() {
@@ -693,15 +700,12 @@ public class MucOptions {
return this.conversation.getAttribute("subject");
}
- private boolean setName(String name) {
- return this.conversation.setAttribute("muc_name", name);
- }
-
public String getName() {
- return this.conversation.getAttribute("muc_name");
+ String mucName = this.conversation.getAttribute("muc_name");
+ return conversation.getJid().getEscapedLocal().equals(mucName) ? null : mucName;
}
- public List<User> getFallbackUsersFromCryptoTargets() {
+ private List<User> getFallbackUsersFromCryptoTargets() {
List<User> users = new ArrayList<>();
for (Jid jid : conversation.getAcceptedCryptoTargets()) {
User user = new User(this, null);
diff --git a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
index 487308c52..14e27cf47 100644
--- a/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
+++ b/src/main/java/de/pixart/messenger/services/XmppConnectionService.java
@@ -2697,23 +2697,8 @@ public class XmppConnectionService extends Service {
sendIqPacket(conversation.getAccount(), request, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- Element query = packet.findChild("query", "http://jabber.org/protocol/disco#info");
- if (packet.getType() == IqPacket.TYPE.RESULT && query != null) {
- String name = null;
- ArrayList<String> features = new ArrayList<>();
- for (Element child : query.getChildren()) {
- if (child.getName().equals("feature")) {
- String var = child.getAttribute("var");
- if (var != null) {
- features.add(var);
- }
- } else if (child.getName().equals("identity")) {
- name = child.getAttribute("name");
- }
- }
- Element form = query.findChild("x", Namespace.DATA);
- Data data = form == null ? null : Data.parse(form);
- if (conversation.getMucOptions().updateConfiguration(features, name, data)) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ if (conversation.getMucOptions().updateConfiguration(new ServiceDiscoveryResult(packet))) {
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": muc configuration changed for " + conversation.getJid().asBareJid());
updateConversation(conversation);
}
diff --git a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
index ed2dfee04..2ff6facf9 100644
--- a/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
+++ b/src/main/java/de/pixart/messenger/ui/ConferenceDetailsActivity.java
@@ -54,6 +54,8 @@ import de.pixart.messenger.utils.UIHelper;
import de.pixart.messenger.utils.XmppUri;
import rocks.xmpp.addr.Jid;
+import static de.pixart.messenger.entities.Bookmark.printableValue;
+
public class ConferenceDetailsActivity extends XmppActivity implements OnConversationUpdate, OnMucRosterUpdate, XmppConnectionService.OnAffiliationChanged, XmppConnectionService.OnRoleChanged, XmppConnectionService.OnConfigurationPushed {
public static final String ACTION_VIEW_MUC = "view_muc";
private static final float INACTIVE_ALPHA = 0.4684f; //compromise between dark and light theme
@@ -598,9 +600,23 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
this.binding.detailsAccount.setVisibility(View.GONE);
}
this.binding.yourPhoto.setImageBitmap(avatarService().get(mConversation.getAccount(), getPixel(48)));
-
- this.binding.mucTitle.setText(mucOptions.getName());
- this.binding.mucSubject.setText(mucOptions.getSubject());
+ String roomName = mucOptions.getName();
+ String subject = mucOptions.getSubject();
+ if (printableValue(roomName)) {
+ this.binding.mucTitle.setText(roomName);
+ this.binding.mucTitle.setVisibility(View.VISIBLE);
+ } else if (!printableValue(subject)) {
+ this.binding.mucTitle.setText(mConversation.getName());
+ this.binding.mucTitle.setVisibility(View.VISIBLE);
+ } else {
+ this.binding.mucTitle.setVisibility(View.GONE);
+ }
+ if (printableValue(subject)) {
+ this.binding.mucSubject.setText(mucOptions.getSubject());
+ this.binding.mucSubject.setVisibility(View.VISIBLE);
+ } else {
+ this.binding.mucSubject.setVisibility(View.GONE);
+ }
this.binding.mucYourNick.setText(mucOptions.getActualNick());
if (mucOptions.online()) {
this.binding.mucMoreDetails.setVisibility(View.VISIBLE);