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 b938231492..d0bf86bb22 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java +++ b/app/src/main/java/org/thoughtcrime/securesms/database/MmsSmsDatabase.java @@ -438,7 +438,7 @@ public class MmsSmsDatabase extends Database { private @NonNull Collection incrementReceiptCounts(@NonNull List syncMessageIds, long timestamp, @NonNull MessageDatabase.ReceiptType receiptType) { SQLiteDatabase db = databaseHelper.getSignalWritableDatabase(); ThreadDatabase threadDatabase = SignalDatabase.threads(); - Set messageUpdates = new HashSet<>(); + Set messageUpdates = new HashSet<>(); Collection unhandled = new HashSet<>(); db.beginTransaction(); @@ -455,16 +455,14 @@ public class MmsSmsDatabase extends Database { for (MessageUpdate update : messageUpdates) { threadDatabase.updateSilently(update.getThreadId(), false); + ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(update.getMessageId()); + ApplicationDependencies.getDatabaseObserver().notifyVerboseConversationListeners(Collections.singleton(update.getThreadId())); } db.setTransactionSuccessful(); } finally { db.endTransaction(); - for (MessageUpdate messageUpdate : messageUpdates) { - ApplicationDependencies.getDatabaseObserver().notifyMessageUpdateObservers(messageUpdate.getMessageId()); - } - if (messageUpdates.size() > 0) { notifyConversationListListeners(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java index d3ff5cac38..dac264e506 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageDetailsRepository.java @@ -12,9 +12,11 @@ import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.conversation.ConversationMessage.ConversationMessageFactory; import org.thoughtcrime.securesms.database.GroupDatabase; import org.thoughtcrime.securesms.database.GroupReceiptDatabase; +import org.thoughtcrime.securesms.database.MmsSmsDatabase; import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.documents.IdentityKeyMismatch; import org.thoughtcrime.securesms.database.documents.NetworkFailure; +import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.recipients.Recipient; @@ -27,7 +29,7 @@ final class MessageDetailsRepository { private final Context context = ApplicationDependencies.getApplication(); @NonNull LiveData getMessageRecord(String type, Long messageId) { - return new MessageRecordLiveData(context, type, messageId); + return new MessageRecordLiveData(new MessageId(messageId, type.equals(MmsSmsDatabase.MMS_TRANSPORT))); } @NonNull LiveData getMessageDetails(@Nullable MessageRecord messageRecord) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java index 11a7806727..6cda0db87a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java +++ b/app/src/main/java/org/thoughtcrime/securesms/messagedetails/MessageRecordLiveData.java @@ -1,104 +1,51 @@ package org.thoughtcrime.securesms.messagedetails; -import android.content.Context; -import android.database.Cursor; - -import androidx.annotation.Nullable; import androidx.annotation.WorkerThread; import androidx.lifecycle.LiveData; import org.signal.core.util.concurrent.SignalExecutors; import org.thoughtcrime.securesms.database.DatabaseObserver; import org.thoughtcrime.securesms.database.MessageDatabase; -import org.thoughtcrime.securesms.database.MmsDatabase; import org.thoughtcrime.securesms.database.MmsSmsDatabase; +import org.thoughtcrime.securesms.database.NoSuchMessageException; import org.thoughtcrime.securesms.database.SignalDatabase; -import org.thoughtcrime.securesms.database.SmsDatabase; +import org.thoughtcrime.securesms.database.model.MessageId; import org.thoughtcrime.securesms.database.model.MessageRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; final class MessageRecordLiveData extends LiveData { - private final Context context; - private final String type; - private final Long messageId; private final DatabaseObserver.Observer observer; + private final MessageId messageId; - private @Nullable Cursor cursor; - - MessageRecordLiveData(Context context, String type, Long messageId) { - this.context = context; - this.type = type; + MessageRecordLiveData(MessageId messageId) { this.messageId = messageId; - this.observer = () -> SignalExecutors.BOUNDED.execute(this::resetCursor); + this.observer = this::retrieveMessageRecordActual; } @Override protected void onActive() { - retrieveMessageRecord(); + SignalExecutors.BOUNDED_IO.execute(this::retrieveMessageRecordActual); } @Override protected void onInactive() { - SignalExecutors.BOUNDED.execute(this::destroyCursor); - } - - private void retrieveMessageRecord() { - SignalExecutors.BOUNDED.execute(this::retrieveMessageRecordActual); - } - - @WorkerThread - private synchronized void destroyCursor() { ApplicationDependencies.getDatabaseObserver().unregisterObserver(observer); - - if (cursor != null) { - cursor.close(); - cursor = null; - } - } - - @WorkerThread - private synchronized void resetCursor() { - destroyCursor(); - retrieveMessageRecord(); } @WorkerThread private synchronized void retrieveMessageRecordActual() { - if (cursor != null) { - return; - } - switch (type) { - case MmsSmsDatabase.SMS_TRANSPORT: - handleSms(); - break; - case MmsSmsDatabase.MMS_TRANSPORT: - handleMms(); - break; - default: - throw new AssertionError("no valid message type specified"); - } + retrieve(messageId.isMms() ? SignalDatabase.mms() : SignalDatabase.sms()); } @WorkerThread - private synchronized void handleSms() { - final MessageDatabase db = SignalDatabase.sms(); - final Cursor cursor = db.getMessageCursor(messageId); - final MessageRecord record = SmsDatabase.readerFor(cursor).getNext(); - - postValue(record); - ApplicationDependencies.getDatabaseObserver().registerVerboseConversationObserver(record.getThreadId(), observer); - this.cursor = cursor; - } - - @WorkerThread - private synchronized void handleMms() { - final MessageDatabase db = SignalDatabase.mms(); - final Cursor cursor = db.getMessageCursor(messageId); - final MessageRecord record = MmsDatabase.readerFor(cursor).getNext(); - - postValue(record); - ApplicationDependencies.getDatabaseObserver().registerVerboseConversationObserver(record.getThreadId(), observer); - this.cursor = cursor; + private synchronized void retrieve(MessageDatabase messageDatabase) { + try { + final MessageRecord record = messageDatabase.getMessageRecord(messageId.getId()); + postValue(record); + ApplicationDependencies.getDatabaseObserver().registerVerboseConversationObserver(record.getThreadId(), observer); + } catch (NoSuchMessageException ignored) { + postValue(null); + } } }