From 43ad0b2294ab01985102ce94e63e18afbc7d544f Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 17 Mar 2022 14:30:57 -0400 Subject: [PATCH] Fix issue where group read was happening on main thread. --- .../conversation/ConversationViewModel.java | 59 ++++++++++--------- 1 file changed, 32 insertions(+), 27 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 39ce295ed3..27751f4988 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ConversationViewModel.java @@ -337,35 +337,40 @@ public class ConversationViewModel extends ViewModel { } @NonNull Observable> getNameColorsMap() { - return recipientId.map(Recipient::resolved) - .map(Recipient::getGroupId) - .map(groupId -> { - if (groupId.isPresent()) { - List fullMembers = SignalDatabase.groups().getGroupMembers(groupId.get(), GroupDatabase.MemberSet.FULL_MEMBERS_INCLUDING_SELF); - Set cachedMembers = MapUtil.getOrDefault(sessionMemberCache, groupId.get(), new HashSet<>()); - cachedMembers.addAll(fullMembers); - sessionMemberCache.put(groupId.get(), cachedMembers); - return cachedMembers; - } else { - return Collections.emptySet(); - } - }) - .map(members -> { - List sorted = Stream.of(members) - .filter(member -> !Objects.equals(member, Recipient.self())) - .sortBy(Recipient::requireStringId) - .toList(); + return recipientId + .observeOn(Schedulers.io()) + .distinctUntilChanged() + .map(Recipient::resolved) + .map(Recipient::getGroupId) + .map(groupId -> { + if (groupId.isPresent()) { + List fullMembers = SignalDatabase.groups().getGroupMembers(groupId.get(), GroupDatabase.MemberSet.FULL_MEMBERS_INCLUDING_SELF); + Set cachedMembers = MapUtil.getOrDefault(sessionMemberCache, groupId.get(), new HashSet<>()); - List names = ChatColorsPalette.Names.getAll(); - Map colors = new HashMap<>(); - for (int i = 0; i < sorted.size(); i++) { - colors.put(sorted.get(i).getId(), names.get(i % names.size())); - } + cachedMembers.addAll(fullMembers); + sessionMemberCache.put(groupId.get(), cachedMembers); - return colors; - }) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()); + return cachedMembers; + } else { + return Collections.emptySet(); + } + }) + .map(members -> { + List sorted = Stream.of(members) + .filter(member -> !Objects.equals(member, Recipient.self())) + .sortBy(Recipient::requireStringId) + .toList(); + + List names = ChatColorsPalette.Names.getAll(); + Map colors = new HashMap<>(); + + for (int i = 0; i < sorted.size(); i++) { + colors.put(sorted.get(i).getId(), names.get(i % names.size())); + } + + return colors; + }) + .observeOn(AndroidSchedulers.mainThread()); } @NonNull LiveData> getActiveNotificationProfile() {