better handle the case when same user is joined with multiple nicks in the same room

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/entities/MucOptions.java    | 32 +
src/main/java/eu/siacs/conversations/services/AvatarService.java |  2 
2 files changed, 26 insertions(+), 8 deletions(-)

Detailed changes

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.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -395,10 +394,18 @@ public class MucOptions {
 		if (user != null) {
 			synchronized (users) {
 				users.remove(user);
-				if (membersOnly() &&
-						nonanonymous() &&
-						user.affiliation.ranks(Affiliation.MEMBER) &&
-						user.realJid != null) {
+				boolean realJidInMuc = false;
+				for (User u : users) {
+					if (user.realJid != null && user.realJid.equals(u.realJid)) {
+						realJidInMuc = true;
+						break;
+					}
+				}
+				if (membersOnly()
+						&& nonanonymous()
+						&& user.affiliation.ranks(Affiliation.MEMBER)
+						&& user.realJid != null
+						&& !realJidInMuc) {
 					user.role = Role.NONE;
 					user.avatar = null;
 					user.fullJid = null;
@@ -508,8 +515,19 @@ public class MucOptions {
 	}
 
 	public List<User> getUsers(int max) {
-		ArrayList<User> users = getUsers();
-		return users.subList(0, Math.min(max, users.size()));
+		ArrayList<User> subset = new ArrayList<>();
+		HashSet<Jid> jids = new HashSet<>();
+		synchronized (users) {
+			for(User user : users) {
+				if (user.getRealJid() == null || jids.add(user.getRealJid())) {
+					subset.add(user);
+				}
+				if (subset.size() >= max) {
+					break;
+				}
+			}
+		}
+		return subset;
 	}
 
 	public int getUserCount() {

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

@@ -172,7 +172,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
 		if (bitmap != null || cachedOnly) {
 			return bitmap;
 		}
-		final List<MucOptions.User> users = mucOptions.getUsers();
+		final List<MucOptions.User> users = mucOptions.getUsers(5);
 		int count = users.size();
 		bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888);
 		Canvas canvas = new Canvas(bitmap);