save muc subject to disk and use crypto targets for offline name generation

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/Conversation.java  | 12 
src/main/java/eu/siacs/conversations/entities/MucOptions.java    | 35 +
src/main/java/eu/siacs/conversations/parser/MessageParser.java   |  4 
src/main/java/eu/siacs/conversations/services/AvatarService.java |  2 
4 files changed, 37 insertions(+), 16 deletions(-)

Detailed changes

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

@@ -495,12 +495,12 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl
 
 	public String getName() {
 		if (getMode() == MODE_MULTI) {
-			if (getMucOptions().getSubject() != null) {
-				return getMucOptions().getSubject();
-			} else if (bookmark != null
-					&& bookmark.getBookmarkName() != null
-					&& !bookmark.getBookmarkName().trim().isEmpty()) {
-				return bookmark.getBookmarkName().trim();
+			final String subject = getMucOptions().getSubject();
+			final String bookmarkName = bookmark != null ? bookmark.getBookmarkName() : null;
+			if (subject != null && !subject.trim().isEmpty()) {
+				return subject;
+			} else if (bookmarkName != null && !bookmarkName.trim().isEmpty()) {
+				return bookmarkName;
 			} else {
 				String generatedName = getMucOptions().createNameFromParticipants();
 				if (generatedName != null) {

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

@@ -3,7 +3,6 @@ package eu.siacs.conversations.entities;
 import android.annotation.SuppressLint;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -362,12 +361,11 @@ public class MucOptions {
 	private final Set<User> users = new HashSet<>();
 	private final List<String> features = new ArrayList<>();
 	private Data form = new Data();
-	private Conversation conversation;
+	private final Conversation conversation;
 	private boolean isOnline = false;
 	private Error error = Error.NONE;
 	public OnRenameListener onRenameListener = null;
 	private User self;
-	private String subject = null;
 	private String password = null;
 
 	public MucOptions(Conversation conversation) {
@@ -661,18 +659,39 @@ public class MucOptions {
 		return self;
 	}
 
-	public void setSubject(String content) {
-		this.subject = content;
+	public boolean setSubject(String subject) {
+		return this.conversation.setAttribute("subject",subject);
 	}
 
 	public String getSubject() {
-		return this.subject;
+		return this.conversation.getAttribute("subject");
+	}
+
+	public List<User> getFallbackUsersFromCryptoTargets() {
+		List<User> users = new ArrayList<>();
+		for(Jid jid : conversation.getAcceptedCryptoTargets()) {
+			User user = new User(this,null);
+			user.setRealJid(jid);
+			users.add(user);
+		}
+		return users;
+	}
+
+	public List<User> getUsersRelevantForNameAndAvatar() {
+		final List<User> users;
+		if (isOnline) {
+			users = getUsers(5);
+		} else {
+			users = getFallbackUsersFromCryptoTargets();
+		}
+		return users;
 	}
 
 	public String createNameFromParticipants() {
-		if (getUserCount() >= 2) {
+		List<User> users = getUsersRelevantForNameAndAvatar();
+		if (users.size() >= 2) {
 			StringBuilder builder = new StringBuilder();
-			for (User user : getUsers(5)) {
+			for (User user : users) {
 				if (builder.length() != 0) {
 					builder.append(", ");
 				}

src/main/java/eu/siacs/conversations/parser/MessageParser.java 🔗

@@ -674,7 +674,9 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
 					if (conversation != null && conversation.getMode() == Conversation.MODE_MULTI) {
 						conversation.setHasMessagesLeftOnServer(conversation.countMessages() > 0);
 						String subject = packet.findChildContent("subject");
-						conversation.getMucOptions().setSubject(subject);
+						if (conversation.getMucOptions().setSubject(subject)) {
+							mXmppConnectionService.updateConversation(conversation);
+						}
 						final Bookmark bookmark = conversation.getBookmark();
 						if (bookmark != null && bookmark.getBookmarkName() == null) {
 							if (bookmark.setBookmarkName(subject)) {

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

@@ -213,7 +213,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
 		if (bitmap != null || cachedOnly) {
 			return bitmap;
 		}
-		final List<MucOptions.User> users = mucOptions.getUsers(5);
+		final List<MucOptions.User> users = mucOptions.getUsersRelevantForNameAndAvatar();
 		if (users.size() == 0) {
 			Conversation c = mucOptions.getConversation();
 			bitmap = getImpl(c.getName(),c.getJid().toBareJid().toString(),size);