Remember avatar and nick by occupant id

Stephen Paul Weber created

Only if they're different from what we would otherwise use anyway.

Change summary

src/main/java/eu/siacs/conversations/entities/MucOptions.java    | 20 ++
src/main/java/eu/siacs/conversations/parser/PresenceParser.java  |  2 
src/main/java/eu/siacs/conversations/services/AvatarService.java |  8 
3 files changed, 27 insertions(+), 3 deletions(-)

Detailed changes

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

@@ -862,6 +862,23 @@ public class MucOptions {
             this.occupantId = occupantId;
             this.nick = nick;
             this.hats = hats;
+
+            if (occupantId != null && options != null) {
+                final var sha1sum = options.getConversation().getAttribute("occupantAvatar/" + occupantId);
+                if (sha1sum != null) {
+                    avatar = new Avatar();
+                    avatar.sha1sum = sha1sum;
+                    avatar.owner = fullJid;
+                }
+
+                if (nick == null) {
+                    this.nick = options.getConversation().getAttribute("occupantNick/" + occupantId);
+                } else if (!getNick().equals(getName())) {
+                    options.getConversation().setAttribute("occupantNick/" + occupantId, nick);
+                } else {
+                    options.getConversation().setAttribute("occupantNick/" + occupantId, (String) null);
+                }
+            }
         }
 
         public String getName() {
@@ -933,6 +950,9 @@ public class MucOptions {
         }
 
         public boolean setAvatar(Avatar avatar) {
+            if (occupantId != null) {
+                options.getConversation().setAttribute("occupantAvatar/" + occupantId, getContact() == null ? avatar.sha1sum : null);
+            }
             if (this.avatar != null && this.avatar.equals(avatar)) {
                 return false;
             } else {

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

@@ -211,7 +211,7 @@ public class PresenceParser extends AbstractParser implements OnPresencePacketRe
 						mucOptions.updateUser(parseItem(conversation, item, from, occupantId, nick == null ? null : nick.getContent(), hats));
                     }
                     MucOptions.User user = mucOptions.deleteUser(from);
-                    if (user != null) {
+                    if (user != null && occupantId == null) {
                         mXmppConnectionService.getAvatarService().clear(user);
                     }
                 }

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

@@ -270,7 +270,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
 				'\0' +
 				user.getAccount().getJid().asBareJid() +
 				'\0' +
-				emptyOnNull(user.getFullJid()) +
+				user.getMuc() +
+				'\0' +
+				user.getOccupantId() == null ? emptyOnNull(user.getFullJid()) : user.getOccupantId() +
 				'\0' +
 				emptyOnNull(user.getRealJid()) +
 				'\0' +
@@ -493,7 +495,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
 				final MucOptions mucOptions = ((Conversation) conversation).getMucOptions();
 				MucOptions.User user;
 				if (trueCounterpart != null) {
-					user = mucOptions.findOrCreateUserByRealJid(trueCounterpart, message.getCounterpart(), null);
+					user = mucOptions.findOrCreateUserByRealJid(trueCounterpart, message.getCounterpart(), message.getOccupantId());
+				} else if(message.getOccupantId() != null) {
+					user = mucOptions.findUserByOccupantId(message.getOccupantId(), message.getCounterpart());
 				} else {
 					user = mucOptions.findUserByFullJid(message.getCounterpart());
 				}