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

This commit is contained in:
Daniel Gultsch 2016-11-29 13:43:52 +01:00
parent 33e6d8a1ce
commit 9e7a54849d
2 changed files with 26 additions and 8 deletions

View file

@ -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() {

View file

@ -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);