From 1da75018eb94db206802364a50a98f57ec9e2a01 Mon Sep 17 00:00:00 2001 From: Michelle Tang Date: Tue, 6 Jan 2026 11:13:43 -0500 Subject: [PATCH] Fix polls in local backups. --- .../securesms/backup/FullBackupExporter.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java index c1cdd2f20e..24a9742512 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/FullBackupExporter.java @@ -39,6 +39,7 @@ import org.thoughtcrime.securesms.database.MentionTable; import org.thoughtcrime.securesms.database.MessageTable; import org.thoughtcrime.securesms.database.OneTimePreKeyTable; import org.thoughtcrime.securesms.database.PendingRetryReceiptTable; +import org.thoughtcrime.securesms.database.PollTables; import org.thoughtcrime.securesms.database.ReactionTable; import org.thoughtcrime.securesms.database.RemappedRecordTables; import org.thoughtcrime.securesms.database.RemoteMegaphoneTable; @@ -180,6 +181,12 @@ public class FullBackupExporter extends FullBackupBase { count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(GroupReceiptTable.MMS_ID))), null, count, estimatedCount, cancellationSignal); } else if (table.equals(AttachmentTable.TABLE_NAME)) { count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(AttachmentTable.MESSAGE_ID))), (cursor, innerCount) -> exportAttachment(attachmentSecret, cursor, outputStream, innerCount, estimatedCount), count, estimatedCount, cancellationSignal); + } else if (table.equals(PollTables.PollTable.TABLE_NAME)) { + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(PollTables.PollTable.MESSAGE_ID))), null, count, estimatedCount, cancellationSignal); + } else if (table.equals(PollTables.PollOptionTable.TABLE_NAME)) { + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringPollMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(PollTables.PollOptionTable.POLL_ID))), null, count, estimatedCount, cancellationSignal); + } else if (table.equals(PollTables.PollVoteTable.TABLE_NAME)) { + count = exportTable(table, input, outputStream, cursor -> isForNonExpiringPollMessage(input, cursor.getLong(cursor.getColumnIndexOrThrow(PollTables.PollVoteTable.POLL_ID))), null, count, estimatedCount, cancellationSignal); } else if (table.equals(StickerTable.TABLE_NAME)) { count = exportTable(table, input, outputStream, cursor -> true, (cursor, innerCount) -> exportSticker(attachmentSecret, cursor, outputStream, innerCount, estimatedCount), count, estimatedCount, cancellationSignal); } else if (!TABLE_CONTENT_BLOCKLIST.contains(table)) { @@ -624,6 +631,20 @@ public class FullBackupExporter extends FullBackupBase { return false; } + private static boolean isForNonExpiringPollMessage(@NonNull SQLiteDatabase db, long pollId) { + String[] columns = new String[] { PollTables.PollTable.MESSAGE_ID }; + String where = PollTables.PollTable.ID + " = ?"; + String[] args = SqlUtil.buildArgs(pollId); + + try (Cursor cursor = db.query(PollTables.PollTable.TABLE_NAME, columns, where, args, null, null, null)) { + if (cursor != null && cursor.moveToFirst()) { + return isForNonExpiringMessage(db, cursor.getLong(cursor.getColumnIndexOrThrow(PollTables.PollTable.MESSAGE_ID))); + } + } + + return false; + } + public interface PostProcessor { int postProcess(@NonNull Cursor cursor, int count) throws IOException; }