mirror of
https://github.com/SimpleMobileTools/Simple-SMS-Messenger.git
synced 2025-06-05 21:49:22 +02:00
Merge pull request #356 from pavelpoley/task/older-messages
Allow displaying older messages
This commit is contained in:
@@ -40,6 +40,7 @@ import com.simplemobiletools.commons.extensions.*
|
|||||||
import com.simplemobiletools.commons.helpers.*
|
import com.simplemobiletools.commons.helpers.*
|
||||||
import com.simplemobiletools.commons.models.PhoneNumber
|
import com.simplemobiletools.commons.models.PhoneNumber
|
||||||
import com.simplemobiletools.commons.models.SimpleContact
|
import com.simplemobiletools.commons.models.SimpleContact
|
||||||
|
import com.simplemobiletools.commons.views.MyRecyclerView
|
||||||
import com.simplemobiletools.smsmessenger.R
|
import com.simplemobiletools.smsmessenger.R
|
||||||
import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
|
import com.simplemobiletools.smsmessenger.adapters.AutoCompleteTextViewAdapter
|
||||||
import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter
|
import com.simplemobiletools.smsmessenger.adapters.ThreadAdapter
|
||||||
@@ -75,6 +76,9 @@ class ThreadActivity : SimpleActivity() {
|
|||||||
private var attachmentSelections = mutableMapOf<String, AttachmentSelection>()
|
private var attachmentSelections = mutableMapOf<String, AttachmentSelection>()
|
||||||
private val imageCompressor by lazy { ImageCompressor(this) }
|
private val imageCompressor by lazy { ImageCompressor(this) }
|
||||||
private var lastAttachmentUri: String? = null
|
private var lastAttachmentUri: String? = null
|
||||||
|
private var loadingOlderMessages = false
|
||||||
|
private var allMessagesFetched = false
|
||||||
|
private var oldestMessageDate = -1
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
super.onCreate(savedInstanceState)
|
super.onCreate(savedInstanceState)
|
||||||
@@ -320,6 +324,14 @@ class ThreadActivity : SimpleActivity() {
|
|||||||
}.apply {
|
}.apply {
|
||||||
thread_messages_list.adapter = this
|
thread_messages_list.adapter = this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
thread_messages_list.endlessScrollListener = object : MyRecyclerView.EndlessScrollListener {
|
||||||
|
override fun updateBottom() {}
|
||||||
|
|
||||||
|
override fun updateTop() {
|
||||||
|
fetchNextMessages()
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
(currAdapter as ThreadAdapter).updateMessages(threadItems)
|
(currAdapter as ThreadAdapter).updateMessages(threadItems)
|
||||||
}
|
}
|
||||||
@@ -351,6 +363,39 @@ class ThreadActivity : SimpleActivity() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun fetchNextMessages() {
|
||||||
|
if (messages.isEmpty() || allMessagesFetched || loadingOlderMessages) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
val dateOfFirstItem = messages.first().date
|
||||||
|
if (oldestMessageDate == dateOfFirstItem) {
|
||||||
|
allMessagesFetched = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
oldestMessageDate = dateOfFirstItem
|
||||||
|
loadingOlderMessages = true
|
||||||
|
|
||||||
|
ensureBackgroundThread {
|
||||||
|
val firstItem = messages.first()
|
||||||
|
val olderMessages = getMessages(threadId, true, oldestMessageDate)
|
||||||
|
|
||||||
|
messages.addAll(0, olderMessages)
|
||||||
|
threadItems = getThreadItems()
|
||||||
|
|
||||||
|
allMessagesFetched = olderMessages.size < MESSAGES_LIMIT || olderMessages.size == 0
|
||||||
|
|
||||||
|
runOnUiThread {
|
||||||
|
loadingOlderMessages = false
|
||||||
|
val itemAtRefreshIndex = threadItems.indexOfFirst { it == firstItem }
|
||||||
|
(thread_messages_list.adapter as ThreadAdapter).apply {
|
||||||
|
updateMessages(threadItems, itemAtRefreshIndex)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private fun setupButtons() {
|
private fun setupButtons() {
|
||||||
updateTextColors(thread_holder)
|
updateTextColors(thread_holder)
|
||||||
val textColor = getProperTextColor()
|
val textColor = getProperTextColor()
|
||||||
@@ -985,6 +1030,9 @@ class ThreadActivity : SimpleActivity() {
|
|||||||
@Subscribe(threadMode = ThreadMode.ASYNC)
|
@Subscribe(threadMode = ThreadMode.ASYNC)
|
||||||
fun refreshMessages(event: Events.RefreshMessages) {
|
fun refreshMessages(event: Events.RefreshMessages) {
|
||||||
refreshedSinceSent = true
|
refreshedSinceSent = true
|
||||||
|
allMessagesFetched = false
|
||||||
|
oldestMessageDate = -1
|
||||||
|
|
||||||
if (isActivityVisible) {
|
if (isActivityVisible) {
|
||||||
notificationManager.cancel(threadId.hashCode())
|
notificationManager.cancel(threadId.hashCode())
|
||||||
}
|
}
|
||||||
|
@@ -231,14 +231,14 @@ class ThreadAdapter(
|
|||||||
|
|
||||||
private fun isThreadDateTime(position: Int) = messages.getOrNull(position) is ThreadDateTime
|
private fun isThreadDateTime(position: Int) = messages.getOrNull(position) is ThreadDateTime
|
||||||
|
|
||||||
fun updateMessages(newMessages: ArrayList<ThreadItem>) {
|
fun updateMessages(newMessages: ArrayList<ThreadItem>, scrollPosition: Int = newMessages.size - 1) {
|
||||||
val latestMessages = newMessages.clone() as ArrayList<ThreadItem>
|
val latestMessages = newMessages.clone() as ArrayList<ThreadItem>
|
||||||
val oldHashCode = messages.hashCode()
|
val oldHashCode = messages.hashCode()
|
||||||
val newHashCode = latestMessages.hashCode()
|
val newHashCode = latestMessages.hashCode()
|
||||||
if (newHashCode != oldHashCode) {
|
if (newHashCode != oldHashCode) {
|
||||||
messages = latestMessages
|
messages = latestMessages
|
||||||
notifyDataSetChanged()
|
notifyDataSetChanged()
|
||||||
recyclerView.scrollToPosition(messages.size - 1)
|
recyclerView.scrollToPosition(scrollPosition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -56,7 +56,7 @@ val Context.messageAttachmentsDB: MessageAttachmentsDao get() = getMessagessDB()
|
|||||||
|
|
||||||
val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao()
|
val Context.messagesDB: MessagesDao get() = getMessagessDB().MessagesDao()
|
||||||
|
|
||||||
fun Context.getMessages(threadId: Long, getImageResolutions: Boolean): ArrayList<Message> {
|
fun Context.getMessages(threadId: Long, getImageResolutions: Boolean, dateFrom: Int = -1): ArrayList<Message> {
|
||||||
val uri = Sms.CONTENT_URI
|
val uri = Sms.CONTENT_URI
|
||||||
val projection = arrayOf(
|
val projection = arrayOf(
|
||||||
Sms._ID,
|
Sms._ID,
|
||||||
@@ -70,9 +70,10 @@ fun Context.getMessages(threadId: Long, getImageResolutions: Boolean): ArrayList
|
|||||||
Sms.STATUS
|
Sms.STATUS
|
||||||
)
|
)
|
||||||
|
|
||||||
val selection = "${Sms.THREAD_ID} = ?"
|
val rangeQuery = if (dateFrom == -1) "" else "AND ${Sms.DATE} < ${dateFrom.toLong() * 1000}"
|
||||||
|
val selection = "${Sms.THREAD_ID} = ? $rangeQuery"
|
||||||
val selectionArgs = arrayOf(threadId.toString())
|
val selectionArgs = arrayOf(threadId.toString())
|
||||||
val sortOrder = "${Sms._ID} DESC LIMIT 100"
|
val sortOrder = "${Sms.DATE} DESC LIMIT $MESSAGES_LIMIT"
|
||||||
|
|
||||||
val blockStatus = HashMap<String, Boolean>()
|
val blockStatus = HashMap<String, Boolean>()
|
||||||
val blockedNumbers = getBlockedNumbers()
|
val blockedNumbers = getBlockedNumbers()
|
||||||
|
@@ -54,6 +54,8 @@ const val FILE_SIZE_600_KB = 614_400L
|
|||||||
const val FILE_SIZE_1_MB = 1_048_576L
|
const val FILE_SIZE_1_MB = 1_048_576L
|
||||||
const val FILE_SIZE_2_MB = 2_097_152L
|
const val FILE_SIZE_2_MB = 2_097_152L
|
||||||
|
|
||||||
|
const val MESSAGES_LIMIT = 100
|
||||||
|
|
||||||
fun refreshMessages() {
|
fun refreshMessages() {
|
||||||
EventBus.getDefault().post(Events.RefreshMessages())
|
EventBus.getDefault().post(Events.RefreshMessages())
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user