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 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 adapter = ConversationAdapter(
this,
@ -325,18 +332,24 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
}
},
onAttachmentNeedsDownload = { attachmentId, mmsId ->
// Keep track of this specific attachment so we don't download it again
val pair = Pair(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,
lifecycleCoroutineScope = lifecycleScope
)
adapter.visibleMessageViewDelegate = this
// Register an AdapterDataObserver to scroll us to the bottom of the RecyclerView if we're
// already near the the bottom and the data changes.
// Register an AdapterDataObserver to scroll us to the bottom of the RecyclerView for if
// we're already near the the bottom and the data changes.
adapter.registerAdapterDataObserver(ConversationAdapterDataObserver(binding?.conversationRecyclerView!!, adapter))
adapter

View File

@ -305,7 +305,12 @@ public class MmsSmsDatabase extends Database {
}
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 (Cursor cursor = queryTables(PROJECTION, selection, order, null)) {