mirror of
https://github.com/oxen-io/session-android.git
synced 2025-02-17 11:48:25 +00:00
Remove unused ConversationPager
This commit is contained in:
parent
2fc686ce73
commit
5e1b5b393c
@ -1,129 +0,0 @@
|
||||
package org.thoughtcrime.securesms.conversation.paging
|
||||
|
||||
import androidx.annotation.WorkerThread
|
||||
import androidx.paging.Pager
|
||||
import androidx.paging.PagingConfig
|
||||
import androidx.paging.PagingSource
|
||||
import androidx.paging.PagingState
|
||||
import androidx.recyclerview.widget.DiffUtil
|
||||
import kotlinx.coroutines.Dispatchers
|
||||
import kotlinx.coroutines.withContext
|
||||
import org.session.libsession.messaging.contacts.Contact
|
||||
import org.thoughtcrime.securesms.database.MmsSmsDatabase
|
||||
import org.thoughtcrime.securesms.database.SessionContactDatabase
|
||||
import org.thoughtcrime.securesms.database.model.MessageRecord
|
||||
|
||||
private const val TIME_BUCKET = 600000L // bucket into 10 minute increments
|
||||
|
||||
private fun config() = PagingConfig(
|
||||
pageSize = 25,
|
||||
maxSize = 100,
|
||||
enablePlaceholders = false
|
||||
)
|
||||
|
||||
fun Long.bucketed(): Long = (TIME_BUCKET - this % TIME_BUCKET) + this
|
||||
|
||||
fun conversationPager(threadId: Long, initialKey: PageLoad? = null, db: MmsSmsDatabase, contactDb: SessionContactDatabase) = Pager(config(), initialKey = initialKey) {
|
||||
ConversationPagingSource(threadId, db, contactDb)
|
||||
}
|
||||
|
||||
class ConversationPagerDiffCallback: DiffUtil.ItemCallback<MessageAndContact>() {
|
||||
override fun areItemsTheSame(oldItem: MessageAndContact, newItem: MessageAndContact): Boolean =
|
||||
oldItem.message.id == newItem.message.id && oldItem.message.isMms == newItem.message.isMms
|
||||
|
||||
override fun areContentsTheSame(oldItem: MessageAndContact, newItem: MessageAndContact): Boolean =
|
||||
oldItem == newItem
|
||||
}
|
||||
|
||||
data class MessageAndContact(val message: MessageRecord,
|
||||
val contact: Contact?)
|
||||
|
||||
data class PageLoad(val fromTime: Long, val toTime: Long? = null)
|
||||
|
||||
class ConversationPagingSource(
|
||||
private val threadId: Long,
|
||||
private val messageDb: MmsSmsDatabase,
|
||||
private val contactDb: SessionContactDatabase
|
||||
): PagingSource<PageLoad, MessageAndContact>() {
|
||||
|
||||
override fun getRefreshKey(state: PagingState<PageLoad, MessageAndContact>): PageLoad? {
|
||||
val anchorPosition = state.anchorPosition ?: return null
|
||||
val anchorPage = state.closestPageToPosition(anchorPosition) ?: return null
|
||||
val next = anchorPage.nextKey?.fromTime
|
||||
val previous = anchorPage.prevKey?.fromTime ?: anchorPage.data.firstOrNull()?.message?.dateSent ?: return null
|
||||
return PageLoad(previous, next)
|
||||
}
|
||||
|
||||
private val contactCache = mutableMapOf<String, Contact>()
|
||||
|
||||
@WorkerThread
|
||||
private fun getContact(sessionId: String): Contact? {
|
||||
contactCache[sessionId]?.let { contact ->
|
||||
return contact
|
||||
} ?: run {
|
||||
contactDb.getContactWithSessionID(sessionId)?.let { contact ->
|
||||
contactCache[sessionId] = contact
|
||||
return contact
|
||||
}
|
||||
}
|
||||
return null
|
||||
}
|
||||
|
||||
override suspend fun load(params: LoadParams<PageLoad>): LoadResult<PageLoad, MessageAndContact> {
|
||||
val pageLoad = params.key ?: withContext(Dispatchers.IO) {
|
||||
messageDb.getConversationSnippet(threadId).use {
|
||||
val reader = messageDb.readerFor(it)
|
||||
var record: MessageRecord? = null
|
||||
if (reader != null) {
|
||||
record = reader.next
|
||||
while (record != null && record.isDeleted) {
|
||||
record = reader.next
|
||||
}
|
||||
}
|
||||
record?.dateSent?.let { fromTime ->
|
||||
PageLoad(fromTime)
|
||||
}
|
||||
}
|
||||
} ?: return LoadResult.Page(emptyList(), null, null)
|
||||
|
||||
val result = withContext(Dispatchers.IO) {
|
||||
val cursor = messageDb.getConversationPage(
|
||||
threadId,
|
||||
pageLoad.fromTime,
|
||||
pageLoad.toTime ?: -1L,
|
||||
params.loadSize
|
||||
)
|
||||
val processedList = mutableListOf<MessageAndContact>()
|
||||
val reader = messageDb.readerFor(cursor)
|
||||
while (reader.next != null && !invalid) {
|
||||
reader.current?.let { item ->
|
||||
val contact = getContact(item.individualRecipient.address.serialize())
|
||||
processedList += MessageAndContact(item, contact)
|
||||
}
|
||||
}
|
||||
reader.close()
|
||||
processedList.toMutableList()
|
||||
}
|
||||
|
||||
val hasNext = withContext(Dispatchers.IO) {
|
||||
if (result.isEmpty()) return@withContext false
|
||||
val lastTime = result.last().message.dateSent
|
||||
messageDb.hasNextPage(threadId, lastTime)
|
||||
}
|
||||
|
||||
val nextCheckTime = if (hasNext) {
|
||||
val lastSent = result.last().message.dateSent
|
||||
if (lastSent == pageLoad.fromTime) null else lastSent
|
||||
} else null
|
||||
|
||||
val hasPrevious = withContext(Dispatchers.IO) { messageDb.hasPreviousPage(threadId, pageLoad.fromTime) }
|
||||
val nextKey = if (!hasNext) null else nextCheckTime
|
||||
val prevKey = if (!hasPrevious) null else messageDb.getPreviousPage(threadId, pageLoad.fromTime, params.loadSize)
|
||||
|
||||
return LoadResult.Page(
|
||||
data = result, // next check time is not null if drop is true
|
||||
prevKey = prevKey?.let { PageLoad(it, pageLoad.fromTime) },
|
||||
nextKey = nextKey?.let { PageLoad(it) }
|
||||
)
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user