mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-04-22 18:00:02 +01:00
Have DatabaseFactory.getSmsDatabase() return MessageDatabase.
Slowly moving towards a single interface.
This commit is contained in:
committed by
Alex Hart
parent
2cf9eb69eb
commit
190ca9eddd
@@ -82,7 +82,7 @@ public class DatabaseFactory {
|
||||
return getInstance(context).thread;
|
||||
}
|
||||
|
||||
public static SmsDatabase getSmsDatabase(Context context) {
|
||||
public static MessageDatabase getSmsDatabase(Context context) {
|
||||
return getInstance(context).sms;
|
||||
}
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ public class MediaDatabase extends Database {
|
||||
List<DatabaseAttachment> attachments = attachmentDatabase.getAttachment(cursor);
|
||||
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.RECIPIENT_ID)));
|
||||
long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.THREAD_ID));
|
||||
boolean outgoing = MessagingDatabase.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)));
|
||||
boolean outgoing = MessageDatabase.Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.MESSAGE_BOX)));
|
||||
|
||||
long date;
|
||||
|
||||
|
||||
@@ -6,11 +6,13 @@ import android.database.Cursor;
|
||||
import android.text.TextUtils;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
|
||||
import com.annimon.stream.Stream;
|
||||
import com.google.protobuf.InvalidProtocolBufferException;
|
||||
|
||||
import net.sqlcipher.database.SQLiteDatabase;
|
||||
import net.sqlcipher.database.SQLiteStatement;
|
||||
|
||||
import org.thoughtcrime.securesms.database.documents.Document;
|
||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||
@@ -22,9 +24,13 @@ import org.thoughtcrime.securesms.database.model.databaseprotos.ReactionList;
|
||||
import org.thoughtcrime.securesms.database.model.ReactionRecord;
|
||||
import org.thoughtcrime.securesms.insights.InsightsConstants;
|
||||
import org.thoughtcrime.securesms.logging.Log;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||
import org.whispersystems.libsignal.IdentityKey;
|
||||
import org.whispersystems.libsignal.util.Pair;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -34,12 +40,13 @@ import java.util.Collections;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Set;
|
||||
|
||||
public abstract class MessagingDatabase extends Database implements MmsSmsColumns {
|
||||
public abstract class MessageDatabase extends Database implements MmsSmsColumns {
|
||||
|
||||
private static final String TAG = MessagingDatabase.class.getSimpleName();
|
||||
private static final String TAG = MessageDatabase.class.getSimpleName();
|
||||
|
||||
public MessagingDatabase(Context context, SQLCipherOpenHelper databaseHelper) {
|
||||
public MessageDatabase(Context context, SQLCipherOpenHelper databaseHelper) {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@@ -48,17 +55,76 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn
|
||||
protected abstract String getDateSentColumnName();
|
||||
protected abstract String getDateReceivedColumnName();
|
||||
|
||||
public abstract @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived);
|
||||
public abstract long getThreadIdForMessage(long id);
|
||||
public abstract int getMessageCountForThread(long threadId);
|
||||
public abstract int getMessageCountForThread(long threadId, long beforeTime);
|
||||
abstract int getMessageCountForThreadSummary(long threadId);
|
||||
|
||||
public abstract Cursor getExpirationStartedMessages();
|
||||
public abstract SmsMessageRecord getSmsMessage(long messageId) throws NoSuchMessageException;
|
||||
public abstract Cursor getMessageCursor(long messageId);
|
||||
public abstract MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException;
|
||||
public abstract Cursor getVerboseMessageCursor(long messageId);
|
||||
public abstract boolean hasReceivedAnyCallsSince(long threadId, long timestamp);
|
||||
|
||||
public abstract void markExpireStarted(long messageId);
|
||||
public abstract void markExpireStarted(long messageId, long startTime);
|
||||
public abstract void markExpireStarted(Collection<Long> messageId, long startTime);
|
||||
|
||||
public abstract void markAsEndSession(long id);
|
||||
public abstract void markAsPreKeyBundle(long id);
|
||||
public abstract void markAsInvalidVersionKeyExchange(long id);
|
||||
public abstract void markAsSecure(long id);
|
||||
public abstract void markAsInsecure(long id);
|
||||
public abstract void markAsPush(long id);
|
||||
public abstract void markAsForcedSms(long id);
|
||||
public abstract void markAsDecryptFailed(long id);
|
||||
public abstract void markAsDecryptDuplicate(long id);
|
||||
public abstract void markAsNoSession(long id);
|
||||
public abstract void markAsUnsupportedProtocolVersion(long id);
|
||||
public abstract void markAsInvalidMessage(long id);
|
||||
public abstract void markAsLegacyVersion(long id);
|
||||
public abstract void markAsOutbox(long id);
|
||||
public abstract void markAsPendingInsecureSmsFallback(long id);
|
||||
public abstract void markAsSent(long messageId, boolean secure);
|
||||
public abstract void markAsSentFailed(long id);
|
||||
public abstract void markUnidentified(long messageId, boolean unidentified);
|
||||
|
||||
public abstract void markAsSending(long messageId);
|
||||
public abstract void markAsRemoteDelete(long messageId);
|
||||
public abstract void markAsMissedCall(long id);
|
||||
public abstract void markAsNotified(long id);
|
||||
public abstract void markSmsStatus(long id, int status);
|
||||
|
||||
public abstract boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt);
|
||||
public abstract List<Pair<Long, Long>> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted);
|
||||
public abstract List<MarkedMessageInfo> setEntireThreadRead(long threadId);
|
||||
public abstract List<MarkedMessageInfo> setMessagesReadSince(long threadId, long timestamp);
|
||||
public abstract List<MarkedMessageInfo> setAllMessagesRead();
|
||||
public abstract Pair<Long, Long> updateBundleMessageBody(long messageId, String body);
|
||||
|
||||
|
||||
public abstract @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address);
|
||||
public abstract @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address);
|
||||
public abstract @NonNull Pair<Long, Long> insertMissedCall(@NonNull RecipientId address);
|
||||
|
||||
public abstract Optional<InsertResult> insertMessageInbox(IncomingTextMessage message, long type);
|
||||
public abstract Optional<InsertResult> insertMessageInbox(IncomingTextMessage message);
|
||||
public abstract long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener);
|
||||
public abstract void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName);
|
||||
|
||||
public abstract boolean deleteMessage(long messageId);
|
||||
abstract void deleteThread(long threadId);
|
||||
abstract void deleteMessagesInThreadBeforeDate(long threadId, long date);
|
||||
abstract void deleteThreads(@NonNull Set<Long> threadIds);
|
||||
abstract void deleteAllThreads();
|
||||
|
||||
abstract SQLiteDatabase beginTransaction();
|
||||
abstract void endTransaction(SQLiteDatabase database);
|
||||
abstract SQLiteStatement createInsertStatement(SQLiteDatabase database);
|
||||
|
||||
public abstract void ensureMigration();
|
||||
|
||||
public abstract MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException;
|
||||
|
||||
final int getInsecureMessagesSentForThread(long threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
@@ -256,7 +322,7 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn
|
||||
}
|
||||
}
|
||||
|
||||
protected List<ReactionRecord> parseReactions(@NonNull Cursor cursor) {
|
||||
protected static List<ReactionRecord> parseReactions(@NonNull Cursor cursor) {
|
||||
byte[] raw = cursor.getBlob(cursor.getColumnIndexOrThrow(REACTIONS));
|
||||
|
||||
if (raw != null) {
|
||||
@@ -527,4 +593,8 @@ public abstract class MessagingDatabase extends Database implements MmsSmsColumn
|
||||
return threadId;
|
||||
}
|
||||
}
|
||||
|
||||
public interface InsertListener {
|
||||
void onComplete();
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,6 @@ import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.net.Uri;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -32,6 +31,7 @@ import com.google.android.mms.pdu_alt.NotificationInd;
|
||||
import com.google.android.mms.pdu_alt.PduHeaders;
|
||||
|
||||
import net.sqlcipher.database.SQLiteDatabase;
|
||||
import net.sqlcipher.database.SQLiteStatement;
|
||||
|
||||
import org.json.JSONArray;
|
||||
import org.json.JSONException;
|
||||
@@ -41,6 +41,7 @@ import org.thoughtcrime.securesms.attachments.AttachmentId;
|
||||
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
|
||||
import org.thoughtcrime.securesms.attachments.MmsNotificationAttachment;
|
||||
import org.thoughtcrime.securesms.contactshare.Contact;
|
||||
import org.thoughtcrime.securesms.database.documents.Document;
|
||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch;
|
||||
import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatchList;
|
||||
import org.thoughtcrime.securesms.database.documents.NetworkFailure;
|
||||
@@ -52,6 +53,7 @@ import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.NotificationMmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.Quote;
|
||||
import org.thoughtcrime.securesms.database.model.ReactionRecord;
|
||||
import org.thoughtcrime.securesms.database.model.SmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.databaseprotos.BodyRangeList;
|
||||
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
|
||||
import org.thoughtcrime.securesms.jobs.TrimThreadJob;
|
||||
@@ -70,11 +72,15 @@ import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
import org.thoughtcrime.securesms.recipients.RecipientId;
|
||||
import org.thoughtcrime.securesms.revealable.ViewOnceExpirationInfo;
|
||||
import org.thoughtcrime.securesms.revealable.ViewOnceUtil;
|
||||
import org.thoughtcrime.securesms.sms.IncomingTextMessage;
|
||||
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
|
||||
import org.thoughtcrime.securesms.util.CursorUtil;
|
||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||
import org.thoughtcrime.securesms.util.SqlUtil;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.whispersystems.libsignal.IdentityKey;
|
||||
import org.whispersystems.libsignal.util.Pair;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
|
||||
import java.io.Closeable;
|
||||
@@ -91,7 +97,7 @@ import java.util.Set;
|
||||
|
||||
import static org.thoughtcrime.securesms.contactshare.Contact.Avatar;
|
||||
|
||||
public class MmsDatabase extends MessagingDatabase {
|
||||
public class MmsDatabase extends MessageDatabase {
|
||||
|
||||
private static final String TAG = MmsDatabase.class.getSimpleName();
|
||||
|
||||
@@ -266,6 +272,171 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
return MESSAGE_BOX;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
int getMessageCountForThreadSummary(long threadId) {
|
||||
return getMessageCountForThread(threadId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor getExpirationStartedMessages() {
|
||||
String where = EXPIRE_STARTED + " > 0";
|
||||
return rawQuery(where, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsMessageRecord getSmsMessage(long messageId) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor getMessageCursor(long messageId) {
|
||||
Cursor cursor = internalGetMessage(messageId);
|
||||
setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor getVerboseMessageCursor(long messageId) {
|
||||
Cursor cursor = internalGetMessage(messageId);
|
||||
setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsEndSession(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPreKeyBundle(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInvalidVersionKeyExchange(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsSecure(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPush(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsDecryptFailed(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsDecryptDuplicate(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsNoSession(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsUnsupportedProtocolVersion(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInvalidMessage(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsLegacyVersion(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsMissedCall(long id) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markSmsStatus(long id, int status) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<Long, Long> updateBundleMessageBody(long messageId, String body) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Pair<Long, Long> insertMissedCall(@NonNull RecipientId address) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<InsertResult> insertMessageInbox(IncomingTextMessage message, long type) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<InsertResult> insertMessageInbox(IncomingTextMessage message) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public long insertMessageOutbox(long threadId, OutgoingTextMessage message, boolean forceSms, long date, InsertListener insertListener) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
void endTransaction(SQLiteDatabase database) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
SQLiteStatement createInsertStatement(SQLiteDatabase database) {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ensureMigration() {
|
||||
databaseHelper.getWritableDatabase();
|
||||
}
|
||||
|
||||
public boolean isGroupQuitMessage(long messageId) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
|
||||
@@ -442,18 +613,6 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
" WHERE " + where + " GROUP BY " + MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID, arguments);
|
||||
}
|
||||
|
||||
public Cursor getMessage(long messageId) {
|
||||
Cursor cursor = internalGetMessage(messageId);
|
||||
setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
public Cursor getVerboseMessage(long messageId) {
|
||||
Cursor cursor = internalGetMessage(messageId);
|
||||
setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
private Cursor internalGetMessage(long messageId) {
|
||||
return rawQuery(RAW_ID_WHERE, new String[] {messageId + ""});
|
||||
}
|
||||
@@ -476,11 +635,6 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
return readerFor(rawQuery(MmsDatabase.TABLE_NAME + "." + MmsDatabase.ID + " IN (" + ids + ")", null));
|
||||
}
|
||||
|
||||
public Reader getExpireStartedMessages() {
|
||||
String where = EXPIRE_STARTED + " > 0";
|
||||
return readerFor(rawQuery(where, null));
|
||||
}
|
||||
|
||||
private void updateMailboxBitmask(long id, long maskOff, long maskOn, Optional<Long> threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
db.execSQL("UPDATE " + TABLE_NAME +
|
||||
@@ -570,6 +724,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
// updateMailboxBitmask(messageId, 0, Types.SECURE_MESSAGE_BIT, Optional.<Long>absent());
|
||||
// }
|
||||
|
||||
@Override
|
||||
public void markAsInsecure(long messageId) {
|
||||
updateMailboxBitmask(messageId, Types.SECURE_MESSAGE_BIT, 0, Optional.<Long>absent());
|
||||
}
|
||||
@@ -578,21 +733,6 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
// updateMailboxBitmask(messageId, 0, Types.PUSH_MESSAGE_BIT, Optional.<Long>absent());
|
||||
// }
|
||||
|
||||
public void markAsDecryptFailed(long messageId, long threadId) {
|
||||
updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT, Optional.of(threadId));
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
public void markAsDecryptDuplicate(long messageId, long threadId) {
|
||||
updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_DUPLICATE_BIT, Optional.of(threadId));
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
public void markAsLegacyVersion(long messageId, long threadId) {
|
||||
updateMailboxBitmask(messageId, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_LEGACY_BIT, Optional.of(threadId));
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markUnidentified(long messageId, boolean unidentified) {
|
||||
ContentValues contentValues = new ContentValues();
|
||||
@@ -650,6 +790,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)});
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
||||
if (sinceTimestamp == -1) {
|
||||
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)});
|
||||
@@ -875,7 +1016,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
String quoteText = cursor.getString(cursor.getColumnIndexOrThrow(QUOTE_BODY));
|
||||
boolean quoteMissing = cursor.getInt(cursor.getColumnIndexOrThrow(QUOTE_MISSING)) == 1;
|
||||
List<Attachment> quoteAttachments = Stream.of(associatedAttachments).filter(Attachment::isQuote).map(a -> (Attachment)a).toList();
|
||||
List<Mention> quoteMentions = parseQuoteMentions(cursor);
|
||||
List<Mention> quoteMentions = parseQuoteMentions(context, cursor);
|
||||
List<Contact> contacts = getSharedContacts(cursor, associatedAttachments);
|
||||
Set<Attachment> contactAttachments = new HashSet<>(Stream.of(contacts).map(Contact::getAvatarAttachment).filter(a -> a != null).toList());
|
||||
List<LinkPreview> previews = getLinkPreviews(cursor, associatedAttachments);
|
||||
@@ -935,7 +1076,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
private List<Contact> getSharedContacts(@NonNull Cursor cursor, @NonNull List<DatabaseAttachment> attachments) {
|
||||
private static List<Contact> getSharedContacts(@NonNull Cursor cursor, @NonNull List<DatabaseAttachment> attachments) {
|
||||
String serializedContacts = cursor.getString(cursor.getColumnIndexOrThrow(SHARED_CONTACTS));
|
||||
|
||||
if (TextUtils.isEmpty(serializedContacts)) {
|
||||
@@ -973,7 +1114,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
|
||||
private List<LinkPreview> getLinkPreviews(@NonNull Cursor cursor, @NonNull List<DatabaseAttachment> attachments) {
|
||||
private static List<LinkPreview> getLinkPreviews(@NonNull Cursor cursor, @NonNull List<DatabaseAttachment> attachments) {
|
||||
String serializedPreviews = cursor.getString(cursor.getColumnIndexOrThrow(LINK_PREVIEWS));
|
||||
|
||||
if (TextUtils.isEmpty(serializedPreviews)) {
|
||||
@@ -1333,7 +1474,8 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
public boolean delete(long messageId) {
|
||||
@Override
|
||||
public boolean deleteMessage(long messageId) {
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
AttachmentDatabase attachmentDatabase = DatabaseFactory.getAttachmentDatabase(context);
|
||||
attachmentDatabase.deleteAttachmentsForMessage(messageId);
|
||||
@@ -1428,7 +1570,8 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
return false;
|
||||
}
|
||||
|
||||
/*package*/ void deleteThreads(Set<Long> threadIds) {
|
||||
@Override
|
||||
void deleteThreads(Set<Long> threadIds) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
String where = "";
|
||||
Cursor cursor = null;
|
||||
@@ -1443,7 +1586,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
cursor = db.query(TABLE_NAME, new String[] {ID}, where, null, null, null, null);
|
||||
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
delete(cursor.getLong(0));
|
||||
deleteMessage(cursor.getLong(0));
|
||||
}
|
||||
|
||||
} finally {
|
||||
@@ -1452,7 +1595,8 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
/*package*/void deleteMessagesInThreadBeforeDate(long threadId, long date) {
|
||||
@Override
|
||||
void deleteMessagesInThreadBeforeDate(long threadId, long date) {
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
@@ -1469,7 +1613,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
|
||||
while (cursor != null && cursor.moveToNext()) {
|
||||
Log.i(TAG, "Trimming: " + cursor.getLong(0));
|
||||
delete(cursor.getLong(0));
|
||||
deleteMessage(cursor.getLong(0));
|
||||
}
|
||||
|
||||
} finally {
|
||||
@@ -1478,7 +1622,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void deleteAllThreads() {
|
||||
DatabaseFactory.getAttachmentDatabase(context).deleteAllAttachments();
|
||||
DatabaseFactory.getGroupReceiptDatabase(context).deleteAllRows();
|
||||
@@ -1487,8 +1631,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
database.delete(TABLE_NAME, null, null);
|
||||
}
|
||||
|
||||
public @Nullable
|
||||
ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() {
|
||||
public @Nullable ViewOnceExpirationInfo getNearestExpiringViewOnceMessage() {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
ViewOnceExpirationInfo info = null;
|
||||
long nearestExpiration = Long.MAX_VALUE;
|
||||
@@ -1535,14 +1678,16 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
private @NonNull List<Mention> parseQuoteMentions(Cursor cursor) {
|
||||
private static @NonNull List<Mention> parseQuoteMentions(@NonNull Context context, Cursor cursor) {
|
||||
byte[] raw = cursor.getBlob(cursor.getColumnIndexOrThrow(QUOTE_MENTIONS));
|
||||
|
||||
return MentionUtil.bodyRangeListToMentions(context, raw);
|
||||
}
|
||||
|
||||
public void beginTransaction() {
|
||||
@Override
|
||||
public SQLiteDatabase beginTransaction() {
|
||||
databaseHelper.getWritableDatabase().beginTransaction();
|
||||
return databaseHelper.getWritableDatabase();
|
||||
}
|
||||
|
||||
public void setTransactionSuccessful() {
|
||||
@@ -1553,7 +1698,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
databaseHelper.getWritableDatabase().endTransaction();
|
||||
}
|
||||
|
||||
public Reader readerFor(Cursor cursor) {
|
||||
public static Reader readerFor(Cursor cursor) {
|
||||
return new Reader(cursor);
|
||||
}
|
||||
|
||||
@@ -1661,12 +1806,14 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
public class Reader implements Closeable {
|
||||
public static class Reader implements Closeable {
|
||||
|
||||
private final Cursor cursor;
|
||||
private final Cursor cursor;
|
||||
private final Context context;
|
||||
|
||||
public Reader(Cursor cursor) {
|
||||
this.cursor = cursor;
|
||||
this.cursor = cursor;
|
||||
this.context = ApplicationDependencies.getApplication();
|
||||
}
|
||||
|
||||
public MessageRecord getNext() {
|
||||
@@ -1812,7 +1959,7 @@ public class MmsDatabase extends MessagingDatabase {
|
||||
long quoteAuthor = cursor.getLong(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_AUTHOR));
|
||||
CharSequence quoteText = cursor.getString(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_BODY));
|
||||
boolean quoteMissing = cursor.getInt(cursor.getColumnIndexOrThrow(MmsDatabase.QUOTE_MISSING)) == 1;
|
||||
List<Mention> quoteMentions = parseQuoteMentions(cursor);
|
||||
List<Mention> quoteMentions = parseQuoteMentions(context, cursor);
|
||||
List<DatabaseAttachment> attachments = DatabaseFactory.getAttachmentDatabase(context).getAttachment(cursor);
|
||||
List<? extends Attachment> quoteAttachments = Stream.of(attachments).filter(Attachment::isQuote).toList();
|
||||
SlideDeck quoteDeck = new SlideDeck(context, quoteAttachments);
|
||||
|
||||
@@ -25,7 +25,7 @@ import androidx.annotation.Nullable;
|
||||
import net.sqlcipher.database.SQLiteDatabase;
|
||||
import net.sqlcipher.database.SQLiteQueryBuilder;
|
||||
|
||||
import org.thoughtcrime.securesms.database.MessagingDatabase.SyncMessageId;
|
||||
import org.thoughtcrime.securesms.database.MessageDatabase.SyncMessageId;
|
||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||
@@ -118,10 +118,10 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
private @NonNull Pair<RecipientId, Long> getGroupAddedBy(long threadId, long lastQuitChecked) {
|
||||
MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
|
||||
SmsDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||
long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked);
|
||||
RecipientId id = smsDatabase.getOldestGroupUpdateSender(threadId, latestQuit);
|
||||
MmsDatabase mmsDatabase = DatabaseFactory.getMmsDatabase(context);
|
||||
MessageDatabase smsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||
long latestQuit = mmsDatabase.getLatestGroupQuitTimestamp(threadId, lastQuitChecked);
|
||||
RecipientId id = smsDatabase.getOldestGroupUpdateSender(threadId, latestQuit);
|
||||
|
||||
return new Pair<>(id, latestQuit);
|
||||
}
|
||||
@@ -209,14 +209,11 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
public boolean checkMessageExists(@NonNull MessageRecord messageRecord) {
|
||||
if (messageRecord.isMms()) {
|
||||
try (Cursor mms = DatabaseFactory.getMmsDatabase(context).getMessage(messageRecord.getId())) {
|
||||
return mms != null && mms.getCount() > 0;
|
||||
}
|
||||
} else {
|
||||
try (Cursor sms = DatabaseFactory.getSmsDatabase(context).getMessageCursor(messageRecord.getId())) {
|
||||
return sms != null && sms.getCount() > 0;
|
||||
}
|
||||
MessageDatabase db = messageRecord.isMms() ? DatabaseFactory.getMmsDatabase(context)
|
||||
: DatabaseFactory.getSmsDatabase(context);
|
||||
|
||||
try (Cursor cursor = db.getMessageCursor(messageRecord.getId())) {
|
||||
return cursor != null && cursor.getCount() > 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -256,7 +253,7 @@ public class MmsSmsDatabase extends Database {
|
||||
|
||||
public int getConversationCountForThreadSummary(long threadId) {
|
||||
int count = DatabaseFactory.getSmsDatabase(context).getMessageCountForThreadSummary(threadId);
|
||||
count += DatabaseFactory.getMmsDatabase(context).getMessageCountForThread(threadId);
|
||||
count += DatabaseFactory.getMmsDatabase(context).getMessageCountForThreadSummary(threadId);
|
||||
|
||||
return count;
|
||||
}
|
||||
@@ -290,14 +287,14 @@ public class MmsSmsDatabase extends Database {
|
||||
}
|
||||
|
||||
public void incrementDeliveryReceiptCount(SyncMessageId syncMessageId, long timestamp) {
|
||||
DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, true);
|
||||
DatabaseFactory.getSmsDatabase(context).incrementSmsReceiptCount(syncMessageId, true);
|
||||
DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, true);
|
||||
}
|
||||
|
||||
public boolean incrementReadReceiptCount(SyncMessageId syncMessageId, long timestamp) {
|
||||
boolean handled = false;
|
||||
|
||||
handled |= DatabaseFactory.getSmsDatabase(context).incrementReceiptCount(syncMessageId, false);
|
||||
handled |= DatabaseFactory.getSmsDatabase(context).incrementSmsReceiptCount(syncMessageId, false);
|
||||
handled |= DatabaseFactory.getMmsDatabase(context).incrementReceiptCount(syncMessageId, timestamp, false);
|
||||
|
||||
return handled;
|
||||
@@ -576,7 +573,7 @@ public class MmsSmsDatabase extends Database {
|
||||
|
||||
private SmsDatabase.Reader getSmsReader() {
|
||||
if (smsReader == null) {
|
||||
smsReader = DatabaseFactory.getSmsDatabase(context).readerFor(cursor);
|
||||
smsReader = SmsDatabase.readerFor(cursor);
|
||||
}
|
||||
|
||||
return smsReader;
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.content.ContentValues;
|
||||
import android.content.Context;
|
||||
import android.database.Cursor;
|
||||
import android.text.TextUtils;
|
||||
import android.util.Pair;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
@@ -50,6 +49,7 @@ import org.thoughtcrime.securesms.util.Base64;
|
||||
import org.thoughtcrime.securesms.util.JsonUtils;
|
||||
import org.thoughtcrime.securesms.util.SqlUtil;
|
||||
import org.thoughtcrime.securesms.util.TextSecurePreferences;
|
||||
import org.whispersystems.libsignal.util.Pair;
|
||||
import org.whispersystems.libsignal.util.guava.Optional;
|
||||
|
||||
import java.io.IOException;
|
||||
@@ -66,7 +66,7 @@ import java.util.Set;
|
||||
*
|
||||
* @author Moxie Marlinspike
|
||||
*/
|
||||
public class SmsDatabase extends MessagingDatabase {
|
||||
public class SmsDatabase extends MessageDatabase {
|
||||
|
||||
private static final String TAG = SmsDatabase.class.getSimpleName();
|
||||
|
||||
@@ -142,6 +142,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
super(context, databaseHelper);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected String getTableName() {
|
||||
return TABLE_NAME;
|
||||
}
|
||||
@@ -175,6 +176,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable RecipientId getOldestGroupUpdateSender(long threadId, long minimumDateReceived) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
|
||||
@@ -193,6 +195,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public long getThreadIdForMessage(long id) {
|
||||
String sql = "SELECT " + THREAD_ID + " FROM " + TABLE_NAME + " WHERE " + ID + " = ?";
|
||||
String[] sqlArgs = new String[] {id+""};
|
||||
@@ -212,21 +215,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
public int getMessageCount() {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
Cursor cursor = null;
|
||||
|
||||
try {
|
||||
cursor = db.query(TABLE_NAME, new String[] {"COUNT(*)"}, null, null, null, null, null);
|
||||
|
||||
if (cursor != null && cursor.moveToFirst()) return cursor.getInt(0);
|
||||
else return 0;
|
||||
} finally {
|
||||
if (cursor != null)
|
||||
cursor.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMessageCountForThreadSummary(long threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
|
||||
@@ -247,6 +236,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMessageCountForThread(long threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
|
||||
@@ -263,6 +253,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getMessageCountForThread(long threadId, long beforeTime) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
|
||||
@@ -279,62 +270,77 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsEndSession(long id) {
|
||||
updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.END_SESSION_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPreKeyBundle(long id) {
|
||||
updateTypeBitmask(id, Types.KEY_EXCHANGE_MASK, Types.KEY_EXCHANGE_BIT | Types.KEY_EXCHANGE_BUNDLE_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInvalidVersionKeyExchange(long id) {
|
||||
updateTypeBitmask(id, 0, Types.KEY_EXCHANGE_INVALID_VERSION_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsSecure(long id) {
|
||||
updateTypeBitmask(id, 0, Types.SECURE_MESSAGE_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInsecure(long id) {
|
||||
updateTypeBitmask(id, Types.SECURE_MESSAGE_BIT, 0);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPush(long id) {
|
||||
updateTypeBitmask(id, 0, Types.PUSH_MESSAGE_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsForcedSms(long id) {
|
||||
updateTypeBitmask(id, Types.PUSH_MESSAGE_BIT, Types.MESSAGE_FORCE_SMS_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsDecryptFailed(long id) {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_FAILED_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsDecryptDuplicate(long id) {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_DUPLICATE_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsNoSession(long id) {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_NO_SESSION_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsUnsupportedProtocolVersion(long id) {
|
||||
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.UNSUPPORTED_MESSAGE_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsInvalidMessage(long id) {
|
||||
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.INVALID_MESSAGE_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsLegacyVersion(long id) {
|
||||
updateTypeBitmask(id, Types.ENCRYPTION_MASK, Types.ENCRYPTION_REMOTE_LEGACY_BIT);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsOutbox(long id) {
|
||||
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_OUTBOX_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsPendingInsecureSmsFallback(long id) {
|
||||
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_PENDING_INSECURE_SMS_FALLBACK);
|
||||
}
|
||||
@@ -349,6 +355,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENDING_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsMissedCall(long id) {
|
||||
updateTypeBitmask(id, Types.TOTAL_MASK, Types.MISSED_CALL_TYPE);
|
||||
}
|
||||
@@ -416,7 +423,8 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
public void markStatus(long id, int status) {
|
||||
@Override
|
||||
public void markSmsStatus(long id, int status) {
|
||||
Log.i(TAG, "Updating ID: " + id + " to status: " + status);
|
||||
ContentValues contentValues = new ContentValues();
|
||||
contentValues.put(STATUS, status);
|
||||
@@ -429,10 +437,12 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
notifyConversationListeners(threadId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsSentFailed(long id) {
|
||||
updateTypeBitmask(id, Types.BASE_TYPE_MASK, Types.BASE_SENT_FAILED_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void markAsNotified(long id) {
|
||||
SQLiteDatabase database = databaseHelper.getWritableDatabase();
|
||||
ContentValues contentValues = new ContentValues();
|
||||
@@ -442,7 +452,8 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
database.update(TABLE_NAME, contentValues, ID_WHERE, new String[] {String.valueOf(id)});
|
||||
}
|
||||
|
||||
public boolean incrementReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) {
|
||||
@Override
|
||||
public boolean incrementSmsReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) {
|
||||
SQLiteDatabase database = databaseHelper.getWritableDatabase();
|
||||
boolean foundMessage = false;
|
||||
|
||||
@@ -487,6 +498,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<Pair<Long, Long>> setTimestampRead(SyncMessageId messageId, long proposedExpireStarted) {
|
||||
SQLiteDatabase database = databaseHelper.getWritableDatabase();
|
||||
List<Pair<Long, Long>> expiring = new LinkedList<>();
|
||||
@@ -531,10 +543,12 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return expiring;
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MarkedMessageInfo> setEntireThreadRead(long threadId) {
|
||||
return setMessagesRead(THREAD_ID + " = ?", new String[] {String.valueOf(threadId)});
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MarkedMessageInfo> setMessagesReadSince(long threadId, long sinceTimestamp) {
|
||||
if (sinceTimestamp == -1) {
|
||||
return setMessagesRead(THREAD_ID + " = ? AND " + READ + " = 0", new String[] {String.valueOf(threadId)});
|
||||
@@ -543,6 +557,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<MarkedMessageInfo> setAllMessagesRead() {
|
||||
return setMessagesRead(READ + " = 0", null);
|
||||
}
|
||||
@@ -584,16 +599,12 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return results;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Pair<Long, Long> updateBundleMessageBody(long messageId, String body) {
|
||||
long type = Types.BASE_INBOX_TYPE | Types.SECURE_MESSAGE_BIT | Types.PUSH_MESSAGE_BIT;
|
||||
return updateMessageBodyAndType(messageId, body, Types.TOTAL_MASK, type);
|
||||
}
|
||||
|
||||
public void updateMessageBody(long messageId, String body) {
|
||||
long type = 0;
|
||||
updateMessageBodyAndType(messageId, body, Types.ENCRYPTION_MASK, type);
|
||||
}
|
||||
|
||||
private Pair<Long, Long> updateMessageBodyAndType(long messageId, String body, long maskOff, long maskOn) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
db.execSQL("UPDATE " + TABLE_NAME + " SET " + BODY + " = ?, " +
|
||||
@@ -610,7 +621,8 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return new Pair<>(messageId, threadId);
|
||||
}
|
||||
|
||||
boolean hasReceivedAnyCallsSince(long threadId, long timestamp) {
|
||||
@Override
|
||||
public boolean hasReceivedAnyCallsSince(long threadId, long timestamp) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
String[] projection = new String[]{SmsDatabase.TYPE};
|
||||
String selection = THREAD_ID + " = ? AND " + DATE_RECEIVED + " > ? AND (" + TYPE + " = ? OR " + TYPE + " = ?)";
|
||||
@@ -624,14 +636,17 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Pair<Long, Long> insertReceivedCall(@NonNull RecipientId address) {
|
||||
return insertCallLog(address, Types.INCOMING_CALL_TYPE, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Pair<Long, Long> insertOutgoingCall(@NonNull RecipientId address) {
|
||||
return insertCallLog(address, Types.OUTGOING_CALL_TYPE, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Pair<Long, Long> insertMissedCall(@NonNull RecipientId address) {
|
||||
return insertCallLog(address, Types.MISSED_CALL_TYPE, true);
|
||||
}
|
||||
@@ -663,6 +678,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return new Pair<>(messageId, threadId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void insertProfileNameChangeMessages(@NonNull Recipient recipient, @NonNull String newProfileName, @NonNull String previousProfileName) {
|
||||
ThreadDatabase threadDatabase = DatabaseFactory.getThreadDatabase(context);
|
||||
List<GroupDatabase.GroupRecord> groupRecords = DatabaseFactory.getGroupDatabase(context).getGroupsContainingMember(recipient.getId(), false);
|
||||
@@ -713,7 +729,8 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
protected Optional<InsertResult> insertMessageInbox(IncomingTextMessage message, long type) {
|
||||
@Override
|
||||
public Optional<InsertResult> insertMessageInbox(IncomingTextMessage message, long type) {
|
||||
if (message.isJoined()) {
|
||||
type = (type & (Types.TOTAL_MASK - Types.BASE_TYPE_MASK)) | Types.JOINED_TYPE;
|
||||
} else if (message.isPreKeyBundle()) {
|
||||
@@ -811,10 +828,12 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<InsertResult> insertMessageInbox(IncomingTextMessage message) {
|
||||
return insertMessageInbox(message, Types.BASE_INBOX_TYPE);
|
||||
}
|
||||
|
||||
@Override
|
||||
public long insertMessageOutbox(long threadId, OutgoingTextMessage message,
|
||||
boolean forceSms, long date, InsertListener insertListener)
|
||||
{
|
||||
@@ -866,17 +885,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
return messageId;
|
||||
}
|
||||
|
||||
Cursor getMessages(int skip, int limit) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
return db.query(TABLE_NAME, MESSAGE_PROJECTION, null, null, null, null, ID, skip + "," + limit);
|
||||
}
|
||||
|
||||
Cursor getOutgoingMessages() {
|
||||
String outgoingSelection = TYPE + " & " + Types.BASE_TYPE_MASK + " = " + Types.BASE_OUTBOX_TYPE;
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
return db.query(TABLE_NAME, MESSAGE_PROJECTION, outgoingSelection, null, null, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor getExpirationStartedMessages() {
|
||||
String where = EXPIRE_STARTED + " > 0";
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
@@ -884,7 +893,7 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
|
||||
@Override
|
||||
public SmsMessageRecord getMessageRecord(long messageId) throws NoSuchMessageException {
|
||||
public SmsMessageRecord getSmsMessage(long messageId) throws NoSuchMessageException {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
Cursor cursor = db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[]{messageId + ""}, null, null, null);
|
||||
Reader reader = new Reader(cursor);
|
||||
@@ -896,38 +905,42 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
else return record;
|
||||
}
|
||||
|
||||
public Cursor getMessageCursor(long messageId) {
|
||||
Cursor cursor = internalGetMessageCursor(messageId);
|
||||
setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cursor getVerboseMessageCursor(long messageId) {
|
||||
Cursor cursor = internalGetMessageCursor(messageId);
|
||||
Cursor cursor = getMessageCursor(messageId);
|
||||
setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId));
|
||||
return cursor;
|
||||
}
|
||||
|
||||
private Cursor internalGetMessageCursor(long messageId) {
|
||||
@Override
|
||||
public Cursor getMessageCursor(long messageId) {
|
||||
SQLiteDatabase db = databaseHelper.getReadableDatabase();
|
||||
Cursor cursor = db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[] {messageId + ""}, null, null, null);
|
||||
return cursor;
|
||||
return db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[] {messageId + ""}, null, null, null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteMessage(long messageId) {
|
||||
Log.i(TAG, "Deleting: " + messageId);
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
long threadId = getThreadIdForMessage(messageId);
|
||||
|
||||
db.delete(TABLE_NAME, ID_WHERE, new String[] {messageId+""});
|
||||
|
||||
boolean threadDeleted = DatabaseFactory.getThreadDatabase(context).update(threadId, false, true);
|
||||
|
||||
notifyConversationListeners(threadId);
|
||||
return threadDeleted;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void ensureMigration() {
|
||||
databaseHelper.getWritableDatabase();
|
||||
}
|
||||
|
||||
@Override
|
||||
public MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException {
|
||||
return getSmsMessage(messageId);
|
||||
}
|
||||
|
||||
private boolean isDuplicate(IncomingTextMessage message, long threadId) {
|
||||
SQLiteDatabase database = databaseHelper.getReadableDatabase();
|
||||
Cursor cursor = database.query(TABLE_NAME, null, DATE_SENT + " = ? AND " + RECIPIENT_ID + " = ? AND " + THREAD_ID + " = ?",
|
||||
@@ -941,12 +954,14 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
/*package */void deleteThread(long threadId) {
|
||||
@Override
|
||||
void deleteThread(long threadId) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
db.delete(TABLE_NAME, THREAD_ID + " = ?", new String[] {threadId+""});
|
||||
}
|
||||
|
||||
/*package*/void deleteMessagesInThreadBeforeDate(long threadId, long date) {
|
||||
@Override
|
||||
void deleteMessagesInThreadBeforeDate(long threadId, long date) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
String where = THREAD_ID + " = ? AND (CASE " + TYPE;
|
||||
|
||||
@@ -959,7 +974,8 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
db.delete(TABLE_NAME, where, new String[] {threadId + ""});
|
||||
}
|
||||
|
||||
/*package*/ void deleteThreads(Set<Long> threadIds) {
|
||||
@Override
|
||||
void deleteThreads(@NonNull Set<Long> threadIds) {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
String where = "";
|
||||
|
||||
@@ -972,23 +988,27 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
db.delete(TABLE_NAME, where, null);
|
||||
}
|
||||
|
||||
/*package */ void deleteAllThreads() {
|
||||
@Override
|
||||
void deleteAllThreads() {
|
||||
SQLiteDatabase db = databaseHelper.getWritableDatabase();
|
||||
db.delete(TABLE_NAME, null, null);
|
||||
}
|
||||
|
||||
/*package*/ SQLiteDatabase beginTransaction() {
|
||||
@Override
|
||||
SQLiteDatabase beginTransaction() {
|
||||
SQLiteDatabase database = databaseHelper.getWritableDatabase();
|
||||
database.beginTransaction();
|
||||
return database;
|
||||
}
|
||||
|
||||
/*package*/ void endTransaction(SQLiteDatabase database) {
|
||||
@Override
|
||||
void endTransaction(SQLiteDatabase database) {
|
||||
database.setTransactionSuccessful();
|
||||
database.endTransaction();
|
||||
}
|
||||
|
||||
/*package*/ SQLiteStatement createInsertStatement(SQLiteDatabase database) {
|
||||
@Override
|
||||
SQLiteStatement createInsertStatement(SQLiteDatabase database) {
|
||||
return database.compileStatement("INSERT INTO " + TABLE_NAME + " (" + RECIPIENT_ID + ", " +
|
||||
PERSON + ", " +
|
||||
DATE_SENT + ", " +
|
||||
@@ -1012,11 +1032,11 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
public static final int STATUS_FAILED = 0x40;
|
||||
}
|
||||
|
||||
public Reader readerFor(Cursor cursor) {
|
||||
public static Reader readerFor(Cursor cursor) {
|
||||
return new Reader(cursor);
|
||||
}
|
||||
|
||||
public OutgoingMessageReader readerFor(OutgoingTextMessage message, long threadId) {
|
||||
public static OutgoingMessageReader readerFor(OutgoingTextMessage message, long threadId) {
|
||||
return new OutgoingMessageReader(message, threadId);
|
||||
}
|
||||
|
||||
@@ -1056,12 +1076,14 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
public class Reader {
|
||||
public static class Reader {
|
||||
|
||||
private final Cursor cursor;
|
||||
private final Cursor cursor;
|
||||
private final Context context;
|
||||
|
||||
public Reader(Cursor cursor) {
|
||||
this.cursor = cursor;
|
||||
this.cursor = cursor;
|
||||
this.context = ApplicationDependencies.getApplication();
|
||||
}
|
||||
|
||||
public SmsMessageRecord getNext() {
|
||||
@@ -1130,8 +1152,4 @@ public class SmsDatabase extends MessagingDatabase {
|
||||
}
|
||||
}
|
||||
|
||||
public interface InsertListener {
|
||||
public void onComplete();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -164,9 +164,9 @@ public class SmsMigrator {
|
||||
ProgressDescription progress,
|
||||
long theirThreadId, long ourThreadId)
|
||||
{
|
||||
SmsDatabase ourSmsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||
Cursor cursor = null;
|
||||
SQLiteStatement statement = null;
|
||||
MessageDatabase ourSmsDatabase = DatabaseFactory.getSmsDatabase(context);
|
||||
Cursor cursor = null;
|
||||
SQLiteStatement statement = null;
|
||||
|
||||
try {
|
||||
Uri uri = Uri.parse("content://sms/conversations/" + theirThreadId);
|
||||
|
||||
@@ -34,8 +34,8 @@ import net.sqlcipher.database.SQLiteDatabase;
|
||||
import org.jsoup.helper.StringUtil;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
|
||||
import org.signal.storageservice.protos.groups.local.DecryptedMember;
|
||||
import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo;
|
||||
import org.thoughtcrime.securesms.database.RecipientDatabase.RecipientSettings;
|
||||
import org.thoughtcrime.securesms.database.MessageDatabase.MarkedMessageInfo;
|
||||
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
|
||||
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord;
|
||||
|
||||
@@ -39,7 +39,7 @@ public class MessageDetailsLoader extends AbstractCursorLoader {
|
||||
case MmsSmsDatabase.SMS_TRANSPORT:
|
||||
return DatabaseFactory.getSmsDatabase(context).getVerboseMessageCursor(messageId);
|
||||
case MmsSmsDatabase.MMS_TRANSPORT:
|
||||
return DatabaseFactory.getMmsDatabase(context).getVerboseMessage(messageId);
|
||||
return DatabaseFactory.getMmsDatabase(context).getVerboseMessageCursor(messageId);
|
||||
default:
|
||||
throw new AssertionError("no valid message type specified");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user