Fix crash on multi-archive.

This commit is contained in:
Alex Hart 2020-08-24 14:48:23 -03:00 committed by Greyson Parrelli
parent c5c2fb31b1
commit 12a8d4e10b
3 changed files with 38 additions and 15 deletions

View File

@ -39,6 +39,8 @@ import org.thoughtcrime.securesms.components.registration.PulsingFloatingActionB
import org.thoughtcrime.securesms.database.DatabaseFactory; import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask; import org.thoughtcrime.securesms.util.task.SnackbarAsyncTask;
import java.util.Set;
public class ConversationListArchiveFragment extends ConversationListFragment implements ActionMode.Callback public class ConversationListArchiveFragment extends ConversationListFragment implements ActionMode.Callback
{ {
@ -107,13 +109,15 @@ public class ConversationListArchiveFragment extends ConversationListFragment im
} }
@Override @Override
protected void archiveThread(long threadId) { @WorkerThread
DatabaseFactory.getThreadDatabase(getActivity()).unarchiveConversation(threadId); protected void archiveThreads(Set<Long> threadIds) {
DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, true);
} }
@Override
@WorkerThread @WorkerThread
protected void reverseArchiveThread(long threadId) { protected void reverseArchiveThreads(Set<Long> threadIds) {
DatabaseFactory.getThreadDatabase(getActivity()).archiveConversation(threadId); DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, false);
} }
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")

View File

@ -678,16 +678,12 @@ public class ConversationListFragment extends MainFragment implements ActionMode
@Override @Override
protected void executeAction(@Nullable Void parameter) { protected void executeAction(@Nullable Void parameter) {
for (long threadId : selectedConversations) { archiveThreads(selectedConversations);
archiveThread(threadId);
}
} }
@Override @Override
protected void reverseAction(@Nullable Void parameter) { protected void reverseAction(@Nullable Void parameter) {
for (long threadId : selectedConversations) { reverseArchiveThreads(selectedConversations);
reverseArchiveThread(threadId);
}
} }
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} }
@ -975,13 +971,13 @@ public class ConversationListFragment extends MainFragment implements ActionMode
} }
@WorkerThread @WorkerThread
protected void archiveThread(long threadId) { protected void archiveThreads(Set<Long> threadIds) {
DatabaseFactory.getThreadDatabase(getActivity()).archiveConversation(threadId); DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, true);
} }
@WorkerThread @WorkerThread
protected void reverseArchiveThread(long threadId) { protected void reverseArchiveThreads(Set<Long> threadIds) {
DatabaseFactory.getThreadDatabase(getActivity()).unarchiveConversation(threadId); DatabaseFactory.getThreadDatabase(getActivity()).setArchived(threadIds, false);
} }
@SuppressLint("StaticFieldLeak") @SuppressLint("StaticFieldLeak")

View File

@ -544,7 +544,7 @@ public class ThreadDatabase extends Database {
String query = RECIPIENT_ID + " = ?"; String query = RECIPIENT_ID + " = ?";
for (Map.Entry<RecipientId, Boolean> entry : status.entrySet()) { for (Map.Entry<RecipientId, Boolean> entry : status.entrySet()) {
ContentValues values = new ContentValues(1); ContentValues values = new ContentValues(2);
if (entry.getValue()) { if (entry.getValue()) {
values.put(PINNED, "0"); values.put(PINNED, "0");
@ -561,6 +561,29 @@ public class ThreadDatabase extends Database {
} }
} }
public void setArchived(Set<Long> 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<RecipientId> getArchivedRecipients() { public @NonNull Set<RecipientId> getArchivedRecipients() {
Set<RecipientId> archived = new HashSet<>(); Set<RecipientId> archived = new HashSet<>();