From 5e31eb5565128228ed33d158946b0fa5c0d941ec Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Tue, 1 Feb 2022 16:47:00 -0500 Subject: [PATCH] Fix re-pin out of order bug. Fixes #11927 --- .../securesms/database/ThreadDatabase.java | 31 ++++++++++++++++--- 1 file changed, 26 insertions(+), 5 deletions(-) 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 7746530cca..d2084f6e99 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -78,6 +78,9 @@ import java.util.Map; import java.util.Objects; import java.util.Set; +import kotlin.Unit; +import kotlin.collections.CollectionsKt; + public class ThreadDatabase extends Database { private static final String TAG = Log.tag(ThreadDatabase.class); @@ -874,14 +877,32 @@ public class ThreadDatabase extends Database { } public void unpinConversations(@NonNull Collection threadIds) { - SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); - ContentValues contentValues = new ContentValues(1); - String placeholders = StringUtil.join(Stream.of(threadIds).map(unused -> "?").toList(), ","); - String selection = ID + " IN (" + placeholders + ")"; + SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); + ContentValues contentValues = new ContentValues(1); + String placeholders = StringUtil.join(Stream.of(threadIds).map(unused -> "?").toList(), ","); + String selection = ID + " IN (" + placeholders + ")"; + List remainingPinnedThreads = getPinnedThreadIds(); + remainingPinnedThreads.removeAll(threadIds); contentValues.put(PINNED, 0); - db.update(TABLE_NAME, contentValues, selection, SqlUtil.buildArgs(Stream.of(threadIds).toArray())); + db.beginTransaction(); + try { + db.update(TABLE_NAME, contentValues, selection, SqlUtil.buildArgs(Stream.of(threadIds).toArray())); + + CollectionsKt.forEachIndexed(remainingPinnedThreads, (index, threadId) -> { + ContentValues values = new ContentValues(1); + values.put(PINNED, index + 1); + db.update(TABLE_NAME, values, ID_WHERE, SqlUtil.buildArgs(threadId)); + + return Unit.INSTANCE; + }); + + db.setTransactionSuccessful(); + } finally { + db.endTransaction(); + } + notifyConversationListListeners(); SignalDatabase.recipients().markNeedsSync(Recipient.self().getId());