diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java index 080aff8f32..69cf64c442 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -602,7 +602,7 @@ public class ThreadDatabase extends Database { selectionArgs[i++] = recipientId.serialize(); } - String query = createQuery(selection, 0); + String query = createQuery(selection, DATE + " DESC", 0, 0); cursors.add(db.rawQuery(query, selectionArgs)); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java index be6de4953a..216ced4e92 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java @@ -35,8 +35,12 @@ import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.concurrent.SerialExecutor; import java.util.ArrayList; +import java.util.Collection; import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.LinkedHashSet; import java.util.LinkedList; import java.util.List; @@ -159,33 +163,46 @@ public class SearchRepository { return Collections.emptyList(); } - Set recipientIds = new LinkedHashSet<>(); - Set filteredContacts = new LinkedHashSet<>(); try (Cursor cursor = SignalDatabase.recipients().queryAllContacts(query)) { while (cursor != null && cursor.moveToNext()) { filteredContacts.add(RecipientId.from(CursorUtil.requireString(cursor, RecipientDatabase.ID))); } } - recipientIds.addAll(filteredContacts); + + Set contactIds = new LinkedHashSet<>(filteredContacts); + + if (noteToSelfTitle.toLowerCase().contains(query.toLowerCase())) { + contactIds.add(Recipient.self().getId()); + } + + Set groupsByTitleIds = new LinkedHashSet<>(); GroupDatabase.GroupRecord record; try (GroupDatabase.Reader reader = SignalDatabase.groups().queryGroupsByTitle(query, true, false, false)) { while ((record = reader.getNext()) != null) { - recipientIds.add(record.getRecipientId()); + groupsByTitleIds.add(record.getRecipientId()); } } + Set groupsByMemberIds = new LinkedHashSet<>(); + try (GroupDatabase.Reader reader = SignalDatabase.groups().queryGroupsByMembership(filteredContacts, true, false, false)) { while ((record = reader.getNext()) != null) { - recipientIds.add(record.getRecipientId()); + groupsByMemberIds.add(record.getRecipientId()); } } - if (noteToSelfTitle.toLowerCase().contains(query.toLowerCase())) { - recipientIds.add(Recipient.self().getId()); - } + List output = new ArrayList<>(contactIds.size() + groupsByTitleIds.size() + groupsByMemberIds.size()); + output.addAll(getMatchingThreads(contactIds)); + output.addAll(getMatchingThreads(groupsByTitleIds)); + output.addAll(getMatchingThreads(groupsByMemberIds)); + + return output; + } + + private List getMatchingThreads(@NonNull Collection recipientIds) { try (Cursor cursor = threadDatabase.getFilteredConversationList(new ArrayList<>(recipientIds))) { return readToList(cursor, new ThreadModelBuilder(threadDatabase)); }