Lighter weight mentions membership query.
parent
1ee747f3ef
commit
4040c4240a
|
@ -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<RecipientId> 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<RecipientId> 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<GroupMemberEntry.FullMember> members;
|
||||
@Nullable private final String query;
|
||||
@NonNull private final List<RecipientId> members;
|
||||
|
||||
MentionQuery(@Nullable String query, @NonNull List<GroupMemberEntry.FullMember> members) {
|
||||
MentionQuery(@Nullable String query, @NonNull List<RecipientId> members) {
|
||||
this.query = query;
|
||||
this.members = members;
|
||||
}
|
||||
|
|
|
@ -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<Recipient> selectedRecipient;
|
||||
private final LiveData<List<MappingModel<?>>> mentionList;
|
||||
private final MutableLiveData<LiveGroup> group;
|
||||
private final MutableLiveData<LiveRecipient> liveRecipient;
|
||||
private final MutableLiveData<Query> liveQuery;
|
||||
private final MutableLiveData<Boolean> 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> recipient = Transformations.switchMap(liveRecipient, LiveRecipient::getLiveData);
|
||||
LiveData<List<RecipientId>> fullMembers = Transformations.distinctUntilChanged(LiveDataUtil.mapAsync(recipient, mentionsPickerRepository::getMembers));
|
||||
LiveData<Query> query = Transformations.distinctUntilChanged(liveQuery);
|
||||
LiveData<MentionQuery> mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m));
|
||||
|
||||
LiveData<List<FullMember>> fullMembers = Transformations.distinctUntilChanged(Transformations.switchMap(group, LiveGroup::getFullMembers));
|
||||
LiveData<Query> query = Transformations.distinctUntilChanged(liveQuery);
|
||||
LiveData<MentionQuery> mentionQuery = LiveDataUtil.combineLatest(query, fullMembers, (q, m) -> new MentionQuery(q.query, m));
|
||||
|
||||
mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).<MappingModel<?>>map(MentionViewState::new).toList());
|
||||
this.mentionList = LiveDataUtil.mapAsync(mentionQuery, q -> Stream.of(mentionsPickerRepository.search(q)).<MappingModel<?>>map(MentionViewState::new).toList());
|
||||
}
|
||||
|
||||
@NonNull LiveData<List<MappingModel<?>>> 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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue