kopia lustrzana https://github.com/ryukoposting/Signal-Android
104 wiersze
4.8 KiB
Java
104 wiersze
4.8 KiB
Java
package org.thoughtcrime.securesms.database;
|
|
|
|
import android.content.ContentValues;
|
|
import android.content.Context;
|
|
import android.database.Cursor;
|
|
|
|
import androidx.annotation.NonNull;
|
|
|
|
import net.zetetic.database.sqlcipher.SQLiteDatabase;
|
|
|
|
import org.thoughtcrime.securesms.database.model.PendingRetryReceiptModel;
|
|
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
|
import org.thoughtcrime.securesms.recipients.RecipientId;
|
|
import org.signal.core.util.CursorUtil;
|
|
import org.signal.core.util.SqlUtil;
|
|
|
|
import java.util.LinkedList;
|
|
import java.util.List;
|
|
|
|
/**
|
|
* Holds information about messages we've sent out retry receipts for.
|
|
*
|
|
* Do not use directly! The only class that should be accessing this is {@link PendingRetryReceiptCache}
|
|
*/
|
|
public final class PendingRetryReceiptDatabase extends Database implements RecipientIdDatabaseReference, ThreadIdDatabaseReference {
|
|
|
|
public static final String TABLE_NAME = "pending_retry_receipts";
|
|
|
|
private static final String ID = "_id";
|
|
private static final String AUTHOR = "author";
|
|
private static final String DEVICE = "device";
|
|
private static final String SENT_TIMESTAMP = "sent_timestamp";
|
|
private static final String RECEIVED_TIMESTAMP = "received_timestamp";
|
|
private static final String THREAD_ID = "thread_id";
|
|
|
|
public static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME + "(" + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
|
|
AUTHOR + " TEXT NOT NULL, " +
|
|
DEVICE + " INTEGER NOT NULL, " +
|
|
SENT_TIMESTAMP + " INTEGER NOT NULL, " +
|
|
RECEIVED_TIMESTAMP + " TEXT NOT NULL, " +
|
|
THREAD_ID + " INTEGER NOT NULL, " +
|
|
"UNIQUE(" + AUTHOR + "," + SENT_TIMESTAMP + ") ON CONFLICT REPLACE);";
|
|
|
|
PendingRetryReceiptDatabase(Context context, SignalDatabase databaseHelper) {
|
|
super(context, databaseHelper);
|
|
}
|
|
|
|
@NonNull PendingRetryReceiptModel insert(@NonNull RecipientId author, int authorDevice, long sentTimestamp, long receivedTimestamp, long threadId) {
|
|
ContentValues values = new ContentValues();
|
|
values.put(AUTHOR, author.serialize());
|
|
values.put(DEVICE, authorDevice);
|
|
values.put(SENT_TIMESTAMP, sentTimestamp);
|
|
values.put(RECEIVED_TIMESTAMP, receivedTimestamp);
|
|
values.put(THREAD_ID, threadId);
|
|
|
|
long id = databaseHelper.getSignalWritableDatabase().insertWithOnConflict(TABLE_NAME, null, values, SQLiteDatabase.CONFLICT_REPLACE);
|
|
|
|
return new PendingRetryReceiptModel(id, author, authorDevice, sentTimestamp, receivedTimestamp, threadId);
|
|
}
|
|
|
|
@NonNull List<PendingRetryReceiptModel> getAll() {
|
|
List<PendingRetryReceiptModel> models = new LinkedList<>();
|
|
|
|
try (Cursor cursor = databaseHelper.getSignalReadableDatabase().query(TABLE_NAME, null, null, null, null, null, null)) {
|
|
while (cursor.moveToNext()) {
|
|
models.add(fromCursor(cursor));
|
|
}
|
|
}
|
|
|
|
return models;
|
|
}
|
|
|
|
void delete(@NonNull PendingRetryReceiptModel model) {
|
|
databaseHelper.getSignalWritableDatabase().delete(TABLE_NAME, ID_WHERE, SqlUtil.buildArgs(model.getId()));
|
|
}
|
|
|
|
private static @NonNull PendingRetryReceiptModel fromCursor(@NonNull Cursor cursor) {
|
|
return new PendingRetryReceiptModel(CursorUtil.requireLong(cursor, ID),
|
|
RecipientId.from(CursorUtil.requireString(cursor, AUTHOR)),
|
|
CursorUtil.requireInt(cursor, DEVICE),
|
|
CursorUtil.requireLong(cursor, SENT_TIMESTAMP),
|
|
CursorUtil.requireLong(cursor, RECEIVED_TIMESTAMP),
|
|
CursorUtil.requireLong(cursor, THREAD_ID));
|
|
}
|
|
|
|
@Override
|
|
public void remapRecipient(@NonNull RecipientId fromId, @NonNull RecipientId toId) {
|
|
ContentValues values = new ContentValues();
|
|
values.put(AUTHOR, toId.serialize());
|
|
getWritableDatabase().update(TABLE_NAME, values, AUTHOR + " = ?", SqlUtil.buildArgs(fromId));
|
|
|
|
ApplicationDependencies.getPendingRetryReceiptCache().clear();
|
|
}
|
|
|
|
@Override
|
|
public void remapThread(long fromId, long toId) {
|
|
ContentValues values = new ContentValues();
|
|
values.put(THREAD_ID, toId);
|
|
getWritableDatabase().update(TABLE_NAME, values, THREAD_ID + " = ?", SqlUtil.buildArgs(fromId));
|
|
|
|
ApplicationDependencies.getPendingRetryReceiptCache().clear();
|
|
}
|
|
}
|