From 12a8d4e10bdb283e7dfbd2cec2a2d4483967c700 Mon Sep 17 00:00:00 2001 From: Alex Hart Date: Mon, 24 Aug 2020 14:48:23 -0300 Subject: [PATCH] Fix crash on multi-archive. --- .../ConversationListArchiveFragment.java | 12 ++++++--- .../ConversationListFragment.java | 16 +++++------- .../securesms/database/ThreadDatabase.java | 25 ++++++++++++++++++- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java index 8930cbcb27..6746c219a3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListArchiveFragment.java @@ -39,6 +39,8 @@ import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionB import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask; +import java.util.Set; + public class ConversationListArchiveFragment extends ConversationListFragment implements ActionMode.Callback { @@ -107,13 +109,15 @@ public class ConversationListArchiveFragment extends ConversationListFragment im } @Override - protected void archiveThread(long threadId) { - DatabaseFactory.getThreadDatabase(getActivity()).unarchiveConversation(threadId); + @WorkerThread + protected void archiveThreads(Set threadIds) { + DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, true); } + @Override @WorkerThread - protected void reverseArchiveThread(long threadId) { - DatabaseFactory.getThreadDatabase(getActivity()).archiveConversation(threadId); + protected void reverseArchiveThreads(Set threadIds) { + DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, false); } @SuppressLint("StaticFieldLeak") diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java index fe775319b4..0cc7bdf2f5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/conversationlist/ConversationListFragment.java @@ -678,16 +678,12 @@ public class ConversationListFragment extends MainFragment implements ActionMode @Override protected void executeAction(@Nullable Void parameter) { - for (long threadId : selectedConversations) { - archiveThread(threadId); - } + archiveThreads(selectedConversations); } @Override protected void reverseAction(@Nullable Void parameter) { - for (long threadId : selectedConversations) { - reverseArchiveThread(threadId); - } + reverseArchiveThreads(selectedConversations); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } @@ -975,13 +971,13 @@ public class ConversationListFragment extends MainFragment implements ActionMode } @WorkerThread - protected void archiveThread(long threadId) { - DatabaseFactory.getThreadDatabase(getActivity()).archiveConversation(threadId); + protected void archiveThreads(Set threadIds) { + DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, true); } @WorkerThread - protected void reverseArchiveThread(long threadId) { - DatabaseFactory.getThreadDatabase(getActivity()).unarchiveConversation(threadId); + protected void reverseArchiveThreads(Set threadIds) { + DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, false); } @SuppressLint("StaticFieldLeak") 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 1ff20dc6f6..640e93d233 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -544,7 +544,7 @@ public class ThreadDatabase extends Database { String query = RECIPIENT_ID + " = ?"; for (Map.Entry entry : status.entrySet()) { - ContentValues values = new ContentValues(1); + ContentValues values = new ContentValues(2); if (entry.getValue()) { values.put(PINNED, "0"); @@ -561,6 +561,29 @@ public class ThreadDatabase extends Database { } } + public void setArchived(Set threadIds, boolean archive) { + SQLiteDatabase db = databaseHelper.getReadableDatabase(); + + db.beginTransaction(); + try { + for (long threadId : threadIds) { + ContentValues values = new ContentValues(2); + + if (archive) { + values.put(PINNED, "0"); + } + + values.put(ARCHIVED, archive ? "1" : "0"); + db.update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(threadId)); + } + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + notifyConversationListListeners(); + } + } + public @NonNull Set getArchivedRecipients() { Set archived = new HashSet<>();