persist some muc configurations
This commit is contained in:
parent
3dc749b22b
commit
d5c4a987a1
|
@ -56,6 +56,10 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
private static final String ATTRIBUTE_NEXT_MESSAGE_TIMESTAMP = "next_message_timestamp";
|
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_CRYPTO_TARGETS = "crypto_targets";
|
||||||
private static final String ATTRIBUTE_NEXT_ENCRYPTION = "next_encryption";
|
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";
|
||||||
protected final ArrayList<Message> messages = new ArrayList<>();
|
protected final ArrayList<Message> messages = new ArrayList<>();
|
||||||
public AtomicBoolean messagesLoaded = new AtomicBoolean(true);
|
public AtomicBoolean messagesLoaded = new AtomicBoolean(true);
|
||||||
protected Account account = null;
|
protected Account account = null;
|
||||||
|
@ -725,6 +729,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
return mode == MODE_SINGLE || getBooleanAttribute(ATTRIBUTE_ALWAYS_NOTIFY, Config.ALWAYS_NOTIFY_BY_DEFAULT || isPrivateAndNonAnonymous());
|
return mode == MODE_SINGLE || getBooleanAttribute(ATTRIBUTE_ALWAYS_NOTIFY, Config.ALWAYS_NOTIFY_BY_DEFAULT || isPrivateAndNonAnonymous());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean setAttribute(String key, boolean value) {
|
||||||
|
boolean prev = getBooleanAttribute(key,false);
|
||||||
|
setAttribute(key,Boolean.toString(value));
|
||||||
|
return prev != value;
|
||||||
|
}
|
||||||
|
|
||||||
private boolean setAttribute(String key, long value) {
|
private boolean setAttribute(String key, long value) {
|
||||||
return setAttribute(key, Long.toString(value));
|
return setAttribute(key, Long.toString(value));
|
||||||
}
|
}
|
||||||
|
@ -811,7 +821,7 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean getBooleanAttribute(String key, boolean defaultValue) {
|
public boolean getBooleanAttribute(String key, boolean defaultValue) {
|
||||||
String value = this.getAttribute(key);
|
String value = this.getAttribute(key);
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
return defaultValue;
|
return defaultValue;
|
||||||
|
|
|
@ -58,7 +58,7 @@ public class MucOptions {
|
||||||
|
|
||||||
public void resetChatState() {
|
public void resetChatState() {
|
||||||
synchronized (users) {
|
synchronized (users) {
|
||||||
for(User user : users) {
|
for (User user : users) {
|
||||||
user.chatState = Config.DEFAULT_CHATSTATE;
|
user.chatState = Config.DEFAULT_CHATSTATE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -100,10 +100,10 @@ public class MucOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum Role {
|
public enum Role {
|
||||||
MODERATOR("moderator", R.string.moderator,3),
|
MODERATOR("moderator", R.string.moderator, 3),
|
||||||
VISITOR("visitor", R.string.visitor,1),
|
VISITOR("visitor", R.string.visitor, 1),
|
||||||
PARTICIPANT("participant", R.string.participant,2),
|
PARTICIPANT("participant", R.string.participant, 2),
|
||||||
NONE("none", R.string.no_role,0);
|
NONE("none", R.string.no_role, 0);
|
||||||
|
|
||||||
Role(String string, int resId, int rank) {
|
Role(String string, int resId, int rank) {
|
||||||
this.string = string;
|
this.string = string;
|
||||||
|
@ -256,7 +256,7 @@ public class MucOptions {
|
||||||
public Contact getContact() {
|
public Contact getContact() {
|
||||||
if (fullJid != null) {
|
if (fullJid != null) {
|
||||||
return getAccount().getRoster().getContactFromRoster(realJid);
|
return getAccount().getRoster().getContactFromRoster(realJid);
|
||||||
} else if (realJid != null){
|
} else if (realJid != null) {
|
||||||
return getAccount().getRoster().getContact(realJid);
|
return getAccount().getRoster().getContact(realJid);
|
||||||
} else {
|
} else {
|
||||||
return null;
|
return null;
|
||||||
|
@ -314,7 +314,7 @@ public class MucOptions {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "[fulljid:"+String.valueOf(fullJid)+",realjid:"+String.valueOf(realJid)+",affiliation"+affiliation.toString()+"]";
|
return "[fulljid:" + String.valueOf(fullJid) + ",realjid:" + String.valueOf(realJid) + ",affiliation" + affiliation.toString() + "]";
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean realJidMatchesAccount() {
|
public boolean realJidMatchesAccount() {
|
||||||
|
@ -370,15 +370,27 @@ public class MucOptions {
|
||||||
public MucOptions(Conversation conversation) {
|
public MucOptions(Conversation conversation) {
|
||||||
this.account = conversation.getAccount();
|
this.account = conversation.getAccount();
|
||||||
this.conversation = conversation;
|
this.conversation = conversation;
|
||||||
this.self = new User(this,createJoinJid(getProposedNick()));
|
this.self = new User(this, createJoinJid(getProposedNick()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFeatures(ArrayList<String> features) {
|
public boolean updateConfiguration(List<String> features, 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()));
|
||||||
|
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"));
|
||||||
|
return changed;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void updateFeatures(List<String> features) {
|
||||||
this.features.clear();
|
this.features.clear();
|
||||||
this.features.addAll(features);
|
this.features.addAll(features);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateFormData(Data form) {
|
private void updateFormData(Data form) {
|
||||||
this.form = form;
|
this.form = form;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -397,8 +409,7 @@ public class MucOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean allowPm() {
|
public boolean allowPm() {
|
||||||
Field field = this.form.getFieldByName("muc#roomconfig_allowpm");
|
return conversation.getBooleanAttribute(Conversation.ATTRIBUTE_ALLOW_PM, false);
|
||||||
return field == null || "1".equals(field.getValue());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean participating() {
|
public boolean participating() {
|
||||||
|
@ -408,7 +419,7 @@ public class MucOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean membersOnly() {
|
public boolean membersOnly() {
|
||||||
return hasFeature("muc_membersonly");
|
return conversation.getBooleanAttribute(Conversation.ATTRIBUTE_MEMBERS_ONLY, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean mamSupport() {
|
public boolean mamSupport() {
|
||||||
|
@ -420,19 +431,15 @@ public class MucOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean nonanonymous() {
|
public boolean nonanonymous() {
|
||||||
return hasFeature("muc_nonanonymous");
|
return conversation.getBooleanAttribute(Conversation.ATTRIBUTE_NON_ANONYMOUS, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isPrivateAndNonAnonymous() {
|
public boolean isPrivateAndNonAnonymous() {
|
||||||
return membersOnly() && nonanonymous();
|
return membersOnly() && nonanonymous();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean persistent() {
|
|
||||||
return hasFeature("muc_persistent");
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean moderated() {
|
public boolean moderated() {
|
||||||
return hasFeature("muc_moderated");
|
return conversation.getBooleanAttribute(Conversation.ATTRIBUTE_MODERATED, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public User deleteUser(Jid jid) {
|
public User deleteUser(Jid jid) {
|
||||||
|
@ -497,7 +504,7 @@ public class MucOptions {
|
||||||
boolean fullJidIsSelf = isOnline && user.getFullJid() != null && user.getFullJid().equals(self.getFullJid());
|
boolean fullJidIsSelf = isOnline && user.getFullJid() != null && user.getFullJid().equals(self.getFullJid());
|
||||||
if ((!membersOnly() || user.getAffiliation().ranks(Affiliation.MEMBER))
|
if ((!membersOnly() || user.getAffiliation().ranks(Affiliation.MEMBER))
|
||||||
&& user.getAffiliation().outranks(Affiliation.OUTCAST)
|
&& user.getAffiliation().outranks(Affiliation.OUTCAST)
|
||||||
&& !fullJidIsSelf){
|
&& !fullJidIsSelf) {
|
||||||
this.users.add(user);
|
this.users.add(user);
|
||||||
return !realJidFound && user.realJid != null;
|
return !realJidFound && user.realJid != null;
|
||||||
}
|
}
|
||||||
|
@ -537,7 +544,7 @@ public class MucOptions {
|
||||||
if (readByMarker.getRealJid() != null) {
|
if (readByMarker.getRealJid() != null) {
|
||||||
User user = findUserByRealJid(readByMarker.getRealJid().asBareJid());
|
User user = findUserByRealJid(readByMarker.getRealJid().asBareJid());
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
user = new User(this,readByMarker.getFullJid());
|
user = new User(this, readByMarker.getFullJid());
|
||||||
user.setRealJid(readByMarker.getRealJid());
|
user.setRealJid(readByMarker.getRealJid());
|
||||||
}
|
}
|
||||||
return user;
|
return user;
|
||||||
|
@ -590,7 +597,7 @@ public class MucOptions {
|
||||||
public ArrayList<User> getUsersWithChatState(ChatState state, int max) {
|
public ArrayList<User> getUsersWithChatState(ChatState state, int max) {
|
||||||
synchronized (users) {
|
synchronized (users) {
|
||||||
ArrayList<User> list = new ArrayList<>();
|
ArrayList<User> list = new ArrayList<>();
|
||||||
for(User user : users) {
|
for (User user : users) {
|
||||||
if (user.chatState == state) {
|
if (user.chatState == state) {
|
||||||
list.add(user);
|
list.add(user);
|
||||||
if (list.size() >= max) {
|
if (list.size() >= max) {
|
||||||
|
@ -607,7 +614,7 @@ public class MucOptions {
|
||||||
HashSet<Jid> jids = new HashSet<>();
|
HashSet<Jid> jids = new HashSet<>();
|
||||||
jids.add(account.getJid().asBareJid());
|
jids.add(account.getJid().asBareJid());
|
||||||
synchronized (users) {
|
synchronized (users) {
|
||||||
for(User user : users) {
|
for (User user : users) {
|
||||||
if (user.getRealJid() == null || jids.add(user.getRealJid())) {
|
if (user.getRealJid() == null || jids.add(user.getRealJid())) {
|
||||||
subset.add(user);
|
subset.add(user);
|
||||||
}
|
}
|
||||||
|
@ -670,7 +677,7 @@ public class MucOptions {
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean setSubject(String subject) {
|
public boolean setSubject(String subject) {
|
||||||
return this.conversation.setAttribute("subject",subject);
|
return this.conversation.setAttribute("subject", subject);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getSubject() {
|
public String getSubject() {
|
||||||
|
@ -679,8 +686,8 @@ public class MucOptions {
|
||||||
|
|
||||||
public List<User> getFallbackUsersFromCryptoTargets() {
|
public List<User> getFallbackUsersFromCryptoTargets() {
|
||||||
List<User> users = new ArrayList<>();
|
List<User> users = new ArrayList<>();
|
||||||
for(Jid jid : conversation.getAcceptedCryptoTargets()) {
|
for (Jid jid : conversation.getAcceptedCryptoTargets()) {
|
||||||
User user = new User(this,null);
|
User user = new User(this, null);
|
||||||
user.setRealJid(jid);
|
user.setRealJid(jid);
|
||||||
users.add(user);
|
users.add(user);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2510,14 +2510,14 @@ public class XmppConnectionService extends Service {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Element form = query.findChild("x", Namespace.DATA);
|
Element form = query.findChild("x", Namespace.DATA);
|
||||||
if (form != null) {
|
Data data = form == null ? null : Data.parse(form);
|
||||||
conversation.getMucOptions().updateFormData(Data.parse(form));
|
if (conversation.getMucOptions().updateConfiguration(features, data)) {
|
||||||
|
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": muc configuration changed for " + conversation.getJid().asBareJid());
|
||||||
|
updateConversation(conversation);
|
||||||
}
|
}
|
||||||
conversation.getMucOptions().updateFeatures(features);
|
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
callback.onConferenceConfigurationFetched(conversation);
|
callback.onConferenceConfigurationFetched(conversation);
|
||||||
}
|
}
|
||||||
Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": fetched muc configuration for " + conversation.getJid().asBareJid() + " - " + features.toString());
|
|
||||||
updateConversationUi();
|
updateConversationUi();
|
||||||
} else if (packet.getType() == IqPacket.TYPE.ERROR) {
|
} else if (packet.getType() == IqPacket.TYPE.ERROR) {
|
||||||
if (callback != null) {
|
if (callback != null) {
|
||||||
|
|
Loading…
Reference in a new issue