From dc46d88ddd78dfcda084d2737eb4ac2487add306 Mon Sep 17 00:00:00 2001 From: Cody Henthorne Date: Tue, 9 Jun 2020 11:52:58 -0400 Subject: [PATCH] Provide two ways of listening for thread/message db updates. --- .../securesms/database/Database.java | 13 ++++++- .../database/DatabaseContentProviders.java | 4 ++ .../securesms/database/MediaDatabase.java | 8 ++-- .../securesms/database/MmsDatabase.java | 38 ++++++++++++------- .../securesms/database/MmsSmsDatabase.java | 4 +- .../securesms/database/SearchDatabase.java | 4 +- .../securesms/database/SmsDatabase.java | 31 ++++++++++----- .../securesms/database/ThreadDatabase.java | 7 +--- .../loaders/MessageDetailsLoader.java | 4 +- 9 files changed, 74 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/Database.java b/app/src/main/java/org/thoughtcrime/securesms/database/Database.java index b1fd5eadb2..b5f04dbaf3 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/Database.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/Database.java @@ -44,6 +44,11 @@ public abstract class Database { protected void notifyConversationListeners(long threadId) { context.getContentResolver().notifyChange(DatabaseContentProviders.Conversation.getUriForThread(threadId), null); + notifyVerboseConversationListeners(threadId); + } + + protected void notifyVerboseConversationListeners(long threadId) { + context.getContentResolver().notifyChange(DatabaseContentProviders.Conversation.getVerboseUriForThread(threadId), null); } protected void notifyConversationListListeners() { @@ -58,11 +63,15 @@ public abstract class Database { context.getContentResolver().notifyChange(DatabaseContentProviders.StickerPack.CONTENT_URI, null); } - protected void setNotifyConverationListeners(Cursor cursor, long threadId) { + protected void setNotifyConversationListeners(Cursor cursor, long threadId) { cursor.setNotificationUri(context.getContentResolver(), DatabaseContentProviders.Conversation.getUriForThread(threadId)); } - protected void setNotifyConverationListListeners(Cursor cursor) { + protected void setNotifyVerboseConversationListeners(Cursor cursor, long threadId) { + cursor.setNotificationUri(context.getContentResolver(), DatabaseContentProviders.Conversation.getVerboseUriForThread(threadId)); + } + + protected void setNotifyConversationListListeners(Cursor cursor) { cursor.setNotificationUri(context.getContentResolver(), DatabaseContentProviders.ConversationList.CONTENT_URI); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java index 81a9645900..422a455fe0 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/DatabaseContentProviders.java @@ -23,6 +23,10 @@ public class DatabaseContentProviders { public static Uri getUriForThread(long threadId) { return Uri.parse(CONTENT_URI_STRING + threadId); } + + public static Uri getVerboseUriForThread(long threadId) { + return Uri.parse(CONTENT_URI_STRING + "verbose/" + threadId); + } } public static class Attachment extends NoopContentProvider { diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java index 4bbc41350d..534822788d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MediaDatabase.java @@ -92,7 +92,7 @@ public class MediaDatabase extends Database { String query = sorting.applyToQuery(applyEqualityOperator(threadId, GALLERY_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); - setNotifyConverationListeners(cursor, threadId); + setNotifyConversationListeners(cursor, threadId); return cursor; } @@ -101,7 +101,7 @@ public class MediaDatabase extends Database { String query = sorting.applyToQuery(applyEqualityOperator(threadId, DOCUMENT_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); - setNotifyConverationListeners(cursor, threadId); + setNotifyConversationListeners(cursor, threadId); return cursor; } @@ -110,7 +110,7 @@ public class MediaDatabase extends Database { String query = sorting.applyToQuery(applyEqualityOperator(threadId, AUDIO_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); - setNotifyConverationListeners(cursor, threadId); + setNotifyConversationListeners(cursor, threadId); return cursor; } @@ -119,7 +119,7 @@ public class MediaDatabase extends Database { String query = sorting.applyToQuery(applyEqualityOperator(threadId, ALL_MEDIA_QUERY)); String[] args = {threadId + ""}; Cursor cursor = database.rawQuery(query, args); - setNotifyConverationListeners(cursor, threadId); + setNotifyConversationListeners(cursor, threadId); return cursor; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java index a5be861ae3..e583740f6a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsDatabase.java @@ -338,12 +338,11 @@ public class MmsDatabase extends MessagingDatabase { public boolean incrementReceiptCount(SyncMessageId messageId, long timestamp, boolean deliveryReceipt) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); - Cursor cursor = null; boolean found = false; - try { - cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX, RECIPIENT_ID}, DATE_SENT + " = ?", new String[] {String.valueOf(messageId.getTimetamp())}, null, null, null, null); - + try (Cursor cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, MESSAGE_BOX, RECIPIENT_ID, DELIVERY_RECEIPT_COUNT, READ_RECEIPT_COUNT}, + DATE_SENT + " = ?", new String[] {String.valueOf(messageId.getTimetamp())}, + null, null, null, null)) { while (cursor.moveToNext()) { if (Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(MESSAGE_BOX)))) { RecipientId theirRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID))); @@ -351,9 +350,10 @@ public class MmsDatabase extends MessagingDatabase { String columnName = deliveryReceipt ? DELIVERY_RECEIPT_COUNT : READ_RECEIPT_COUNT; if (ourRecipientId.equals(theirRecipientId) || Recipient.resolved(theirRecipientId).isGroup()) { - long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); - long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); - int status = deliveryReceipt ? GroupReceiptDatabase.STATUS_DELIVERED : GroupReceiptDatabase.STATUS_READ; + long id = cursor.getLong(cursor.getColumnIndexOrThrow(ID)); + long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); + int status = deliveryReceipt ? GroupReceiptDatabase.STATUS_DELIVERED : GroupReceiptDatabase.STATUS_READ; + boolean isFirstIncrement = cursor.getLong(cursor.getColumnIndexOrThrow(columnName)) == 0; found = true; @@ -363,7 +363,12 @@ public class MmsDatabase extends MessagingDatabase { DatabaseFactory.getGroupReceiptDatabase(context).update(ourRecipientId, id, status, timestamp); DatabaseFactory.getThreadDatabase(context).update(threadId, false); - notifyConversationListeners(threadId); + + if (isFirstIncrement) { + notifyConversationListeners(threadId); + } else { + notifyVerboseConversationListeners(threadId); + } } } } @@ -374,9 +379,6 @@ public class MmsDatabase extends MessagingDatabase { } return found; - } finally { - if (cursor != null) - cursor.close(); } } @@ -427,11 +429,21 @@ public class MmsDatabase extends MessagingDatabase { } public Cursor getMessage(long messageId) { - Cursor cursor = rawQuery(RAW_ID_WHERE, new String[] {messageId + ""}); - setNotifyConverationListeners(cursor, getThreadIdForMessage(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 + ""}); + } + public MessageRecord getMessageRecord(long messageId) throws NoSuchMessageException { try (Cursor cursor = rawQuery(RAW_ID_WHERE, new String[] {messageId + ""})) { MessageRecord record = new Reader(cursor).getNext(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java index 8daa21c9a7..5d401f75fd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -162,7 +162,7 @@ public class MmsSmsDatabase extends Database { String limitStr = limit > 0 || offset > 0 ? offset + ", " + limit : null; Cursor cursor = queryTables(PROJECTION, selection, order, limitStr); - setNotifyConverationListeners(cursor, threadId); + setNotifyConversationListeners(cursor, threadId); return cursor; } @@ -176,7 +176,7 @@ public class MmsSmsDatabase extends Database { String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsSmsColumns.MISMATCHED_IDENTITIES + " IS NOT NULL"; Cursor cursor = queryTables(PROJECTION, selection, order, null); - setNotifyConverationListeners(cursor, threadId); + setNotifyConversationListeners(cursor, threadId); return cursor; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java index 5a46fa09a6..ee59015b73 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SearchDatabase.java @@ -121,7 +121,7 @@ public class SearchDatabase extends Database { Cursor cursor = db.rawQuery(MESSAGES_QUERY, new String[] { fullTextSearchQuery, fullTextSearchQuery }); - setNotifyConverationListListeners(cursor); + setNotifyConversationListListeners(cursor); return cursor; } @@ -138,7 +138,7 @@ public class SearchDatabase extends Database { fullTextSearchQuery, String.valueOf(threadId) }); - setNotifyConverationListListeners(cursor); + setNotifyConversationListListeners(cursor); return cursor; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java index d5462b2d2a..3a47a65fb1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/SmsDatabase.java @@ -414,19 +414,18 @@ public class SmsDatabase extends MessagingDatabase { public boolean incrementReceiptCount(SyncMessageId messageId, boolean deliveryReceipt) { SQLiteDatabase database = databaseHelper.getWritableDatabase(); - Cursor cursor = null; boolean foundMessage = false; - try { - cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, RECIPIENT_ID, TYPE}, + try (Cursor cursor = database.query(TABLE_NAME, new String[] {ID, THREAD_ID, RECIPIENT_ID, TYPE, DELIVERY_RECEIPT_COUNT, READ_RECEIPT_COUNT}, DATE_SENT + " = ?", new String[] {String.valueOf(messageId.getTimetamp())}, - null, null, null, null); + null, null, null, null)) { while (cursor.moveToNext()) { if (Types.isOutgoingMessageType(cursor.getLong(cursor.getColumnIndexOrThrow(TYPE)))) { RecipientId theirRecipientId = messageId.getRecipientId(); RecipientId outRecipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID))); String columnName = deliveryReceipt ? DELIVERY_RECEIPT_COUNT : READ_RECEIPT_COUNT; + boolean isFirstIncrement = cursor.getLong(cursor.getColumnIndexOrThrow(columnName)) == 0; if (outRecipientId.equals(theirRecipientId)) { long threadId = cursor.getLong(cursor.getColumnIndexOrThrow(THREAD_ID)); @@ -437,7 +436,13 @@ public class SmsDatabase extends MessagingDatabase { new String[] {String.valueOf(cursor.getLong(cursor.getColumnIndexOrThrow(ID)))}); DatabaseFactory.getThreadDatabase(context).update(threadId, false); - notifyConversationListeners(threadId); + + if (isFirstIncrement) { + notifyConversationListeners(threadId); + } else { + notifyVerboseConversationListeners(threadId); + } + foundMessage = true; } } @@ -449,9 +454,6 @@ public class SmsDatabase extends MessagingDatabase { } return foundMessage; - } finally { - if (cursor != null) - cursor.close(); } } @@ -810,9 +812,20 @@ public class SmsDatabase extends MessagingDatabase { } public Cursor getMessageCursor(long messageId) { + Cursor cursor = internalGetMessageCursor(messageId); + setNotifyConversationListeners(cursor, getThreadIdForMessage(messageId)); + return cursor; + } + + public Cursor getVerboseMessageCursor(long messageId) { + Cursor cursor = internalGetMessageCursor(messageId); + setNotifyVerboseConversationListeners(cursor, getThreadIdForMessage(messageId)); + return cursor; + } + + private Cursor internalGetMessageCursor(long messageId) { SQLiteDatabase db = databaseHelper.getReadableDatabase(); Cursor cursor = db.query(TABLE_NAME, MESSAGE_PROJECTION, ID_WHERE, new String[] {messageId + ""}, null, null, null); - setNotifyConverationListeners(cursor, getThreadIdForMessage(messageId)); return cursor; } 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 f98ebf8523..c74c64eb77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/ThreadDatabase.java @@ -32,8 +32,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import net.sqlcipher.database.SQLiteDatabase; import org.signal.storageservice.protos.groups.local.DecryptedGroup; -import org.thoughtcrime.securesms.contactshare.Contact; -import org.thoughtcrime.securesms.contactshare.ContactUtil; import org.thoughtcrime.securesms.database.MessagingDatabase.MarkedMessageInfo; import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper; import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord; @@ -63,7 +61,6 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Set; import java.util.UUID; @@ -440,7 +437,7 @@ public class ThreadDatabase extends Database { } Cursor cursor = cursors.size() > 1 ? new MergeCursor(cursors.toArray(new Cursor[cursors.size()])) : cursors.get(0); - setNotifyConverationListListeners(cursor); + setNotifyConversationListListeners(cursor); return cursor; } @@ -549,7 +546,7 @@ public class ThreadDatabase extends Database { String query = createQuery(ARCHIVED + " = ? AND " + MESSAGE_COUNT + " != 0", 0); Cursor cursor = db.rawQuery(query, new String[]{archived}); - setNotifyConverationListListeners(cursor); + setNotifyConversationListListeners(cursor); return cursor; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java index 06b45567b4..d833661f30 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/loaders/MessageDetailsLoader.java @@ -37,9 +37,9 @@ public class MessageDetailsLoader extends AbstractCursorLoader { public Cursor getCursor() { switch (type) { case MmsSmsDatabase.SMS_TRANSPORT: - return DatabaseFactory.getSmsDatabase(context).getMessageCursor(messageId); + return DatabaseFactory.getSmsDatabase(context).getVerboseMessageCursor(messageId); case MmsSmsDatabase.MMS_TRANSPORT: - return DatabaseFactory.getMmsDatabase(context).getMessage(messageId); + return DatabaseFactory.getMmsDatabase(context).getVerboseMessage(messageId); default: throw new AssertionError("no valid message type specified"); }