diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.java b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.java deleted file mode 100644 index 3871918734..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.java +++ /dev/null @@ -1,146 +0,0 @@ -package org.thoughtcrime.securesms.database; - -import android.content.ContentValues; -import android.content.Context; -import android.database.Cursor; - -import androidx.annotation.NonNull; - -import org.thoughtcrime.securesms.recipients.RecipientId; -import org.signal.core.util.CursorUtil; - -import java.util.HashMap; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; - -/** - * The backing datastore for {@link RemappedRecords}. See that class for more details. - */ -public class RemappedRecordTables extends DatabaseTable { - - public static final String[] CREATE_TABLE = { Recipients.CREATE_TABLE, - Threads.CREATE_TABLE }; - - private static class SharedColumns { - protected static final String ID = "_id"; - protected static final String OLD_ID = "old_id"; - protected static final String NEW_ID = "new_id"; - } - - private static final class Recipients extends SharedColumns { - private static final String TABLE_NAME = "remapped_recipients"; - private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + - OLD_ID + " INTEGER UNIQUE, " + - NEW_ID + " INTEGER)"; - } - - private static final class Threads extends SharedColumns { - private static final String TABLE_NAME = "remapped_threads"; - private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + " (" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + - OLD_ID + " INTEGER UNIQUE, " + - NEW_ID + " INTEGER)"; - } - - RemappedRecordTables(Context context, SignalDatabase databaseHelper) { - super(context, databaseHelper); - } - - @NonNull Map getAllRecipientMappings() { - SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); - Map recipientMap = new HashMap<>(); - - db.beginTransaction(); - try { - List mappings = getAllMappings(Recipients.TABLE_NAME); - - for (Mapping mapping : mappings) { - RecipientId oldId = RecipientId.from(mapping.getOldId()); - RecipientId newId = RecipientId.from(mapping.getNewId()); - recipientMap.put(oldId, newId); - } - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - return recipientMap; - } - - @NonNull Map getAllThreadMappings() { - SQLiteDatabase db = databaseHelper.getSignalReadableDatabase(); - Map threadMap = new HashMap<>(); - - db.beginTransaction(); - try { - List mappings = getAllMappings(Threads.TABLE_NAME); - - for (Mapping mapping : mappings) { - threadMap.put(mapping.getOldId(), mapping.getNewId()); - } - - db.setTransactionSuccessful(); - } finally { - db.endTransaction(); - } - - return threadMap; - } - - void addRecipientMapping(@NonNull RecipientId oldId, @NonNull RecipientId newId) { - addMapping(Recipients.TABLE_NAME, new Mapping(oldId.toLong(), newId.toLong())); - } - - void addThreadMapping(long oldId, long newId) { - addMapping(Threads.TABLE_NAME, new Mapping(oldId, newId)); - } - - public Cursor getAllRecipients() { - return databaseHelper.getSignalReadableDatabase().query(Recipients.TABLE_NAME, null, null, null, null, null, null); - } - - public Cursor getAllThreads() { - return databaseHelper.getSignalReadableDatabase().query(Threads.TABLE_NAME, null, null, null, null, null, null); - } - - private @NonNull List getAllMappings(@NonNull String table) { - List mappings = new LinkedList<>(); - - try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(table, null, null, null, null, null, null)) { - while (cursor != null && cursor.moveToNext()) { - long oldId = CursorUtil.requireLong(cursor, SharedColumns.OLD_ID); - long newId = CursorUtil.requireLong(cursor, SharedColumns.NEW_ID); - mappings.add(new Mapping(oldId, newId)); - } - } - - return mappings; - } - - private void addMapping(@NonNull String table, @NonNull Mapping mapping) { - ContentValues values = new ContentValues(); - values.put(SharedColumns.OLD_ID, mapping.getOldId()); - values.put(SharedColumns.NEW_ID, mapping.getNewId()); - - databaseHelper.getSignalWritableDatabase().insert(table, null, values); - } - - static final class Mapping { - private final long oldId; - private final long newId; - - public Mapping(long oldId, long newId) { - this.oldId = oldId; - this.newId = newId; - } - - public long getOldId() { - return oldId; - } - - public long getNewId() { - return newId; - } - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt new file mode 100644 index 0000000000..a727df205e --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/database/RemappedRecordTables.kt @@ -0,0 +1,124 @@ +package org.thoughtcrime.securesms.database + +import android.content.Context +import android.database.Cursor +import androidx.core.content.contentValuesOf +import org.signal.core.util.readToList +import org.signal.core.util.requireLong +import org.signal.core.util.select +import org.signal.core.util.withinTransaction +import org.thoughtcrime.securesms.database.RemappedRecordTables.SharedColumns.ID +import org.thoughtcrime.securesms.database.RemappedRecordTables.SharedColumns.NEW_ID +import org.thoughtcrime.securesms.database.RemappedRecordTables.SharedColumns.OLD_ID +import org.thoughtcrime.securesms.recipients.RecipientId +import java.util.HashMap + +/** + * The backing datastore for [RemappedRecords]. See that class for more details. + */ +class RemappedRecordTables internal constructor(context: Context?, databaseHelper: SignalDatabase?) : DatabaseTable(context, databaseHelper) { + + companion object { + val CREATE_TABLE = arrayOf(Recipients.CREATE_TABLE, Threads.CREATE_TABLE) + } + + private object SharedColumns { + const val ID = "_id" + const val OLD_ID = "old_id" + const val NEW_ID = "new_id" + } + + private object Recipients { + const val TABLE_NAME = "remapped_recipients" + const val CREATE_TABLE = """ + CREATE TABLE $TABLE_NAME ( + $ID INTEGER PRIMARY KEY AUTOINCREMENT, + $OLD_ID INTEGER UNIQUE, + $NEW_ID INTEGER + ) + """ + } + + private object Threads { + const val TABLE_NAME = "remapped_threads" + const val CREATE_TABLE = """ + CREATE TABLE $TABLE_NAME ( + $ID INTEGER PRIMARY KEY AUTOINCREMENT, + $OLD_ID INTEGER UNIQUE, + $NEW_ID INTEGER + ) + """ + } + + fun getAllRecipientMappings(): Map { + val recipientMap: MutableMap = HashMap() + + readableDatabase.withinTransaction { db -> + val mappings = getAllMappings(db, Recipients.TABLE_NAME) + for (mapping in mappings) { + val oldId = RecipientId.from(mapping.oldId) + val newId = RecipientId.from(mapping.newId) + recipientMap[oldId] = newId + } + } + + return recipientMap + } + + fun getAllThreadMappings(): Map { + val threadMap: MutableMap = HashMap() + + readableDatabase.withinTransaction { db -> + val mappings = getAllMappings(db, Threads.TABLE_NAME) + for (mapping in mappings) { + threadMap[mapping.oldId] = mapping.newId + } + } + + return threadMap + } + + fun addRecipientMapping(oldId: RecipientId, newId: RecipientId) { + addMapping(Recipients.TABLE_NAME, Mapping(oldId.toLong(), newId.toLong())) + } + + fun addThreadMapping(oldId: Long, newId: Long) { + addMapping(Threads.TABLE_NAME, Mapping(oldId, newId)) + } + + fun getAllRecipients(): Cursor { + return readableDatabase + .select() + .from(Recipients.TABLE_NAME) + .run() + } + + fun getAllThreads(): Cursor { + return readableDatabase + .select() + .from(Threads.TABLE_NAME) + .run() + } + + private fun getAllMappings(db: SQLiteDatabase, table: String): List { + return db.select() + .from(table) + .run() + .readToList { cursor -> + Mapping( + oldId = cursor.requireLong(OLD_ID), + newId = cursor.requireLong(NEW_ID) + ) + } + } + + private fun addMapping(table: String, mapping: Mapping) { + val values = contentValuesOf( + OLD_ID to mapping.oldId, + NEW_ID to mapping.newId + ) + databaseHelper.signalWritableDatabase.insert(table, null, values) + } + + private class Mapping(val oldId: Long, val newId: Long) +}