use room name (if available and != localpart) as group name
This commit is contained in:
parent
d59cc3b738
commit
159fedb358
|
@ -55,7 +55,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";
|
||||
|
@ -478,10 +477,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;
|
||||
|
@ -739,10 +741,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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,9 +1,10 @@
|
|||
package eu.siacs.conversations.entities;
|
||||
|
||||
import android.annotation.SuppressLint;
|
||||
import android.util.Log;
|
||||
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;
|
||||
|
@ -323,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())) {
|
||||
|
@ -359,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;
|
||||
|
@ -374,34 +374,40 @@ 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() {
|
||||
|
@ -409,17 +415,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() {
|
||||
|
@ -694,15 +701,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);
|
||||
|
|
|
@ -2447,23 +2447,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);
|
||||
}
|
||||
|
|
|
@ -50,6 +50,8 @@ import eu.siacs.conversations.utils.UIHelper;
|
|||
import eu.siacs.conversations.utils.XmppUri;
|
||||
import rocks.xmpp.addr.Jid;
|
||||
|
||||
import static eu.siacs.conversations.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";
|
||||
|
||||
|
@ -533,8 +535,23 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers
|
|||
this.binding.detailsAccount.setText(getString(R.string.using_account, account));
|
||||
this.binding.jid.setText(mConversation.getJid().asBareJid().toEscapedString());
|
||||
this.binding.yourPhoto.setImageBitmap(avatarService().get(mConversation, getPixel(72)));
|
||||
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);
|
||||
|
|
Loading…
Reference in a new issue