diff options
author | Christian Schneppe <christian@pix-art.de> | 2018-06-29 22:22:29 +0200 |
---|---|---|
committer | Christian Schneppe <christian@pix-art.de> | 2018-06-29 22:22:29 +0200 |
commit | d269fd47eecc7b4f34634118926a19bc084d07a4 (patch) | |
tree | 60e32019ff038b683dadb421aa6695461876fad6 /src/main/java | |
parent | 298e5757cdfcdeacdd1d219ce314d52089fc2823 (diff) |
use room name (if available and != localpart) as group name
Diffstat (limited to 'src/main/java')
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); |