This commit is contained in:
alansley 2024-05-15 13:09:18 +10:00 committed by Andrew
parent 1354bccb59
commit 8c31c83fc5
2 changed files with 24 additions and 6 deletions

View File

@ -298,6 +298,13 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
private val reverseMessageList = false private val reverseMessageList = false
private val adapter by lazy { private val adapter by lazy {
// To prevent repeated attachment download jobs being spawned we'll keep a set of what
// attachmentId / mmsId pairs we've already attempted to download and only spawn the job
// if we haven't already done so. Without this then when the retry limit for a failed job
// hits another job is immediately spawned (endlessly).
var alreadyAttemptedAttachmentDownloadPairs = mutableSetOf<Pair<Long, Long>>()
val cursor = mmsSmsDb.getConversation(viewModel.threadId, reverseMessageList) val cursor = mmsSmsDb.getConversation(viewModel.threadId, reverseMessageList)
val adapter = ConversationAdapter( val adapter = ConversationAdapter(
this, this,
@ -325,9 +332,15 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
} }
}, },
onAttachmentNeedsDownload = { attachmentId, mmsId -> onAttachmentNeedsDownload = { attachmentId, mmsId ->
// Start download (on IO thread) // Keep track of this specific attachment so we don't download it again
lifecycleScope.launch(Dispatchers.IO) { val pair = Pair(attachmentId, mmsId)
JobQueue.shared.add(AttachmentDownloadJob(attachmentId, mmsId)) if (!alreadyAttemptedAttachmentDownloadPairs.contains(pair)) {
alreadyAttemptedAttachmentDownloadPairs.add(pair)
// Start download (on IO thread)
lifecycleScope.launch(Dispatchers.IO) {
JobQueue.shared.add(AttachmentDownloadJob(attachmentId, mmsId))
}
} }
}, },
glide = glide, glide = glide,
@ -335,8 +348,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
) )
adapter.visibleMessageViewDelegate = this adapter.visibleMessageViewDelegate = this
// Register an AdapterDataObserver to scroll us to the bottom of the RecyclerView if we're // Register an AdapterDataObserver to scroll us to the bottom of the RecyclerView for if
// already near the the bottom and the data changes. // we're already near the the bottom and the data changes.
adapter.registerAdapterDataObserver(ConversationAdapterDataObserver(binding?.conversationRecyclerView!!, adapter)) adapter.registerAdapterDataObserver(ConversationAdapterDataObserver(binding?.conversationRecyclerView!!, adapter))
adapter adapter

View File

@ -305,7 +305,12 @@ public class MmsSmsDatabase extends Database {
} }
String order = MmsSmsColumns.NORMALIZED_DATE_SENT + " DESC"; String order = MmsSmsColumns.NORMALIZED_DATE_SENT + " DESC";
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId;
// As the MmsSmsDatabase.ADDRESS column never contains the sender address we have to get creative to filter down all the
// messages that have been sent without interrogating each MessageRecord returned by the cursor. One way to do this is
// via the fact that the `ADDRESS_DEVICE_ID` is always null for incoming messages, but always has a value (such as 1) for
// outgoing messages - so we'll filter our query for only records with non-null ADDRESS_DEVICE_IDs in the current thread.
String selection = MmsSmsColumns.THREAD_ID + " = " + threadId + " AND " + MmsSmsColumns.ADDRESS_DEVICE_ID + " IS NOT NULL";
// Try everything with resources so that they auto-close on end of scope // Try everything with resources so that they auto-close on end of scope
try (Cursor cursor = queryTables(PROJECTION, selection, order, null)) { try (Cursor cursor = queryTables(PROJECTION, selection, order, null)) {