From 4040c4240a62ae07dc15f2ab4a922c26a7500bd5 Mon Sep 17 00:00:00 2001 From: Alan Evans Date: Thu, 3 Sep 2020 12:42:56 -0300 Subject: [PATCH] Lighter weight mentions membership query. --- .../ui/mentions/MentionsPickerRepository.java | 29 +++++++++------ .../ui/mentions/MentionsPickerViewModel.java | 35 +++++++++---------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepository.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepository.java index 016537925a..124f4dfaa7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerRepository.java @@ -1,7 +1,6 @@ package org.thoughtcrime.securesms.conversation.ui.mentions; import android.content.Context; -import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -10,8 +9,8 @@ import androidx.annotation.WorkerThread; import com.annimon.stream.Stream; import org.thoughtcrime.securesms.database.DatabaseFactory; +import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.RecipientDatabase; -import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -21,9 +20,22 @@ import java.util.List; final class MentionsPickerRepository { private final RecipientDatabase recipientDatabase; + private final GroupDatabase groupDatabase; MentionsPickerRepository(@NonNull Context context) { recipientDatabase = DatabaseFactory.getRecipientDatabase(context); + groupDatabase = DatabaseFactory.getGroupDatabase(context); + } + + @WorkerThread + @NonNull List getMembers(@Nullable Recipient recipient) { + if (recipient == null || !recipient.isPushV2Group()) { + return Collections.emptyList(); + } + + return Stream.of(groupDatabase.getGroupMembers(recipient.requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF)) + .map(Recipient::getId) + .toList(); } @WorkerThread @@ -32,19 +44,14 @@ final class MentionsPickerRepository { return Collections.emptyList(); } - List recipientIds = Stream.of(mentionQuery.members) - .filterNot(m -> m.getMember().isLocalNumber()) - .map(m -> m.getMember().getId()) - .toList(); - - return recipientDatabase.queryRecipientsForMentions(mentionQuery.query, recipientIds); + return recipientDatabase.queryRecipientsForMentions(mentionQuery.query, mentionQuery.members); } static class MentionQuery { - @Nullable private final String query; - @NonNull private final List members; + @Nullable private final String query; + @NonNull private final List members; - MentionQuery(@Nullable String query, @NonNull List members) { + MentionQuery(@Nullable String query, @NonNull List members) { this.query = query; this.members = members; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java index a2a0cde48f..34d60392fc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/ui/mentions/MentionsPickerViewModel.java @@ -12,12 +12,11 @@ import com.annimon.stream.Stream; import org.thoughtcrime.securesms.conversation.ui.mentions.MentionsPickerRepository.MentionQuery; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; -import org.thoughtcrime.securesms.groups.GroupId; -import org.thoughtcrime.securesms.groups.LiveGroup; -import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry.FullMember; import org.thoughtcrime.securesms.megaphone.MegaphoneRepository; import org.thoughtcrime.securesms.megaphone.Megaphones; +import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.util.MappingModel; import org.thoughtcrime.securesms.util.SingleLiveEvent; import org.thoughtcrime.securesms.util.livedata.LiveDataUtil; @@ -29,24 +28,26 @@ public class MentionsPickerViewModel extends ViewModel { private final SingleLiveEvent selectedRecipient; private final LiveData>> mentionList; - private final MutableLiveData group; + private final MutableLiveData liveRecipient; private final MutableLiveData liveQuery; private final MutableLiveData isShowing; private final MegaphoneRepository megaphoneRepository; - MentionsPickerViewModel(@NonNull MentionsPickerRepository mentionsPickerRepository, @NonNull MegaphoneRepository megaphoneRepository) { + MentionsPickerViewModel(@NonNull MentionsPickerRepository mentionsPickerRepository, + @NonNull MegaphoneRepository megaphoneRepository) + { this.megaphoneRepository = megaphoneRepository; + this.liveRecipient = new MutableLiveData<>(); + this.liveQuery = new MutableLiveData<>(); + this.selectedRecipient = new SingleLiveEvent<>(); + this.isShowing = new MutableLiveData<>(false); - group = new MutableLiveData<>(); - liveQuery = new MutableLiveData<>(Query.NONE); - selectedRecipient = new SingleLiveEvent<>(); - isShowing = new MutableLiveData<>(false); + LiveData recipient = Transformations.switchMap(liveRecipient, LiveRecipient::getLiveData); + LiveData> fullMembers = Transformations.distinctUntilChanged(LiveDataUtil.mapAsync(recipient, mentionsPickerRepository::getMembers)); + LiveData query = Transformations.distinctUntilChanged(liveQuery); + LiveData mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m)); - LiveData> fullMembers = Transformations.distinctUntilChanged(Transformations.switchMap(group, LiveGroup::getFullMembers)); - LiveData query = Transformations.distinctUntilChanged(liveQuery); - LiveData mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m)); - - mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).>map(MentionViewState::new).toList()); + this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).>map(MentionViewState::new).toList()); } @NonNull LiveData>> getMentionList() { @@ -78,11 +79,7 @@ public class MentionsPickerViewModel extends ViewModel { } public void onRecipientChange(@NonNull Recipient recipient) { - GroupId groupId = recipient.getGroupId().orNull(); - if (groupId != null) { - LiveGroup liveGroup = new LiveGroup(groupId); - group.setValue(liveGroup); - } + this.liveRecipient.setValue(recipient.live()); } /**