From 1c40f2d16775b28c91f2d728b50eee59dc3c7b10 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Thu, 27 May 2021 15:03:31 -0300 Subject: [PATCH] Fix issue with disappearing colors upon group removal. --- .../conversation/ConversationViewModel.java | 47 +++++++++++++------ 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java index cbf1c2137..f3e2558ea 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java @@ -15,6 +15,7 @@ import com.annimon.stream.Stream; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; +import org.signal.core.util.MapUtil; import org.signal.core.util.logging.Log; import org.signal.paging.PagedData; import org.signal.paging.PagingConfig; @@ -42,9 +43,12 @@ import org.whispersystems.libsignal.util.guava.Optional; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Set; import java.util.UUID; public class ConversationViewModel extends ViewModel { @@ -68,6 +72,8 @@ public class ConversationViewModel extends ViewModel { private final SingleLiveEvent events; private final LiveData chatColors; + private final Map> sessionMemberCache = new HashMap<>(); + private ConversationIntents.Args args; private int jumpToPosition; @@ -207,35 +213,48 @@ public class ConversationViewModel extends ViewModel { } @NonNull LiveData> getNameColorsMap() { - LiveData recipient = Transformations.switchMap(recipientId, r -> Recipient.live(r).getLiveData()); - LiveData> group = Transformations.map(recipient, Recipient::getGroupId); - LiveData> groupMembers = Transformations.switchMap(group, g -> { + LiveData recipient = Transformations.switchMap(recipientId, r -> Recipient.live(r).getLiveData()); + LiveData> group = Transformations.map(recipient, Recipient::getGroupId); + LiveData> groupMembers = Transformations.switchMap(group, g -> { //noinspection CodeBlock2Expr - return g.transform(id -> new LiveGroup(id).getFullMembers()) - .or(() -> new DefaultValueLiveData<>(Collections.emptyList())); + return g.transform(this::getSessionGroupRecipients) + .or(() -> new DefaultValueLiveData<>(Collections.emptySet())); }); return Transformations.map(groupMembers, members -> { - List sorted = Stream.of(members) - .filter(member -> !Objects.equals(member.getMember(), Recipient.self())) - .sortBy(this::getMemberIdentifier) - .toList(); + List sorted = Stream.of(members) + .filter(member -> !Objects.equals(member, Recipient.self())) + .sortBy(this::getMemberIdentifier) + .toList(); List names = ChatColorsPalette.Names.getAll(); Map colors = new HashMap<>(); for (int i = 0; i < sorted.size(); i++) { - colors.put(sorted.get(i).getMember().getId(), names.get(i % names.size())); + colors.put(sorted.get(i).getId(), names.get(i % names.size())); } return colors; }); } - private @NonNull String getMemberIdentifier(@NonNull GroupMemberEntry.FullMember fullMember) { - return fullMember.getMember() - .getUuid() + private @NonNull LiveData> getSessionGroupRecipients(@NonNull GroupId groupId) { + LiveData> fullMembers = Transformations.map(new LiveGroup(groupId).getFullMembers(), + members -> Stream.of(members) + .map(GroupMemberEntry.FullMember::getMember) + .toList()); + + return Transformations.map(fullMembers, currentMembership -> { + Set cachedMembers = MapUtil.getOrDefault(sessionMemberCache, groupId, new HashSet<>()); + cachedMembers.addAll(currentMembership); + sessionMemberCache.put(groupId, cachedMembers); + return cachedMembers; + }); + } + + private @NonNull String getMemberIdentifier(@NonNull Recipient fullMember) { + return fullMember.getUuid() .transform(UUID::toString) - .or(fullMember.getMember().getE164()) + .or(fullMember.getE164()) .or(""); }