diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt index 8c566c060b..401901607a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationActivityV2.kt @@ -2066,8 +2066,11 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe } fun onSearchQueryUpdated(query: String) { + Log.d("[ACL]", "1") searchViewModel.onQueryUpdated(query, viewModel.threadId) + Log.d("[ACL]", "2") binding?.searchBottomBar?.showLoading() + Log.d("[ACL]", "3") adapter.onSearchQueryUpdated(query) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt index 6013af5ba4..1ac7419d9a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapter.kt @@ -22,6 +22,7 @@ import kotlinx.coroutines.launch import network.loki.messenger.R import network.loki.messenger.databinding.ViewVisibleMessageBinding import org.session.libsession.messaging.contacts.Contact +import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.conversation.v2.messages.ControlMessageView import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageView import org.thoughtcrime.securesms.conversation.v2.messages.VisibleMessageViewDelegate @@ -268,7 +269,9 @@ class ConversationAdapter( } fun onSearchQueryUpdated(query: String?) { + Log.d("[ACL]", "4") this.searchQuery = query + Log.d("[ACL]", "5") notifyDataSetChanged() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt index d2459a952d..744dc579a6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/menus/ConversationMenuHelper.kt @@ -127,8 +127,7 @@ object ConversationMenuHelper { override fun onQueryTextChange(query: String): Boolean { // *** Crashes when searching for non-alphanumeric first char *** - Log.d("[ACL]", "THIS ONE - CMH search query changed to: $query") - + Log.d("[ACL]", "[ConversationMenuHelper] Query text changed to: $query") context.onSearchQueryUpdated(query) return true diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java index eac6a5fbc3..92b0bed9a0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java @@ -10,6 +10,7 @@ import com.annimon.stream.Stream; import net.zetetic.database.sqlcipher.SQLiteDatabase; import org.session.libsession.utilities.Util; +import org.session.libsignal.utilities.Log; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import java.util.List; @@ -118,6 +119,8 @@ public class SearchDatabase extends Database { int queryLimit = Math.min(query.length()*50,500); + Log.d("[ACL]", "[SearchDatabase] Query is:\n" + MESSAGES_QUERY); + Cursor cursor = db.rawQuery(MESSAGES_QUERY, new String[] { prefixQuery, prefixQuery, String.valueOf(queryLimit) }); setNotifyConverationListListeners(cursor); return cursor; 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 ddfe85515c..737322d2cb 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/search/SearchRepository.java @@ -95,6 +95,16 @@ public class SearchRepository { Stopwatch timer = new Stopwatch("FtsQuery"); String cleanQuery = sanitizeQuery(query); + + // If the search is for a single character and it was stripped by `sanitizeQuery` then abort + // the search for an empty string to avoid SQLite error. + if (cleanQuery.length() == 0) + { + Log.d(TAG, "Aborting empty search query."); + timer.stop(TAG); + return; + } + timer.split("clean"); Pair, List> contacts = queryContacts(cleanQuery); @@ -114,15 +124,30 @@ public class SearchRepository { public void query(@NonNull String query, long threadId, @NonNull Callback> callback) { if (TextUtils.isEmpty(query)) { + Log.d("[ACL]", "Recognised empty query!"); + callback.onResult(CursorList.emptyList()); return; } + else { + Log.d("[ACL]", "Non-empty query is: " + query); + } executor.execute(() -> { - long startTime = System.currentTimeMillis(); - CursorList messages = queryMessages(sanitizeQuery(query), threadId); - Log.d(TAG, "[ConversationQuery] " + (System.currentTimeMillis() - startTime) + " ms"); + Log.d("[ACL]", "Hit query.execute!"); + + // If the search is for a single character and it was stripped by `sanitizeQuery` then abort + // the search for an empty string to avoid SQLite error. + String cleanQuery = sanitizeQuery(query); + Log.d("[ACL]", "clean query is: \"" + cleanQuery + "\""); + if (cleanQuery.isEmpty() || cleanQuery.equalsIgnoreCase(" ")) + { + Log.d("[ACL]", "Aborting empty search query."); + return; + } + + CursorList messages = queryMessages(cleanQuery, threadId); callback.onResult(messages); }); } @@ -186,12 +211,19 @@ public class SearchRepository { } private CursorList queryMessages(@NonNull String query) { + + Log.d("[ACL]", "[SearchRepository] Query is:\n" + query); + + Cursor messages = searchDatabase.queryMessages(query); return messages != null ? new CursorList<>(messages, new MessageModelBuilder(context)) : CursorList.emptyList(); } private CursorList queryMessages(@NonNull String query, long threadId) { + + Log.d("[ACL]", "[SearchRepository] 6 - query is: " + query); + Cursor messages = searchDatabase.queryMessages(query, threadId); return messages != null ? new CursorList<>(messages, new MessageModelBuilder(context)) : CursorList.emptyList(); @@ -205,6 +237,9 @@ public class SearchRepository { * However, if we replace the apostrophe with a space, then the query will find the match. */ private String sanitizeQuery(@NonNull String query) { + + Log.d("[ACL]", "[SearchRepository] Hit sanitizeQuery - initial query is: " + query); + StringBuilder out = new StringBuilder(); for (int i = 0; i < query.length(); i++) { @@ -216,7 +251,10 @@ public class SearchRepository { } } - return out.toString(); + Log.d("[ACL]", "[SearchRepository] Hit sanitizeQuery - sanitized query is: " + out.toString()); + + // Querying for an empty string causes a crash so we'll que + if (out.toString().length() > 0) { return out.toString(); } else { return " "; } } private static class ContactModelBuilder implements CursorList.ModelBuilder {